주요정보통신기반시설.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) 패스워드 최소 길이 설정
. /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글자 이상
. /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"
(3) 패스워드 Min Age 7 설정
. /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 로 설정."
(4) 패스워드 Max Age 90 설정
. /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개 까지 저장
. /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
. /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 "원격 서비스를 사용하지 않고 있거나, 접속이 차단 되어 있습니다."
(7) user02 사용자는 /sbin/shutdown 명령어만 사용가능(단, su 명령어를 사용하지 않고 sudo 명령어를 사용하도록 해야 한다.)
. /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
print_info "특정 사용자에게 제한적인 sudo 명령어를 사용"
cat << EOF
/etc/sudoers파일은 ro(read only)이기 때문에 퍼미션 설정을 해 주어야 한다.
EOF
else
print_good "user02 사용자에 대한 sudo /sbin/shutdown 명령어 설정이 되어있습니다."
(8) 일반 사용자가 원격에서 로그인하는 경우 5번 암호 실패 후 lock 되고 20분후에 다시 시도할 수 있도록 설정한다.(Brute Force Attack, Password Guessing 차단)
. /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 " 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 " 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
print_info "특정 사용자에게 제한적인 sudo 명령어를 사용"
cat << EOF
/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
################################
파일에 저장해서 출력
################################
출력결과를 라인카운트로 총평 구문 작성
[출력결과]
출력 폼이 보기좋게 출력 되지는 않았지만.
동작하는데 이상은 없이 잘 되었다.
'Learning > └프로젝트' 카테고리의 다른 글
[한국정보기술연구원] '2017 KISBIC' BoB 정보보안 아이디어 공모전 참가 (0) | 2017.01.18 |
---|---|
[제 1 차 프로젝트]칼리리눅스 내장된 모의해킹 툴에 대한 사용법 연구 (0) | 2016.10.31 |