본문 바로가기

Learning/└프로젝트

리눅스 패스워드 정책 진단 스크립트 분석 및 작성[계정관리]

주요정보통신기반시설.pdf


주요정보통신기반시설 Unix 서버 취약점 분석 평가 항목 참조 스크립트 작성


2. 계정관리

2-1

root 계정 원격 접속 제한

2-9

패스워드 최소 사용 기간 설정

2-2

패스워드 복잡성 설정

2-10

불필요한 계정 제거

2-3

계정 잠금 임계값 설정

2-11

관리자 그룹에 최소한의 계정 포함

2-4

패스워드 파일 보호

2-12

계정에 존재하지 않는 GID 금지

2-5

root 이외의 UID‘0’ 금지

2-13

동일한 UID 금지

2-6

root 계정 su 제한

2-14

사용자 Shell 점검

2-7

패스워드 최소 길이 설정

2-15

Session Timeout 설정

2-8

패스워드 최대 사용 기간 설정

 

 

 

출처: http://hyess.tistory.com/400 [hyes IT]


[패스워드 정책]

(1) 패스워드의 최소 길이 설정 8글자 이상(/etc/login.defs(PASS_MIN_LEN))

- /etc/login.defs(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) 패스워드 최소 길이 설정

#!bin/bash

. /root/bin/print.sh
NUM=`grep PASS_MIN_LEN /etc/login.defs | \

grep -v '^#' | \

grep '^PASS_MIN_LEN' | \

awk '{print $2}'`

if [ $NUM -ge 8 ] ; then
        print_good "
패스워드 최소 길이가 8자 이상으로 설정되어 있습니다. [GOOD]:)"

else

print_error "패스워드 최소 길이가 8자 미만으로 설정되어 있습니다. [WARM]:("

print_info "패스워드 정책 설정파일을 수정하여 패스워드 최소 길이를 8자 이상으로 설정하시오."

echo "    # vi /etc/login.defs  /PASS_MIN_LEN 8 으로 설정."

fi


(2) 패스워드는 문자 2글자, 다른 문자(숫자 or 특수문자) 1글자 이상

#!/bin/bash

. /root/bin/print.sh

cat /etc/pam.d/system-auth | grep "^password requisite pam_cracklib.so" > /dev/null 2>&1

if [ $? -eq 0 ] ; then
        print_good "적합한 패스워드 정책을 사용 중입니다. [GOOD]:)"
else
        print_error "패스워드 정책이 올바르게 되어 있지 않습니다. [WARM]:("
        print_info "관련 수정 경로 # vi /etc/pam.d/system-auth"
        echo "password requisite pam_cracklib.so try_first_pass retry=3 type= minlen=8 dcredit=-1
        ucredit=-1 lcredit=-1 ocredit=-1"

fi

 

(3) 패스워드 Min Age 7 설정

#!/bin/bash

 

. /root/bin/print.sh

NUM=`grep PASS_MIN_DAYS /etc/login.defs | grep -v '^#' | grep '^PASS_MIN_DAYS' | awk '{print $2}'`


if [ $NUM -ge 1 ] ; then

print_good "패스워드 최소 사용기간이 7 로 설정되어 있습니다. [GOOD]:)"

else

print_error "패스워드 최소 사용기간이 설정되어 있지 않습니다. [WARM]:("

print_info "패스워드 정책설정 파일을 수정하시오. (Min Age 7로 설정)"

echo "    # vi /etc/login.defs /PASS_MIN_DAYS  7 로 설정."

fi

 

(4) 패스워드 Max Age 90 설정

#!/bin/bash

 

. /root/bin/print.sh

NUM=`grep PASS_MAX_DAYS /etc/login.defs | \

grep -v '^#' | \

grep '^PASS_MAX_DAYS' | \

awk '{print $2}'`

 

if [ $NUM -le 90 ] ; then

print_good "패스워드 최대 사용기간이 90 이하로 설정되어 있습니다."

else

print_error "패스워드 최대 사용기간이 90 이하로 설정되어 있지 않습니다."

print_info "패스워드 정책설정 파일을 수정하시오. (Max Age 90으로 설정)"

echo " => vi /etc/login.defs 파일 열고 /PASS_MAX_DAYS 검색 후 90 으로 설정."

fi


(5) 패스워드 히스토리 기능, 이전 암호 4개 까지 저장

#!/bin/bash

. /root/bin/print.sh

grep required /etc/pam.d/system-auth |grep account|grep pam_unix.so| remember=4 |awk '{print $4}'

 

- /etc/pam.d/passwd, /etc/pam.d/system-auth(pam_unix.so(remember=N))

 

 

        print_info "LINUX PAM 모듈을 이용한 설정 방법"
        cat << EOF

Password History exists

Password must be satisfied with following requirements :

Secuve Password Management :

  - Minimum Length : 8 characters.

  - Maximum Length : 16 characters.

  - Min. Upper Letter : 0 character(s).

  - Min. Lower Letter : 1 character(s).

  - Min. Number Letter : 1 numeric(s).

  - Min. Special Letter : 1 character(s).

  - Past Password Diff. : 5 character(s).

  - Username Diff. : 0 character(s).

  - Max. Repeat Count :  2 character(s).

  - Max. Sequence Count :  0 character(s).

New UNIX password:

EOF

 

fi 


(6) root 사용자는 원격(EX: telnet)에서 로그인 금지, 시스템 관리자는 user01 사용자로 로그인하여 su 명령어를 통해 swiching 하도록 설정(단, user01 사용자만 su 명령어를 사용해야 한다.)#!/bin/bas

#!/bin/bash

 

. /root/bin/print.sh

grep ^pts /etc/securetty >/dev/null 2>&1

if [ $? -eq 0 ] ; then
        print_error "root 직접 접속이 허용되었거나, 원격서비스를 사용 중 입니다."
        print_info "vi /etc/securetty 파일에서 pts 주석처리."
else
        print_good "원격 서비스를 사용하지 않고 있거나, 접속이 차단 되어 있습니다."

fi

 

(7)  user02 사용자는 /sbin/shutdown 명령어만 사용가능(단, su 명령어를 사용하지 않고 sudo 명령어를 사용하도록 해야 한다.)

#!/bin/bash

. /root/bin/print.sh

cat /etc/pam.d/su | grep "pam_wheel.so"| grep "^#" > /dev/null 2>&1

if [ $? -eq 1 ] ; then
        print_good "su 명령어를 제한하고 있습니다."
else
        print_error "su 명령어를 모든 사용자가 사용하도록 설정되어 있습니다."
        print_info "LINUX PAM 모듈을 이용한 설정 방법"
        cat << EOF
"\"/etc/pam.d/su\"" 파일을 아래와 같이 (주석제거)
auth    sufficient    /lib/security/pam_rootok.so
auth    required      /lib/security/pam_wheel.so debug group=wheel 
EOF

fi 

#cat /etc/pam.d/su | grep 'pam_wheel.so' | grep "required" | grep -v '^#' | wc -l

#if [ `cat /etc/pam.d/su | grep 'pam_wheel.so' | grep "required" | grep -v '^#' | wc -l` -eq 0 ]


echo 

if [ `cat /etc/sudoers | grep "^user02" | grep "/sbin/shutdown" | wc -l` -eq 0 ]
then
print_error "user02 사용자가 모든 sudo 명령어를 사용하도록 설정되어 있습니다."
print_info "특정 사용자에게 제한적인 sudo 명령어를 사용"
cat << EOF                        
"/etc/sudoers 에 user02 ALL=(ALL) /sbin/shutdown 내용 추가"
/etc/sudoers파일은 ro(read only)이기 때문에 퍼미션 설정을 해 주어야 한다.
EOF
else
      print_good "user02 사용자에 대한 sudo /sbin/shutdown 명령어 설정이 되어있습니다."
fi


 

(8) 일반 사용자가 원격에서 로그인하는 경우 5번 암호 실패 후 lock 되고 20분후에 다시 시도할 수 있도록 설정한다.(Brute Force Attack, Password Guessing 차단)

#!/bin/bash

. /root/bin/print.sh
cat /etc/pam.d/system-auth | grep "^account required pam_tally2.so" > /dev/null 2>&1

if [ $? -eq 0 ]; then
    print_good "계정 잠금 임계값이 5 이하의 값으로 설정되어 있는 경우입니다."
else
    print_error "계정 잠금 임계값이 설정되어 있지 않거나, 5 이하의 값으로 설정되지 않은 경우 입니다."
    print_info "vi /etc/pam.d/system-auth 확인."
    echo "auth required pam_tally2.so no_magic_root deny=5 reset unlock_time=1200"
    echo "account required pam_tally2.so no_magic_root"

 

fi






초기작성 소스

#!/bin/bash


. /root/bin/print.sh

NUM2=`grep PASS_MIN_LEN /etc/login.defs | grep -v '^#' | grep '^PASS_MIN_LEN'`

NUM=`grep PASS_MIN_LEN /etc/login.defs | \

grep -v '^#' | \

grep '^PASS_MIN_LEN' | \

awk '{print $2}'`

    if [ $NUM -ge 8 ] ; then

        print_good "OK"

    else

        echo Minimum acceptable password length.

        echo minimum password length Probleam :\(

        print_error $NUM2

        echo $NUM2 --'>' PASS_MIN_LEN 8

    fi

echo


NUM=`grep PASS_MIN_DAYS /etc/login.defs | \

grep -v '^#' | \

grep '^PASS_MIN_DAYS' | \

awk '{print $2}'`

    if [ $NUM -ge 1 ] ; then

        print_good "OK"

    else

        print_error "Minimum number of days allowed betwwn password chages."

        echo PASS_MIN_DAYS 1 $NUM

    fi

echo


NUM=`grep PASS_MAX_DAYS /etc/login.defs | \

grep -v '^#' | \

grep '^PASS_MAX_DAYS' | \

awk '{print $2}'`

    if [ $NUM -le 90 ] ; then

        print_good "OK"

    else

        print_error "Maximum number of days a password may be used."

        echo PASS_MAX_DAYS 90 $NUM

    fi

echo

 

 

 




리눅스 패스워드 정책 진단 스크립트 완성소스(간결하게 재작성 필요. 함수,환경변수 이용)

#!/bin/bash


. /root/bin/print.sh

 

echo "######################################################################"

echo "                     리눅스 패스워드 정책 점검 - 사용규칙 분석결과                                     "

### 항목명 ###

echo "    1. 패스워드 사용규칙 적용"

### 위험도 ###

echo "    위험도 : 상"

### 기준설명 ###

echo "    [진단결과]"

echo "######################################################################"

cat << EOF

[패스워드 정책 점검 리스트]

(1) 패스워드의 최소 길이 설정 8글자 이상(/etc/login.defs(PASS_MIN_LEN))

- /etc/login.defs(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)
EOF
echo "######################################################################"

echo
echo "##################진단 결과############################################"

### 항목명 ###

echo "    1. 패스워드의 최소 길이 설정 8글자 이상"

### 위험도 ###

echo "    위험도 : 상"

### 기준설명 ###

echo "    [진단결과]"
NUM=`grep PASS_MIN_LEN /etc/login.defs | \

grep -v '^#' | \

grep '^PASS_MIN_LEN' | \

awk '{print $2}'`

if [ $NUM -ge 8 ] ; then
        print_good "
패스워드 최소 길이가 8자 이상으로 설정되어 있습니다. [GOOD]:)"

else

print_error "패스워드 최소 길이가 8자 미만으로 설정되어 있습니다. [WARM]:("

print_info "패스워드 정책 설정파일을 수정하여 패스워드 최소 길이를 8자 이상으로 설정하시오."

echo "    # vi /etc/login.defs  /PASS_MIN_LEN 8 으로 설정."

fi

echo

### 항목명 ###

echo "    2. 패스워드는 문자 2글자 다른 문자(숫자 또는 특수문자) 1 글자 이상"

### 위험도 ###

echo "    위험도 : 상"

### 기준설명 ###

echo "    [진단결과]"

cat /etc/pam.d/system-auth | grep "^password requisite pam_cracklib.so" > /dev/null 2>&1

if [ $? -eq 0 ] ; then
        print_good "적합한 패스워드 정책을 사용 중입니다. [GOOD]:)"
else
        print_error "패스워드 정책이 올바르게 되어 있지 않습니다. [WARM]:("
        print_info "관련 수정 경로 # vi /etc/pam.d/system-auth"
        echo "password requisite pam_cracklib.so try_first_pass retry=3 type= minlen=8 dcredit=-1
        ucredit=-1 lcredit=-1 ocredit=-1"

fi

echo

### 항목명 ###

echo "    3. 패스워드의 Min Age는 7 설정"

### 위험도 ###

echo "    위험도 : 상"

### 기준설명 ###

echo "    [진단결과]"

NUM=`grep PASS_MIN_DAYS /etc/login.defs | grep -v '^#' | grep '^PASS_MIN_DAYS' | awk '{print $2}'`


if [ $NUM -ge 1 ] ; then

print_good "패스워드 최소 사용기간이 7 로 설정되어 있습니다. [GOOD]:)"

else

print_error "패스워드 최소 사용기간이 설정되어 있지 않습니다. [WARM]:("

print_info "패스워드 정책설정 파일을 수정하시오. (Min Age 7로 설정)"

echo "    # vi /etc/login.defs /PASS_MIN_DAYS  7 로 설정."

fi


echo

### 항목명 ###

echo "    4. 패스워드 Max Age는 90 설정"

### 위험도 ###

echo "    위험도 : 상"

### 기준설명 ###

echo "    [진단결과]"

NUM=`grep PASS_MAX_DAYS /etc/login.defs | \

grep -v '^#' | \

grep '^PASS_MAX_DAYS' | \

awk '{print $2}'`

 

if [ $NUM -le 90 ] ; then

print_good "패스워드 최대 사용기간이 90 이하로 설정되어 있습니다."

else

print_error "패스워드 최대 사용기간이 90 이하로 설정되어 있지 않습니다."

print_info "패스워드 정책설정 파일을 수정하시오. (Max Age 90으로 설정)"

echo " => vi /etc/login.defs 파일 열고 /PASS_MAX_DAYS 검색 후 90 으로 설정."

fi

echo

### 항목명 ###

echo "    5. 패스워드 히스토리 기능, 이전 암호 4개 까지 저장"

### 위험도 ###

echo "    위험도 : 상"

### 기준설명 ###

echo "    [진단결과]"



 

echo

### 항목명 ###

echo "    6. root 사용자는 원격(EX: telnet)에서 로그인 금지"

### 위험도 ###

echo "    위험도 : 상"

### 기준설명 ###

echo "    [진단결과]"

grep ^pts /etc/securetty >/dev/null 2>&1

if [ $? -eq 0 ] ; then
        print_error "root 직접 접속이 허용되었거나, 원격서비스를 사용 중 입니다."
        print_info "vi /etc/securetty 파일에서 pts 주석처리."
else
        print_good "원격 서비스를 사용하지 않고 있거나, 접속이 차단 되어 있습니다."

fi

echo

### 항목명 ###

echo "    7. user02 사용자는 /sbin/shutdown 명령어만 사용가능"

### 위험도 ###

echo "    위험도 : 상"

### 기준설명 ###

echo "    [진단결과]"

cat /etc/pam.d/su | grep "pam_wheel.so"| grep "^#" > /dev/null 2>&1

if [ $? -eq 1 ] ; then
        print_good "su 명령어를 제한하고 있습니다."
else
        print_error "su 명령어를 모든 사용자가 사용하도록 설정되어 있습니다."
        print_info "LINUX PAM 모듈을 이용한 설정 방법"
        cat << EOF
"\"/etc/pam.d/su\"" 파일을 아래와 같이 (주석제거)
auth    sufficient    /lib/security/pam_rootok.so
auth    required      /lib/security/pam_wheel.so debug group=wheel 
EOF

fi 

#cat /etc/pam.d/su | grep 'pam_wheel.so' | grep "required" | grep -v '^#' | wc -l

#if [ `cat /etc/pam.d/su | grep 'pam_wheel.so' | grep "required" | grep -v '^#' | wc -l` -eq 0 ]


echo 

if [ `cat /etc/sudoers | grep "^user02" | grep "/sbin/shutdown" | wc -l` -eq 0 ]
then
print_error "user02 사용자가 모든 sudo 명령어를 사용하도록 설정되어 있습니다."
print_info "특정 사용자에게 제한적인 sudo 명령어를 사용"
cat << EOF                        
"/etc/sudoers 에 user02 ALL=(ALL) /sbin/shutdown 내용 추가"
/etc/sudoers파일은 ro(read only)이기 때문에 퍼미션 설정을 해 주어야 한다.
EOF
else
      print_good "user02 사용자에 대한 sudo /sbin/shutdown 명령어 설정이 되어있습니다."

fi

echo

### 항목명 ###

echo "    8. 로그인 실패 후 암호 실패 후 lock "

### 위험도 ###

echo "    위험도 : 상"

### 기준설명 ###

echo "    [진단결과]"
 cat /etc/pam.d/system-auth | grep "^account required pam_tally2.so" > /dev/null 2>&1

if [ $? -eq 0 ]; then
    print_good "계정 잠금 임계값이 5 이하의 값으로 설정되어 있는 경우입니다."
else
    print_error "계정 잠금 임계값이 설정되어 있지 않거나, 5 이하의 값으로 설정되지 않은 경우 입니다."
    print_info "vi /etc/pam.d/system-auth 확인."
    echo "auth required pam_tally2.so no_magic_root deny=5 reset unlock_time=1200"
    echo "account required pam_tally2.so no_magic_root"

 

fi


################################

파일에 저장해서 출력

################################

출력결과를 라인카운트로 총평 구문 작성


 

[출력결과]

 

출력 폼이 보기좋게 출력 되지는 않았지만.

동작하는데 이상은 없이 잘 되었다.