[목차]

 

 

 

패스워드 파일 보호(1.4)

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

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

 

 

root 이외의 UID가 '0' 금지(1.5)

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

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

 

 

 

 


 

 

 

[패스워드 파일 보호]

 

 

 

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

 

1.4 패스워드 파일 보호

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

■ 세부 점검 항목: 패스워드 파일 보호

■ 대상: 리눅스

■ 위험도: 

■ 관련 코드: U-04



(1) 취약점 개요

패스워드 정보를 평문으로 저장하는 경우 정보 유출 피해가 발생할 수 있으므로 패스워드를 암호화하여 보호하여야 함. 쉐도우 패스워드를 사용하여 "/etc/shadow"파일에 암호화된 패스워드가 저장되도록 하고 특별 권한이 있는 사용자들만 읽을 수 있도록 제한함.

 

(2) 판단기준

양호: 쉐도우 패스워드(EX: shadow)를 사용하거나, 패스워드를 암호화하여 저장하는 경우

취약: 쉐도우 패스워드를 사용하지 않고, 패스워드를 암호화하여 저장하지 않는 경우

 

(3) 조치방법

패스워드 암호화 저장∙관리 설정 적용

 

(4) 보안 설정 방법

① /shadow 파일 존재 확인 (일반적으로 /etc 디렉터리 내 존재)

# ls /etc

② /etc/passwd 파일 내 두 번째 필드가 "x" 표시되는지 확인

# cat /etc/passwd

root:x:0:0:root:/root:/bin/bash

 

(5) 조치시 영향

Trusted Mode로 전환 시 파일시스템 구조가 변경되어 운영 중인 서비스에 문제가 발생할 수 있으므로 충분한 테스트를 거친 후 Trusted Mode로의 전환이 필요함.



 

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

(고객에게 설명)

/etc/passwd(rw-r--r--) 파일은 other 퍼미션에 read 권한이 필요하다.

많은 프로그램들이 /etc/passwd 파일을 참조하여 동작하기 때문이다.

 

/etc/passwd 파일안에 암호화된 암호가 들어 있는 경우에는

악의적인 사용자에 의해 암호화된 암호를 크랙 당할 수 있는 가능성이 있다.

(EX) user01:$1$5NMpVSbZ$iOKUDimAmp9KtlzGuE6A01:1002:1002::/home/user01:/bin/bash

$1(암호화방식)$ (솔트키)5NMpVSbZ $(암호해시)iOKUDimAmp9KtlzGuE6A01

따라서, /etc/passwd 파일 체계(암호화된 암호는 /etc/passwd에 저장)를 사용하는 것은 보안상 위험하다. 그래서 /etc/passwd, /etc/shadow(암호화된 암호는 /etc/shadow에 저장) 파일을 사용하는 체계를 사용해야 한다.

 

 

 

관련문서 제작

[실습] pwconv/pwunconv 명령어 실습

* /etc/passwd -- pwunconv --> /etc/passwd, /etc/shadow

* /etc/passwd, /etc/shadow -- pwconv --> /etc/passwd

 

 

 

 

컨설팅

(보안정책)

리눅스의 기본 체계를 쓸것을 권장한다.

 

[참고] /etc/passwd, /etc/shadow 파일의 백업본 존재 유무 확인

# ls -l /etc/*passwd*

# ls -l /etc/*shadow*

 

 


 

 

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

 

 

 

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

/etc/passwd 파일이 존재하지 않는 경우는 없다.

패스워드는 반드시 암호화되어 있다. 암호화 되어 있지 않는 경우는 없다.

/etc/passwd 파일만 쓰는 경우와 /etc/passwd, /etc/shadow 파일을 사용하는 체계가 있다.

(결국 shadow 파일이 있는가 없는가를 확인하면 됨)

 

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

/etc/shadow 파일이 존재하는가를 점검한다.

 

 

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

(CentOS 5.x) U-04.sh

#!/bin/bash

 

. function.sh

 

BAR

CODE [U-04] 패스워드 파일 보호

cat << EOF >> $RESULT

[양호]: 쉐도우 패스워드를 사용하거나, 패스워드를 암호화하여 저장하는 경우

[취약]: 쉐도우 패스워드를 사용하지 않고, 패스워드를 암호화하여 저장하지 않는 경우

EOF

BAR

 

FILE1=/etc/passwd

FILE2=/etc/shadow

 

if [ -f $FILE1 -a -f $FILE2 ] ; then

OK 쉐도우 패스워드를 사용하며, 패스워드가 암호화되어 있습니다.

else

WARN 쉘도우 패스워드 파일을 사용하지 않습니다.

fi

 

cat $RESULT

echo; echo

 

 

function.sh

..중략..

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" ;;

 

 

(CentOS 7.x) U-04.sh

 

#!/bin/bash


. function.sh

BAR
CODE [U-04] 패스워드 파일 보호
cat << EOF >> $RESULT
[양호]: 쉐도우 패스워드를 사용하거나, 패스워드를 암호화하여 저장하는 경우
[취약]: 쉐도우 패스워드를 사용하지 않고, 패스워드를 암호화하여 저장하지 않는 경우
EOF
BAR

PASSFILE=/etc/passwd
#PASSFILE=passwd
SHADOWFILE=/etc/shadow
#SHADOWFILE=shadow


if [ -f $PASSFILE -a -f $SHADOWFILE ] ; then
	Ret1=$(CheckEncryptedPasswd $SHADOWFILE)
	case $Ret1 in
		None) WARN '쉐도우 패스워드를 사용하지만, 패스워드가 암호화 되어 있지 않습니다.' ;;
		TrueTrue) OK '쉐도우 패스워드를 사용하거나, 패스워드를 암호화하여 저장하고 있습니다.' ;;
		WarnTrue) OK '쉐도우 패스워드를 사용하거나, 패스워드를 암호화하여 저장하고 있습니다.'  ; 					    INFO 'SHA-512 알고리즘을 사용할 것을 권장합니다.' ;;
		*) : ;;
	esac
else
	WARN "쉐도우 패스워드를 사용하지 않고 있습니다."
fi


cat $RESULT
echo ; echo

 

 


 

 

 

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

 

 

 

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

  • 0열 선택0열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가

셀 전체 선택

열 너비 조절

행 높이 조절

1.5 root 이외의 UID가 '0' 금지

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

■ 세부 점검 항목: root 이외의 UID가 '0' 금지

■ 대상: 리눅스

■ 위험도: 

■ 관련 코드: U-05

 

 

(1) 취약점 개요

root(UID=0)와 동일한 *UID(User Identification)를 가진 계정 존재 시 root 권한으로 시스템 접근이 가능하므로 root의 UID를 가진 계정이 존재하지 않도록 확인하여야 함.

root 뿐만 아니라 사용자 간 UID 중복 시에도 권한 중복으로 인한 사용자 감사 추적이 어렵게 되는 문제가 발생하므로 계정 및 UID 확인이 필요함.

UID(User Identification): 여러 명의 사용자가 동시에 사용하는 시스템에서 사용자가 자신을 대표하기 위해 쓰는 이름.

 

 

(2) 판단기준

양호: root 계정과 동일한 UID를 갖는 계정이 존재하지 않는 경우

취약: root 계정과 동일한 UID를 갖는 계정이 존재하는 경우

 

 

(3) 조치방법

UID가 0인 계정 존재 시 변경할 UID를 확인 후 다른 UID로 변경 및 불필요 시 삭제, 계정이 사용 중이면 명령어로 조치가 안 되므로 /etc/passwd 파일 설정 변경

 

 

(4) 보안 설정 방법

1. usermod 명령으로 UID가 0인 일반 계정의 UID를 500 이상으로 수정

(예) test 계정의 UID를 2002 로 바꿀 경우

# usermod -u 2002 test

※ 각 OS별로 사용자 UID 체계가 달라 시스템 계정 및 일반 사용자 계정이 부여받는 값의 범위에

차이가 있으며, 공통적으로 관리자는 "UID=0"을 부여받음

 

 

(5) 조치시 영향

해당 계정에 관리자 권한이 필요하지 않으면 일반적으로 영향 없음

 

 

 

 

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

(고객에게 설명)

리눅스 운영체제에서는 사용자 이름이 아닌 UID를 통해 권한 할당이 된다. 따라서 user01 사용자 이름을 가지고 있지만 UID 번호가 0으로 되어 있다면, 관리자와 동인할 기능을 갖는다.

간단한 테스트

# usermod -u 0 -o user01

# telnet localhost

user01 사용자로 로그인

$ id

$ exit

# usermod -u 1001 user01

 

 

관련문서 제작

[실습] user01 사용자를 추가하고 uid 번호를 0으로 설정하여 권한 상승 실습

 

 

 

컨설팅

(보안 정책)

중복된 UID 번호를 쓰는 사용자가 존재하는지와 UID 번호가 0으로 설정된 사용자 확인

 

 

 


 

 

 

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

 

 

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

root 사용자와 동일한 UID를 갖는 사용자가 있을 때는 반드시 컨설턴트에게 알려줘야 한다.

 

 

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

# cat /etc/passwd | awk -F: '{print $3}' | sort -n | uniq –d

 

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

root

user01

 

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

root : 0

user01 : 0

 

 

 

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

■ U-05.sh

#!/bin/bash

 

. function.sh

TMP1=`SCRIPTNAME`.log

> $TMP1

 

BAR

CODE [U-05] root 이외의 UID가 '0' 금지

cat << EOF >> $RESULT

[양호]: root 계정과 동일한 UID를 갖는 계정이 존재하지 않는 경우

[취약]: root 계정과 동일한 UID를 갖는 계정이 존재하는 경우

EOF

BAR

 

FILE1=/etc/passwd

 

echo "[root 사용자와 동일한 UID를 갖는 계정들]" > $TMP1

awk -F: '$3 == "0" {print $1 " = 0"}' $FILE1 >> $TMP1

NUM=`cat $TMP1 | wc -l`

if [ $NUM -ge 3 ] ; then

WARN root 계정과 동일한 UID를 갖는 계정이 존재합니다.

INFO $TMP1 파일을 점검합니다.

else

OK root 계정과 동일한 UID를 갖는 계정은 없습니다.

fi

 

cat $RESULT

echo; echo

 

 

(CentOS 7.x) 다른 예 : U-05.sh

#!/bin/bash

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

BAR
CODE [U-05] root 이외의 UID가 '0' 금지
cat << EOF >> $RESULT
[양호]: root 계정과 동일한 UID를 갖는 계정이 존재하지 않는 경우
[취약]: root 계정과 동일한 UID를 갖는 계정이 존재하는 경우
EOF
BAR

PASSFILE=passwd
awk -F: '$3 == "0" {print $1}' $PASSFILE >> $TMP1
UIDZEROCNT=$(wc -l < $TMP1)
if [ $UIDZEROCNT -ge 2 ] ; then
	WARN 'root 계정과 동일한 UID를 갖는 계정이 존재합니다'
	INFO $TMP1 참고 하십시오
else
	OK 'root 계정과 동일한 UID를 갖는 계정은 없습니다.'
fi

cat $RESULT
echo ; echo

 

728x90

+ Recent posts