시스템 보안에 대한 6가지 보안 주제
* 계정과 패스워드 관리
* 세션 관리
* 접근 제어
* 권한 관리
* 로그 관리
* 취약점 관리
취약점 컨설팅
1) [양호] / [취약]으로 답이 나오는 경우
* 이 부분은 Customer하고 상의할 부분이 없는 내용으로,
스크립트를 작성하여 취약한 부분을 보고서로 작성한다.
2) 컨설턴트가 Customer하고 상의 해야할 부분
사용자를 삭제한다거나 하는 내용은 반드시 고객과 상의해야한다.
* 컨설턴트에게 많은 정보를 제공
- 어떤 명령어를 사용하였는지
- 주의해야 할 사항이 무엇인지
* Customer와 상담하는 내용은 사용자의 선택이다.
- 책임 소재가 있기 때문에 취약점에 대한 Customer의 대응방안을 기록
- 그 이외에도 필요한 사항이 있으면 기록한다.
스크립트 체계
리눅스에서 사용하는 스크립트를 간단히 정리해 보았다. 아래는 Kisa 가이드에 따라 작성한다.
주요정보통신기반시설 기술적 취약점 분석 평가 상세 가이드
* banner.sh ### 배너 함수 모듈화
* vulcheck.sh ### U-## 및 배너 스크립트
* dec.c ### install.sh 비밀번호 입력 후 실행되도록 구성
* install.sh ### vulcheck.sh 실행 스크립트
* U-##.sh ### 취약점 진단 스크립트
* env.sh ### 서비스명, 디렉터리명
* function.sh ### 함수를 모듈화 하여 사용(재사용성, 가독성)
* must.sh ### 반드시 실행되어야 하는 스크립트 EX: 백업, 서비스 체크
개발자 - 컨설턴트 - 서버관리자
--------------------------> 암호화 하여 전달(gpg: 거의 모든 유닉스, 리눅스에 있음)
* 개발자는 gpg 프라이빗 키와 암호화된 스크립트를 컨설턴트에 전달
* 서버관리자가 result.log 파일 수정하거나 열람하지 못하여야 함
* 컨설턴트, 서버관리자가 스크립트를 수정하거나 열람하지 못하게 해야함 (암호화 및 삭제)
스크립트 실행시 만드는 디렉터리
/bin ### 바이너리 파일
/lib ### env.sh , functino.sh 등 라이브러리
/scripts ### U-## 스크립트
/gpg ### log 암호화 할 공개키 / 컨설턴트가 복호화
/result ### 최종 로그
/docs ### 관련 문서
/html ### 웹
서버관리자 실행 디렉터리
/test
/test1
#!/bin/bash
. env.sh
. function.sh
mkdir -p CMDS FILES
# /etc/securetty backup
FILE1="$(ConvertFileName $SECURETTY)"
# echo $FILE1
[ ! -f $FILE1 ] \
&& /bin/cp -a $SECURETTY $FILE1
# systemctl list-unit-files
SERVICE_TOTAL_LIST=CMDS/service.list
[ ! -f $SERVICE_TOTAL_LIST ] \
&& systemctl list-unit-files > "$SERVICE_TOTAL_LIST"
# /etc/security/pwquality.conf backup
FILE1="$(ConvertFileName $PWQUALITY_CONF)"
[ ! -f $FILE1 ] \
&& /bin/cp -a $PWQUALITY_CONF $FILE1
LOG=check.log
RESULT=result.log
> $LOG
> $RESULT # 로그 파일 생성 컨설트에게 전달.
# Directory Name
# Service Name
# Conf File List
# PAM Module
# PAM File
Linux CentOS 7 버전
CentOS 7 Version 사용자 root
# 작업 디렉토리 생성
[root~] mkdir -p /root/scripts
# 엘리어스 변경 (사용자 root)
[root~] vi ~/.bashrc # 터미널을 열 때 마다 실행되는 스크립트
# 로그인 시 실행 (~/.bash_profile)
alias s='chmod 755 /root/scripts/*.sh' # 스크립트 실행권한(편집기에서)
#
#!/bin/bash
. env.sh
. function.sh
Bar
Code [U-01] root 계정 원격 접속 제한
cat << EOF >> $RESULT
[양호]: 원격 서비스를 사용하지 않거나 사용시 직접 접속을 차단한 경우
[취약]: root 직접 접속을 허용하고 원격 서비스를 사용하는 경우
EOF
Bar
# 1. telnet service check
# * telnet service check
# * pam check(pam_securetty.so)
# * /etc/securetty(pts/#)
# 2. ssh service check
# * ssh service check
# * /etc/ssh/sshd_config(PermitRootLogin)
if [ $(CheckService $SVC_TELNET) = 'ACTIVE' ] ; then
Info 'TELNET 서비스가 기동되어 있습니다.'
if egrep -v '^#|^$' "$PAM_FILE_LOGIN" | grep -qw "$PAM_MODULE_SECURETTY" ; then
Ok '[ OK ]'
else
Fail "$PAM_FILE_LOGIN($PAM_MODULE_SECURETTY) 내용이 존재하지 않습니다."
fi
else
Ok 'TELNET 서비스가 기동되어 있지 않습니다.'
fi
cat $RESULT
echo; echo
#!/bin/bash
. env.sh
. function.sh
LOG1=$(LogName $0) && > $LOG1
Bar
Code [U-02] 패스워드 복잡성 검사
cat << EOF >> $RESULT
[양호]: 영문 숫자 특수문자가 혼합된 8 글자 이상의 패스워드가 설정된 경우.
[취약]: 영문 숫자 특수문자 혼합되지 않은 8 글자 미만의 패스워드가 설정된 경우.
EOF
Bar
# /etc/security/pwquality.conf
# * minlen = 12
# * minclass = 4
# * lcredit = 0
# * ucredit = 0
# * dcredit = 0
# * ocredit = 0
MINLEN=$(FindPatternReturnValue $PWQUALITY_CONF minlen 8)
MINCLASS=$(FindPatternReturnValue $PWQUALITY_CONF minclass 0)
LCREDIT=$(IsFindPatternReturnValue $PWQUALITY_CONF lcredit)
UCREDIT=$(IsFindPatternReturnValue $PWQUALITY_CONF ucredit)
DCREDIT=$(IsFindPatternReturnValue $PWQUALITY_CONF dcredit)
OCREDIT=$(IsFindPatternReturnValue $PWQUALITY_CONF ocredit)
ALLCREDIT=$(TrueFalse $LCREDIT $UCREDIT $DCREDIT $OCREDIT)
if [ $MINLEN -ge 12 -a $MINCLASS -ge 4 -a $ALLCREDIT = 'True' ] ; then
Ok "영문 숫자 특수문자가 혼합된 8 글자 이상의 패스워드가 설정된 경우."
else
Info "현재 설정은 CMDS/_etc_security_pwquality.conf 파일 내용을 확인합니다."
Fail "영문 숫자 특수문자 혼합되지 않은 8 글자 미만의 패스워드가 설정된 경우."
fi
cat $RESULT
#!/bin/bash
. env.sh
. function.sh
Bar
Code [U-03] 계정 잠금 임계값 설정
cat << EOF >> $RESULT
[양호]: 계정 잠금 임계값이 5 이하의 값으로 설정되어 있는 경우
[취약]: 취약: 계정 잠금 임계값이 설정되어 있지 않거나, 5 이하의 값으로 설정되지 않은 경우
EOF
Bar
# /etc/pam.d/system-auth -> pam_tally2.so|pam_faillock.so(deny=5)
# /etc/pam.d/password-auth -> pam_tally2.so|pam_faillock.so(deny=5)
OUTPUT1=$(PAM_FindPatternReturnValue $PAM_FILE_SYSTEMAUTH $PAM_MODULE_TALLY2 $PAM_MODULE_FAILLOCK)
if [ "$OUTPUT1" = 'None' ] ; then
Fail "No Defined PAM ($PAM_FILE_SYSTEMAUTH) Module($PAM_MODULE_FAILLOCK|$PAM_MODULE_TALLY2) in PAM FILE "
else
Info "Defined PAM Module($PAM_MODULE_FAILLOCK|$PAM_MODULE_TALLY2) in PAM FILE($PAM_FILE_SYSTEMAUTH) "
for i in $OUTPUT1
do
echo $i | awk -F= '{print $1, $2}' | while read KEY1 VALUE1
do
# echo $KEY1 : $VALUE1
case $KEY1 in
'deny') CheckNumLessThenFive $VALUE1 ;;
*) echo : ;;
esac
done
done
fi
cat $RESULT
echo; echo
#!/bin/bash
. env.sh
. function.sh
LOG1=$(LogName $0)
> $LOG1
Bar
Code '[U-36] finger 서비스 비활성화'
cat << EOF >> $RESULT
[양호]: Finger 서비스가 비활성화 되어 있는 경우
[취약]: Finger 서비스가 활성화 되어 있는 경우
EOF
Bar
if [ $(CheckPKG $PKG_TELNET) = "False" ] ; then
Info "$PKG_TELNET Package is ND"
Ok "[양호]: Finger 서비스가 비활성화 되어 있는 경우"
else
if [ $(CheckService $SVC_FINGER 2>/dev/null ) = "ACTIVE" ] ; then
Warn "[취약]: Finger 서비스가 활성화 되어 있는 경우"
else
Ok "[양호]: Finger 서비스가 비활성화 되어 있는 경우"
fi
fi
cat $RESULT
echo; echo
#!/bin/bash
. env.sh
. function.sh
LOG1=$(LogName $0)
> $LOG1
Bar
Code '[U-37] Anonymous FTP 비활성화'
cat << EOF >> $RESULT
[양호]: Anonymous FTP (익명 ftp) 접속을 차단한 경우
[취약]: Anonymous FTP (익명 ftp) 접속을 차단하지 않은 경우
EOF
Bar
# Check vsftpd or proftpd
# * vsftpd
# * Check pakage
# * Check service
# * Check anonymous service
# * proftpd
# * Check pakage
# * Check service
# * Check anonymous service
FINDFTP=$(netstat -antup | grep ':21 ' | awk '{print $7}')
# echo $FINDFTP
if echo $FINDFTP | egrep -q 'proftpd|vsftpd' ; then
Info "vsftpd 또는 proftpd 서비스를 사용하고 있습니다."
else
Info "CMDS/{netstat.txt, ps.txt} 2개의 파일을 참고하여 적당한 FTP 서비스를 찾고 고객과 상의한다."
Consult "고객과 상의합니다."
fi
if echo $FINDFTP | egrep -q 'vsftpd' ; then
Info 'vsftpd 서비스를 사용하고 있습니다.'
if [ $(FindPatternReturnValue2 $VSFTPD_CONFIG anonymous_enable) = 'YES' ] ; then
Fail 'Anonymous FTP (익명 ftp) 접속을 차단하지 않은 경우입니다.'
else
Ok 'Anonymous FTP (익명 ftp) 접속을 차단한 경우입니다.'
fi
elif echo $FINDFTP | egrep -q 'proftpd' ; then
Info 'proftpd 서비스를 사용하고 있습니다.'
# IsFindDaemonOption proftpd 'DANONYMOUS_FTP'
if [ $(IsFindDaemonOption 'DANONYMOUS_FTP') = 'True' ] ; then
Fail 'Anonymous FTP (익명 ftp) 접속을 차단하지 않은 경우입니다.'
else
Ok 'Anonymous FTP (익명 ftp) 접속을 차단한 경우입니다.'
fi
else
Info '알수없는 FTP 서비스를 사용하고 있습니다.'
fi
cat $RESULT
echo ; echo
#!/bin/bash
. env.sh
. function.sh
LOG1=$(LogName $0)
> $LOG1
Bar
Code 'r 계열 서비스 비활성화'
cat << EOF >> $RESULT
[양호]: r 계열 서비스가 비활성화 되어 있는 경우
[취약]: r 계열 서비스가 활성화 되어 있는 경우
EOF
Bar
for i in $SVC_RCMD
do
ISACTIVE=$(CheckService $i)
if [ $ISACTIVE = "ACTIVE" ] ; then
Warn "[취약]: r 계열 서비스가 활성화 되어 있는 경우" >> $LOG1
else
Ok "[양호]: r 계열 서비스가 비활성화 되어 있는 경우" >> $LOG1
fi
done
cat $RESULT
echo ; echo