부산정보산업진흥원/보안

CentOS7 계정 취약점 관리

newind2000 2017. 7. 7. 17:58

주요정보통신기반시설에 열거 되어 있는 취약점 분석 평가 항목을 바탕으로 CentOS7의 계정관리 부분에 대한 취약점 관리 가이드를 작성해 본다.



[root 계정 원격 접속 제한]

1. 설명

root계정은 시스템에 대한 전지전능한 계정을 가짐으로 외부에서 root 권한으로 접속하는 것을 차단해 주는것이 보안적인 입장에서 안전하다.

root계정의 외부 접속 차단은 여부는 다음과 같이 파악 가능하다.


2. 방법  

"/etc/pam.d/login" 파일에서 아래의 내용을 추가한다. 

"auth required /lib/security/pam_securetty.so"


 #cat /etc/securetty pts/0 ~ pts/x 관련 설정이 존재하지 않음

3. 스크립트

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

if [ $? -eq 0 ] ; then

        echo "비정상"

else

        echo "정상"

fi



[패스워드 설정:

- 패스워드 복잡성 설정

- 패스워드 최소 길이 설정

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

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

- 패스워드 임계값 설정]


1. 설명

단순하거나 유추가능한 비밀번호의 설정은 시스템 공격자에게 접속을 용이하게 한다. 따라서 비밀번호는 8자 이상의 복합된 문자와 기호로 설정하도록 만드는 것이 보안을 높이는 방법이다. 또한 비밀번호 입력 시도에 대한 제한이 없으면 한정된 경우의 수에 따라 언젠가는 비밀번호가 풀리게 된다. 이것을 방지하기 위해 비밀번호 시도 횟수에 대한 제한을 설정해야 한다.


2. 방법

CentOS의 비밀번호 복잡성 설정은 "/etc/login.defs" 파일에서 가능하다.


PASS_MAX_DAYS - 비밀번호를 사용할 수 있는 최대 기간

PASS_MIN_DAYS - 비밀번호를 변경 간 최소 기간(비밀번호 변경 후 다시 변경하려면 기다려야 하는 최소 기간)

PASS_MIN_LEN - 비밀번호 최소 길이

PASS_WARN_AGE - 비밀번호 변경 만료를 알리는 기간(5일을 설정하면, 비밀번호 만료 5일 전부터 알려준다)



- 최소 1년에 한번씩 비밀번호를 바꾸도록하고

- 한번 비밀번호를 변경하면 적어도 3일간은 변경하지 못하도록 하고

- 비밀번호의 최소 길이는 8자

- 비밀번호 만료를 알리는 기간을 30일


비밀번호의 복잡성은 "/etc/pam.d/system-auth" 파일에서 설정할 수 있다.

- 비밀번호에 대/소문자, 숫자, 기호를 다 사용하도록 설정


"ucredit=x" 대문자 x개 이상 사용

"lcredit=x" 소문자 x개 이상 사용

"dcredit=x" 숫자 x개 이상 사용

"ocredit=x" 기호 x개 이상 사용


password requisite pam_cracklib.so type= ucredit=1 lcredit=1 dcredit=1 ocredit=1


- 비밀번호 시도 3회

"try_first_pass retry = x" 비밀번호 접속 시도 x회 이상 틀렸을 시 차단


password requisite pam_cracklib.so try_first_pass retry=3

auth required pam_tally2.so deny=3
account required pam_tally2.so


- 과거 사용한 비밀번호 재사용 금지

password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=x

x개까지 과거 사용한 비밀번호 기억하여 재사용지 금지



* 3번이상 틀리면 터미널창이 얼어버린다.


3. 스크립트

- 복잡성

복잡한 암호를 사용해야 한다.(문자(대문자/소문자), 숫자특수문자공백문자)

암호의 최소 길이는 8글자 이상으로 한다.

관리자의 정책 

(암호를 정기적으로 변경하도록 유도(/etc/login.defs, chage CMD) 

(암호를 사용자가 변경할수 없도록 설정(# chmod u-s /usr/bin/passwd)

# ls -l /usr/bin/passwd

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

# chmod u-s /usr/bin/passwd

# ls -l /usr/bin/passwd

 

# telnet localhost

user01 사용자로 로그인

$ passwd

-> 자신의 암호를 변경할 수 있는가?

$ exit

# passwd user01

-> 관리자가 user01 사용자의 암호 변경이 가능한가?

# chmod 4755 /usr/bin/passwd

# ls -l /usr/bin/passwd



- 임계값

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

auth required /lib/security/pam_tally.so deny=5 unlock_time=120 no_magic_root

account required /lib/security/pam_tally.so no_magic_root reset

 

no_magic_root   : root 사용자에게 패스워드 잠금 설정을 적용하지 않음

deny=5          : 5회 입력 실패시 패스워드 잠금

unlock_time     계정 잠김 후 마지막 계정 실패 시간부터 설정된 시간이 지나면 자동 계정

                         잠김 해제(단위 )

reset           접속 시도 성공 시 실패한 횟수 초기화


- 패스워드 최소 길이 설정

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

grep -v '^#' | \

grep '^PASS_MIN_LEN' | \

awk '{print $2}'`

# if [ $NUM -ge 8 ] ; then

        echo "OK"

else

        echo "WARN"

fi

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

# 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


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

# 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


[패스워드 파일 보호]


1. 설명


패스워드가 저장되어 있는 파일이 공격자에 의해 혹은 사용자에 의해 외부로 노출될 수 있음으로 "/etc/shadow" 파일은 특정 권한이 있는 사용자들만 사용할 수 있도록 권한을 제한해야 한다.


2. 방법

"/etc/shadow" 파일의 존재를 확인하고, 



"/etc/passwd"의 두번째 필드가 "x"로 표시되는지 확인한다.



쉐도우 패스워드 정책을 적용하도록 설정한다.

"pwconv"

3. 스크립트

# [ -f /etc/passwd -a -f /etc/shadow ] && echo "OK" || echo "WARN"

 

or

 

if [ -f /etc/passwd -a -f /etc/shadow ] ; then

         echo "OK"

else

         echo "WARN"

fi


[root 이외의 UID가 '0' 금지]


1. 설명

UID=0 인 것은 시스템에서 root와 같은 권한을 가짐으로 root 이외에 UID가 0인것을 확인하여 제거해 주어야 한다.


2. 방법


"/etc/passwd" 로 가서 내용을 확인하고 세번째 필드의 값이 "0"인 경우 삭제한다.



하나 밖에 없음을 알 수 있다.


[root 계정 su 제한]


1. 설명

"su" 명령어를 사용하면 권한이 없는 일반 사용자도 root 권한을 획득할 수 있기 때문에 허용된 사용자에게만 "su" 명령어를 사용할 수 있도록 설정해주어야 한다.


2. 방법


"/etc/group" 파일에서 "wheel" 소속이 누구인지 확인하고, 원하지 않은 그룹이 있을 경우 삭제



허용 그룹만 su를 사용할 수 있는지 확인

"cat /etc/pam.d/su"




CentOS의 비밀번호 복잡성 설정은 "/etc/login.defs" 파일에서 가능하다.


PASS_MAX_DAYS - 비밀번호를 사용할 수 있는 최대 기간

PASS_MIN_DAYS - 비밀번호를 변경 간 최소 기간(비밀번호 변경 후 다시 변경하려면 기다려야 하는 최소 기간)

PASS_MIN_LEN - 비밀번호 최소 길이


3. 스크립트

# NUM=`awk -F: '{print $3}' /etc/passwd | sort -n | uniq -d | wc -l`

# if [ $NUM -gt 0 ] ; then

         echo "WARN"

else

         echo "OK"

fi

 

or

 

# grep -v '^root' /etc/passwd | awk -F: '$3 == 0 {print $1 " = 0"}'


 

root' /etc/passwd | awk -F: '$3 == 0 {print $1 " = 0"}'




[불필요한 계정 제거]

1. 설명

계정 목록에서 사용하지 않은 아이디는 공격자에 의해 비밀번호 추측 공격의 대상이 될 수 있음으로 사용하지 않거나 의심스러운 계정은 지속적으로 확인하고 삭제해 주어야 한다.


2. 방법

"etc/passwd"에서 미사용 계정 혹은 의심스러운 계정(lp, uucp,nuucp)을 확인하고 삭제해 준다.


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

1. 설명

시스템에 대한 전반적인 권한을 가진 관리자 계정은 그 수를 최소한으로 제한해야 한다. 


2. 방법

"/etc/group" 파일에서 관리자 권한이 불필요한 계정은 삭제한다.



[계정이 존재하지 않는 GID 금지]


1. 설명

구성원이 존재하지 않는 그룹이 존재하는 경우, 해당 그룹 소유의 파일이 공격자에게 노출될 가능성이 있음으로, 구성원이 존재하지 않는 그룹은 삭제해 주어야 한다.


2. 방법

"/etc/group" 파일 내에 계정이 없고 사용하지 않는 그룹은 삭제해 준다.


3. 스크립트

# awk -F: '{print $1}' /etc/passwd > input.txt

# awk -F: '{print $1}' /etc/group > input2.txt

# cat input.txt | while read SARAM

do

grep -w "$SARAM" input2.txt >/dev/null 2>&1

if [ $? -eq 0 ] ; then

echo "[ OK ] : $SARAM"

else

echo "[ WARN ] : $SARAM"

fi

done


[동일한 UID 금지]


1. 설명

UID는 시스템에서 사용자 정보를 대응시키는 역할을 하기 때문에, 중복된 UID가 존재할 경우 시스템에 문제가 발생할 수 있음은 물론 데이터 유출 시에도 감사 추적이 어렵게 된다. 때문에 중복된 UID가 있을 경우 이를 삭제해 주어야 한다.


2. 방법 

"etc/passwd" 파일에서 동일한 UID가 존재할 경우,

"usermod -u <변경할 UID값> <user_name>"을 사용하여 UID를 변경해 준다.


3. 스크립트

# cat /etc/passwd | awk -F: '{print $3}' > output.txt

# NUM=`cat output.txt | sort -n | uniq -d | wc -l`

# if [ $NUM -gt 0 ] ; then

echo "[ WARN ]"

else

echo "[ OK ]"

fi



[사용자 shell 점검]


1. 설명

로그인이 필요하지 않은 계정에 경우 공격자가 해당 계정으로 접근하여 시스템을 공격할 수 있음으로 로그인이 필요없는 계정인 경우 쉘(shell)을 부여하여 로그인을 금지한다.


2. 방법

"/etc/passwd"파일을 연 후, 로그인이 필요 없는 계정에 대해서는 로그인 쉘 부분에 "/bin/false" 혹은 "/bin/nologin"

 



[Session Timeout 설정]


1. 설명

계정 접속이 특정 시간동안 방치될 경우 연결을 끊어 공격자로부터의 시스템 접속을 방지한다.


2. 방법

"/etc/profile" 혹은 "/etc/.profile" 에서 "TIMEOUT"시간을 설정해 준다.




반응형