[목차]

root 계정 su 제한(1.6)

  1. 취약점 분석/평가 방법 상세 가이드

  2. 취약점 점검 스크립트 제작

패스워드 최소 길이 설정(1.7)

  1. 취약점 분석/평가 방법 상세 가이드

  2. 취약점 점검 스크립트 제작

 

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

  1. 취약점 분석/평가 방법 상세 가이드

  2. 취약점 점검 스크립트 제작

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

  1. 취약점 분석/평가 방법 상세 가이드

  2. 취약점 점검 스크립트 제작

 

패스워드 정책 실습 정리

 

 

 


 

 

 

[root 계정 su 제한]

 

1.6 root 계정 su 제한

■ 점검 분류 항목: 계정 관리

■ 세부 점검 항목: root 계정 su 제한

■ 대상: 리눅스

■ 위험도: 

■ 관련 코드: U-06

 

 

(1) 취약점 개요

권한이 없는 일반 사용자가 su 명령을 사용하여 로그인을 시도하고 패스워드 무작위 대입 공격(Brute Force Attack)이나 패스워드 추측 공격(Password Guessing)을 통해 root 권한을 획득할 수 있음. su 명령어 사용이 허용된 사용자만 root 계정으로 접속할 수 있도록 함.

 

 

(2) 판단기준

양호: su 명령어를 특정 그룹에 속한 사용자만 사용하도록 제한되어 있는 경우

취약: su 명령어를 모든 사용자가 사용하도록 설정되어 있는 경우

 

 

(3) 조치방법

일반 사용자의 su 명령 사용 제한

1. Group 생성(생성할 그룹 요청, 일반적으로 wheel 사용)

2. su 명령어의 그룹을 요청받은 그룹으로 변경

3. su 명령어의 권한 변경(4750)

4. su 명령어 사용이 필요한 계정을 새로 생성한 그룹에 추가(추가할 계정 요청)

※ LINUX의 경우, *PAM(Pluggable Authentication Module)을 이용한 설정 가능

*PAM(Pluggable Authentication Module): 사용자를 인증하고 그 사용자의 서비스에 대한

액세스를 제어하는 모듈화 된 방법을 말하며, PAM은 관리자가 응용프로그램들의 사용자 인증

방법을 선택할 수 있도록 해줌

 

 

(4) 보안 설정 방법

1. “wheel” 그룹(su 명령어 사용 그룹) 및 그룹 내 구성원 존재 여부 확인

# cat /etc/group

wheel:x:10:root,admin

2. 허용 그룹(su 명령어 사용 그룹) 설정 여부 확인

# cat /etc/pam.d/su

auth required /lib/security/pam_wheel.so debug group=wheel 또는,

auth required /lib/security/$ISA/pam_wheel.so use_uid

■ LINUX PAM 모듈을 이용한 설정 방법

1. “/etc/pam.d/su” 파일을 아래와 같이 설정(주석제거)

auth sufficient /lib/security/pam_rootok.so

auth required /lib/security/pam_wheel.so debug group=wheel 또는,

auth sufficient /lib/security/$ISA/pam_rootok.so

auth required /lib/security/$ISA/pam_wheel.so use_uid

2. wheel 그룹에 su 명령어를 사용할 사용자 추가

# usermod -G wheel <user_name>

또는, 직접 “/etc/group” 파일을 수정하여 필요한 계정 추가

wheel:x:10: -> wheel:x:10:root,admin

 

 

(5) 조치시 영향

그룹에 추가된 계정들은 모든 Session 종료 후 재로그인 시 su 명령어 사용 가능

 

 

 

고객에게 취약점을 어떻게 이해시킬것인가?

(고객에게 설명)

sucrack 툴에 대한 설명(EX: KaliLinux)

http://www.leidecker.info/projects/sucrack.shtml(sucrack 소스코드)

[실습] sucrack 실습

 

 

 

관련문서 제작

[실습] wheel 그룹에 대한 실습(/var/log/secure)

* /etc/pam.d/su 파일

 

 

 

컨설팅

(정리) 보안 정책

su 명령어를 통해 스위칭할수 있는 사용자 그룹(wheel)을 설정한다.

-> /etc/pam.d/su(pam_wheel.so)

-> usermod -G wheel user01

sudo 명령어를 사용할 수 있는 사용자/그룹 지정, 명령어의 집합의 지정이 필요하다.

-> /etc/sudoers

root 사용자를 위한 일반사용자 계정(EX: webadmin)은 wheel 그룹에 속하도록 관리하는 것이 유리하고, 나머지 일반 사용자 계정(EX: wasuser)은 sudo 명령어 체계를 사용하는 것이 좋다.

 

 


 

 

2. 취약점 진단 스크립트 제작

 

 

(스크립트 제작 시 참고사항)

/etc/pam.d/su 파일에 pam_wheel.so 모듈에 대한 정의가 되어 있어야 한다.

wheel 그룹에 속한 사용자까지 확인할 필요는 없다.

 

 

(스크립트 제작 시 판단 근거)

# cat /etc/pam.d/su | egrep -v '(^#|^$)' | egrep pam_wheel.so

 

 

(스크립트 안에 들어갈 내용)

 

 

(CentOS 7.x) U-06.sh

#!/bin/bash

 

. function.sh

 

BAR

CODE [U-06] root 계정 su 제한

cat << EOF >> $RESULT

[양호]: su 명령어를 특정 그룹에 속한 사용자만 사용하도록 제한되어 있는 경우

[취약]: su 명령어를 모든 사용자가 사용하도록 설정되어 있는 경우

EOF

BAR

 

PAM_FILE=/etc/pam.d/su

PAM_MODULE=pam_wheel.so

GROUPFILE=/etc/group

 

egrep -v '^#|^$' $PAM_FILE | grep -q $PAM_MODULE

if [ $? -eq 0 ] ; then

OK $PAM_MODULE 설정이 되어 있습니다.

if grep -q wheel $GROUPFILE; then

OK wheel 그룹이 존재합니다.

else

WARN wheel 그룹이 존재하지 않습니다.

fi

else

WARN $PAM_MODULE 설정이 되어 있지 않습니다.

fi

 

cat $RESULT

echo ; echo

 

#!/bin/bash

. function.sh

BAR
CODE [U-06] root 계정 su 제한
cat << EOF >> $RESULT
[양호]: su 명령어를 특정 그룹에 속한 사용자만 사용하도록 제한되어 있는 경우
[취약]: su 명령어를 모든 사용자가 사용하도록 설정되어 있는 경우
EOF
BAR

PAM_FILE=/etc/pam.d/su
PAM_MODULE=pam_wheel.so
GROUP_FILE=/etc/group

egrep -v '^#|^$' $PAM_FILE | grep -q $PAM_MODULE
if [ $? -eq 0 ] ; then
	INFO 'pam_wheel.so 모듈을 사용하고 있습니다.'
	if grep -q wheel $GROUP_FILE ; then
		INFO 'wheel 그룹이 존재합니다.'
	else
		INFO 'wheel 그룹이 존재하지 않습니다.'
	fi
	OK 'su 명령어를 특정 그룹에 속한 사용자만 사용하도록 제한되어 있는 경우입니다.'
else
	WARN 'su 명령어를 모든 사용자가 사용하도록 설정되어 있는 경우입니다.'
fi

cat $RESULT
echo ; echo

 

 

 


 

 

 

[패스워드 최소 길이 설정]

 

 

1. 취약점 분석/평가 방법 상세 가이드

 

1.7 패스워드 최소 길이 설정

■ 점검 분류 항목: 계정 관리

■ 세부 점검 항목: 패스워드 최소길이 설정

■ 대상: 리눅스

■ 위험도: 

■ 관련 코드: U-07

 

 

(1) 취약점 개요

패스워드 무작위 대입 공격(Brute Force Attack)이나 패스워드 추측 공격(Password Guessing)을 피하기 위하여 패스워드 최소 길이가 설정되어 있는지 점검함. 패스워드 최소 길이가 설정되어 있지 않거나, 짧게 설정되어 있을 경우 쉽게 유추될 수 있음.

 

 

(2) 판단기준

양호: 패스워드 최소 길이가 8자 이상으로 설정되어 있는 경우

취약: 패스워드 최소 길이가 8자 미만으로 설정되어 있는 경우

 

 

(3) 조치방법

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

 

 

(4) 보안 설정 방법

■ 점검 방법

# cat /etc/login.defs

PASS_MIN_LEN 8

■ 설정 방법

1. vi 편집기를 이용하여 "/etc/login.defs" 파일을 연 후

2. 아래와 같이 수정 또는, 신규 삽입

(수정 전) PASS_MIN_LEN 6

(수정 후) PASS_MIN_LEN 8

 

 

(5) 조치시 영향

일반적으로 영향 없음

 

 

 

 

고객에게 취약점을 어떻게 이해시킬것인가?

(고객에게 설명)

패스워드의 최소 길이가 너무 작으면 패스워드 무작위 공격이나 패스워드 추측 공격등에 취약하다. 패스워드 추측 가능성이 높아짐

 

 

 

관련문서 제작

[실습] 암호 복잡성 테스트

/etc/login.defs 파일

/etc/shadow 파일(chage CMD)

 

[실습] 암호 크랙에 대한 테스트(과제)

개인적인 실습으로 진행한다.

- John The Ripper 대한 실습

CentOS에는 John The Ripper 툴이 설치 되어 있지 않음

-> sourceforge.net 다운로드

 

[실습] SetUID 비트를 제거하여 관리자만 암호를 변경할 수 있도록 설정

-> /usr/bin/passwd 명령어의 SetUID 비트 제거

-rwsr-xr-x 1 root root 23K Aug 11 2010 /usr/bin/passwd*

# chmod 755 /usr/bin/passwd

# chmod 4755 /usr/bin/passwd

 

[실습] /etc/passwd, /etc/shadow 파일의 백업본에 대해서

 

 

 

 

컨설팅

(정리) 보안 정책

서버에 대한 관리자 암호를 변경할수 없도록 제어

- 물리적인 보안(H/W Security)

- Fireware 관리자 암호 설정

- GRUB 암호 설정

 

 


 

 

2. 취약점 진단 스크립트 제작

 

 

(스크립트 제작시 참고 사항)

 

# cat /etc/login.defs | egrep –v ‘^#|^$’

# cat /etc/login.defs | egrep –v ‘^#|^$’| grep PASS_MIN_LEN

# cat /etc/login.defs | egrep –v ‘^#|^$’| grep PASS_MIN_LEN | awk ‘{print $2}’

 

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

grep -v '^#' | \

awk '{print $2}'`

 

if [ $NUM -ge 8 ] ; then

echo "OK"

else

echo "WARN"

fi

 

 

(출력결과)

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

[U-07] 패스워드 최소 길이 설정

[양호]: 암호의 최소 길이가 8글자 이상

[취약]: 암호의 최소 길이가 7글자 미만

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

[ 경고 ] : 암호정책 중 암호의 최소길이가 7글자 미만입니다.

[ 정보 ] : PASS_MIN_LEN 5



 

■ (CentOS 7.x) U-07.sh

#!/bin/bash

 

. function.sh

TMP1=`SCRIPTNAME`.log

> $TMP1

TMP2=$(mktemp)

 

BAR

CODE [U-07] 패스워드 최소 길이 설정

cat << EOF >> $RESULT

[양호]: 암호의 최소 길이가 8글자 이상

[취약]: 암호의 최소 길이가 7글자 미만

EOF

BAR

 

LOGINDEFSFILE=/etc/login.defs \

grep PASS_MIN_LEN $LOGINDEFSFILE | egrep -v '^#|^$' >> $TMP2

NUM=$(cat $TMP2 | awk '{print $2}')

if [ $NUM -ge 7 ] ; then

OK 암호의 최소 길이가 8글자 이상입니다.

else

WARN 암호의 최소 길이가 7글자 이하입니다.

INFO $TMP1 파일을 참고하십시오.

echo "=============================================================" >> $TMP1

echo "1. /etc/login.defs 파일 내용 중 PASS_MIN_LEN 설정 부분입니다." >> $TMP1

echo "" >> $TMP1

cat $TMP2 >> $TMP1

echo "=============================================================" >> $TMP1

fi

 

cat $RESULT

echo ; echo

 

 

#!/bin/bash

. function.sh

BAR
CODE [U-07] 패스워드 최소 길이 설정
cat << EOF >> $RESULT
[양호]: 패스워드 최소 길이가 8자 이상으로 설정되어 있는 경우
[취약]: 패스워드 최소 길이가 8자 미만으로 설정되어 있는 경우
EOF
BAR


TMP1=`SCRIPTNAME`.log
> $TMP1
TMP2=$(mktemp)

INFO_FILE=$(cat /etc/login.defs | egrep -v '^#|^$' | grep PASS_MIN_LEN )
CHECK_FILE=$(cat /etc/login.defs | egrep -v '^#|^$' | grep PASS_MIN_LEN | awk '{print $2}')


# echo $CHECK_FILE
if [ $CHECK_FILE -lt 8 ] ; then
	WARN '패스워드 최소 길이가 8자 미만으로 설정되어 있는 경우 입니다.'
	INFO $INFO_FILE
else
	OK '패스워드 최소 길이가 8자 이상으로 설정되어 있습니다.'
	INFO $INFO_FILE
fi

cat $RESULT
echo ; echo

 

 

 


 

 

 

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

 

 

 

1. 취약점 분석/평가 방법 상세 가이드

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

■ 점검 분류 항목: 계정 관리

■ 세부 점검 항목: 패스워드 최대 사용기간 설정

■ 대상: 리눅스

■ 위험도: 

■ 관련 코드: U-08

 

 

(1) 취약점 개요

패스워드 최대 사용기간을 설정하지 않은 경우 일정 기간 경과 후에도 유출된

패스워드로 접속이 가능함. 악의적인 사용자로부터 계속적인 접속을 차단하기 위해

패스워드 최대 사용기간을 설정하여 주기적으로 변경할 수 있도록 함.

 

 

(2) 판단기준

양호: 패스워드 최대 사용기간이 90일(12주) 이하로 설정되어 있는 경우

취약: 패스워드 최대 사용기간이 90일(12주) 이하로 설정되어 있지 않는 경우

 

 

(3) 조치방법

패스워드 정책 설정파일을 수정하여 패스워드 최대 사용기간을 90일(12주)로 설정

 

 

(4) 보안 설정 방법

■ 점검 방법

# cat /etc/login.defs

PASS_MAX_DAYS 90

■ 설정 방법

1. vi 편집기를 이용하여 “/etc/login.defs” 파일을 연 후

2. 아래와 같이 수정 또는, 신규 삽입

(수정 전) PASS_MAX_DAYS 99999

(수정 후) PASS_MAX_DAYS 90 (단위: 일)

 

 

(5) 조치시 영향

일반적으로 영향 없음

 

 

고객에게 취약점을 어떻게 이해시킬것인가?

(고객에게 설명)

?

 

 


 

 

 

2. 취약점 진단 스크립트 제작

 

 

(스크립트 제작 참고 사항)

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

grep -v '^#' | \

grep '^PASS_MAX_DAYS' | \

awk '{print $2}'`

# if [ $NUM -le 90 ] ; then

echo "OK"

else

echo "WARN"

fi

 

 

 

(출력결과)

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

[U-08] 패스워드 최대 사용기간 설정

[양호]: 패스워드 최대 사용기간이 90일(12주) 이하로 설정되어 있는 경우

[취약]: 패스워드 최대 사용기간이 90일(12주) 이하로 설정되어 있지 않는 경우

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

[ 경고 ] : 패스워드 최대 사용기간이 90일(12주) 이하로 설정되어 있지 않습니다.

[ 정보 ] : PASS_MAX_DAYS 99999

 

 

 

(CentOS 7.x) U-08.sh

 

function.sh

SearchValue() {

# $1 : VALUE or KEYVALUE

# $2 : specified file

# $3 : the word you want to find

# VALUE :

# KEYVALUE :

SEARCH=$(egrep -v '^#|^$' $2 | sed 's/#.*//' | grep -w $3)

if [ -z "$SEARCH" ] ; then

echo FALSE

else

if [ $1 = 'KEYVALUE' ] ; then

echo $SEARCH

elif [ $1 = 'VALUE' ] ; then

echo "$SEARCH" | awk '{print $2}'

fi

fi

}


U-08.sh

#!/bin/bash

 

. function.sh

TMP1=`SCRIPTNAME`.log

> $TMP1

 

BAR

CODE [U-08] 패스워드 최대 사용기간 설정

cat << EOF >> $RESULT

[양호]: 패스워드 최대 사용기간이 90일(12주) 이하로 설정되어 있는 경우

[취약]: 패스워드 최대 사용기간이 90일(12주) 이하로 설정되어 있지 않는 경우

EOF

BAR

 

LOGINDEFSFILE=/etc/login.defs

SEARCHVALUE=PASS_MAX_DAYS

NUM=$(SearchValue VALUE $LOGINDEFSFILE $SEARCHVALUE)

if [ $NUM -le 90 ] ; then

OK "패스워드 최대 사용기간이 90일(12주) 이하로 설정되어 있습니다."

else

WARN "패스워드 최대 사용기간이 90일(12주) 이하로 설정되어 있지 않습니다."

INFO $TMP1 파일을 참고 하시오.

echo "===================================================" >> $TMP1

echo "1. $LOGINDEFSFILE 파일의 내용입니다." >> $TMP1

echo "" >> $TMP1

SearchValue KEYVALUE $LOGINDEFSFILE $SEARCHVALUE >> $TMP1

echo "===================================================" >> $TMP1

fi

 

cat $RESULT

echo ; echo

 

#!/bin/bash

. function.sh

BAR
CODE [U-07] 패스워드 최소 길이 설정
cat << EOF >> $RESULT
[양호]: 패스워드 최대 사용기간이 90일(12주) 이하로 설정되어 있는 경우
[취약]: 패스워드 최대 사용기간이 90일(12주) 이하로 설정되어 있지 않은 경우
EOF
BAR

TMP1=$(SCRIPTNAME).log
>$TMP1

Value=$(egrep -v '^#|^$' /etc/login.defs | grep PASS_MAX_DAYS)
CHECK_FILE=$(egrep -v '^#|^$' /etc/login.defs | grep PASS_MAX_DAYS | awk '{print $2}')
#echo $CHECK_FILE
if [ $CHECK_FILE -le 90 ] ; then
	OK "패스워드 최대 사용기간이 90일(12주) 이하로 설정되어 있습니다."
else
	WARN "패스워드 최대 사용기간이 90일(12주) 이하로 설정되어 있지 않습니다."
	INFO $TMP1 파일을 참고 하세요.
	echo "===================================================" >> $TMP1
	echo "1. $LOGINDEFSFILE 파일의 내용입니다." >> $TMP1
	echo "" >> $TMP1
	echo $Value >> $TMP1
	echo "===================================================" >> $TMP1
fi


cat $RESULT
echo ; echo

 

 

 


 

 

 

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

 

 

 

1. 취약점 분석/평가 방법 상세 가이드

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

■ 점검 분류 항목: 계정 관리

■ 세부 점검 항목: 패스워드 최소 사용기간 설정

■ 대상: 리눅스

■ 위험도: 

■ 관련 코드: U-09

 

 

(1) 취약점 개요

패스워드 최소 사용기간을 설정하지 않은 경우 사용자에게 익숙한 패스워드로 변경이

가능하며, 이를 재사용함으로써 패스워드의 정기적인 변경은 무의미해질 수 있음.

이전 암호를 그대로 재사용하는 것을 방지하기 위해 최근 암호 기억 설정을 함께

적용하여 패스워드를 보호함.

 

 

(2) 판단기준

양호: 패스워드 최소 사용기간이 1일(1주)로 설정되어 있는 경우

취약: 패스워드 최소 사용기간이 설정되어 있지 않는 경우

 

 

(3) 조치방법

패스워드 정책 설정파일을 수정하여 패스워드 최소 사용기간을 1일(1주)로 설정

 

 

(4) 보안 설정 방법

■ 점검 방법

# cat /etc/login.defs

PASS_MIN_DAYS 1

■ 설정 방법

1. vi 편집기를 이용하여 “/etc/login.defs” 파일을 연 후

2. 아래와 같이 수정 또는, 신규 삽입

(수정 전) PASS_MIN_DAYS

(수정 후) PASS_MIN_DAYS 1 (단위: 일)

 

 

(5) 조치시 영향

일반적으로 영향 없음

 

 

 

고객에게 취약점을 어떻게 이해시킬것인가?

 

 

(고객에게 설명)

?

 

 


 

 

 

2. 취약점 진단 스크립트 제작

 

 

(스크립트 제작 참고)

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

grep -v '^#' | \

grep '^PASS_MIN_DAYS' | \

awk '{print $2}'`

# if [ $NUM -ge 1 ] ; then

echo "OK"

else

echo "WARN"

fi

 

 

 

(출력결과)

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

[U-09] 패스워드 최소 사용기간 설정

[양호]: 패스워드 최소 사용기간이 1일(1주)로 설정되어 있는 경우

[취약]: 패스워드 최소 사용기간이 설정되어 있지 않는 경우

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

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

[ 정보 ] : PASS_MIN_DAYS 0

 

 

 

 

(CentOS 7.x)

 

function.sh

LOG=check.log
RESULT=result.log
> $LOG
> $RESULT

BAR() {
echo "========================================================================" >> $RESULT
}

NOTICE() {
echo '[ OK ] : 정상'
echo '[WARN] : 비정상'
echo '[INFO] : Information 파일을 보고, 고객과 상의'
}

OK() {
echo -e '\033[32m'"[ 양호 ] : $*"'\033[0m'
} >> $RESULT

WARN() {
echo -e '\033[31m'"[ 취약 ] : $*"'\033[0m'
} >> $RESULT

INFO() { 
echo -e '\033[35m'"[ 정보 ] : $*"'\033[0m'
} >> $RESULT

CODE(){
echo -e '\033[36m'$*'\033[0m' 
} >> $RESULT

SCRIPTNAME() {
basename $0 | awk -F. '{print $1}' 
}

FindPatternReturnValue() {
# $1 : File name
# $2 : Find Pattern
if egrep -v '^#|^$' $1 | grep -q $2 ; then # -q = 출력 내용 없도록
	ReturnValue=$(egrep -v '^#|^$' $1 | grep $2 | awk -F= '{print $2}')
else
	ReturnValue=None
fi
echo $ReturnValue
}

IsFindPattern() {
if egrep -v '^#|^$' $1 | grep -q $2 ; then # 라인의 처음이#, 라인의 처음이 마지막으로 되어있는
	ReturnValue=$?
else
	ReturnValue=$?
fi
echo $ReturnValue
}

PAM_FindPatternReturnValue() {
PAM_FILE=$1
PAM_MODULE=$2
PAM_FindPattern=$3
LINE=$(egrep -v '^#|^$' $PAM_FILE | grep $PAM_MODULE)
if [ -z "$LINE" ] ; then #내용이 없으면 (zero면) None을 출력
	ReturnValue=None
else
	PARAMS=$(echo $LINE | cut -d ' ' -f4-)
	# echo $PARAMS
	set $PARAMS
	while [ $# -ge 1 ]
	do
		CHOICE1=$(echo $* | awk '{print $1}' | awk -F= '{print $1}')
		CHOICE2=$(echo $* | awk '{print $1}' | awk -F= '{print $2}')
		# echo "$CHOICE1 : $CHOICE2"
		case $CHOICE1 in
			$PAM_FindPattern) ReturnValue=$CHOICE2 ;;
			*) : ;;		
		esac
		shift
	done
fi
echo $ReturnValue
}


: << EOF
PAM_FindPatternReturnValue() {
PAM_FILE=$1
egrep -v '^#|^$' $PAM_FILE \
	| egrep 'pam_faillock.so | pam_tally2.so' \
	| while read TYPE CONTROL PAM PAM_ARGS
do
	set $PAM_ARGS
	while [ $# -ge 1 ]
	do
		CHOICE=$(echo $* | awk '{print $1}') 
		if echo $CHOICE | egrep -q 'deny|unlock_time' ; then
			PARAMETER=$(echo $CHOICE | awk -F= '{print $1}')
			VALUE=$(echo $CHOICE | awk -F= '{print $2}')  # 값만 뽑아낸다
			case $PARAMETER in
				'deny') echo $VALUE ;;
				'unlock_time') echo $VALUE ;;
				*) continue ;;
			esac
		fi
		shift
	done
done
}
EOF



CheckEncryptedPasswd() {
SFILE=$1
# $1$saltkey$encrypted 숫자들은 암호화 알고리즘의 종류
# $2a$saltkey$encrypted
# $5$saltkey$encrypted
# $6$saltkey$encrypted 우리는 6번을 써야함
EncryptedPasswdField=$(grep '^root' $SFILE | awk -F: '{print $2}' | awk -F'$' '{print $2}')
#echo $EncryptedPasswdField
case $EncryptedPasswdField in
	1|2a|5) echo WarnTrue ;;
	6) echo TrueTrue ;;
	*) echo 'None' ;;

esac
}



#	1) echo "암호화 방식 : MD5" ;; # 메뉴얼 확인 : man 5 shadow ; man 3 crypt
#	2a) echo "암호화 방식 : Blowfish" ;;
#	5) echo "암호화 방식 : SHA-256" ;;
#	6) echo "암호화 방식 : SHA-512" ;;
#	*) echo "암호화 방식 : None" ;;



SearchValue() {
# $1 : VALUE or KEYVALUE
# $2 : specified file
# $3 : the word you want to find
# VALUE :
# KEYVALUE :

SEARCH=$(egrep -v '^#|^$' $2 | sed 's/#.*//' | grep -w $3)
if [ -z "$SEARCH" ] ; then
	echo FALSE
else
	if [ $1 = 'KEYVALUE' ] ; then
	echo $SEARCH
elif [ $1 = 'VALUE' ] ; then
	echo "$SEARCH" | awk '{print $2}'
	fi
fi
}


 

 

U-09.sh

 

#!/bin/bash

. function.sh
TMP1=`SCRIPTNAME`.log
> $TMP1

BAR
CODE [U-09] 패스워드 최소 사용기간 설정
cat << EOF >> $RESULT
[양호]: 패스워드 최소 사용기간이 1일(1주)로 설정되어 있는 경우
[취약]: 패스워드 최소 사용기간이 설정되어 있지 않는 경우
EOF
BAR

LOGINDEFSFILE=/etc/login.defs
SEARCHVALUE=PASS_MIN_DAYS
NUM=$(SearchValue VALUE $LOGINDEFSFILE $SEARCHVALUE)
if [ $NUM -ge 7 ] ; then
	OK "패스워드 최소 사용기간이 1일(1주)로 설정 되어 있습니다."
else
	WARN "패스워드 최소 사용기간이 1일(1주)로 설정 되어 있지 않습니다."
	INFO $TMP1 파일을 참고 하시오.
	echo "===================================================" >> $TMP1
	echo "1. $LOGINDEFSFILE 파일의 내용입니다." >> $TMP1
	echo "" >> $TMP1
	SearchValue KEYVALUE $LOGINDEFSFILE $SEARCHVALUE >> $TMP1
	echo "===================================================" >> $TMP1
fi

cat $RESULT
echo ; echo

 


 

 

 

[패스워드 정책 실습 내용 정리]

 

 

[참고] Set a password policy in Red Hat Enterprise Linux 7 and 8

https://access.redhat.com/solutions/2808101

 

[참고] CentOS / RHE 7 : How to Prevent Users from Using the Last 10 Passwords

https://www.thegeekdiary.com/centos-rhe-7-how-to-prevent-users-from-using-the-last-10-passwords/

 

 

 

[패스워드 정책 실습 내용]

(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))

- /etc/pam.d/passwd (/etc/pam.d/system-auth(pam_pwquality.so (/etc/security/pwquality.conf)

 

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

- /etc/login.defs(PASS_MIN_DAYS)

 

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

- /etc/login.defs(PASS_MAX_DAYS, PASS_WARN_AGE)

 

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

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

- /etc/pam.d/passwd, /etc/pam.d/system-auth(pam_pwhistory.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(wheel 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_tally2.so)

- /etc/pam.d/login, /etc/pam.d/system-auth(pam_faillock.so)

 

 

Password History

이전에 사용하던 암호를 기억해 두었다가, 새로운 암호 입력시 비교하는 동작

=> 최근에 사용한 암호를 사용할 수 없도록 하기 위한 기능.

 

(CentOS 7.x)

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

#%PAM-1.0

# This file is auto-generated.

# User changes will be destroyed the next time authconfig is run.

auth required pam_env.so

auth sufficient pam_fprintd.so

auth sufficient pam_unix.so nullok try_first_pass

auth requisite pam_succeed_if.so uid >= 1000 quiet_success

auth required pam_deny.so

 

account required pam_unix.so

account sufficient pam_localuser.so

account sufficient pam_succeed_if.so uid < 1000 quiet

account required pam_permit.so

 

password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=

password requisite pam_pwhistory.so debug use_authok remember=4 retry=3

password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok

password required pam_deny.so

 

session optional pam_keyinit.so revoke

session required pam_limits.so

-session optional pam_systemd.so

session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid

session required pam_unix.so

 

 

 

 

 

728x90

+ Recent posts