20160726 리눅스 서버보안
1.10 불필요한 계정 제거
■ 점검 분류 항목: 계정 관리 ■ 세부 점검 항목: 불필요한 계정 제거 ■ 대상: 리눅스 ■ 위험도: 하 ■ 관련 코드: U-10
(1) 취약점 개요 OS나 Package 설치 시 Default로 생성되는 계정은 대부분 Default 패스워드를 사용하는 경우가 많으며 패스워드 추측공격에 악용될 수 있으므로 시스템에서 이용하지 않는 "lp, uucp, nuucp” 등의 Default 계정 및 의심스러운 특이한 계정의 존재 유무를 확인 후 삭제함. 또한, 관리되지 않은 불필요한 계정으로 인해 시스템 접속이 가능하므로 퇴직, 전직, 휴직 등의 이유로 더 이상 사용하지 않는 계정, 불필요한 계정, 의심스러운 계정은 제거해야 함. 특히, 장기간 패스워드가 변경되지 않은 미사용 계정은 반복적인 패스워드 추측 공격(Password Guessing)이 가능하고 해당 계정 정보의 유출 여부 확인이 어려움.
(2) 판단기준 양호: 불필요한 계정이 존재하지 않는 경우 취약: 불필요한 계정이 존재하는 경우
(3) 조치방법 현재 등록된 계정 현황 확인 후 불필요한 계정 삭제
(4) 보안 설정 방법 ■ 점검 방법 1. 미사용 계정 및 의심스러운 계정 존재 여부 확인 #c at /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 CMD ---> (출력 결과 분석) 최근에 로그인을 하지 않은 사용자- lastb CMD ---> (출력 결과 분석) 비슷한 시간대에 반복적으로 실패하는 사용자
불 필요한 계정 삭제
[실습] lastlog 명령어에 대해서
# cat /etc/passwd
-> 기본 계정에 대해 확인한다. -> 시스템 계정은 root 사용자를 제외하고 일반적으로 로그인이 가능하지 않는다.
(일반 사용자) # awk -F: '$3 > 499 && $3 < 60000 {print $1}' /etc/passwd (시스템 사용자) # awk -F: '$3 < 500 {print $1}' /etc/passwd
# man lastlog
# lastlog --help
# lastlog
-> 시스템 계정인데 최근에 로그인이 되었던 사용자가 있거나 -> 일반 사용자인데 최근에 로그인한 기록이 없다면 -> 이상이 있다고 볼수도 있다. 따라서 자세하게 점검해 봐야 한다. [실습] lastb 명령어에 대해서
# man lastb
# lastb --help
[TERM2] 모니터링 터미널 # while true (# watch lastb) > do > echo "------------`date`-----------" > lastb | head > sleep 2 > done user01 ssh:notty localhost.locald Tue Sep 16 08:45 - 08:45 (00:00) user01 ssh:notty localhost.locald Tue Sep 16 08:45 - 08:45 (00:00) user01 ssh:notty localhost.locald Tue Sep 16 08:45 - 08:45 (00:00)
# ssh user01@localhost
-> 잘못된 암호 입력
일정한 시간안에 반복적으로 로그인이 실패하는 기록이 남겼졌을 때는 외부의 공격인지 확인해야 한다.
|
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) 조치시 영향 일반적으로 영향 없음 |
(고객에게 설명)
실습은 이전 실습을 참고한다.
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) 조치시 영향 일반적으로 영향 없음 |
(스크립트 제작)
/etc/passwd 파일에는 사용자 이름이 존재하는데 /etc/group 파일에 그룹이 존재하지 않는 경우
/etc/group 파일에는 그룹 이름이 존재하는데 /etc/passwd 파일에 사용자 이름이 존재하지 않는 경우
# 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
1.13 동일한 UID 금지
■ 점검 분류 항목: 계정 관리 ■ 세부 점검 항목: 동일한 UID 금지 ■ 대상: 리눅스 ■ 위험도: 중 ■ 관련 코드: U-13
(1) 취약점 개요 UNIX 시스템은 모든 사용자 계정에 UID를 부여하여 해당 UID로 사용자 이름, 패스워 드, 홈 디렉터리 등과 같은 사용자 정보를 대응시킴. 만약 중복된 UID가 존재할 경우 시스템에서 동일한 사용자로 인식하여 문제가 발생할 수 있으며, 공격자에 의한 개인 정보 및 관련 데이터 유출 발생 시에도 감사 추적이 어렵게 됨.
(2) 판단기준 양호: 동일한 UID로 설정된 사용자 계정이 존재하지 않는 경우 취약: 동일한 UID로 설정된 사용자 계정이 존재하는 경우
(3) 조치방법 동일한 UID로 설정된 사용자 계정의 UID를 서로 다른 값으로 변경
(4) 보안 설정 방법 ■ 점검 방법 # cat /etc/passwd 동일한 UID를 갖는 계정이 존재하는 경우 아래의 보안설정방법에 따라 설정을 변경함
■ 설정 방법 usermod 명령으로 동일한 UID로 설정된 사용자 계정의 UID 변경 # usermod -u <변경할 UID값> <user_name>
(5) 조치시 영향 일반적으로 영향 없음 |
(스크립트 제작)
/etc/passwd 파일내에 동일한 UID 번호를 가진 사용자가 존재하면 안된다.
# 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
1.14 사용자 shell 점검
■ 점검 분류 항목: 계정 관리 ■ 세부 점검 항목: 사용자 shell 점검 ■ 대상: 리눅스 ■ 위험도: 하 ■ 관련 코드: U-14
(1) 취약점 개요 로그인이 필요 없는 계정을 이용해 시스템에 접근하여 사용자의 명령어를 해석하고 악용할 가능성이 있으므로, /bin/false *쉘(Shell)을 부여해 로그인을 금지함. *쉘(Shell): 대화형 사용자 인터페이스로써, 운영체제(OS) 가장 외곽계층에 존재하여 사용자의 명령어를 이해하고 실행함.
(2) 판단기준 양호: 로그인이 필요하지 않은 계정에 /bin/false(nologin) 쉘이 부여되어 있는 경우 취약: 로그인이 필요하지 않은 계정에 /bin/false(nologin) 쉘이 부여되지 않은 경우
(3) 조치방법 로그인이 필요하지 않은 계정에 대해 /bin/false(nologin) 쉘 부여
(4) 보안 설정 방법 ■ 점검 방법 # cat /etc/passwd | egrep "^daemon|^bin|^sys|^adm|^listen|^nobody|^nobody4|^noaccess|^diag|^ listen|^operator|^games|^gopher" | grep -v "admin"
■ 설정 방법 1. vi 편집기를 이용하여 “/etc/passwd” 파일을 연 후 2. 로그인 쉘 부분인 계정 맨 마지막에 /bin/false(nologin) 부여 및 변경 (수정 전) daemon:x:1:1::/:/sbin/ksh (수정 후) daemon:x:1:1::/:/bin/false 또는, daemon:x:1:1::/:/sbin/nologin
일반적으로 로그인이 불필요한 계정 daemon, bin, sys, adm, listen, nobody, nobody4, noaccess, diag, listen, operator, games, gopher 등 일반적으로 UID 100 이하 60000 이상의 시스템 계정 해당
(5) 조치시 영향 일반적인 경우 영향 없음 모호한 경우 “/etc/shadow” 파일에서 해당 계정에 패스워드 존재 여부로 확인 |
1.15 Session Timeout 설정
■ 점검 분류 항목: 계정 관리 ■ 세부 점검 항목: Session Timeout 설정 ■ 대상: 리눅스 ■ 위험도: 하 ■ 관련 코드: U-15
(1) 취약점 개요 계정이 접속된 상태로 방치될 경우 권한이 없는 사용자에게 중요시스템이 노출되어 악의적인 목적으로 사용될 수 있으므로 일정 시간 이후 어떠한 이벤트가 발생하지 않 으면 연결을 종료하는 Session Timeout 설정이 필요함.
(2) 판단기준 양호: Session Timeout이 600초(10분) 이하로 설정되어 있는 경우 취약: Session Timeout이 600초(10분) 이하로 설정되지 않은 경우
(3) 조치방법 600초(10분) 동안 입력이 없을 경우 접속된 Session을 끊도록 설정
(4) 보안 설정 방법 ■ 점검 방법 <sh, ksh, bash 사용 시> # cat /etc/profile(.profile) TMOUT=600 export TMOUT
<csh 사용 시> # cat /etc/csh.login 또는, #cat /etc/csh.cshrc set autologout=10
■ 설정 방법 - sh(born shell), ksh(korn shell), bash(born again shell)을 사용하는 경우 - 1. vi 편집기를 이용하여 “/etc/profile(.profile)” 파일을 연 후 2. 아래와 같이 수정 또는, 추가 TMOUT=600 (단위: 초) export TMOUT
- csh 을 사용하는 경우 - 1. vi 편집기를 이용하여 “/etc/csh.login” 또는, “/etc/csh.cshrc” 파일을 연 후 2. 아래와 같이 수정 또는, 추가 set autologout=10 (단위: 분)
(5) 조치시 영향 모니터링 용도로 사용할 경우 해당 계정의 환경변수 파일에만 예외적으로 600초 이상의 시간 입력 (예) root 로 모니터링 할 경우 /.profile, /.bash_profile 등에 600초 이상 입력 |
(고객에게 설명)
로그인하여 계정을 모두 사용한 후 사용자의 부주의로 계정이 접속한 상태로 방치할 경우 악의 적인 목적으로 사용 될 수 있으며, 권한이 없는 사용자에 의한 사용이 이루어 질 수 있음. 그러므로 일정 시간 이후 어떠한 이벤트가 발생하지 않으면 연결을 강제로 종료하는 session timeout 설정이 필요함
(로컬) 화면 잠금 기능(system > preference > screensaver)
(원격) 원격접속시 TMOUT 변수 설정(EX: export TMOUT=60)
TMOUT 변수 설정
■ 사용시스템 - KaliLinux - linux200
(linux200)
# man bash
[실습] 칼리 리눅스(192.168.20.50)에서 CentOS 리눅스(192.168.20.200)로 로그인
(KaliLinux)
# telnet 192.168.20.200 root 사용자로 로그인
# export TMOUT=60
-> 가만히 기다린다.
TMOUT 변수 설정은 환경 파일에 설정한다. 관리자) /etc/profile, /etc/bashrc 사용자) $HOME/.bash_profile, $HOME/.bashrc (/etc/skel/*)
|
HISTTIMEFORMAT 변수
(linux200)
■ HISTTIMEFORMAT 변수 명령어 히스토리(Command history) 기능에 시간을 설정할 수 있는 기능이다. 사용자가 수행한 명령어를 추적할 때 사용할 수 있으므로 사용을 권장한다.
# export LANG=C # man bash
# man 3 strftime
# vi /etc/profile
# telnet localhost user01 사용자로 로그인
$ export LANG=C $ history
$ exit # export LANG=C # history
■ Command History (History) 이전에 사용한 명령어를 저장하는 기능
# ps
# pmap 5028
[ stack ]
| | --------- | | A | | | | | 1000 | | | | | V +-----------------+ --------- ~/.bash_history
HISTSIZE=1000 /* stack 크기 */ HISTFILE=~/.bash_history /* history 파일 지정 */ HISTFILESIZE=1000 /* history 파일 크기 지정 */
# grep -i HISTSIZE /etc/profile
[참고] history -c (~/.bash_logout) (history -c 명령어의 필요성) # echo user01 | passwd --stdin user01 # mysql -u root -p soldesk1. # smbclient -L 192.168.20.200 -u root -p soldesk1.
(작업 방법에 대한 예제) # vi /etc/skel/.bash_logout
# useradd test01 # passwd test01 # su - test01 # ls -al .bash_logout # cat ~/.bash_logout
(복원) /etc/skel/.bash_logout 파일 추가된 삭제(history -c)
■ 사용자가 환경파일을 변경할수 없도록 설정
(예) history -c ---> /etc/skel/.bash_logout(history -c) --- useradd CMD ---> /home/$USER/.bash_logout(사용자 삭제 가능)
/home/user01 (rwxr-xr-x root root) + | +----- .bash_profile (-rw-r--r-- root root) <---- cd work | ...... +----- .bash_logout (-rw-r--r-- root root) | +----- work (drwx------ user01 user01)
■ ~/.bash_history 파일
# cat ~/.bash_history
# pinfo date -> Examples of date 선택 -> 예제들 중 아래 명령어 예제를 찾는다.
# date -d '1970-01-01 UTC 1441155935 seconds' +"%Y-%m-%d %T %z"
-> 시간 출력 포맷을 변경하여 출력
(명령어 형식) # time.sh 1441155935 2015-12-30 14:29:09 +0900
# cd /root/bin # vi time.sh
# chmod 755 time.sh
# cat ~/.bash_history -> 적당한 시간 선택 # ./time.sh 1441155935
■ cat ~/.bash_history 파일의 출력 형식 변경 작업
~/.bash_history ---- 보기좋은 형식 -----> ~/.bash_history.conv #1450183998 2015-12-30 14:29:09 +0900 passwd passwd #1450184477 2015-12-30 14:29:09 +0900 clear clear #1450184555 2015-12-30 14:29:09 +0900 poweroff poweroff
# man paste NAME paste - merge lines of files # cat file1 1111 2222 3333 # cat file2 aaaa bbbb cccc # paste file1 file2 1111 aaaa 2222 bbbb 3333 cccc
|
(정리) 보안 정책
(로컬)화면 잠금 기능을 설정한다.
(원격)원격접속시 일정한 시간(예: TMOUT=600)안에 명령어 수행이 없으면 자동 로그아웃을 설정한다.
사용자의 수행한 명령어를 추적하기 위해서 HISTTIMEFORMAT 변수를 설정한다.
2. 파일 및 디렉토리 관리
2.1 root 홈, 패스(PATH) 디렉토리 권한 및 패스(PATH) 설정
■ 점검 분류 항목: 파일 및 디렉토리 관리 ■ 세부 점검 항목: root 홈, 패스(PATH) 디렉토리 권한 및 패스(PATH) 설정 ■ 대상: 리눅스 ■ 위험도: 상 ■ 관련 코드: U-16
(1) 취약점 개요 root 계정의 PATH 환경변수에 “.” (현재 디렉터리 지칭)이 포함되어 있으면, root 계정의 인가자로 인해 비의도적으로 현재 디렉터리에 위치하고 있는 명령어가 실행될 수 있음. 즉 “.”이 /usr/bin이나 /bin, /sbin 등 명령어들이 위치하고 있는 디렉터리보다 우선하여 위치하고 있을 경우, root 계정의 인가자가 특정 명령을 실행하면, 비인가자가 불법적으로 위치시킨 파일을 실행하여 예기치 않은 결과를 가져올 수 있음. 잘못된 PATH의 우선순위 등이 침해사고에 이용될 수 있으므로 “.” 뿐만 아니라 비인가자가 불법적으로 생성한 디렉터리를 우선으로 가리키지 않도록 설정함.
(2) 판단기준 양호: PATH 환경변수에 “.” 이 맨 앞이나 중간에 포함되지 않은 경우 취약: PATH 환경변수에 “.” 이 맨 앞이나 중간에 포함되어 있는 경우
(3) 조치방법 root 계정의 환경변수 설정파일(“/.profile”, “/.cshrc” 등)과 “/etc/profile” 등에서 PATH 환경변수에 포함되어 있는 현재 디렉터리를 나타내는 “.”을 PATH 환경변수의 마지막으로 이동 “/etc/profile”, root 계정의 환경변수 파일, 일반계정의 환경변수 파일을 순차적으로 검색하여 확인
(4) 보안 설정 방법 ■ 점검 방법 # echo $PATH /usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11:/usr/local/bin:/usr/bi n:/usr/X11R6/bin:/root/bin 위와 같이 출력되는 PATH 변수 내에 “.” 또는, “::” 포함 여부 확인
■ 설정 방법 1. vi 편집기를 이용하여 root 계정의 설정파일(~/.profile 과 /etc/profile)을 연 후 # vi /etc/profile 2. 아래와 같이 수정 (수정 전) PATH=.:$PATH:$HOME/bin (수정 후) PATH=$PATH:$HOME/bin ※ 환경변수 파일은 OS별로 약간씩 다를 수 있음
(5) 조치시 영향 일반적인 경우 영향 없음 |
(고객에게 설명)
root 사용자의 PATH 변수 설정에 현재 디렉토리가 설정이 되어 있다면 일반사용자가 이 취약점을 이용하여 root 권한을 따낼수 있다.
일반사용자가 root 사용자에 의한 프로그램 실행
관리자의 잘못된 PATH 변수 설정
(주의) 관리자(EX:root)의 PATH 변수 설정은 현재 디렉토리가 포함되어 있으면 안된다.
■ 관리자의 잘못된 PATH 변수 설정 예 PATH=.:/bin:/usr/bin:/usr/sbin PATH=/bin:/usr/bin:/usr/sbin:. PATH=:/bin:/usr/bin:/usr/sbin PATH=/bin:/usr/bin:/usr/sbin: PATH=/bin::/usr/bin:/usr/sbin
PATH 변수에 대해서 - 명령어가 있는 디렉토리를 선언할 때 사용하는 변수
# ls (절대경로) # /bin/ls (상대경로) # cd /bin # ./ls
(root 사용자)
[TERM1] root 사용자의 윈도우 # unalias ls #
# useradd hacker # passwd hacker (# echo hacker | passwd --stdin hacker)
# export PATH=.:$PATH # echo $PATH
(Hacker 사용자)
[TERM2] hacker 사용자의 윈도우 # telnet localhost hacker 사용자로 로그인
$ id
$ pwd
$ vi /tmp/.hacker.c
$ gcc -o /tmp/.hacker /tmp/.hacker.c $ ls -l /tmp/.hacker
$ cd $ vi ls
$ chmod 755 ls $
$ cat > -i
$ ls
=====> 관리자 Call (도움 요청 내용: '-i' 파일을 지울수 없다.)
(root 사용자)
[TERM1] root 사용자의 윈도우 # cd ~hacker (# cd /home/hacker) # ls -> ① PATH 변수 참조 -> ② 현재디렉토리 검색 -> ③ 현재디렉토리 밑에 있는 ls 명령어 수행
# rm -i # rm \-i # rm '-i' # rm "-i" [참고] # ls -li # find . -inum 450 -type f -exec rm -f {} \;
(Hacker 사용자)
[TERM2] hacker 사용자의 윈도우 $ ls -l /tmp/.hacker
$ /tmp/.hacker $ id -a
$ cat /etc/shadow -> 정상적으로 내용이 보인다.
$ exit #
|
2.2 파일 및 디렉토리 소유자 설정
■ 점검 분류 항목: 파일 및 디렉토리 관리 ■ 세부 점검 항목: 파일 및 디렉토리 소유자 설정 ■ 대상: 리눅스 ■ 위험도: 상 ■ 관련 코드: U-17
(1) 취약점 개요 소유자가 존재하지 않는 파일 및 디렉터리는 현재 권한이 없는 자(퇴직, 전직, 휴직 등)의 소유였거나, 관리 소홀로 인해 생긴 파일일 가능성이 있음. 만약 중요 파일 및 디렉터리일 경우 문제가 발생할 수 있으므로 관리가 필요함.
(2) 판단기준 양호: 소유자가 존재하지 않은 파일 및 디렉터리가 존재하지 않는 경우 취약: 소유자가 존재하지 않은 파일 및 디렉터리가 존재하는 경우
(3) 조치방법 소유자가 존재하지 않은 파일 및 디렉터리 삭제 또는, 소유자 변경
(4) 보안 설정 방법 ■ 점검 방법 #find / -nouser -print #find / -nogroup -print 소유자가 nouser, nogroup인 파일이나 디렉터리 존재하는 경우 아래의 보안설정방법에 따라 디렉터리 및 파일 삭제 또는, 소유자 및 그룹을 변경함
■ 설정 방법 1. 소유자가 존재하지 않는 파일이나 디렉터리가 불필요한 경우 rm 명령으로 삭제 #rm <file_name> #rm <directory_name> ※ 삭제할 파일명 또는, 디렉터리명 입력 2. 필요한 경우 chown 명령으로 소유자 및 그룹 변경 #chown <user_name> <file_name>
(5) 조치시 영향 일반적인 경우 영향 없음 |
(고객에게 설명)
소유자가 존재하지 않는 파일 및 디렉터리는 현재 권한이 없는 자(퇴직자 등)의 소유였거나, 관리 소홀로 인해 생긴 파일일 가능성이 있음. 만일 중요 파일 및 디렉터리일 경우 문제가 발생할 수 있으므로 관리가 필요함
삭제된 소유자의 UID 와 동일한 사용자가 해당파일, 디렉토리 접근 가능.
[실습] find 명령어를 사용한 소유자/그룹 없는 파일 검색 및 처리
사용자/그룹이 없는 파일에 대해서
■ 사용시스템 - linux200
[실습] 사용자/그룹이 없는 파일 생성
① 실습용 사용자(nouser) 생성 및 확인 # useradd nouser # echo nouser | passwd --stdin nouser
■ useradd 명령어 수행 (ㄱ) /etc/passwd 파일 내용 추가(# grep nouser /etc/passwd) (ㄴ) /etc/shadow 파일 내용 추가(# grep nouser /etc/shadow) (ㄷ) /home/nouser 디렉토리 생성(# ls -l /etc/skel/*) (ㄹ) /etc/group 파일 내용 추가 (# grep nouser /etc/group) (ㅁ) MAIL BOX 설정(# ls -l /var/spool/mail/$USER)
# grep nouser /etc/passwd
# cd /home # ls -l
② /etc/passwd 파일 백업 및 /etc/passwd 파일 편집 # cp -p /etc/passwd /etc/passwd.old # vi /etc/passwd
-> nouser 라인 삭제
# ls -l
③ nouser 파일들 목록 점검 # find / -nouser 2>/dev/null
# find / -nouser -ls 2>/dev/null
# find / -nouser -exec rm -rf {} \; # find / \( -nouser -o -nogroup \) -ls 2>/dev/null
# find / -perm -2 2>/dev/null # find / -perm -0002 2>/dev/null # find / -perm -o=w 2>/dev/null
(예제) (파일 ) -rw-r--rw- ..... file1 (디렉토리) -rwxr-xrwx ..... dir1
내용중 불필요한 파일이 있다면 삭제한다.
④ /etc/passwd 파일 복원작업 검색된 # cp -f /etc/passwd.old /etc/passwd # ls -l /home -> /home/nouser 파일의 디렉토리 속성 정보 확인
|
2.9 SUID, SGID, Sticky bit 설정 파일 점검
■ 점검 분류 항목: 파일 및 디렉토리 관리 ■ 세부 점검 항목: 파일 및 디렉토리 소유자 설정 ■ 대상: 리눅스 ■ 위험도: 상 ■ 관련 코드: U-24
(1) 취약점 개요 *SUID(Set User-ID)와 *SGID(Set Group-ID)가 설정된 파일은(특히, root 소유의 파일인 경우) 특정 명령어를 실행하여 root 권한 획득 및 정상서비스 장애를 발생시킬 수 있으며, 로컬 공격에 많이 이용되므로 보안상 철저한 관리가 필요함. root 소유의 SUID 파일의 경우에는 꼭 필요한 파일을 제외하고는 SUID, SGID 속성을 제거해주고, 잘못 설정되어 보안 위협이 되고 있는지 주기적인 진단 및 관리가 요구됨. *SUID(Set User-ID): 설정된 파일 실행 시, 특정 작업 수행을 위하여 일시적으로 파일 소유자의 권한을 얻게 됨. *SGID(Set Group-ID): 설정된 파일 실행 시, 특정 작업 수행을 위하여 일시적으로 파일 소유 그룹의 권한을 얻게 됨.
(2) 판단기준 양호: 주요 파일의 권한에 SUID와 SGID에 대한 설정이 부여되어 있지 않은 경우 취약: 주요 파일의 권한에 SUID와 SGID에 대한 설정이 부여되어 있는 경우
(3) 조치방법 1. 불필요한 SUID, SGID 파일 제거 2. 아래의 목록 이외에 애플리케이션에서 생성한 파일이나, 사용자가 임의로 생성한 파일 등 의심스럽거나 특이한 파일의 발견 시 SUID 제거 필요
(4) 보안 설정 방법 ■ 점검 방법 OS별 주요 파일에 대한 SUID/SGID 설정 여부 확인 #ls -alL [check_file] |awk ' {print $1 }' | grep -i 's'
■ 설정 방법 1. 제거 방법 #chmod -s <file_name> 2. 주기적인 감사 방법 #find / -user root -type f \( -perm -4000 -o -perm -2000 \) -xdev -exec ls -al { } \; 3. 반드시 사용이 필요한 경우 특정 그룹에서만 사용하도록 제한하는 방법 일반 사용자의 Setuid 사용을 제한함 (임의의 그룹만 가능) #/usr/bin/chgrp <group_name> <setuid_file_name> #/usr/bin/chmod 4750 <setuid_file_name>
SetUID/SetGID 비트를 제거하는 파일 종류 /sbin/dump /usr/bin/lpq-lpd /usr/bin/newgrp /sbin/restore /usr/bin/lpr /usr/sbin/lpc /sbin/unix_chkpwd /usr/bin/lpr-lpd /usr/sbin/lpc-lpd /usr/bin/at /usr/bin/lprm /usr/sbin/traceroute /usr/bin/lpq /usr/bin/lprm-lpd
(5) 조치시 영향 SUID 제거 시 OS 및 응용 프로그램 등 서비스 정상작동 유무 확인 필요 |
(고객에게 설명)
SetUID, SetGID 프로그램의 개수가 변경되었다면 거의 70 ~ 80%가 해킹을 당한것일 가능성이 높다. 일부 프로그램 설치시 SetUID 비트 설정이 될수 있지만 이런 경우는 극히 드문 경우이다.
SetUID 프로그램에 의해 공격 당할 가능성
[실습] SetUID 프로그램의 위험성
[실습] SetUID 프로그램을 목록화하고 비교하는 프로그램 작성
-> 개인적으로 작성
/test/SetUID.list
A
| compare
V
/test/SetUID.current
# vi check_SetUID.sh
-----------------------------------------------
#!/bin/bash
#
# # crontab -l
# 분 시 일 월 요일 CMD
# 0 1 * * * /test/check_SetUID.sh
#
if [ ! -f /test/SetUID.list ] ; then
find / -perm -4000 -type f 2>/dev/null | egrep -v '(/test|/tmp)' > /test/SetUID.list
echo "First excution"
exit 0
fi
find / -perm -4000 -type f 2>/dev/null | egrep -v '(/test|/tmp)' > /test/SetUID.current
if [ $? -eq 0 ] ; then
diff /test/SetUID.list /test/SetUID.current > /test/.file1
if [ -s /test/.file1 ] ; then
mailx -s "[ WARN ]: check setuid" root < /test/.file1
else
echo `date` | mailx -s "[ OK ]: all clear" root
fi
else
echo "Error 1: Can't excute a find command"
exit 1
fi
-----------------------------------------------
[실습] 중요한 파일들의 변경 사항(수정 사항)을 점검하는 프로그램 작성
# cat /test/important_file.txt
/etc/passwd
/etc/shadow
/etc/group
/etc/hosts
.......
/test/important_file.txt
A
| compare
V
/test/important_file.current
/test/report.txt
-------------------------------------
[ OK ] : /etc/passwd
[ OK ] : /etc/shadow
[ WARN ] : /etc/hosts
......
-------------------------------------
# vi check_important_file.sh
-----------------------------------------------
#!/bin/bash
#
# # crontab -l
# 0 1 * * * /test/check_important_file.sh
#
# # cat /test/important_file.txt
# /etc/passwd
# /etc/hosts
# ......
#
# 이 프로그램이 처음 동작 할 때
if [ ! -d /check ] ; then
mkdir -p /check
cat /test/important_file.txt | while read FILE1
do
cp -p $FILE1 /check # cp -p /etc/passwd /check
echo "First excution"
exit 0
done
fi
> /test/report.txt
cat /test/important_file.txt | while read FILE2
do
FILE1=$(basename $FILE2) # basename /etc/passwd
cmp -s /check/$FILE1 $FILE2
if [ $? -eq 0 ] ; then
echo "[ OK ] : $FILE2" >> /test/report.txt
else
echo "[ WARN ] : $FILE2" >> /test/report.txt
fi
done
if grep WARN /test/report.txt 2>/dev/null ; then
mailx -s "[ WARN ] : check important file" root < /test/report.txt
else
mailx -s "[ OK ] : all clear" root < /test/report.txt
fi
-----------------------------------------------
'모의해킹 침해대응 전문가 과정' 카테고리의 다른 글
20160727 로그보안 (0) | 2016.07.27 |
---|---|
20160727 리눅스 서버보안 (0) | 2016.07.27 |
20160725 리눅스 서버보안 (0) | 2016.07.25 |
20160722 리눅스 서버보안 (0) | 2016.07.22 |
20160714 무선해킹 (0) | 2016.07.14 |