[목차]

 

 

불필요한 계정 제거 (1.10)

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

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

 

 

관리자 그룹에 최소한의 계정 포함(1.11)

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

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

 

 

계정이 존재하지 않는 GID 금지(1.12)

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

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

 

 

 


 

 

 

[불필요한 계정 제거]

 

 

 

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

1.10 불필요한 계정 제거

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

■ 세부 점검 항목: 불필요한 계정 제거

■ 대상: 리눅스

■ 위험도: 

■ 관련 코드: U-10

 

 

(1) 취약점 개요

OS나 Package 설치 시 Default로 생성되는 계정은 대부분 Default 패스워드를 사용하는 경우가 많으며 패스워드 추측공격에 악용될 수 있으므로 시스템에서 이용하지 않는 "lp, uucp, nuucp" 등의 Default 계정 및 의심스러운 특이한 계정의 존재 유무를 확인 후 삭제함. 또한, 관리되지 않은 불필요한 계정으로 인해 시스템 접속이 가능하므로 퇴직, 전직, 휴직 등의 이유로 더 이상 사용하지 않는 계정, 불필요한 계정, 의심스러운 계정은 제거해야 함. 특히, 장기간 패스워드가 변경되지 않은 미사용 계정은 반복적인 패스워드 추측 공격(Password Guessing)이 가능하고 해당 계정 정보의 유출 여부 확인이 어려움.

 

 

(2) 판단기준

양호: 불필요한 계정이 존재하지 않는 경우

취약: 불필요한 계정이 존재하는 경우

 

 

(3) 조치방법

현재 등록된 계정 현황 확인 후 불필요한 계정 삭제

 

(4) 보안 설정 방법

■ 점검 방법

1. 미사용 계정 및 의심스러운 계정 존재 여부 확인

# cat /etc/passwd

 

 

2. 사용하지 않는 Default 계정 점검 (lp, uucp, nuucp 계정 존재 확인 예시)

# cat /etc/passwd | egrep "lp|uucp|nuucp"

 

 

3. 로그인 실패 기록 점검을 통해 미사용 계정 및 의심스러운 계정 확인

# cat /var/log/sulog

■ 설정 방법

1. 서버에 등록된 불필요한 사용자 계정 확인

2. userdel 명령으로 불필요한 사용자 계정 삭제

# userdel <user_name>

※ /etc/passwd 파일에서 계정 앞에 #을 삽입하여도 주석처리가 되지 않으므로 조치 시에는 반드시 계정을 삭제하도록 권고함

 

 

(5) 조치시 영향

일반적으로 영향 없음



 

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

(고객에게 설명)

로그인이 가능한 사용자 계정들은 로그인을 통해서 시스템에 접근이 가능하기 때문에 로그인 계정의 패스워드 부재로 인한 패스워드 유출이나 패스워드 추측 공격으로 인한 패스워드 유출가능성이 있음. 오랫동안 로그인 하지 않은 계정은 계정만 만들어지고 관리가 되지 않는 계정일 가능성이 높으며, 이런 경우 계정을 악의적인 사용자가 불법적으로 사용해도 알 수 없으며, 패스워드 변경이 없으므로 패스워드 유출가능성이 존재함. 반복된 로그인 실패 기록이 남아있다는 계정도 패스워드 추측에 의한 불법적인 로그인 시도 가능성이 있음.그러므로 사용 목적이 만료된 관리자, Guest, 테스트 계정, 무자격 사용자(예>퇴직자) 등 시스템에 불필요한 계정을 주기적으로 삭제 조치 취해야함.

관리되지 않는 계정을 통한 시스템 접속 가능성이 존재할 수 있다.

 

 

휴먼 계정 점검

# lastlog (/var/log/lastlog)

오랫동안 로그인하지 않은 계정, 한 번도 로그인하지 않은 계정 존재하는지 점검.

로그인 실패기록 점검(반복된 로그인 실패 기록을 점검)

 

# lastb (/var/log/wtmp)

명령어 출력 결과 분석

 

 

 

관련문서 제작

 

[실습] lastlog/lastb 테스트

불필요한 사용자를 제거시 확인 방법

- lastlog CMD ---> (출력 결과 분석) 최근에 로그인을 하지 않은 사용자

- lastb CMD ---> (출력 결과 분석) 비슷한 시간대에 반복적으로 실패하는 사용자

 

 

 


 

 

 

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

 

 

* 스크립트 작성시 참고 사항

불필요한 사용자에 대한 정확한 규정이 모호하므로 고객과 충분한 상의가 필요하다.

따라서, 스크립트 작성 후 고객과 상의 할수 있도록 정보를 충분히 제공한다.

불필요한 사용자라는 것의 기준을 다음 몇가지로 정하였다.

 

- (ㄱ) 시스템 사용자인데 로그인 할 수 있는 쉘을 할당 받은 경우는 위험

system Account(UID: 0~199, 200~999)

- (ㄴ) 최근 1년간 서버에 로그인한적이 없는 사용자는 불필요할 가능성이 높은 사용자로 점검

/var/log/lastlog

- (ㄷ) su 명령어의 시도 실패 회수가 많은 사용자는 점검

/var/log/secure (su 명령어 수행 여부 확인)

 

 

# cat /etc/passwd | awk –F: ‘$3 >= 0 –a $3 <= 199 {print $0}’

# lastlog

# cd /var/log ; cat secure-* secure | grep ‘su: pam_unix’

 

 

* 모든 점검 파일에 대한 설명이 함께 출력 되어야 한다.

 

 

# cat /etc/passwd | awk –F: ‘

# lastlog

# cat /var/log/secure*

(result.log 파일 출력 결과)

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

[U-10] 불필요한 계정 제거

[양호]: 불필요한 계정이 존재하지 않는 경우

[취약]: 불필요한 계정이 존재하는 경우

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

[ 정보 ] : U-10.log 파일을 점검한다.

(U-10.log 파일 출력 결과)

 

[/etc/passwd 파일의 내용]

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

(ㄱ) 시스템 사용자인데 로그인 할 수 있는 쉘을 할당 받은 경우 점검

또한, 시스템 사용자의 정보를 자세하게 확인해야 한다.(악의적인 설정 점검)

(ㄴ) 일반사용자 중 최근(최근 1년간)에 로그인한 적이 없는 사용자 점검

이런경우는 lastlog 명령어의 출력 결과를 확인한다.

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

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

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

..... (중략) .....

 

[lastlog 명령어의 출력내용]

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

(ㄱ) 최근 1년간 로그인한적이 없는 사용자를 점검한다.

(ㄴ) 이 부분은 고객과 반듯시 상의해야 한다.

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

Username Port From Latest

root :0 Fri Dec 15 19:13:12 +0900 2017

bin **Never logged in**

daemon **Never logged in**

adm **Never logged in**

lp **Never logged in**

..... (중략) .....

 

[su 명령어의 실패시도 내용]

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

(ㄱ) 빈번하게 su 명령어를 실행하는 사용자들 점검(하루에 20번 이상)

(ㄴ) 일반사용자에서 root 사용자로 전환하는 경우를 중점적으로 점검한다.

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

Dec 18 22:19:51 linux200 su: pam_unix(su-l:auth): authentication failure; logname=user01 uid=500 euid=0 tty=pts/3 ruser=user01 rhost= user=root

Dec 18 22:20:11 linux200 su: pam_unix(su-l:auth): authentication failure; logname=user01 uid=500 euid=0 tty=pts/3 ruser=user01 rhost= user=root

 

 

 

(스크립트 작성)

U-10.sh

#!/bin/bash


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


BAR
CODE [U-10] 불필요한 계정 제거
cat << EOF >> $RESULT
[양호]: 불필요한 계정이 존재하지 않는 경우
[취약]: 불필요한 계정이 존재하는 경우
EOF
BAR

INFO $TMP1 파일을 점검한다.


FILE1=/etc/passwd

# /etc/passwd 파일의 내용
echo "[/etc/passwd 파일의 내용]" >> $TMP1

cat << EOF >> $TMP1
==================================================================

(ㄱ) 시스템 사용자인데 로그인 할 수 있는 쉘을 할당 받은 경우 점검
또한, 시스템 사용자의 정보를 자세하게 확인해야 한다.(악의적인 설정 점검)

(ㄴ) 일반사용자 중 최근(최근 1년간)에 로그인한 적이 없는 사용자 점검
이런경우는 lastlog 명령어의 출력 결과를 확인한다.

==================================================================
EOF

cat /etc/passwd >> $TMP1


# lastlog 명령어의 출력 내용
echo >> $TMP1
echo "[lastlog 명령어의 출력내용]" >> $TMP1

cat << EOF >> $TMP1
==================================================================

(ㄱ) 최근 1년간 로그인한적이 없는 사용자를 점검한다.
(ㄴ) 이 부분은 고객과 반드시 상의해야 한다.

==================================================================
EOF
lastlog >> $TMP1


# su 명령어의 실패 사용자 출력 내용
echo >> $TMP1
echo "[su 명령어의 실패시도 내용]" >> $TMP1

cat << EOF >> $TMP1
==================================================================

(ㄱ) 빈번하게 su 명령어를 실행하는 사용자들 점검(하루에 20번 이상)
(ㄴ) 일반사용자에서 root 사용자로 전환하는 경우를 중점적으로 점검한다.

==================================================================
EOF

cat /var/log/secure | grep 'su: pam_unix(su-l:auth): authentication failure' >> $TMP1


cat $RESULT
echo ; echo

 

 

 


 

 

 

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

 

 

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

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

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

■ 세부 점검 항목: 관리자 그룹에 최소한의 계정 포함

■ 대상: 리눅스

■ 위험도: 

■ 관련 코드: U-11

 

 

(1) 취약점 개요

시스템을 관리하는 root 계정이 속한 그룹은 시스템 운영 파일에 대한 접근권한이 부여되어 있으므로 최소한의 계정만 등록되어 있어야 함. 해당 그룹 관리가 이루어지지 않으면 허가되지 않은 일반 사용자가 관리자의 권한으로 시스템에 접근할 수 있으며, 파일 수정 및 변경 등의 악의적인 작업으로 인해 시스템 운영에 피해를 줄 수 있음.

 

 

(2) 판단기준

양호: 관리자 그룹에 불필요한 계정이 등록되어 있지 않은 경우

취약: 관리자 그룹에 불필요한 계정이 등록되어 있는 경우

 

 

(3) 조치방법

현재 등록된 계정 현황 확인 후 불필요한 계정 삭제

 

 

(4) 보안 설정 방법

■ 점검 방법

# cat /etc/group

root:x:0:root

■ 설정 방법

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

2. root 그룹에 등록된 불필요한 계정 삭제

(예) root 그룹에 등록된 불필요한 test 계정 삭제

(수정 전) root:x:0:root,test

(수정 후) root:x:0:root

 

 

(5) 조치시 영향

일반적으로 영향 없음

 

 

 

 

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

 

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

관리자 그룹에 최소한의 계정이 포함되어 있어야 하는데

최소한의 계정이라는 것은 'root, bin, daemon, sys, adm, disk, wheel'등이다.

 

스크립트 작성이 위의 계정외에 다른 사용자가 root 그룹에 포함되어 있으면

경고로 표시하고, 출력내용을 고객과 상의 할수 있도록 한다.

 

■ 화면 출력 내용

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

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

양호 : 관리자 그룹에 불필요한 계정이 등록되어 있지 않은 경우

취약 : 관리자 그룹에 불필요한 계정이 등록되어 있는 경우

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

[ 정보 ] 고객과 상의해 주세요.

[ 정보 ] 고객과 상의시 U-11.log 파일을 참고합니다.

 

 

  

■ U-11.log파일의 출력 내용

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

1. /etc/group 파일의 내용입니다.

 

* 다음 사항을 점검합니다.

* - 1) root,bin,daemon,sys,adm,tty,disk,mem,kmem,wheel 그룹에 속한 사용자가

반드시 필요한지 고객과 상의한다.

* - 2) 4번째 필드가 그룹에 속한 사용자 목록이다.

* - 3) 사용자 목록이 없으면, 양호이다.

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

egrep ‘^(root|bin|daemon|sys|adm|tty|disk|mem|kmem|wheel):’ /etc/group 출력 내용



U-11.sh

#!/bin/bash

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

BAR
CODE [U-11] 관리자 그룹에 최소한의 계정 포함
cat << EOF >> $RESULT
양호: 관리자 그룹에 불필요한 계정이 등록되어 있지 않은 경우
취약: 관리자 그룹에 불필요한 계정이 등록되어 있는 경우
EOF
BAR

INFO $TMP1 파일을 참고하여 고객과 상의해 주세요.

GROUPFILE=/etc/group 
grep -E '^(root|bin|daemon|sys|adm|tty|disk|mem|kmem|wheel):' $GROUPFILE >> $TMP2

echo
cat << EOF >> $TMP1  # -E 옵션은 egrep이라고 생각하면 됨. 유닉스 쪽에도 사용가능.
==================================================================
1. /etc/group 파일의 내용입니다.

* 다음 사항을 점검합니다.

* - 1) root,bin,daemon,sys,adm,tty,disk,mem,kmem,wheel 그룹에 속한 사용자가 
       반드시 필요한지 고객과 상의한다.
* - 2) 4번째 필드가 그룹에 속한 사용자 목록이다.
* - 3) 사용자 목록이 없으면, 양호이다.
==================================================================
$(cat $TMP2)
==================================================================
EOF

rm -f $TMP2

cat $RESULT
echo ; echo

 

 

 


 

 

 

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

 

 

 

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

1.12 계정이 존재하지 않는 GID 금지

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

■ 세부 점검 항목: 계정이 존재하지 않는 GID 금지

■ 대상: 리눅스

■ 위험도: 

■ 관련 코드: U-12

 

 

(1) 취약점 개요

미흡한 계정 그룹 관리로 인해 구성원이 없는 그룹이 존재할 경우 해당 그룹 소유의 파일이 비인가자에게 노출될 위험이 있음. 계정이 존재하지 않는 *GID(Group Identification) 설정을 관리자와 검토 후 제거하여야 함.

*GID(Group Identification): 다수의 사용자가 특정 개체를 공유할 수 있게 연계시키는 특정 그룹의 이름으로 주로 계정처리 목적으로 사용되며, 한 사용자는 여러 개의 GID를 가질 수 있음.

 

 

(2) 판단기준

양호: 존재하지 않는 계정에 GID 설정을 금지한 경우

취약: 존재하지 않은 계정에 GID 설정이 되어있는 경우

 

 

(3) 조치방법

구성원이 존재하지 않는 그룹이 있을 경우 관리자와 검토하여 제거

 

 

(4) 보안 설정 방법

■ 점검 방법

# cat /etc/group

root:x:0:root

......

plugdev:x:46:haldaemon,adminisdor,xan,noa

■ 설정 방법

# groupdel <group_name>

※ 구성원이 없거나, 더 이상 사용하지 않는 그룹명 삭제

 

 

(5) 조치시 영향

일반적으로 영향 없음

 

 

 

 

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

 

(스크립트 제작시 유의사항)

그룹에 속한 사용자가 시스템에 존재하지 않는 경우를 점검

 

 

-코딩 아이디어-

사용자는 반드시 어느 한 그룹에는 속해 있어야 한다

반드시 속해야 하는 그룹 = Primary그룹, 확인은 (/etc/passwd 의 4번째 필드)

그리고 31개의 Secondary 그룹중 하나에도 추가로 속할 수 있고 확인은 (/etc/group 4번째 필드,)

 

이걸 보기 좋게 확인하는 커맨드가 #id

내가 속한 그룹만 보고 싶으면 # groups

 

# groupadd class1

# groupadd class2

# groupadd class3

 

현재 아무 사용자도 속해있지 않은 상태

# cat /etc/group | grep class

class1:x:1002:(비어있음)

class1:x:1002:(비어있음)

class1:x:1002:(비어있음)

 

사용자 추가

# useradd user10

# echo user10 | passwd --stdin user10 > /dev/null

 

secondary그룹 확인.

# cat /etc/group | grep user10

user10:x:1009:(비어있음)

 

비어있는 곳은 secondary 그룹 정보다!

primary 그룹 정보를 확인하려면

# grep user10 /etc/passwd

user10:x:1006:1009:~~

 

 

둘 다 확인해야 하는데 번거롭기 때문데

# id

를 쓴다.

 

# id user10

# id -u user10 (uid)

# id -un user10 (username)

# id -g user10 (gid)

# id -gn user10 (groupname)

# id -Gn user10 (대문자 G는 secondary group)

 

 

# usermod -aG class1, class2 user10

# id user10

group=1009(user10), 1006(class1), 1007(class2)

# id -Gn user10

 

 

# cat /etc/group | awk -F: '{print $1}'

# id -Gn 위에서 뽑은 그룹이름

 

test.sh

#!/bin/bash

. function.sh
TMP1=`SCRIPTNAME`.log
> $TMP1
> /tmp/tmp1
> /tmp/tmp2
> /tmp/tmp3

# /tmp/grouplist 사용자가 속한 전체 그룹
#root
#adm
#bin ...

#for i in `cat /etc/passwd | awk -F: '{print $1}'`
for i in $(cat /etc/group | awk -F: '{print $1}')
do
	#id -Gn $i | grep -w root
	CNT=0
	MAX=`wc -l < /etc/passwd`
	for j in `cat /etc/passwd | awk -F: '{print $1}'`
	do
		id -Gn $j | grep -q -w $i
		if [ $? -eq 0 ] ; then # 정상적으로 수행(찾은경우) 되면
			echo "Found : $j"
			continue 2 #2 반복구문 위의 위, 즉 처음 시작 반복문으로 돌아가란 뜻
		else
			CNT=`expr $CNT + 1` # passwd 맥스값은 라인 카운트=전체 카운트 갯수
			if [ $CNT -ge $MAX ] ; then
				echo $i >> /tmp/tmp3
			fi
		fi
	done
done

cat /tmp/tmp3


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


#!/bin/bash


> /tmp/tmp1
> /tmp/tmp2
> /tmp/tmp3

for i in `cat /etc/passwd | awk -F: '{print $1}'`
do
	#echo $i
	for z in `id -Gn $i`
	do
		echo $z >> /tmp/tmp1
	done
done
sort -u /tmp/tmp1 > /tmp/tmp2


for j in `cat /etc/group | awk -F: '{print $1}'`
do
	if ! grep -q -w $j /tmp/tmp2 ; then #/tmp/tmp1에는 사용자가 속한 전체 이름이 들어있는데
		# echo $j     					# 매칭이 안되는걸 출력하라고!
	    grep '$j' /etc/group >> /tmp/tmp3 # j는 조건을 갖췄을때의 그룹의 이름
	fi
done


# 중복제거 명령어 uniq 사용. uniq은 sort 작업을 꼭 먼저 해줘야 한다! 
# 먼저 중복 있는지 확인! grep mail | /tmp/tmp1
# sort -u 옵션은 중복 되는걸 하나로 표기해줌!
# sort /tmp/tmp1 | uniq -d # -d = duplecate  / 중복 확인 커맨드
# sort -u /tmp/tmp1 > /tmp/tmp2

 

 

 

(스크립트 제작)

U-12.sh

#!/bin/bash

. function.sh

TMP1=`SCRIPTNAME`.log
TMP2=/tmp/tmp1
TMP3=/tmp/tmp2
TMP4=/tmp/tmp3

BAR
CODE [U-12] 계정이 존재하지 않는 GID 금지
cat << EOF >> $RESULT
양호: 존재하지 않는 계정에 GID 설정을 금지한 경우
취약: 존재하지 않은 계정에 GID 설정이 되어있는 경우
EOF
BAR

GROUPFILE=/etc/group
/bin/cp $GROUPFILE $TMP2
for i in $(cat $GROUPFILE | awk -F: '{print $4}')
do
	if [ ! -z "$i"  ] ; then
		sed -i "/:${i}/d" $TMP2
	fi
done

awk -F: '{print $4}' /etc/passwd > $TMP3
for j in $(cat $TMP2)
do
	NUM=$(echo $j | awk -F: '{print $3}')
	if grep -wq $NUM $TMP3; then
		:
	else
		echo $j >> $TMP4
	fi
done

if [ -s $TMP4 ] ; then
	WARN 존재하지 않는 계정에 GID 설정이 되어 있습니다.
	INFO $TMP1 파일을 참고합니다.
	cat << EOF >> $TMP1
==================================================================
1. 사용자가 포함되지 않은 그룹 이름의 목록을 /etc/group에서 검색하였습니다.

$(cat $TMP4)
==================================================================
EOF
else
	OK 존재하지 않는 계정에 GID 설정을 금지 되어 있습니다.
fi

cat $RESULT
echo ; echo

 

 

 

 

 

728x90

+ Recent posts