유닉스/리눅스 서버 시스템 보안
가. 최신버전 패치 적용
(1) RPM(Redhat Package Management)을 이용한 업데이트
유닉스 계열의 소프트웨어를 설치할 때 컴파일하는 번거로움을 해결하기 위하여 RedHat에서는 RPM이라는 패키지 관리 유틸리티를 만들었다.
● 주요 RPM 사용방법
| 구분 |
방법 |
| 설치여부 확인 |
rpm -qa apache |
| 설치 |
rpm -ivh apache-1.3.12-2.i386.rpm |
| 업그레이드 |
rpm -Uvh apache-1.3.20-14.i386.rpm |
| 삭제 |
rpm -e apache-1.3.20-14 |
● RPM에서 제공하는 옵션
| 구분 |
방법 |
| -i |
설치 |
| -U |
업그레이드 |
| -e |
제거 |
| -v |
검증 |
| -h |
진행상태를 #으로 보여줌 |
-q
|
패키지가 설치되어 있는지 확인 |
| --force |
rpm 버전을 다운 그레이드 |
| --nodeps |
의존성관계에 있는 다른 패키지가 설치되어 있지 않다 해도 강제 설치 |
| --test |
실제로 삭제를 하지 않고 테스트하는 옵션 |
| -qc |
/etc/ 밑에 설치되는 설정 파일만 확인 |
| -qf |
설치되어 있는 파일이 어느 패키지에 속해 있는지 확인 |
| -ql |
패키지 목록 확인 |
| -qlv |
패키지 목록 자세한 정보 확인 |
| -q -requires |
패키지가 필요한 모듈 (의존성) |
| -q -scripts |
패키지가 설치되기 전 또는 설치된 후에 실행되는 스크립트 확인 |
| -qcf |
파일과 관련된 설정 파일 확인 |
| -qpil |
원하는 패키지로부터 패키지 정보와 설치되는 곳의 정보 확인 |
| -Kv |
md5 체크를 해서 자세하게 보여줌 | 패키지별 RPM버전 다운사이트 : http://ftp.redhat.com/pub/redhat/linux/
(2) Solaris 패치
● Solaris 패치사이트에서 시스템에 맞게 패치를 선택해 다운받아 압축을 푼다. ● 패치가 이미 시스템에 설치되어 있는지 확인한다. # showrev -p | grep ● 패치가 있는 디렉토리로 이동하여 스크립트를 실행한다. # patchadd“패치 ID”
※ Solaris 패치 사이트 http://sunsolve1.sun.com ftp://sunsove1.sun.com
나. 사용자계정 및 패스워드 관리
● /etc/passwd 파일을 주기적으로 점검하여 사용하지 않는 계정 및 guest 계정, 패스워드가 지정되지 않은 계정을 삭제한다. 예) adm, lp, sync, shutdown, halt, news, uucp, operator, games, gopher, ftp(anonymous 사용치 않은 경우 제거), rpcuser, rpc 등 불필요한 계정은 userdel 명령어를 사용하여 모두 제거한다.
# more /etc/passwd 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 sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin news:x:9:13:news:/etc/news: uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin gopher:x:13:30:gopher:/var/gopher:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin nscd:x:28:28:NSCD Daemon:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin rpm:x:37:37::/var/lib/rpm:/bin/bash mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin | ● bin, sync, daemon 등과 같은 시스템 계정은 /bin/false, /dev/null 등을 이용하여 시스템 쉘을 부여하지 않는다.
# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/bin/false ? bin 계정으로는 쉘이 부여되지 않음 daemon:x:2:2:daemon:/sbin:/bin/false nobody:x:99:99:Nobody:/:/bin/false hcjung:x:501:10:mail user:/home/hcjung:/bin/false | ● 최소 패스워드 길이 제한 /etc/passwd 파일에서 패스워드의 최소 길이를 8자리 이상으로, 영문자(대소구별), 숫자, 특수문자를 혼용한 경우 이외에는 패스워드를 만들지 못하도록 한다. 이는 패스워드 관리 프로그램을 이용하여 수행할 수 있다.
● 강력한 패스워드 사용 패스워드가 없거나, 너무 쉬운 패스워드를 가진 계정을 찾아서 수정하도록 한다. 이는 Crack을 이용하여 주기적으로 점검할 수 있다.
● 패스워드 유효기간 설정 패스워드의 유효기간을 설정하여 관리하도록 한다.
다. 불필요한 서비스 중지
시스템 설치 시 기본으로 설치되는 여러 서비스들은 대부분 필요하지 않으며 보안측면에서도 잠재적인 위험을 갖고 있으므로 불필요한 서비스는 제거하도록 한다.
● 보안상 취약한 서비스 원격에서 루트 권한을 취득할 수 있는 popd, imapd, sadmind, rpc.cmsd, rpc.ttdbserverd와 같은 서비스나 rsh, rlogin, rexec 등과 같은‘r’명령어들이 필요하지 않으면 제거한다.
● /etc/inetd.conf, /etc/xinetd.d 파일에서 불필요한 서비스 제거 - /etc/inetd.conf를 사용할 때 /etc/inetd.conf파일에는 디폴트로 여러 다양한 서비스들이 설정되어 있으나 대부분 ftp와 telnet만이 필요하다. pop, imapd, rsh과 같은 불필요한 서비스들은 코멘트(#)로 처리하여 제거하도록 한다.
예) ① root만이 읽기/쓰기가 가능하도록 퍼미션을 바꿔준다. # chmod 600 /etc/inetd.conf ② /etc/inetd.conf 파일을 아래와 같이 코멘트 처리 및 편집한다.
# vi /etc/inetd.conf ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -L -i -o telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd #gopher stream tcp nowait root /usr/sbin/tcpd gn #smtp stream tcp nowait root /usr/bin/smtpd smtpd #nntp stream tcp nowait root /usr/sbin/tcpd in.nntpd | ③ inetd 데몬을 다시 띄워준다. # killall -HUP inetd ④ 관리자만이 이 파일에대해 접근할 수있도록“inetd.conf”파일을 셋팅해 다른 사람이 수정, 삭제할 수 없도록 한다. 추후 inetd.conf 파일을 수정하고자하면 플래그를 -i로 바꿔 주면 된다. # chattr +i /etc/inetd.conf
- xinetd를 사용할 때 ① /etc/xinetd.d디렉토리 내에는 리눅스 시스템에서 실행하는 각각의 서비스들의 설정 파일이 위치하고 있다. 제거하고자 하는 서비스명 파일을 열어 코멘트 처리한다
# vi /etc/inetd.conf ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -L -i -o telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd #gopher stream tcp nowait root /usr/sbin/tcpd gn #smtp stream tcp nowait root /usr/bin/smtpd smtpd #nntp stream tcp nowait root /usr/sbin/tcpd in.nntpd | disable = yes로 하면 해당 서비스가 실행되지 않는다.
# vi telnet # default: on # description: The telnet server serves telnet sessions; it uses \ # unencrypted username/password pairs for authentication. service telnet { flags = REUSE socket_type = stream wait = no user = root server = /usr/sbin/in.telnetd log_on_failure += USERID disable = yes } | ② /etc/rc.d/init.d에서 xinetd데몬을 재시작한다. # ./xinetd restart
● /etc/rc.d/init.d에서 불필요한 서비스 데몬 삭제 ntsysv는 runlevel을 조정할 수 있는 간단한 인터페이스를 제공하는 도구이다. 쉘 프롬프트 에서“ntsysv”를 입력한다. [*]처럼 된 것은 리눅스 시스템이 부팅시에 이 데몬을 자동으로 시작시킨다는 것이고 []처럼 공백으로 되어 있으면 이 데몬은 자동으로 시작되지 않는다. 서비스하지 않는 항목들은 모두 체크를 없애고 서버를 재시작한다. X윈도우 화면의 GNOME에서“/usr/bin/serviceconf”유틸리티를 이용하면 리눅스 시스템을 시작할 때 자동으로 시작할 것인지에 대해 지정을 할 수 있다. 서비스하지 않는 항목들은 모두 체크를 없애고 서버를 재시작한다.
# cd init.d # ls aep1000 firstboot isdn mysql ntpd rawdevices squid yppasswdd anacron functions kWnn named pcmcia rhnsd sshd ypserv apmd gpm kdcrotate netfs portmap saslauthd syslog ypxfrd atd halt keytable network postfix sendmail tux autofs httpd killall nfs postgresql single xfs bcm5820 iptables kudzu nfslock pxe snmpd xinetd crond irda lpd nscd random snmptrapd ypbind |

라. 원격 접속 관리
(1) 원격지에서 root 계정 접속 제한
● Linux /etc/securetty 파일은 어떤 가상의 터미널이 root로 접속할 수 있는지를 설정하는 파일로, 로컬 접속만이 가능한 tty1, tty2와 같은 터미널만 이 파일에 리스트 되도록 한다.
# cat /etc/securetty tty1 tty2 tty3 ttyp1 --> 원격지에서 root로 접근하는 것을 허용하기 때문에 삭제 | ● Solaris /etc/default/login 파일에서 CONSOLE 변수 코멘트(#) 설정을 해제하여 root로의 원격지접속을 제한한다.
# cat /etc/default/login ....... # If CONSOLE is set, root can only login on that device. # Comment this line out to allow remote login by root. # CSOLE=/dev/console --> 콘솔에서만 접속 가능함 ........ | (2) 타임아웃 설정
Unix의 경우 /etc/default/login 파일에서 TIMEOUT 변수를 0~900사이에서 설정하여, 설정된 시간이 지나도록 사용하지 않으면, 해당 세션을 종료하도록 설정한다. Linux에서 root의 작업 시간을 제어하기 위해 사용하는 옵션은 TMOUT이며, 이것은 “/etc/profile”등에 사용하여 모든 사용자에게 적용시킬 수도 있고,“ /root/.bash_profile”에만 입력하여 root만 사용할 수도 있다. 예) root의 홈디렉토리에 있는“.bash_profile”에 TMOUT옵션 추가
# cat .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs TMOUT=900 PATH=$PATH:$HOME/bin BASH_ENV=$HOME/.bashrc USERNAME=”root” export USERNAME BASH_ENV PATH | ※ 주의 : TMOUT=900에서 900이라는 숫자의 단위는 초로, root로 시스템에 로그인 한 후 900초 동안 아무런 입력이 없으면 자동으로 로그아웃된다.
마. 파일시스템 보안
● setuid와 setgid 파일에는 사용자 그룹별로 해당 파일을 사용할 수 있는 권한을 설정할 수 있다 있다. (파일 소유주만이 갖는 권한, 그룹이 갖는 권한, 일반 사용자의 권한 등) 이때 파일의 소유주가 아닌 다른 사용자에게 어떤 권한을 설정할 것인가는 대단히 중요한 문제이며, 특히 몇 개의 특수한 파일들은 특별한 권한 관리가 필요하다. 예를 들어 패스워드 관리와 같은 경우 남의 패스워드는 당연히 접근할 수는 없으나 자기의 패스워드는 수정할 수 있는 권한이 주어져야 하는데 setuid 와 setgid는 바로 이런 경우에 사용하는 퍼미션 설정 방법이다. setuid와 setgid는 유익한 퍼미션이지만, 프로그램을 실행하는 사용자가 누구이거나 파일의 소유자(보통 root) 권한으로 수행되기 때문에 프로그램에 버그가 있다면 그것을 이용해서 해킹이 가능하므로 다음 명령어를 이용하여 setuid나 setgid 권한이 설정된 해당 파일들을 찾아 비인가 된 사용이 있는지 확인한다.
# find / -type f \(-perm -4000 -o perm -2000 \) -exec ls -al {} \;
setuid나 setgid 퍼미션이 불필요하게 설정된 경우는 업그레이드하거나 삭제해 준다.
● 환경설정 파일, 시스템 명령어, 로그파일에 대한 접근제어 설정 - /etc/utmp와 /var/adm/wtmp를 644로 설정한다. - /etc/motd와 /etc/mtab를 644로 설정한다. - /etc/syslog.pid를 644로 설정한다. - rc.* startup 파일들과 /etc/hosts.allow와 같은 시스템 환경 설정파일들은 일반 사용자가 접근하지 못하도록, 읽기 권한까지 제약한다. - /var/log/ 이하의 모든 디렉토리를 root만 쓰기 가능하도록 한다. - 파일시스템 보안기능이 지원되면 시스템 명령 파일은 변경하지 못하도록 하며, 로그 파일은 Append-only로 설정한다. - /vmunix와 같은 커널은 소유자를 root로, permission을 644로 설정한다. - /etc, /usr/etc, /bin, /usr/bin, /sbin, /tmp, /var/tmp는 소유자를 root로 하고, /tmp와 /var/tmp는 sticky-bit을 설정한다.
● 임의의 사용자에게 쓰기 권한 금지 임의의 사용자에게 파일과 디렉토리에 대해서 쓰기 권한을 금지한다. 즉 파일에 077이나 027 처럼 접근권한을 설정하면 안 된다. 특히 root에 의해서 실행되는 파일에 대해서 일반 사용자에게 쓰기 권한을 허용하지 않도록 한다.
바. 예약 작업(Cron) 관리
● root의 crontab의 소유자를 root로 하며, 허용권한을 600으로 설정한다. ● 일반사용자에 대해서 cron을 Diable로 설정한다.
사. 스텍(Stack)실행 방지
Unix(solaris)의 경우 /etc/system 파일에 다음의 설정을 추가함으로써 오버플로우를 통한 해킹 을 근본적으로 막을 수 있다. set noexec_user_stack=1 set noexec_user_stack_log=1
아. FTP 보안
FTP서비스는 유닉스 네트워크에서 필수적이지만 안전한 서비스가 아니므로 엄격한 설정 옵션을 적용하고 모든 상태를 기록해야 한다.
● 많은 FTP프로그램중에서 테스트를 거쳐 안전한 것을 선택한다. ● FTP 설정 파일(ftpusers, ftphosts, ftpaccess)들에 대해 정확한 보안 설정을 한다. ● ftpwatch등의 도구를 이용해 감시한다. ● anonymous FTP를 사용해 접근 가능한 디렉토리나 파일들이 제대로 구성되어 있는지 점검한다. ● FTP의 그룹파일로 시스템 그룹파일을 사용하지 않는다. ● FTP의 보조 디렉토리인 etc, bin은 ftp의 소유여서는 안된다.
출처 -한국정보보호진흥원 사이버안전메뉴얼 중
|
|