인프라 진단/주•통기반 리눅스 서버 점검

U-02. 패스워드 복잡성 설정

sheow13 2024. 6. 23. 12:01
728x90

 

  주요정보통신기반시설 기술적 취약점 분석 평가

- 과학기술정보통신부 및 한국인터넷진흥원에서 발행한 가이드로, IDC, ISP 등 민간, 공공시설을 불문하고 침해사고 등이

발생할 경우 경제사회와 국가안정에 미치는 영향이 큰 시설들을 말하며, 이 시설들을 보호하기 위해 내부에 존재하는 취약점을 파악 및 조치하는 방법을 기술해놓은 가이드로, 국내 많은 기업들이 해당 가이드를 토대로 점검 및 조치를 진행하고 있다.

- 주요정보통신기반시설 기술적 취약점 분석 평가에는 주요 점검 대상으로 유닉스, 윈도우즈, 보안장비, 네트워크 장비, 데이터베이스, 웹 등을 다루고 있으며 해당 챕터에서는 유닉스(리눅스)서버를 다룰 예정

- 해당 가이드는 한국인터넷진흥원 가이드라인에서 참고

- https://www.kisa.or.kr/2060204/form?postSeq=12&page=1

 

 

  유닉스(리눅스) 서버 점검 항목

- Unix(Linux) 서버 점검 항목으로 크게 계정 관리, 파일 및 디렉터리 관리, 서비스 관리, 패치 관리, 로그 관리 등을 다루고 있다.

- 계정 관리의 경우, root 계정 원격 접속 제한, 계정 잠금 등에 대한 부분을 다루고 있으며, 파일 및 디렉터리 관리에서는 root 홈, 패스 디렉터리 권한 설정, UMASK 설정 등을 다루고 있으며, 서비스에서는 보안상 취약한 서비스(ex, finger) 비활성화 등을 다루고 있으며, 패치 관리는 최신 보안 패치 여부를 점검하며, 로그 관리는 정기적으로 로그를 검토 및 점검하고 있는지 여부를 확인하고 있다. 

- 해당 챕터에서는 CentOS 7.9 버전에서 진행하였으며, CentOS 이외에 다른 OS 점검 방법은 상기에 기재된 가이드 참고

 

  패스워드 복잡성 설정 점검

점검 내용
- 시스템 정책에 사용자 계정(root 및 일반계정 모두 해당) 패스워드 복잡성 관련 설정이 되어 있는지 점검
- (양호) : 패스워드 최소길이 8자리 이상, 영문·숫자·특수문자 최소 입력 기능이 설정된 경우
- (취약) : 패스워드 최소길이 8자리 이하 또는 영문·숫자·특수문자 최소 입력 기능이 설정되어 있지 않은 경우

 

보안 위협
- 사용자 계정 패스워드가 복잡성 설정이 되어 있지 않은 경우, 공격자는 무작위 대입 공격(brute force) 등을 통해 손쉽게 사용자 계정을 탈취할 수 있다.

 

점검 방법
- /etc/security/pwquality.conf 파일에서 패스워드 복잡성 설정이 활성화 되어 있는지 확인
- lcredit=-1 : 소문자 최소 1자 이상 요구
- ucredit=-1 : 최소 대문자 1자 이상 요구
- dcredit=-1 : 최소 숫자 1자 이상 요구
- ocredit=-1 : 최소 특수문자 1자 이상 요구
- minlen=8 : 최소 8자리 이상 설정

 

점검 방법 확인 명령어

 

1. 패스워드 복잡도 설정 중 최소 3개 이상 설정되어 있는지 확인

cat /etc/security/pwquality.conf | egrep "^lcredit" | wc -l

 

 - 패스워드 복잡도 설정이 활성화 되어 있는지 확인

  * 출력 결과가 0이면 패스워드 복잡도 미설정, 출력 결과가 1이면 패스워드 복잡도 설정

[패스워드 복잡도 설정 옵션이 활성화 되어 있는지 확인]

 

2. 패스워드 길이가 최소 8자리 이상 설정되어 있는지 확인

cat /etc/security/pwquality.conf | egrep "^minlen" | awk -F '=' '{print $2}' | tr -d ' '

 

- 패스워드 최소 길이 설정이 활성화(주석 여부) 여부 확인 후, 활성화 되어 있다면 '=' 값을 구분자로 2번째 필드를 출력하는 것으로, 만약 출력하는 값에 공백이 있다면 공백을 제거해서 출력

[패스워드 최소 길이가 설정되어 있으면, 그 값만 출력하는 명령어]

 

 

패스워드 복잡성 설정 쉘 코드

 

#!/bin/bash

FILE="U-02.txt"
COUNT=0
TMP="ucredit dcredit ocredit"

echo "U-02. 패스워드 복잡성 설정" >> $FILE 2>&1
echo "===================================================================" >> $FILE 2>&1
echo "" >> $FILE 2>&1

echo "영문,숫자,특수문자가 혼합된 8자리 이상 설정되어 있는지 확인" >> $FILE 2>&1
echo "===================================================================" >> $FILE 2>&1
echo "" >> $FILE 2>&1
echo "ucredit : 대문자 설정, dcredit : 숫자 설정, ocredit : 특수문자 설정, minlen : 최소 글자수 설정" >> $FILE 2>&1
echo "===================================================================" >> $FILE 2>&1
echo "" >> $FILE 2>&1

# 패스워드 최소 길이 여부를 먼저 확인하고, 만약 비활성화 되어 있거나 8자리 이상이면 바로 해당 항목 취약으로 설정
# 패스워드 최소 길이가 8자리 이상일경우, 패스워드 복잡도 설정여부 확인
if [ $(grep -iq "^minlen" /etc/security/pwquality.conf; echo $?) -eq 0 ]; then
    MINLEN=$(grep -i "^minlen" /etc/security/pwquality.conf | awk -F '=' '{print $2}' | tr -d ' ')
    if [ "$MINLEN" -ge 8 ]; then
        echo "패스워드 최소길이가 8자리 이상 설정되어 있습니다." >> $FILE 2>&1
        echo "===================================================================" >> $FILE 2>&1
        echo "" >> $FILE 2>&1
        echo "패스워드 복잡도 설정 여부 확인 필요합니다." >> $FILE 2>&1
        echo "===================================================================" >> $FILE 2>&1
        echo "" >> $FILE 2>&1

# 패스워드 복잡도 설정(ucredit, dcredit, ocredit) 등이 3개 이상 설정되어 있는지 확인
# count가 3이 넘으면 양호, count가 3보다 작으면 취약으로 설정

        for temp in $TMP; do
            if [ $(grep -iq "^$temp" /etc/security/pwquality.conf; echo $?) -ne 0 ]; then
                echo "패스워드 복잡도 설정을 하지 않았습니다." >> $FILE 2>&1
                echo "===================================================================" >> $FILE 2>&1
                echo "" >> $FILE 2>&1
                break
            else
                VALUE=$(grep -i "^$temp" /etc/security/pwquality.conf | awk -F '=' '{print $2}' | tr -d ' ')
                if [ "$VALUE" -ne 0 ]; then
                    COUNT=$((COUNT+1))
                else
                    echo "패스워드 복잡도 설정값을 넣지 않았습니다." >> $FILE 2>&1
                    echo "===================================================================" >> $FILE 2>&1
                    echo "" >> $FILE 2>&1
                    break
                fi
            fi
        done
    else
        echo "패스워드 최소길이가 8보다 작게 설정하였습니다." >> $FILE 2>&1
        echo "===================================================================" >> $FILE 2>&1
        echo "" >> $FILE 2>&1
    fi
else
    echo "패스워드 최소길이 설정을 진행하지 않았습니다." >> $FILE 2>&1
    echo "===================================================================" >> $FILE 2>&1
    echo "" >> $FILE 2>&1
fi

if [ $COUNT -ge 3 ]; then
    echo "U-02. 패스워드 복잡도 설정 : 양호" >> $FILE 2>&1
    echo "===================================================================" >> $FILE 2>&1
    echo "" >> $FILE 2>&1
else
    echo "U-02. 패스워드 복잡도 설정 : 취약" >> $FILE 2>&1
    echo "===================================================================" >> $FILE 2>&1
    echo "" >> $FILE 2>&1
fi