1. 실무환경을고려한엔터프라이즈 Linux 운영체제설치 1.4 운영체제기본보안설정 Linux 운영체제는 Open Source 기반운영체제입니다. Open Source 기반의운영체제라는조건이실제시스템운영측점에서장점이될수도있고, 단점이될수도있는데대표적인것이바로운영체제보안이라볼수있습니다. 운영체제의 Source code 가공개되어져있기에실제운영체제의보안취약점이크래커에게공개되는경우가있을수있다는것입니다. 하지만반면에전세계적으로분포된 Linux 개발프로젝트에참여한개발자, 엔지니어, 테스터들이문제점을사전에발견하여지속적인패치를해준다는장점이있습니다. 실제상용 UNIX 의경우보안적인문제가발생하더라도이가해당보안담당자에게알려지는기간이길기때문에패치가나오기전에해킹을당하는경우가많습니다. 하지만 LINUX 의경우는대부분의해킹사례가이미 Linux 커뮤니티등에서보안이슈를발표하고 1년이상이후에해당취약점으로패치가안된시스템을공격하는경우입니다. 이런두가지측면의보안이슈는어느것이좋고, 나쁨을떠나시스템엔지니어의보안에대한경각심과시스템보안관리에대한노력의문제라고볼수있습니다. 아래는 Linux 시스템을설치후기본적인보안설정에대해설명한것입니다. 초기배포환경에서는여러측면의서비스를대상으로하기때문에해당시스템의서비스성격과다른패키지와보안정책등이부여가되어져있을것입니다. 이는실제불필요한시스템의자원낭비일뿐만아니라관리하지않는보안적헛점이존재한다는측면에서보안적으로취약점이될수있기에설치이후서비스를시작하기전에적절한조치를취해줘야하는내용들입니다. 1.4.1 시스템서비스 Daemon 관리 - 불필요한서비스 Daemon 제거 Redhat 기반의 Linux 운영체제를설치하면기본적으로여러가지서비스가부팅시 1/32 페이지
자동시작이되도록설정이되어져있다. 하지만대부분의서비스들이실제서비스대상과는전혀상관없는서비스이다. 꼭필요한서비스이외의나머지서비스들은아래와같은방법으로부팅시자동시작리스트에서제거한다. /sbin/chkconfig --del anacron /sbin/chkconfig --del atd /sbin/chkconfig --del autofs /sbin/chkconfig --del echo /sbin/chkconfig --del finger /sbin/chkconfig --del gpm /sbin/chkconfig --del nfs /sbin/chkconfig --del nfslock /sbin/chkconfig --del portmap /sbin/chkconfig --del rlogin /sbin/chkconfig --del rsh /sbin/chkconfig --del rsync /sbin/chkconfig --del lpd /sbin/chkconfig --del xfs - 필요한서비스추가 /sbin/chkconfig --add crond /sbin/chkconfig --add network /sbin/chkconfig --add sshd /sbin/chkconfig --add syslog /sbin/chkconfig --add named /sbin/chkconfig --add proftpd /sbin/chkconfig --add sendmail /sbin/chkconfig --add nfs /sbin/chkconfig --add portmap /sbin/chkconfig --add rlogin /sbin/chkconfig --add rsh /sbin/chkconfig --add rsync 2/32 페이지
부팅시자동시작서비스 Daemon 제어방법으론위방식은 chkconfig 이외에 ntsysv 란명령어를이용하여설정할수도있다. - 불필요한 Xinetd 서비스제거 Xinetd 서비스설정은 /etc/xinetd.d/ 안에존재한다. 이설정파일을잘못관리하게되면원하지않는서비스를허용하게된다. 원천적으로사용하지않는서비스설정에대해서는삭제해버리는것이좋다. rm -f chargen rm -f chargen-udp rm -f daytime rm -f daytime-udp rm -f echo rm -f echo-udp rm -f finger rm -f ntalk rm -f rexec rm -f rlogin rm -f rsh rm -f rsync rm -f servers rm -f services rm -f sgi_fam rm -f talk rm -f telnet rm -f time rm -f time-udp rm -f proftpd-inetd 1.4.2 시스템계정관리및운영체제파일, Directory 권한조정 Linux 를설치하게되면기본적으로많은시스템계정과어플리케이션계정이존재하게된다. 3/32 페이지
이는이전의 Linux 버전에서실제서비스 Daemon의대부분을 root 계정에서관리를하였는데이런취약한서비스 Daemon을이용하여시스템의 root 권한을외부에허용하는보안상의헛점이많이존재하였다. 그후서비스 Daemon을제어하는시스템계정을별도로생성하게되었는데이런이유로 Linux를기본적으로설치하면많은시스템계정이생성되게된다. 하지만사용하지않는서비스나어플리케이션에구동되어지는계정의경우불필요한계정관리부담및보안상에위험요소를가지고있게된다. 이런이유로불필요한계정과그룹정보를초기운영체제설치후에반드시지원주도록하다. 이런기본시스템계정삭제에앞서해당설정파일을백업을받고삭제를하길바란다. 주요백업대상파일은 /etc/passwd, /etc/group, /etc/shadow 가그에해당한다. - 불필요계정삭제 userdel adm userdel lp userdel sync userdel shutdown userdel halt userdel news userdel uucp userdel operator userdel games userdel gopher - 불필요그룹삭제 groupdel adm groupdel lp groupdel news groupdel uucp groupdel games groupdel dip 4/32 페이지
- 운영체제기본명령어권한조정및시스템파일보안정책 기본운영체제설치이후 root setuid, setgid 권한의명령어를검색하여불필요한명령어의퍼미션을조정한다. 참고로 setuid, setgid 는일반유저가해당명령어를실행할때 root 권한으로명령어가실행되도록하는권한이다. 이는해당명령어를통해일반유저가 root 관리자권한을얻게되는것으로불필요한경우에는반드시퍼미션을조정해야한다. # find / -type f \( -perm -4000 -o -perm -2000 \) chmod 700 /usr/bin/chage chmod 700 /usr/bin/gpasswd chmod 700 /usr/bin/wall chmod 700 /usr/bin/chfn chmod 700 /usr/bin/chsh chmod 700 /usr/bin/newgrp chmod 700 /usr/bin/write chmod 700 /usr/bin/passwd chmod 700 /usr/bin/at chmod 700 /usr/bin/lockfile chmod 700 /usr/bin/rcp chmod 700 /usr/bin/rlogin chmod 700 /usr/bin/rsh chmod 700 /usr/bin/slocate chmod 700 /usr/bin/crontab chmod 700 /usr/libexec/openssh/ssh-keysign chmod 700 /usr/sbin/ping6 chmod 700 /usr/sbin/traceroute6 chmod 700 /usr/sbin/usernetctl chmod 700 /usr/sbin/userhelper chmod 700 /usr/sbin/lockdev chmod 700 /usr/sbin/userisdnctl chmod 700 /usr/sbin/sendmail.sendmail chmod 700 /usr/sbin/traceroute chmod 700 /usr/sbin/utempter chmod 700 /bin/ping 5/32 페이지
chmod 700 /bin/mount chmod 700 /bin/umount chmod 700 /bin/su chmod 700 /sbin/pam_timestamp_check chmod 700 /sbin/pwdb_chkpwd chmod 700 /sbin/unix_chkpwd chomd 700 /usr/bin/gcc chmod 700 /sbin/netreport chmod 700 /usr/bin/sudo 아래는 setuid, setgid 권한의명령어와일반관리자용명령어중특정일반유저가사용할필요가있는경우특정그룹을만들어해당그룹에속한유저만사용가능토록지정하는방법이다. chmod 4750 /usr/bin/rcp chmod 4750 /usr/bin/rsh chmod 4750 /usr/bin/rlogin chmod 4111 /usr/bin/sudo chmod 2750 /usr/sbin/sendmail.sendmail chmod 4750 /bin/su chattr +i /etc/fstab chmod 750 /bin/ps chmod 750 /bin/netstat chmod 750 /bin/dmesg chmod 750 /bin/df chmod 750 /usr/bin/w chmod 750 /usr/bin/who chmod 750 /usr/bin/last chmod 750 /usr/bin/top chmod 750 /usr/sbin/lsof chmod 750 /usr/bin/gcc 6/32 페이지
chgrp wheel /bin/ps chgrp wheel /bin/netstat chgrp wheel /bin/dmesg chgrp wheel /bin/df chgrp wheel /usr/bin/w chgrp wheel /usr/bin/who chgrp wheel /usr/bin/last chgrp wheel /usr/bin/top chgrp wheel /usr/sbin/lsof chgrp whell /usr/bin/gcc chgrp wheel /usr/bin/rcp chgrp wheel /usr/bin/rsh chgrp wheel /usr/bin/rlogin # vi /etc/group. wheel:x:10:root,clunix,alang. - 시스템 Directory 권한조정 chmod 711 / chmod 711 /home chmod 711 /var chmod 711 /var/log chmod 711 /etc chmod 700 /root 1.4.3 운영체제기본서비스보안설정 - 일반 Shell 사용자보안설정 시스템에여러개의접속계정이있을경우사용자계정에따른적절한보안정책이주어져야한다. 즉사용자별시스템자원사용제한정책이나, 사용자의특정작업을감시하는형태의보안이필요하게된다. 7/32 페이지
사용자별자원의할당정책은주로사용자그룹을이용하여제한을두는것이관리상편리하다. 자원의제한설정은 /etc/security/limits.conf 설정파일에서제어할수있다. # vi /etc/security/limits.conf ------------------------------------------------------------------- @student hard nproc 20 @admin soft nproc 20 @admin hard nproc 50 ftp hard nproc 3 @student - maxlogins 4 alang - maxlogins 2 ------------------------------------------------------------------- 설정의경우 student 란그룹의속해진유저들은이시스템에서최대 20개의프로세스사용할수있고. 최대 4개의터미널접속이가능하도록제한되어진다. limits.conf 의설정방식은아래와같다. <domain> <type> <item> <value> <domain> 은시스템계정이나그룹에해당되며공백일경우에는와일드카드문자인 * 이적용되어진다. 그룹의경우에는그룹명앞에 '@' 를붙여사용할수있다. <type> 의경우는 hard 와 soft 로나누어지며 hard 의경우는 hard limit 에해당하고 soft 는 soft limit 에해당하는값이다. hard, soft limit 는시스템명령인 ulimit 란명령으로확인이가능하다. hard limit 확인 -> # ulimit -Ha soft limit 확인 -> # ulimit -Sa <item> 의경우는실제세부적인시스템자원에해당된다. 여기에는여러가지해당값으로 8/32 페이지
나눌수있다. 대표적인항목으로는다음과같다. core - limits the core file size (KB) data - max data size (KB) fsize - maximum filesize (KB) memlock - max locked-in-memory address space (KB) nofile - max number of open files rss - max resident set size (KB) stack - max stack size (KB) cpu - max CPU time (MIN) nproc - max number of processes as - address space limit maxlogins - max number of logins for this user priority - the priority to run user process with locks - max number of file locks the user can hold <value> 는각자원의제한값이다. 이밖에사용자의주요작업내역에대해서는아래의방식으로관리가가능하다. 물론이런방식이정상적으로허용될지에대해서는각사이트마다다를것이다. 하지만여러명의사용자가존재하고모두의정상적인시스템사용을위해서는관리자의막강한관리권한이주어져야하며, 권한을가진관리자에게는시스템관리에따른윤리성에대한자각이갖추어져야한다. 아래방식은실제사용자의주요작업 history 를관리자가쉽게파악할수있도록하는방법이다. 관리자의경우는실제시스템적관리권한에이미일반사용자의작업 history를볼수있는권한이주어진다. 하지만운영정책에의해제한되어지는환경도많을것이다. 아래방법은시스템상에서적절한권한을위임받은상태에서보다효율적인관리를위해서사용될수있는방법일것이다. - 일반 shell 사용자작업내용감시하기 /etc/profile 파일의제일밑부분에아래내용추가 9/32 페이지
if [ $LOGNAME!= "root" ] then HISTFILE=/var/log/user_history TMOUT=200 echo -n " userhistory 로그인 ID: $LOGNAME 접속시간 : `/bin/date` " >> /var/log/user_history fi /root/.bashrc 파일밑부분에다음라인추가 HISTFILE=/root/.bash_history TMOUT=-1 그런후 /var/log 밑에 user_history 란파일을생성합니다. # touch /var/log/user_history 마지막으로 /var/log/user_history 파일의 permission 을 662 으로해줍니다. # chmod 662 /var/log/user_history 위와같은설정이완료되면일반계정에서로그인을했을경우사용자계정의홈Directory 밑에생성되어져야할작업 history 가 /var/log/user_history 밑에아래와같이생성이될것이다. 10/32 페이지
# cat /var/log/user_history userhistory 로그인 ID: alang 접속시간 : Mon Apr 11 16:34:42 KST 2005 ls ls ps ax cat.bash_history 참고 : 위설정에서 TIMEOUT 설정은사용자계정이접속한후아무런작업없이 200초를유휴상태로있을경우자동 logoff 시키는명령이다. limits.conf 등에서사용자계정의터미널최대접속수를제한했을경우실제시스템을사용하지않는상태에서접속만하고있을경우다른사용자들이시스템접속제한에걸려접속을하지못하는것을방지하기위한설정이다. 만일접속사용자의편의를최대한보장한다고한다면, limits.conf 설정의 maxlogin과위설정의 TIMEOUT 설정을제거하도록한다. 이제위의사용자 history 내역을관리자에게자동메일을보내주는스크립트를사용하여매일편리하게사용자관련보안을점검하면된다. # vi cmdchk -------------------------------------------------------------------------------- #!/bin/sh date=`date +%Y%m%d` mailadm=admin@domain.com if [ -s /var/log/user_history ] then mail -s "$date `hostname` user_history check" admin@domain.com < /var/log/user_history echo > /var/log/user_history fi -------------------------------------------------------------------------------- 11/32 페이지
- Xinetd 서버스보안정책 시스템기본접속단계에해당하는 telnet, ssh, ftp 등의서비스는xinetd 란수퍼 Daemon 상에서관리되어진다. 이는 Linux 기본정책일뿐반드시위서비스가 xinetd Daemon 상에서관리되어야하는것은아니다. xinetd Daemon의자세한사용법에대해서는별도의서적이나인터넷상의정보를참고하길바란다. 여기서는 xinetd 상에서구동되는서비스의기본보안설정에대해서만다루도록한다. xinetd Daemon으로구동되어지는서비스들은 /etc/service 란설정파일에서확인할수있다. 그리고실제서비스적용사항들은 /etc/xinetd.d 란 Directory에서확인이가능하다. xinetd 설정형식은다음과같다. # cat /etc/xinetd.d/rsh ----------------------------------------------------------------------------- service shell { disable = yes socket_type = stream wait = no user = root log_on_success += USERID log_on_failure += USERID server = /usr/sbin/in.rshd } ------------------------------------------------------------------------------ 실제위설정에서 'disable' 설정에 'yes' 가되어있는경우서비스를 off 시켜두겠다는의미이다. 실제사용을하지않는서비스의경우에서설정파일을제거하는것이안정할것이다. 임시적으로사용을중단하는것이라면위설정과같이 disable = yes 상태로두는것이좋다. 이런형태의 xinetd Daemon으로관리하는서비스의경우 TCP Wrapper 란프로그램으로서비스에대한접근권한을제어할수있다. 이는 iptables 와같은 netfilter 기반의보안방식에비해가볍고효율적인보안관리가가능하다. 12/32 페이지
아래는 tcp wrapper 설정방법이다. # vi /etc/hosts.deny sshd : ALL : twist ( /root/bin/hostchk Y Y %a %c %d %h %n %p %s %u ) & in.proftpd : ALL : twist ( /root/bin/hostchk Y Y %a %c %d %h %n %p %s %u ) & # vi /etc/hosts.allow sshd : localhost 127.0.0.1 211.241.202. 192.168.1. in.proftpd : localhost 127.0.0.1 211.241.202. 192.168.1. tcp wrapper 설정은 /etc/hosts.deny 와 /etc/hosts.allow 두가지설정으로나누어진다. hosts.deny 는서비스거부설정이고 hosts.allow 는서비스허가설정이다. 순서로보면 /etc/hosts.deny 설정파일에서서비스접근을거부시킬서비스와그영역을설정한다. 위설정에서는 sshd, proftpd 란서비스에대해모든곳에서의접속을거부한다는의미다. twist 설정은실제거부되는서비스에접근시도가있을경우뒤에설정된명령을실행시키는설정이다. 그런후접속을허가할사이트에대해서 hosts.allow 파일에허가설정을하도록한다. 서비스설정방식은아래와같다. 13/32 페이지
<service>:<address>:<option> <service> 는 xinetd Daemon 상에서구동되어지는서비스명이다. <address> 는접속사이트의 IP 주소및 Subnet 영역등이포함된다. 'ALL' 이란설정으로모든영역을나타낼수있다. <option> 은 twist 와같이접근제한, 혹은접근허가이후특정작업을실행할수있다. 위설정은 hosts.allow 에서허가하지않는사이트에서접근할때접근을거부시키고 /root/bin/hostchk 란명령어를실행하라는의미이다. hostchk 란명령어는접속사이트정보를관리자에게메일로보내주는관리용스크립터명령이다. # vi /root/bin/hostchk -------------------------------------------------------------------------------- #!/bin/sh ################################ 변수정의부문 # 메일수신자 mailto=admin_user@domain.com # 화면출력여부, 메일전송여부 dsp=$1; msg=$2 # 접속자정보등 a=$3; c=$4; d=$5; h=$6; n=$7; p=$8; s=$9; u=$10 # 현재시간 time=`date` # 접속시도자소속서버의 finger 정보 finger=`/usr/bin/finger -l @$h 2> /dev/null` 14/32 페이지
################################ 화면출력부문 if [ $dsp = Y ] then /bin/echo -n " =================================== 접속이허용되지않습니다. =================================== " fi Access Time : $time Client host address : $a Client information : $c Client host name(or IP) : $h Client host name : $n Client user name : $u ################################ 메일송신부문 if [ $msg = Y ] then /bin/echo -n " =============================== 접속거부자상세정보 =============================== Access Time : $time Access client host address : $a Access client information : $c The daemon process name : $d 15/32 페이지
Access client host name(or IP) : $h Access client host name : $n The daemon process id : $p Server information : $s Access client user name : $u -------------------------------------- Access client finger information -------------------------------------- $finger ------------------------------------------------ " \ /bin/mail -s "tcp_wrapper report [$d]" $mailto fi ------------------------------------------------------------------------------------ 허가되지않은영역에서접속을하게되면위관리스크립터에지정된관리자메일주소로아래와같은 Message 가발송이되어진다. =============================== 접속거부자상세정보 =============================== Access Time : Mon Apr 11 17:18:25 KST 2005 Access client host address : 192.168.133.1 Access client information : arh01.clunix.org The daemon process name : sshd Access client host name(or IP) : arh01.clunix.org Access client host name : arh01.clunix.org The daemon process id : 4154 Server information : sshd@192.168.133.9 Access client user name : Y0 16/32 페이지
-------------------------------------- Access client finger information -------------------------------------- ------------------------------------------------ 보안과사용자편리성은상극적인관계상에존재한다. 사용자의편의만을생각하면실제아무런보안설정이되어져있지않는것이좋을것이다. 오랜시간안정적인시스템환경유지를위해서라면철저한시스템보안정책위주의보안이필요할것이다. 하지만이런보안환경에서는사용자의불편함이클수밖에없다. 이두가지관계속에해당사이트의특성을최대한고려하여관리자는보안정책을적용해야할것이다. 1.4.4 기본보안프로그램설치및관리 - Tripwire 설치및관리 Tripwire 은원래 Linux가아닌유닉스플랫폼에서설계되어왔으나현재 Linux에서대표적으로사용되는파일무결성검사도구이다. Tripwire는시스템파일등의변조및추가등을검사함으로써.. 해킹의도를파악할수있는보안도구입니다. Tripwrie 설치전몇가지알아두어야할점이있다. 검사도구는시스템설치후에바로설치해야의미가있다. 이미해킹당한상태에서설치해보아야검사도구엔발견되지않는다. 초기에아주깨끗한상태에서시스템파일정보들을 DB file로만들어놓고앞으로변화되는상황을지켜보아야한다. 그리고시스템정보가저장될 DB file 이다른사람에게접근을허용하면안된다. 이두가지만철저하게지키면아주유용한보안도구로사용이가능하다. 이제설치에들어가보도록하자. 설치는 RPM 과 Source 두가지방법이있다. 먼저 Source 설치방법에대해알아보자. 17/32 페이지
tripwire 소스는다음사이트에서다운받을수있다. http://www.tripwire.org 특정 Directory 에소스를다운받아압축을푼다. # tar xzvf tripwire-2.3-47.bin.tar.gz # cd tripwire-2.3 #./install.sh ------------------------------------------------------------------------------------ Installer program for: Tripwire(R) 2.3 Open Source for LINUX Copyright (C) 1998-2000 Tripwire (R) Security Systems, Inc. Tripwire (R) is a registered trademark of the Purdue Research Foundation and is licensed exclusively to Tripwire (R) Security Systems, Inc. LICENSE AGREEMENT for Tripwire(R) 2.3 Open Source for LINUX Please read the following license agreement. You must accept the agreement to continue installing Tripwire. Press ENTER to view the License Agreement. <--- [ ENTER ].. consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. Please type "accept" to indicate your acceptance of this license agreement. [do not accept] <--- [ accept ]. 18/32 페이지
. TWBIN: /usr/sbin TWMAN: /usr/man TWPOLICY: /etc/tripwire TWREPORT: /var/lib/tripwire/report TWDB: /var/lib/tripwire TWSITEKEYDIR: /etc/tripwire TWLOCALKEYDIR: /etc/tripwire CLOBBER is false. Continue with installation? [y/n] <--- [ y ] Creating key files... (When selecting a passphrase, keep in mind that good passphrases typically have upper and lower case letters, digits and punctuation marks, and are at least 8 characters in length.) Enter the site keyfile passphrase: <--- [ password ] Verify the site keyfile passphrase: <--- [ password ] (When selecting a passphrase, keep in mind that good passphrases typically have upper and lower case letters, digits and punctuation marks, and are at least 8 characters in length.) Enter the local keyfile passphrase: <--- [ password ] Verify the site keyfile passphrase: <--- [ password ].. ---------------------------------------------- Generating Tripwire configuration file... ---------------------------------------------- 19/32 페이지
Creating signed configuration file... Please enter your site passphrase: <--- [ password ]. ---------------------------------------------- Customizing default policy file... ---------------------------------------------- Creating signed policy file... Please enter your site passphrase: <--- [ password ] ---------------------------------------------- The installation succeeded. Please refer to /usr/doc/tripwire/release_notes for release information and to the printed user documentation for further instructions on using Tripwire 2.3 Open Source for LINUX. 이로써 tripwire 의설치가완료되었다. 설치가완료된시점에서일단 Tripwire 의초기 DB 데이터를생성하도록한다. Tripwire 의초기 DB 데이터란현시스템의운영체제의파일들의무결성점검결과를저장한 DB 파일을초기화시킨다는의미이다. 즉깨끗한시스템파일초기상태의기준을세운다는의미로보면된다. 만일이초기화작업을이미해킹을당해백도어가설치된상태에서초기화를시킨다고하면이런 Back door 까지도무결파일의기준으로인식하게된다. 그렇기때문에 Tripwire 같은무결성프로그램은반드시 OS 설치후정식서비스를시작하기전에설치를해두는것이좋을것이다. # tripwire --init Please enter your local passphrase: <--- [ password ] 이제 tripwire 로파일시스템의무결성을체크하면된다. # tripwire --check 20/32 페이지
Redhat 배포판의경우 RPM 방식으로배포를하기때문에이패키지사용을권장한다. 아래는간단한 RPM 방식의설치및기본설정방법에대해소개한다. Redhat Linux 9 배포판 CD3 에 tripwire-2.3.1-17 버전의패키지가존재한다. 해당 RPM을설치한다. # rpm -Uvh tripwire-2.3.1-17.i386.rpm 설치정보는다음과같다. ROOT POLFILE DBFILE REPORTFILE SITEKEYFILE LOCALKEYFILE =/usr/sbin =/etc/tripwire/tw.pol =/var/lib/tripwire/$(hostname).twd =/var/lib/tripwire/report/$(hostname)-$(date).twr =/etc/tripwire/site.key =/etc/tripwire/$(hostname)-local.key 이제위의소스방식의설치단계에나오는 site.key 생성및로컬인증키생성등의과정에해당하는기본보안설정스크립터인 twinstall.sh 를실행한다. twinstall.sh 실행전에 /etc/tripwire/twpol.txt 에서무결성체크대상설정변경후에도실행하도록한다. 초기 twpol.txt 에정의된보안정책은기본운영체제에맞는보안체제기때문에바로적용하기엔너무많은체크대상을포함하게된다. 그렇기때문에초기에는우선초기화명령을실행해서출력되는에러내용을파악하여현시스템에맞는체크대상을만들도록한다. # tripwire --init 2> error # cat error ------------------------------------------------------------------------------------.. ### Filename: /bin/ksh ### 그런파일이나 Directory가없음 ### Continuing... 21/32 페이지
### Warning: File system error. ### Filename: /root/.esd_auth ### 그런파일이나 Directory가없음 ### Continuing... ### Warning: File system error. ### Filename: /root/.gnome_private ### 그런파일이나 Directory가없음 ### Continuing... ### Warning: File system error. ### Filename: /root/.gnome-desktop ### 그런파일이나 Directory가없음 ### Continuing... ### Warning: File system error. ### Filename: /root/.gnome ### 그런파일이나 Directory가없음 ------------------------------------------------------------------------------------ 위는기본정책에는들어있는체크대상이지만현시스템에는존재하지않는대상들이다. 이부분들을 /etc/tripwire/twpol.txt 에서제거하고다시 /etc/tripwire/twinstall.sh 를실행한다. # /etc/tripwire/twinstall.sh 체크대상보안정책 DB 파일을재생성한다. # twadmin --create-polfile twpol.txt 새로생성된체크대상보안정책으로초기체크대상 DB 파일을초기화한다. # tripwire --init 이제파일시스템의무결성을체크한다. # tripwire --check 22/32 페이지
체크한결과는터미널상에출력되고, /var/lib/tripwire/report 에 twr확장 DB 파일로생성이된다. twr 결과리포트를다시확인하고싶을때는아래방식을이용하면된다. # twprint -m r --twrfile /var/lib/tripwire/report/arhdev-20050415-102800.twr 그럼아래와같은결과가출력된다. ------------------------------------------------------------------------------------ Note: Report is not encrypted. Tripwire(R) 2.3.0 Integrity Check Report Report generated by: root Report created on: 2005 04 15 () 10 28 00 Database last updated on: Never Report Summary: Host name: arhdev Host IP address: 192.168.133.9 Host ID: None Policy file used: /etc/tripwire/tw.pol Configuration file used: /etc/tripwire/tw.cfg Database file used: /var/lib/tripwire/arhdev.twd Command line used: tripwire --check Rule Summary: ------------------------------------------------------------------------------- Section: Unix File System ------------------------------------------------------------------------------- Rule Name Severity Level Added Removed Modified --------- -------------- ----- ------- -------- Invariant Directories 66 0 0 0 Temporary directories 33 0 0 0 Tripwire Data Files 100 0 0 0 Critical devices 100 0 0 0 23/32 페이지
User binaries 66 0 0 0 Tripwire Binaries 100 0 0 0 Libraries 66 0 0 0 Operating System Utilities 100 0 0 0 Critical system boot files 100 0 0 0 File System and Disk Administraton Programs 100 0 0 0 Kernel Administration Programs 100 0 0 0 Networking Programs 100 0 0 0 System Administration Programs 100 0 0 0 Hardware and Device Control Programs 100 0 0 0 System Information Programs 100 0 0 0 Application Information Programs 100 0 0 0 Shell Related Programs 100 0 0 0 Critical Utility Sym-Links 100 0 0 0 Shell Binaries 100 0 0 0 Critical configuration files 100 0 0 0 System boot changes 100 0 0 0 OS executables and libraries 100 0 0 0 Security Control 100 0 0 0 Login Scripts 100 0 0 0 Root config files 100 0 0 0 ------------------------------------------------------------------------------------ 이제테스트를해보도록하자 /bin Directory 밑에 test 란임의의파일을하나생성하고, /bin 밑의명령어의 permission을변경해보도록하자. # echo > /bin/test # chmod 700 /bin/vi 그런후무결성체크를재시도해보자 # tripwire --check # twprint -m r --twrfile /var/lib/tripwire/report/arhdev-20050415-104007.twr ------------------------------------------------------------------------------------ Rule Summary: 24/32 페이지
------------------------------------------------------------------------------- Section: Unix File System ------------------------------------------------------------------------------- Rule Name Severity Level Added Removed Modified --------- -------------- ----- ------- -------- Invariant Directories 66 0 0 0 Temporary directories 33 0 0 0 Tripwire Data Files 100 0 0 0 Critical devices 100 0 0 0 User binaries 66 0 0 0 Tripwire Binaries 100 0 0 0 Libraries 66 0 0 0 * Operating System Utilities 100 0 0 1 Critical system boot files 100 0 0 0 File System and Disk Administraton Programs 100 0 0 0 Kernel Administration Programs 100 0 0 0 Networking Programs 100 0 0 0 System Administration Programs 100 0 0 0 Hardware and Device Control Programs 100 0 0 0 System Information Programs 100 0 0 0 Application Information Programs 100 0 0 0 Shell Related Programs 100 0 0 0 Critical Utility Sym-Links 100 0 0 0 Shell Binaries 100 0 0 0 Critical configuration files 100 0 0 0 System boot changes 100 0 0 0 * OS executables and libraries 100 1 0 1 Security Control 100 0 0 0 Login Scripts 100 0 0 0 * Root config files 100 0 0 2.. ------------------------------------------------------------------------------- Rule Name: OS executables and libraries (/bin) Severity Level: 100 ------------------------------------------------------------------------------- Added: "/bin/alang" Modified: 25/32 페이지
"/bin".. ------------------------------------------------------------------------------- Rule Name: Operating System Utilities (/bin/vi) Severity Level: 100 ------------------------------------------------------------------------------- Modified: "/bin/vi". ----------------------------------------------------------------------------------- 위와같이초기화 DB 에서변경된사항들을확인할수있다. 시스템을관리하면서추가로패키지를설치하거나관리목적으로설정파일등을변경했을때매번결과리포트에변경사항이적용되어출력이될것이다. 그렇기에변경된내용을새로업데이트하여초기 DB 를갱신해야할때가있다. 이때는아래의명령행을이용한다. # tripwire --update --twrfile /var/lib/tripwire/report/arhdev-20050415-104007.twr 그럼결과리포트중변동내역에대한자세한정보를출력해주고이를확인후관리작업상의변동사항이라고하면 site.key 의인증암호를입력하여업데이트를시키도록한다. 이로써 Tripwire 를이용한파일시스템무결성체크에대한설명을마치도록한다. - fcheck 설치및관리 fcheck 는 perl 기반의파일무결성관리프로그램으로 Tripwire 에비해가볍고간단하면서 Tripwire 와유사한역할을충분히해준다. 먼저프로그램을다운받도록하자. http://www.geocities.com/fcheck2000/ 가면최신프로그램이있을것이다. 다운을받고 /usr/local 및에둔다. 압축을풀고..fcheck,fcheck.cfg 파일의설정값을몇개수정하자. 26/32 페이지
# tar xzvf FCheck_2.07.59.tar.gz # cd fcheck # vi fcheck -------------------------------------------------------------------.. ############################################################### ############## # # # User modifiable variable definitions: # # # ############################################################### ############## # This should be passed through the command line, but hard coding still works $config="/usr/local/fcheck/fcheck.cfg"; ----------------------------------------- 이부분을시스템환경에맞게수정 ------------------------------------------------------------------- # vi fcheck.cfg ------------------------------------------------------------------- Directory = /etc/ Directory = /bin/ Directory = /usr/bin/ Directory = /sbin/ Directory = /usr/sbin/ Directory = /usr/local/bin/ Directory = /usr/local/sbin/ Directory = /lib/ Directory = /usr/lib/ Directory = /usr/local/lib/ # # Directory 설정은 fcheck 가체크할파일들이들어있는 Directory로시스템에 27/32 페이지
# 중요한명령어나설정파일등이있는곳을정해주면된다. # Exclusion Exclusion = /etc/passwd = /etc/shadow # # Exclusion 설정은 Directory 설정에서정한 Directory중자주변경이되는파일 # 이있어서체크때마다걸리므로체크생략을요하는파일을정해주면된다. # 호스팅업체나기타자주사용자를추가하는서버라면위와같이해주면된다. # DataBase = /usr/local/fcheck/data/data.dbf # # DataBase 설정은 Linux 파일정보를 DB 파일로저장해서다음체크시비교 # 분석할때사용되어진다. # TimeZone = GMT-9 # # 한국시간을적용한다. GMT-9 # #File = /usr/local/admtools/logs/sol.dbf ------------------------------------------------------------------------- File 설정은필요없으니주석처리해준다. 기타여러설정값이있으나크게작동하는데영향을주지않는다. 기본값을적용한다. 이와같이적용후 /usr/local/fcheck/data Directory 를만들어준다. 28/32 페이지
# mkdir /usr/local/fcheck/data # /usr/local/fcheck/fcheck -ac 이와같이 fcheck -ac 로파일무결성체크를시작한다. 그럼 data Directory 안에 data.dbf 파일이생성되어진다. 이제 Directory 설정에해당하는 Directory 안에다가파일을하나생성하고재대로점검을하는지테스트를하여보자.. # touch /etc/test # /usr/local/fcheck/fcheck -a 그럼아마아래와같은결과를출력할것이다. PROGRESS: validating integrity of /etc/ STATUS: ADDITION: [zzang911.net] /etc/test Inode Permissons Size Created On 19508 -rw-r--r-- 0 Sep 19 20:13 2001 자이제이명령어를이용하여주기적으로시스템파일무결성을체크하고관리자에게통보하는프로그램을만들어보도록하자. # vi /root/bin/fcheck.sh --------------------------------------------------------------------------- #!/bin/sh ADM_MAIL=admin_user@domain.com CHECK=`/usr/local/fcheck/fcheck -a grep Inode` HOSTNAME=`hostname` if [ -n "$CHECK" ] then /usr/local/fcheck/fcheck -a > fcheck_result mail -s "$HOSTNAME File 무결성체크결과 " $ADM_MAIL < fcheck_result 29/32 페이지
fi rm -f fcheck_result ---------------------------------------------------------------------------- 간단한이정도스크립터로보다효율적인관리가가능해질것이다. 이제 cron 에등록시켜놓고.. 매일파일무결성체크를간단히메일로받아서관리할수있게된다. 만일변화된파일이정당한변화라면.. # /usr/local/fcheck/fcheck -ac 로 DBfile 를업데이트시켜줘야한다. 아님.. 계속메일이날아오게된다. 이로써시스템설치후점검해야할보안설정에대해서마치겠다. 시스템보안은초기의보안설정이아주큰부분을차지하고있다. 하지만.. 지속적은감시와관리역시초기보안상태를유지하는가장중요한작업이라고도할수있다. - Service Port Scan 확인 기본적인 OS 설정및보안설정이완료되면최종적으로현재서비스가이루어지는 TCP/IP Port 에대해시스템초기상태에서알아두어야한다. 이후이때파악되지않는서비스포트가열려있을경우보안에의심을해보아야할것이다. Port Scan 도구로는가장많이사용하는것이 nmap,nc,netstat,lsof 등이다. 사용법은다음과같다. nmap,nc,netstat 등을이용해서시스템의열린포트를점검한다. # nmap localhost -p 1-65535 # nc -w 3 -v -z localhost 1-65535 # netstat -ant grep LISTEN 30/32 페이지
21/tcp open ftp 22/tcp open ssh 23/tcp open telnet 25/tcp open smtp 53/tcp open domain 80/tcp open http 3306/tcp open mysql 불필요한서비스포트가열려있는경우엔반드시해당 Daemon이나서비스를 off 시켜크래킹에이용되지않도록조치한다. 1.4.5 기타추가설정 이후사이트서비스성격이나시스템관리자취향에맞게추가설정을해주도록한다. - Time 설정 # rdate -s time.bora.net - command alias 설정 # vi.bash_profile ------------------------------------------------------------------------------ alias vf='vi /etc/proftpd/proftpd.conf' alias rf='/etc/rc.d/init.d/proftpd restart' alias rx='/etc/rc.d/init.d/xinetd restart' alias vh='vi /usr/local/apache/conf/httpd.conf +' alias re='/usr/local/apache/bin/apachectl restart' alias rn='/etc/rc.d/init.d/named restart' alias rs='/etc/rc.d/init.d/sendmail restart' ------------------------------------------------------------------------------ 31/32 페이지
- System Login Information 설정 # vi /etc/issue ( 콘솔접속로그인화면 ) # vi /etc/issue.net ( Telnet 접속로그인화면 ) # vi /etc/motd ( ssh, rsh 등의원격접속로그인화면 ) - 시스템시작시자동실행작업 시스템이 Rebooting 될때자동으로실행시켜야하는프로그램이나명령어가있을경우 /etc/rc.d/rc.local 설정파일마지막에실행명령을적으면된다. 특정계정로그인시자동으로실행해야하는작업이있을경우는해당계정의홈폴더밑에있는.bash_profile 혹은.bashrc 파일하단에해당작업을적어주면된다. 32/32 페이지