관리 메뉴

IT창고

리눅스 서버 보안 1 본문

보안/Security

리눅스 서버 보안 1

방구석여포 2018. 6. 13. 13:21

우리나라에는 주요정보통신기반시설이 있는데 주요정보통신기반시설은 정보통신기반 보호법 제9조에 따라 관리기관은 매년마다 취약점 분석, 평가를 해야만 합니다. 5년 전 까지만 해도 100몇 개정도 되는 시설이 현재는 굉장히 많아졌습니다.


이러한 시설들의 취약점을 분석, 평가를 해야만 하는데 분석, 평가하는 메뉴얼 가이드를 찾아보았고 직접 보안점검을 해보겠습니다.


리눅스의 취약점 분석, 평가 항목으로 각 항목과 중요도가 나와있습니다. 단 취약점 분석,평가를 진행하며 자체인증모듈pam에 관한 부분은 따로 모아서 확인하도록 하겠습니다.


1. 계정관리


1.2 패스워드 복잡성 설정


패스워드 같은 경우는 영문, 숫자, 특수문자를 조합하여 계정명과 상이한 8자 이상의 패스워드 설정하는게 일반적입니다.

길이가 짤거나 사용자계정에서 유추 가능한 단어로 패스워드를 만들지 않으면 됩니다.


1.4 패스워드 파일 보호



쉐도우 패스워드를 사용하거나, 패스워드를 암호화하여 저장하는 경우가 양호이므로 cat으로 한번 root계정을 살펴보면 패스워드가 x 로 되어있는걸 알수있습니다. 패스워드 정책 변경은 pwconv명령어가 쉐도우 패스워드이고 pwunconv가 일반 패스워드 정책입니다.


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


UID=0은 root와 동일한 권한을 가지게 되기 때문에 UID가 0인 계정은 있으면 안되며 중복이 되어서도 안됩니다.

따로 테스트계정을 만들었습니다. 

/etc/passwd파일에서 UID를 확인합니다. 만약 테스트 계정의 UID를 수동으로 0으로 바꾸게되면 root와 동일한 권한을 가지게 됩니다.


ex)

계정명:암호:UID:GID

UID를 보기 편하게 확인할수있습니다.  UID가 중복되는 것을 쉽게 확인해볼수있습니다.


(1.7 & 1.8 & 1.9)

1.7 패스워드 최소 길이 설정


Brute Force Attack(무작위 대입 공격)나 Password Guessing(패스워드 추측 공격)을 피하기 위하여 패스워드의 최소 길이가 설정되어있는지 확인합니다.

최소길이 8자리 이상이면 보안 양호입니다.

vi 편집기로 직접 수정해주면 됩니다.

/etc/login.defs 파일을 수정하는데 27번째 줄에 있습니다.


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


최대 기간을 설정하지 않을 경우 일정 기간이 지나도 유출된 패스워드로 접속할 수 있기 때문에 패스워드를 주기적으로 변경해야합니다. 보안 양호는 최대 사용기간이 90일 이하로 설정되어 있는 경우입니다.



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


최소 사용기간을 설정하지 않을 경우 사용자에게 익숙한 패스워드로 변경하거나 재사용하기에 정기적인 변경이 무의미해질수있습니다. 보안양호는 최소 사용기간이 1일~1주일로 설정되어 있는 경우 입니다.



1.10 불필요한 계정 제거


OS나 package를 설치하면 디폴트로 생성되는 계정이 있는데 이러한 계정중에 사용하지않는 계정이나 존재조차 몰랐던 계정은 삭제해줘야만 합니다. 


기본적으로 차단하는 Default 계정은 아래와 같습니다.

adm, lp, sync, shutdown, halt, news, uucp, operator, games, gopher, nfsnobody, squid 등 같은계정


userdel 명령어와 -r옵션으로 홈디렉토리까지 삭제할수있습니다.

계정의 존재여부로 필요한지 안필요한지는 passwd파일에 홈디렉토리가 있는지로 알아볼수도 있습니다.


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


시스템을 관리하는 root계정이 속한 그룹은 시스템 운영파일에 대해 접근권한을 가지기 때문에 최소한의 계정만이 등록되어 있어야만 합니다. 최소한이 아닌 아예없는 편이 가장 좋습니다.

root 계정에 4번째 그룹이 비워있거나 꼭 필요한 최소한의 계정만 포함되어있으면 됩니다. 수정방법은 /etc/group 파일에서 vi편집기로 직접 수정하면 됩니다.


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


존재하지 않는 계정에 GID가 설정되어 있다면 삭제해줘야만 합니다.

명령어 groupdel <group_name>로 그룹에 GID를 삭제할수있습니다.


1.13 동일한 UID 금지


UNIX 시스템은 모든 사용자계정에 UID를 부여하는데 UID로 사용자의 정보를 대응합니다.

root계정에 관한 UID는 위에서 확인했으므로 root계정 이외에 계정 UID가 중복되는지 확인합니다.

cat /etc/passwd


1.14 사용자 Shell 점검


로그인이 필요없는 계정을 이용하여 시스템에 접근할 위험이 있습니다. 보안 양호상태로는 로그인이 필요하지 않는 계정에 /bin/false , /sbin/nologin 쉘이 부여되야합니다.



일반적으로 로그인이 불필요한 계정은 아래와 같습니다.

adm, lp, sync, shutdown, halt, news, uucp, operator, games, gopher, nfsnobody, squid 등

보안점검할 때 모호한 경우 “/etc/shadow” 파일에서 패스워드 존재 여부 찾아보면 됩니다.

/etc/shells 파일에서 시스템에서 사용할 수 있는 쉘을 확인할수있습니다.


Tip

쉘 종류는 zShell 등 다양한 쉘이 존재합니다.

사용자 계정 로그인 쉘 변경

usermod -s [쉘경로] [계정명]



1.15 Session Timeout 설정 (중요)


계정이 접속되어있는 상태로 방치될 경우 권한없는 사용자에게 공격당할 경우가 있기에 일정 시간동안 어떠한 이벤트가 없다면 연결을 종료하는 Session Timeout설정을 꼭 해줘야만 합니다.


Session Timeout설정은 두가지가 있습니다.

1. 서버에 직접 입력

/etc/profile 파일에 직접 스크립트를 작성합니다. 

CentOS 리눅스는 /etc/profile -> ~/.bash_profile -> ~/.bashrc -> /etc/bashrc  순서로 스크립트를 읽어서 부팅되며 4가지 파일안에 위와 같은 스크립트를 작성해주면 됩니다.


2. 원격접속 프로그램을 이용(로그인 스크립트 기능)

xShell 프로그램이나 타 쉘 프로그램을 사용하면 편의 기능에 TMOUT=600 을 붙여도 됩니다. 

최소한으로 담당자가 어딘가 다른 장소로 이동시 Win + L 사용하여 화면 잠금을 꼭 해줍니다.


2. 파일 및 디렉토리 관리


2.1 root 홈, PATH 디렉토리 권한 및 PATH 설정


root계정의 PATH환경변수에 "."가 포함되어있으면 root계정의 인가자로 인해 비인도적으로 현재 디렉터리에 위치하고 있는 명령어가 실행될 수 있습니다 "."이 /usr/bin이나 /bin/sbin 등 명령어들이 위치하는 디렉토리보다 우선하여 위치하고 있을 경우 root계정 인가자가 특정 명령을 실행할 경우 비인가자가 불법적으로 위치시킨 파일이 실행하여 안 좋은 결과가 생길수있습니다.

출력되는 PATH 변수 내에 “.” 또는, “::” 포함 여부 확인합니다.

ex)

(수정 전) PATH=.:$PATH:$HOME/bin

(수정 후) PATH=$PATH:$HOME/bin

환경변수 파일은 OS별로 약간씩 다를 수 있습니다.


2.2 파일 및 디렉토리 소유자 설정


쉽게 보면 현재 기준으로 소유자가 존재하지 않는 파일 및 디렉토리가 있을 경우 삭제해줍니다.

find / -nouser -print 명령어와 find / -nogroup -print 명령어로 찾아봅니다. (-print 옵션은 안사용해도 기본값으로 적용됩니다.)

간단한 테스트를 위하여 테스트계정에 적용된 파일을 만들고 테스특정을 삭제한후 find 명령어로 소유자가 없는 파일을 확인해보았습니다.


찾아낸 파일은 rm명령어로 삭제하면 됩니다. 만약 이러한 파일이 많을 경우 find / -nouser -delete 명령어로 한번에 삭제가 가능합니다. 위에 찾을떄 find 에러메세지는 find명령어가 끝나서 나오는 결과로 메모리에 find가 없기에 에러메세지가 출력되는것이기에 정상입니다.

에러메세지 출력을 안보려면 find / -nouser 2> /dev/null 명령어로 깔끔하게 확인할수있습니다.



2.3 /etc/passwd 파일 소유자 및 권한 설정


passwd파일은 사용자계정에 대한 정보들이 있으므로 관리자 이외의 사용자가 접근해서는 안됩니다.

보안 양호상태는 /etc/passwd파일이 root소유자이며 권한은 644이하이면 됩니다.

ex)

chown root /etc/passwd

chmod 444 /etc/passwd


2.4 /etc/shadow 파일 소유자 및 권한 설정


위에 /etc/passwd파일과 마찬가지인 이유이며 /etc/shadow파일은 /etc/passwd파일에 계정암호가 있는 파일입니다.

보안 양호상태는 /etc/shadow파일이 root소유자이며 권한은 400이하여야만 합니다.

ex)

chown root /etc/shadow

chmod 400 /etc/shadow


2.5 /etc/hosts 파일 소유자 및 권한 설정


/etc/hosts파일은 ip주소와 호스트네임을 매핑하는데 사용되는 파일로 접근권한이 잘못설정될 경우 보안사고가 일어날수있습니다.

리눅스에서 도메인 주소를 사용 시 파일 확인 순서는 첫번째가 /etc/hosts 이며 두번째가 /etc/resolv.conf(DNS Server)입니다.

보안 양호상태는 /etc/hosts파일의 소유자가 root이며 권한이 600이하인 경우 입니다.

ex)

chown root /etc/hosts

chmod 600 /etc/hosts



2.6 /etc/(x)inetd.conf 파일 소유자 및 권한 설정


현재는 많이 사용하지 않는 (x)inetd.conf 입니다. (x)inetd.conf는 인터넷 슈퍼데몬 서비스 설정 파일로 외부 네트워크 요청이 있을 시 (x)inetd.conf 에 등록된 내부 프로그램인 인터넷 서비스들의 데몬을 실행시켜주는 역활을 합니다.


현재 테스트PC 리눅스는 mini버전 리눅스로 테스트를 위하여 telnet-server 패키지를 다운받아서 테스트해봅니다.


chkconfig --list 명령어로 데몬들을 확인할수있는데 xinetd기반 서비스도 확인해볼수있습니다.

보안양호 상태는 소유자가 root이며 권한은 600이 아닌 경우 바꿔주면 됩니다.


2.7 /etc/syslog.conf 파일 소유자 및 권한 설정


/etc/syslog.conf는 CentOS 5버전때 로그데몬이며 6버전부터는 /etc/rsyslog.conf 입니다.

보안 양호상태는 /etc/rsyslog.conf파일이 소유자가 root이며 권한은 644이하여야만 합니다.

ex)

chown root /etc/syslog.conf

chmod 644 /etc/syslog.conf



2.8 /etc/services 파일 소유자 및 권한 설정


서비스 관리를 위하여 사용되는 /etc/services 파일이 일반사용자에 의해 변경이 가능하면 보안사고가 일어날수있기 때문에 접근제한을 해야만 합니다.

보안 양호상태는  /etc/services 파일이 root 소유자이며 권한은 644이하인 경우 입니다.



2.9 SUID, SGID, Stick bit 설정 파일 점검(중요)


SUID, SGID가 설정된 파일은 root권한 획득 및 정상서비스 장애를 발생시킬수 있기 때문에 꼭 철저한 관리가 필요합니다.


find / -user root -type f \( -perm -04000 -o -perm -02000 \) -xdev -exec ls -al {} \; 명령어로 Set이 걸려있는 파일들을 확인할수있습니다.


확인을 위하여 간단한 테스트를 해보겠습니다.



위와 같이 root계정으로 권한상승될수있기 때문에 꼭 Set이 걸린 파일은 중요 관리 파일이 됩니다.

악의적인 사용자들은 보통 Set이 걸린 파일을 백도어 용도로 사용합니다.


불필요하게 Set이 걸린 파일은 chmod -s <file_name>으로 Set권한을 삭제해야만 합니다.

'보안 > Security' 카테고리의 다른 글

리눅스 iptables 심화  (0) 2018.06.24
리눅스 iptables 기초  (0) 2018.06.17
리눅스 서버 보안3  (0) 2018.06.16
리눅스 서버 보안2  (0) 2018.06.14
테스트 환경구성  (0) 2018.06.11
Comments