[리눅스/계정관리] 패스워드 복잡성 설정 (U-02)



취약점 개요

■ 위험도
- 상

■ 점검 목적
- 패스워드 복잡성 관련 정책이 설정되어 있는지 점검하여 비인가자의 공격 ( 무작위 대입 공격, 사전 대입 공격 등 ) 에 대비가 되어 있는지 확인하기 위함

■ 보안 위협
- 패스워드 복잡성 설정이 되어 있지 않은 사용자 계정 패스워드 존재 시 비인가자가 각종 공격 ( 무작위 대입 공격, 사전 대입 공격 등 )을 통해 취약한 패스워드가 설정된 사용자 계정의 패스워드를 획득하여 획득한 사용자 계정정보를 통해 해당 사용자 계정의 시스템에 접근할 수 있는 위험이 존재함

점검 및 조치 방법

■ 판단 기준
- 양호 : 영문, 숫자, 특수문자를 조합하여 2종류 조합 시 10자리 이상, 3종류 이상 조합 시 8자리 이상의 패스워드가 설정된 경우 ( 공공기관 9자리 이상 )
- 취약 : 영문, 숫자, 특수문자를 조합하지 않거나 2종류 조합 시 10자리 미만, 3종류이상 조합 시 8자리 미만의 길이가 패스워드로 설정된 경우 ( 공공기관 9자리 미만 )

■ 조치 방법
(1) 패스워드의 최소 길이 설정 8글자 이상(/etc/login.defs(PASS_MIN_LEN))
- /etc/login.efs(PASS_MIN_LEN)
(2) 패스워드는 문자 2글자 다른 문자(숫자 또는 특수문자) 1 글자 이상
- /etc/pam.d/passwd(/etc/pam.d/system-auth(pam_cracklib.so))
(3) 패스워드의 Min Age는 7 설정
- /etc/login.defs(PASS_MIN_DAYS)
(4) 패스워드 Max Age는 90 설정
- /etc/login.defs(PASS_MAX_DAYS)
(5) 패스워드 히스토리 기능, 이전 암호 4개 까지 저장
- /etc/pam.d/passwd, /etc/pam.d/system-auth(pam_unix.so(remember=N))
(6) root 사용자는 원격(EX: telnet)에서 로그인 금지, 시스템 관리자는 user01 사용자로 로그인하여 su 명령어를 통해 swiching 하도록 설정(단, user01 사용자만 su 명령어를 사용해야 한다.)
- /etc/securetty, /etc/pam.d/login(pam_securetty.so),
- /etc/pam.d/su(pam_wheel.so), /etc/group
(7) user02 사용자는 /sbin/shutdown 명령어만 사용가능(단, su 명령어를 사용하지 않고 sudo 명령어를 사용하도록 해야 한다.)
- /etc/sudoers(user02, %user02)
(8) 일반 사용자가 원격에서 로그인하는 경우 5번 암호 실패 후 lock 되고 20분후에 다시 시도할 수 있도록 설정한다.
- /etc/pam.d/login, /etc/pam.d/system-auth(pam_tally.so)

◆ 부적절한 패스워드 유형
1. 사전에 나오는 단어나 이들의 조합
2. 길이가 너무 짧거나, NULL(공백)인 패스워드
3. 키보드 자판의 일련의 나열 (예 : abcd, qwert, qaz 등)
4. 사용자 계정 정보에서 유추 가능한 단어들
(예 : 지역명, 부서명, 계정명, 사용자 이름의 이니셜, root, rootroot, root1234, admin 등)

◆ 패스워드 관리 방법
1. 영문, 숫자, 특수문자를 조합하여 계정명과 상이한 8자 이상의 패스워드 설정
※ 다음 각 목의 문자 종류 중 2종류 이상을 조합하여 최소 10자리 이상 또는, 3종류 이상을 조합하여 최소 8자리 이상의 길이로 구성
① 영문 대문자 (26개)
② 영문 소문자 (26개)
③ 숫자 (10개)
④ 특수문자 (32개)
2. 시스템마다 상이한 패스워드 사용
3. 패스워드를 기록해 놓을 경우 변형하여 기록
4. 가급적 자주 패스워드를 변경할 것

password requisite pam_cracklib.so try_first_pass retry=3 minlen=8 ucredit=-1 dcredit=-1 ocredit=-1 lcredit=-1
-->
retry=N : 패스워드 입력 실패 시 재시도횟수
difok=N : 기존 패스워드와 비교. 기본값10 (50%)
minlen=N : 크레디트를 더한 패스워드최소길이
dcredit=N : 숫자에 주어지는 크레디트값. 기본 1
udredit=N : 영어대문자에 주어지는 크레디트값
lcredit=N : 영어 소문자에 주어지는 크레디트값
ocredit=N : 숫자, 영어대/소문자를 제외한 기타문자
(각 항목에서 -1 값을 주면 반드시 해당하는 문자를 포함시켜야 함. 즉 dcredit=-1 이라면 패스워드에 숫자가 반드시 포함되어야 함.)

예시

retry=5 : 패스워드 입력 실패 시 재시도 가능 횟수
difok=10 : 기존 패스워드와 비교하는 정도. 기본값10 (50%)
minlen=5 : 패스워드의 최소 길이
dcredit=-1 : 숫자를 최소 1자 이상 사용
ucredit=-1 : 영어 대문자를 최소 1자 이상 사용
lcredit=-1 : 영어 소문자를 최소 1자 이상 사용
ocredit=-1 : 숫자, 영어대/소문자를 제외한 기타문자(특수문자)를 1자 이상 사용

스크립트

#!/bin/bash

cat << EOF

===================[U-02] 패스워드 복잡성 설정 ==============

    영문과 숫자 특수문자가 혼합된 8글자 이상의 패스워드 일 경우  "OK"
    영문과 숫자 특수문자가 혼합되지 않은 8글자 이하의 패스워드일 경우 "WARN"

=====================================================

EOF

> check.log
LOG=check.log
chmod 600 $LOG

. /root/check/print.sh

cat << EOF | tee $LOG
(1) password minimum length check
OK : 8 글자 이상
WARN: 8 글자 미만

# cat /etc/login.defs
EOF

echo "---------------------------------------------" | tee $LOG
C_LINE=`grep PASS_MIN_LEN /etc/login.defs | grep -v '^#'`
NUM=`echo $C_LINE | awk '{print $2}'`
if [ $NUM -ge 8 ] ; then
print_good "[ OK ] : $C_LINE" | tee $LOG
else
print_error "[ WARN ] : $C_LINE" | tee $LOG
fi

echo "---------------------------------------------" | tee $LOG
FILE1=/etc/pam.d/system-auth
PAM_MODULE=pam_cracklib.so
LINE=`cat $FILE1 | egrep -v '(^$|^#)' | grep $PAM_MODULE`
LINE2=`echo $LINE | cut -d ' ' -f 4-`
VAR2=0

cat << EOF | tee $LOG

(2) 패스워드는 문자 2글자 다른 문자(숫자 또는 특수문자) 1 글자 이상
OK : 숫자 또는 대문자, 특수문자 1 글자 이상
WARN: 숫자 또는 대문자, 특수문자 1 글자 미만

# cat /etc/pam.d/system-auth

EOF


echo "---------------------------------------------" | tee $LOG

for VAR in `echo $LINE2`
do
FIRST=`echo $VAR | awk '{print $1}'`
CHECK1=`echo $FIRST | awk -F= '{print $1}'`
CHECK2=`echo $FIRST | awk -F= '{print $2}'`
case $CHECK1 in
try_first_pass) break | tee $LOG ;;
retry) print_info "retry값 $CHECK2" | tee $LOG ;;
minlen) print_info "minlen값 $CHECK2" | tee $LOG ;;
ucredit) print_good "[ OK ] ucredit $CHECK2" | tee $LOG | expr $VAR2 + 1 ;;
dcredit) print_good "[ OK ] dcredit $CHECK2" | tee $LOG | expr $VAR2 + 1 ;;
ocredit) print_good "[ OK ] ocredit $CHECK2" | tee $LOG | expr $VAR2 + 1 ;;
*) print_info 'other' ;;
esac
shift
done

if [ $VAR2 -eq 0 ] ; then
print_error "[ WARN ] ucredit(대문자수), dcredit(숫자갯수), ocredit(특수기호수) 설정없음"
else
print_good "[ OK ]"
fi
echo "---------------------------------------------" | tee $LOG

댓글

Designed by JB FACTORY