방화벽을 위한 Solaris 준비하기
Solaris의 무장화(Armoring Solaris)
인터넷 보안 분야에서 방화벽은 빠르게 성장하고 있는 유능한 도구이다. 그러나, 방화벽은 자신이 탑재되어 있는 OS가 안전한만큼만 안전할 뿐이다. 이 문서는 Sparc과 x86 Solaris를 어떻게 무장화시킬지에 대해 차근차근히 설명해나갈 것이다. 각 단계들은 모든 상황에 적용될 수 있지만, 여기에선 Solaris 2.6에 탑재된 Check Point FireWall-1을 예로 들기로한다. 이 문서의 끝에는 직접 다운로드하여 자동으로 solaris를 무장화시킬 수 있는 스크립트가 있다.
설치(Installation)
OS의 설치는 시스템의 보안을 위한 매우 중요한 과정이다. 방화벽을 설치하기 위한 시스템에 이미 설치된 것들을 믿어선 안 된다. 시스템의 보안도를 높이기 위해 새로 OS를 설치하는 것이 좋다.
시스템을 다른 곳과 연결된 네트웍으로부터 단절시켜라. 아직, 보호되지 않은 시스템을 다른 곳에 연결된 네트웍이나 인터넷 연결시키는 것은 좋지 않다. 새로 깔린 시스템이 인터넷에 연결된지 15분만에 발견되어 root를 뺏기는 일도 있다. 후에 중요한 파일들과 패치들을 받기 위해, 인터넷에 연결된 다른 박스가 하나 필요할 것이다. 이 두번째 박스는 인터넷으로부터 필요한 파일들을 다운받아, 중요한 파일들을 전송하기 위해 당신의 고립된 네트웍-혹은 시스템-에 연결될 것이다.
방화벽 박스가 될 박스를 고립된 네트웍에 놓았다면, 이제 시작할 준비는 된 것이다. 처음으로 할 일은, 설치될 OS 패키지를 선택하는 것이다. 최대의 효율을 유지하기 위한 가장 좋은 선택은 최소 설치를 선택하는 것이다. 박스에 설치되는 소프트웨어가 적을 수록, 잠재적인 취약점이나 구멍들이 줄어든다. 나는 Core 설치(Core Installation)를 추천한다. 내가 Core를 선호하는 이유는 이것이 좀더 안전한 OS를 만들기 위한 최소한의 소프트웨어를 설치하기 때문이다. 오타쿠들을 위해, Core 설치를 조정하는 방법에 대한 두 개의 체크 목록을 만들어봤다. 하나는 Solaris 2.6과 FW-1.4.0을 위한 것이고, 다른 하나는 Solaris 8과 FW-1.4.1을 위한 것이다. 두번째 체크 목록은 아직 beta판이다. 만약, 당신이 GUI를 필요로하거나, solaris에 처음 접한다면, End User 설치(End User Installation)을 고려하는게 좋을지도 모르겠다. Developer 같은 그 이상의 설치 패키지들은 필요도 없고 잠재적인 취약점이 남아있는 소프트웨어들을 설치한다. 설치과정에 "On-Line Manual Pages"를 꼭 선택하는 것이 좋다. 이것은 매우 유용할 뿐더러, 시스템에 별 위험을 끼치지 않는다. 최소 설치를 위한 좀더 많은 정보를 필요로한다면, 보안을 위한 솔라리스 최소화(Solaris Minimization for Security)를 읽어보아라.
설치 과정 중에, 시스템을 파티션해야 할 것이다. 나는 Sun이 /opt와 /usr을 비롯하여 많은 파티션들을 나누는 것을 이해할 수 없다. 작은 파티션을 만들게 되면, 나중에는 항상 그것들을 다 써버리게 된다. 나는 항상 root를 최대한 크게 잡고 모든 것을 그곳에 넣어버리는 것을 좋아한다. 이렇게 하면, 하드를 다 써버리는 일은 없을 것이다. 그러나, root 파티션을 보호하기 위해 몇 개 파티션들을 잡아주어야 한다. 만약, root 파티션을 logging이나 email 같은 자료들로 가득 채워버린다면, 시스템을 crash시킬지도 모르는 DoS가 일어날 수도 있다.
그러므로, /var를 위한 파티션을 따로 나누는 것이 좋다. 이 파티션은 시스템의 모든 logging과 email이 저장되는 곳이다. 방화벽 logging을 위한 파티션을 따로 잡아주는 것도 고려하는 게 좋다. Checkpoint Firewall 1은 기본적으로 모든 logging을 /etc/fw/log(4.0은 /var/opt/CKPfw/log)에 남긴다. 많은 solaris 시스템들이 Ultra 10이나 x86을 위한 2 IDE 같은 두가지 이상의 드라이브(하드디스크)들을 갖는다. 만약, 두번째 드라이브를 미러링하지 않았다면, 그것을 모두 방화벽 logging을 위한 파티션으로 잡아라. 이것은, 방화벽 logging이 넘치는 것으로부터 다른 모든 파티션들을 보호한다. 이와같은 설정을 따르면, 다음과 같은 모양의 파틴션이 나올 것이다.
/ - everything else
/var - 400 MB
swap - 256 MB (or normally 2x amount of RAM)
/etc/fw/log - 2nd drive (for CP FW-1 ver 3.0x)
/var/opt/CKPfw/log - 2nd drive (for CP FW-1 ver 4.0x)
/var/opt/CPfw1-41/log - 2nd drive (for CP FW-1 ver 4.1x)
설치 후에 리부팅을 한 다음, Sun으로부터 recommended patch cluster를 꼭 설치하도록 한다. 패치들을 얻기 위해, 두번째 박스를 이용하는 것을 잊지 말아라. 아직, 방화벽 박스는 고립된 네트웍에 남아 있어야 한다. 패치들은 안전한 방화벽 유지를 위해 매우 중요하며 적어도 일주일에 한 번씩은 갱신되어야한다. Bugtraq은 최근의 버그와 취약점들을 위한 훌륭한 보고이다.
서비스 제거하기(Eliminating Services)
이제, 설치 패키지와 패치들을 깔고 리부팅하였다면, OS를 무장화하기 위한 준비가 되었다. 무장화는 주로 서비스들을 끄고, logging을 더하고, 몇 파일들을 조정하며, TCP Wrapper를 설치하는 것으로 이루어진다. 먼저, 우리는 서비스를 끄는 것에서 시작할 것이다.
기본적으로, solaris는 많은 유용한 서비스들을 제공하는 강력한 OS이다. 그러나, 이런 서비스들의 대부분은 방화벽을 위해선 필요가 없으며, 잠재적인 위험을 안고 있다. /etc/inetd.conf에서부터 시작해보자. 이 파일은 /usr/sbin/inetd 데몬이 listen할 서비스들을 정해놓고 있다. 기본적으로, /etc/inetd.conf는 35개의 서비스들로 구성되어 있지만, 당신에겐 ftp와 telnet 두 개만 필요할 뿐이다. 다른 필요 없는 서비스들에 대해선 앞에 #를 달아 주석처리한다(example). rexd 같은 inetd에 의해 제공되는 서비스들은 보안적으로 많은 위험을 가하기 때문에 이 과정은 매우 중요하다. 다음 명령을 통해, 어떤 서비스들을 주석처리했는지 확인하도록 한다.(이 명령은 주석처리 되지 않은 모든 서비스들을 보여줄 것이다.)
#grep -v "^#" /etc/inetd.conf
다음으로 건들어야 할 곳은 /etc/rc2.d와 /etc/rc3.d이다. 여기에는 init 프로세스에 의해 부팅시 실행되는 스크립트들이 있다. 이중 많은 것들이 필요하지 않다. 부팅 중에 스크립트가 실행되는 것을 막기 위해, 대문자 S를 소문자 s로 바꾼다. 부팅시에 스크립트를 실행하기 위해선 소문자 s를 다시 대문자 S로 바꾸어주면 된다. 다음 스크립트들은 필요가 없을 뿐더러, 보안적으로 위험한 것들이다.
/etc/rc2.d
S73nfs.client - NFS 마운팅을 위한 것으로, 방화벽엔 필요 없다.
S74autofs - automount을 위한 것으로, 방화벽엔 필요 없다.
S80lp - 프린팅을 위한 것으로, 역시 필요 없다.
S88sendmail - 오는 email을 듣기 위한 것으로, 이것이 실행되지 않더라도 방화벽은 email을 보낼 수 이싸.
S71rpc - portmapper 데몬으로, 아주 취약한 서비스이다.(CDE를 실행한다면, 필요하다.)
S99dtlogin - CDE를 기본적으로 시작시키는 CDE 데몬이다.
/etc/rc3.d
S15nfs.server - 파일 시스템 공유를 위한 것으로, 방화벽엔 아주 안 좋다.
S76snmpdx - snmp 데몬
GUI(CDE나 OpenWindows)를 실행시키는 것은 좋지 않다. 아주 꼭 필요한 경우에만 GUI를 실행시키도록 한다. Solaris 2.6의 기본 GUI인 CDE를 끄기 위해서는 S99dtlogin을 s99dtlogin으로 바꾸어주면 된다(대문자 S를 소문자 s로). CDE가 얼마나 많은 포트들과 서비스들을 필요로하는지 알아보려면, CDE가 실행되고 있을 때 다음을 쳐보아라.
ps -aef | wc - l
S99dtlogin과 S71rpc들을 꺼버린 다음(CDE를 실행시키기 위해선 필요함), 위에 명령을 실행시켜보고 얼마나 많은 서비스와 열려있는 포트가 줄어들었는지 그 전의 결과와 비교해보아라. 더 적은 서비스가 돌고 있을 수록 좋은 것이다. Core 설치를 한 경우에는 GUI가 설치되지 않기 때문에, 이 문제에 대해 신경쓸 필요가 없다.
Logging과 Tweaking(Logging and Tweaking)
가능한 많은 서비스들을 제거했다면, 이제는 logging을 설정할 차례이다. 많은 시스템의 logging이 /var/adm에서 이루어진다. 우리는 여기에 두 개의 log 파일들-sulog와 loginlog를 더할 것이다. /var/adm/sulog에는 su에 대한 모든 성공과 실패들이 기록된다. 이것을 통해 누가 시스템에 root 권한을 얻기 위한 시도를 했는지 모니터링 할 수 있다. /var/adm/loginlog에는 연속으로 실패한 login 시도가 기록된다. 만약, 사용자가 5번 login을 시도하여 모두 실패했다면 기록에 남게된다. 이것을 가능하게 하기 위해서는 /var/adm/loginlog과 /var/adm/sulog를 touch하기만 하면 된다. 두 파일 모두 민감한 정보를 싣고 있으니, chmod 640으로 설정하는 것을 잊지 말아라.
다음으로 할 일은 tweaking이다. 이것은 다양한 파일들의 관리에 관계된다. 먼저 할 일은 /etc/issue 파일을 만드는 것이다. 이 파일은 ASCII text 배너로 telnet login시에 나타난다(example A). 이 합법적인 경고는 누군가가 당신의 시스템에 login을 시도할 때 나타날 것이다.
또한 /etc/ftpusers 파일을 만들어야한다(example B). 이 파일에 열거된 계정들은 시스템에 ftp로 접속할 수 없다. 이것은 root나 bin과 같은 중요 계정들로 ftp session에 접근하는 것을 제한한다. 이 파일은 만드는 쉬운 방법은 다음 명령을 실행하는 것이다.
cat /etc/passwd | cut -f1 -d: > /etc/ftpusers
방화벽에 ftp로 접근하기 위한 계정이 /etc/ftpusers에 포함되지 않았는지 확인하라.
또한, root 계정으로 시스템에 telnet 접근을 할 수 없도록 확인해라. 이것은, 사용자가 시스템에 일반계정으로 login하여 root 권한을 갖기 위해 su를 사용하게 만든다. 대부분 시스템에 기본적으로 설정되어 있지만, /etc/default/login 파일에 console이 주석처리되지 않도록 확인한다(example C).
마지막으로, 나는 telnet OS 배너를 제거하고 ftp를 위한 배너를 만드는 것을 더 좋아한다. telnet OS 배너를 제거하는 건 /etc/default/telnetd 파일을 만들고 다음 문장을 추가하는 것으로 쉽게 된다.
BANNER="" # "SunOS 5.6" 텔넷 배너 제거
ftp를 위한 새 배너를 만들기 위해, /etc/default/ftpd 파일을 만들고, 다음 문장을 추가한다.
BANNER="WARNING:Authorized use only" # ftp를 위한 경고 배너
방화벽에 연결하기(Connetcing to Firewall)
방화벽에 연결하기 위한 안전하고 조정 가능한 길을 만드는 것은 매우 중요하다. 종종, 당신은 관리와 파일의 업로드를 위해 원격으로 방화벽에 접속해야 할 필요가 있을 것이다. 이런 통신들은 안전해야하며, 나는 여기에서 그 대책으로 ssh와 TCP Wrapper에 대해 설명할 것이다.
나는 ssh를 더 좋아한다. ssh는 당신과 방화벽 사이의 모든 통신들을 암호화시켜주지만, TCP Wrapper는 그렇지 않다. 따라서, TCP Wrapper는 스니핑으로부터 당신의 네트웍을 보호해주지 못 한다. 사용자들은 네트웍상에서 당신의 keystroke(패스워드 포함)들을 여전히 캡쳐할 수 있다. 만약, 사용자들의 스니핑이 걱정된다면, telnet/ftp 대신에 ssh를 쓸 것을 권장한다. ssh는 방화벽과의 모든 통신들을 암호화시켜, 당신이 안전한 상태로 파일을 업로드하고 방화벽을 관리할 수 있게 해준다. ssh는 자신만의 logging layer를 갖고 있다는 점과 자신에게 접속할 수 있는 시스템을 제한할 수 있다는 점에서 TCP Wrapper와 비슷하다. ssh에 대한 더 많은 정보를 원한다면, 이곳에서 찾을 수 있을 것이다. 2.x 버전은 라이센스에 제한이 있기 때문에, 1.2.7 버전을 쓰는 것을 권장한다. 95/NT 사용자들은 ssh 클라이언트 프로그램으로 SecureCRT를 사용할 수 있다.
TCP Wrapper는 비록 통신의 암호화는 해주지 않지만, 당신의 시스템에 접근할 수 있는 시스템들을 제한할 수 있고, 그들에 대한 log를 남길 수 있다. TCP Wrapper는 telnet이나 ftp 같은 inetd 서비스들을 보호하는 프로그램이다. TCP Wrapper를 통해 inetd 연결에 대한 wrapper를 띄워서, 모든 log들을 남겨 접근 조절 목록에 반하는 시도들을 가려낼 수 있게 된다. 만약, 연결이 허락되면 TCP Wrapper는 telnet과 같은 적당한 binary로 연결을 넘겨 준다. 접근 제한 목록에 의해 연결이 거절될 경우에는, 연결은 끊어진다.
많은 사람이 방화벽에 왜 굳이 TCP Wrapper가 필요한지 궁금해할 것이다. 대답은 간단하다. 첫째, 방화벽이 침범됐거나 무너졌을 때, TCP Wrapper는 두번째 방어벽을 제공한다. 둘째, TCP Wrapper는 방화벽의 잘못된 조정을 보완해준다. 나는 종종 방화벽이 잘못 세팅되어 있는 것을 보았다. 특히, VPN의 경우 권한이 없는 사용자가 방화벽에 접근할 수 있는 경우가 많았다. 셋째, TCP Wrapper는 다른 시스템 log들을 입증할 수 있는 두번째 logging layer를 제공한다.
Wietse Venema의 Website에서 TCP Wrapper를 얻을 수 있다. 다시 한 번, 당신의 두번째 박스를 사용하여 TCP Wrapper를 받고 컴파일하여라. 방화벽에는 어떤 컴파일러도 필요 없을 뿐더러, 아직은 고립된 네트웍에서 방화벽을 보호해야만 한다. 다운로드가 끝났으면, README 파일을 먼저 읽어보아라. 이것은 TCP Wrapper에 대한 아주 멋진 소개글이다. TCP Wrapper를 컴파일하는데 나는 두가지 옵션을 추천한다. 먼저, go with paranoid로 모든 연결에 대해 reverse lookup이 가능하다. 다음 방법으로, advance configuration을 사용하라. 이것은 매우 간단하다. 이 configuration은 후에 있을 패치들을 위해, 본래 위치에 binary들을 설치한다.
TCP Wrapper를 구동시키기 위해 몇가지 파일들을 편집해야 한다. 먼저, 컴파일이 끝났으면, /usr/local/bin 디렉토리에 tcpd 실행파일이 설치될 것이다. 다음으로, 서비스들을 보호하기 위해/etc/inetd.conf가 조정되어야 한다(example D). 그리고, tcpd logging을 위해 /etc/syslog.conf를 조정하고(example E), /var/adm/tcpdlog를 touch해줘야한다. 마지막으로, /etc/hosts.allow와 /etc/hosts.deny에 접근 제한 목록을 만들어야한다(example F).
이제 모든 파일들이 조정되었다면, /usr/bin/inetd를 kill -HUP를 이용하여 재실행한다. 이로써 TCP Wrapper 데몬이 실행될 것이다. 끝내기 전에 ACLs과 logging이 제대로 남는지 확인해보아라.
오타쿠들을 위해(For the Truly Paranoid)
이제까지 아주 필요한 것들에 대해서만 언급해보았다. 이런 방법들을 통해 당신의 시스템은 아주 안전해졌을 것이다. 축하!! 그러나 불행히도, 당신의 시스템이 100% 안전해진 것은 아닐 뿐더러 그럴 수도 없다(번역자 왈 : lan 선을 뽑아버리고, 컴퓨터를 스위스 은행 금고속에 넣으면 아주 안전하겠지만 --a). 오타쿠들을 위해, 조금더 안전한 시스템을 만들기 위한 몇 가지 방법들을 더해보았다.
먼저 우리는 wheel 그룹을 만들 것이다. wheel 그룹은 /usr/bin/su 같은 강력한 명령을 실행시킬 수 있는 선택된 개인들의 그룹이다. 이런 명령을 실행시킬 수 있는 사람들을 제한함으로써, 시스템의 안전도를 더 높일 수 있다. group을 생성하기 위해, /etc/group 파일을 편집해라. wheel 그룹을 만들고, 거기에 시스템 admin들을 추가시켜라. 그런다음 /usr/bin/su 같은 중요한 시스템 실행파일들을 찾아, 이 파일들의 그룹을 wheel로 바꾸고 실행 권한을 소유주와 그룹에게만 주어라. /usr/bin/su의 예를 들어, 다음과 같이 하면 된다.
/usr/bin/chgrp wheel /usr/bin/su
/usr/bin/chmod 4750 /usr/bin/su
*주의:(su가 /sbin 디렉토리에도 있다는 것을 잊지 말아라. 2.6에서는 /sbin/su.static로 되어 있다. 이 파일은 /usr/bin/su와 똑같지만, 라이브러리가 정적으로 링크되어 있어 파일 크기가 조금 더 크다. 이 파일 역시 위와 같이 바꾸어 주어야한다.)
다음으로, 우리는 .rhosts, .netrc, /etc/hosts.equiv 같은 파일들을 잠굴 것이다. r 명령들이 시스템에 접근하기 위해 이런 파일들을 사용한다. 이 파일들을 잠그기 위해, 퍼미션을 0으로 주어라. 이렇게 함으로써, 아무도 이 파일들을 변경시키거나 생성시킬 수 없게 된다. 예를 들어 다음과 같이 하면 된다.
/usr/bin/touch /.rhosts /.netrc /etc/hosts.equiv
/usr/bin/chmod 0 /.rhosts /.netrc /etc/hosts.equiv
또, TCP initial sequence number 생성 파라미터를 설정한다. 모든 TCP 연결에 대한 ISN을 랜덤하게 설정함으로써, 세션 하이재킹이나 ip 스푸핑 공격에 대해 대비를 할 수 있다. /etc/default/inetinit 파일에 TCP_STRONG_ISS=2로 설정함으로써 이것이 가능해진다(example G). 기본적으로, 시스템이 설치될 때 1로 설정되어있는데 이거은 결코 안전하지 않다.
가능한 버퍼오버플로우 공격을 막기위해, /etc/system에 다음 줄을 추가하여라.
set noexec_user_stack=1
set noexec_user_stack_log=1
(번역자 왈 : 이것은, stack 영역에서 code가 실행되지 않게 할 뿐더러 그러한 시도에 대해 log를 남긴다.)
마지막으로, IP 모듈에 대해 약간의 변경을 가하자. 다음의 명령들을 당신의 시작 스크립트에 추가하여라. ndd와 보안을 위한 ip 모듈 튜닝에 대한 자세한 정보는 Network Settings for Security에서 참고하여라.
### Set kernel parameters for /dev/ip
ndd -set /dev/ip ip_respond_to_echo_broadcast 0
ndd -set /dev/ip ip_forward_directed_broadcasts 0
ndd -set /dev/ip ip_respond_to_timestamp 0
ndd -set /dev/ip ip_respond_to_timestamp_broadcast 0
ndd -set /dev/ip ip_forward_src_routed 0
ndd -set /dev/ip ip_ignore_redirect 1
결론(Conclusion)
solaris 무장화를 위한 다소 기본적인 방법들을 살펴보았다. 안전한 시스템을 위한 열쇠는 최소의 소프트웨어 설치와 TCP Wrapper 등을 통한 layer들의 보호이다. 아직도 sudo(시스템 관리자가 root 권한을 몇몇 사용자에게만 주고 그들의 활동을 모두 log로 남길 수 있게한다), tripwire(시스템 실행파일들의 변경을 감지한다), swatch(자동으로 log를 모니터하고 경고해준다) 등과 같은 취할 수 있는 많은 방법들이 남아 있다. 시스템은 절대 100% 안전할 수 없다는 것을 명심하여라. 그러나, 위에 설명된 방법들을 통해, 위험을 크게 감소 시켰음은 틀림없다.
당신의 solaris 시스템을 더욱 무장화하기 위한 정보로, Sun Microsytems blueprint 글들, 특히 Solaris Security를 읽어 보는 것이 좋다.
보안을 위해, Brad Powell의 armoring script Titan을 검토해볼 것을 적극 권장한다. 이 전문적인 도구는 내가 여기에 써 놓은 것들보다도 더 강력하고 모듈적이면서, 훨씬 더 자세하게 보안에 대해 기술해 놓았다. 또한, YASSP-Yet Another Security Solaris Paper-를 검토해 보는 것도 좋을 것이다.
다운로드(Downloads)
당신의 시간과 노력을 덜어주기 위해, 여기에 쓰인 모든 것들을 자동으로 해주는 스크립트 하나를 만들어보았다. 이 스크립트는 바뀌기 전의 모든 파일들을 백업한 다음, 위에 쓰인데로 시스템을 바꿀 것이다. 또한, TCP Wrapper 역시 당신을 위해 구현할 것이다. 이 스크립트는 당신의 프로세서를 적절히 탐지하여 적당히 알아서 행동할 것이다. 이 스크립트는 꼭 새로이 설치된 시스템에만 쓰길 바란다. 의견이나 충고는 lance@spitzner.net로 보내면 된다.
Download armor-1.3.tar.Z
solaris 배포판에 uncompress가 기본으로 설치되기 때문에, gzip 대신에 compress를 사용하였다.
MD5 체크섬은 295e47ee993f4acc3b78333680fde1e5 이다.
Author's bio
Lance Spitzner는 집에서 그의 Unix 시스템을 날려 먹으면서 공부하는 것을 즐기고 있다. 이 전에는, 그는 Rapid Deployment Force의 장교였다. 그곳에서 그는 다른 어떤 것을 날려먹었다. lance@spitzner.net을 통해 그에게 연락할 수 있다.
'OS > SOLARIS' 카테고리의 다른 글
솔라리스 백업관련 (0) | 2006.10.09 |
---|---|
시스템 디스크 교체 후 E3500 부팅 절차 (0) | 2006.08.07 |
솔라리스 호스트네임변경 (0) | 2006.08.01 |
Sun Solaris Server 온라인중 root 파일시스템 백업 (0) | 2006.07.24 |
슬라이스 이동을 통한, 기본적인 디스크 장애 관리기법입니다. (0) | 2006.07.24 |