본문 바로가기

Learning/└◆리눅스 서버 보안

01_리눅스 보안 점검_ 자동_스크립트

#!/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