'보안'에 해당되는 글 2건

  1. 2008.06.25 해외에서 접근하는 IP 차단하기
  2. 2008.06.25 unix 기본적보안설정

특정 국가나 해외에서 시스템에 악의적으로 접근하는 IP를 iptables 을 이용하여 국가별로 차단할 수 있습니다.

1. 참조 문서
   The geoip match HOWTO (http://people.netfilter.org/peejix/geoip/howto/geoip-HOWTO.html#toc1)

2. 준비사항

    1) patch-o-matic 최신버전 받기
        http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/

    2) geoip update 스크립트
        http://people.netfilter.org/peejix/geoip/tools/geoip_update.sh  

3. kernel 과 iptables에 geoip 패치 및 모듈 생성하기

    1) patch-o-matic-ng-xxxxxxxx.tar.bz2 를 압축을 풀고,

    2) ./runme --download 를 실행하여 geoip 소스를 가져와서

    3) ./runme geoip 를 실행하면 kernel과 iptables에 geoip 모듈소스가 설치됩니다.

    4) 이제 linux 디렉토리로 이동후 make menuconfig 실행하여

    5) Networking options --> IP:Netfilter Configuration --> <M>   geoip match support 선택후

    6) make modules 실행하면 /usr/src/linux/net/ipv4/netfilter/ipt_geoip.o 모듈이 생성됩니다.

    7) make modules_install 또는 ipt_geoip.o 을 /lib/modules/2.4.29/kernel/net/ipv4/netfilter/ 하에 복사합니다.

    8) 또 한 가지 iptables 소스위치에서 make 실행하면 libipt_geoip.so 이 생성됩니다.

    9) make install 또는 libipt_geoip.so 을 /usr/local/lib/iptables/ 하에 복사하면 방화벽 가동준비가 끝납니다.
    
4. geoip database 생성하기

    1) geoip_update.sh 내용중 아래의 내용을
        GEO_BIN="http://www.cookinglinux.org/geoip/db/geoipdb.bin"
        GEO_IDX="http://www.cookinglinux.org/geoip/db/geoipdb.idx"
        다음과 같이 수정합니다.
        GEO_BIN="http://people.netfilter.org/peejix/geoip/database/20050410/geoipdb.bin"
        GEO_IDX="http://people.netfilter.org/peejix/geoip/database/20050410/geoipdb.idx"

    2) geoip_update.sh 을 실행하면 /var/geoip/에 geoipdb.bin  geoipdb.idx  geoipdb.last 파일이 생성됩니다.

    3) 최신의 geoip database 는 아래 주소에서 얻을 수 있습니다.
        http://www.maxmind.com/download/geoip/database/   

    4) cvs2bin 툴을 이용하여 매월1일 업데이트 되는 geoip database를 생성합니다.
   
        (1) 툴 다운로드후 설치
        http://people.netfilter.org/peejix/geoip/tools/csv2bin-20041103.tar.gz
 
        (2) geoip database 생성후 /var/geoip/ 에 저장
        cvs2bin GeoIPCountryWhois.csv
        위의 명령 실행결과 geoipdb.bin  geoipdb.idx 파일이 생성됩니다.

5. ipt_geoip.o 모듈올리기

    1) insmod /lib/modules/XXXX/kernel/net/ipv4/netfilter/ipt_geoip.o

    2) lsmod 로 모듈이 로딩되었는지 확인합니다.

6. iptables 구문의 적정 위치에 룰셋을 추가후 messages 기록이나 아파치로그를 통하여 모니터링해 봅니다.

    1) 예로 국내를 제외한 모든 해외로부터의 시스템 접근 차단하기
         iptables -A INPUT -m geoip ! --src-cc KR -j DROP

    2) 중국 IP 대역으로부터 들어오는 ssh 접근 차단하기
        iptables -A INPUT -p tcp --dport 22 -m geoip --src-cc CN -j DROP


신고



댓글을 달아 주세요

  • 불필요한 계정 삭제하기

    시스템에서 사용하고 있지 않는 불필요한 계정은 삭제합니다. 예를 들어 lp, sync, shutdown, halt, news, uucp, operator, games, gopher 등..., 계정의 삭제는 다음과 같이 할수 있습니다.

    userdel gopher

    그룹의 삭제는

    groupdel gopher

     

  • 확실한 암호체계를 사용한다.

    1. 암호의 길이

      대부분의 배포본에서 기본적으로 암호의 길이는 5자 이상으로 설정되어 있습니다. 이것은 8자 이상으로 바꾸어야 합니다. 이것을 위해서는 login.defs 파일을 수정합니다. (보통 /etc/login.defs)

       PASS_MIN_LEN    5
      	을
      	PASS_MIN_LEN    8
      	로 바꾸어 줍니다.
      	
    2. 쉐도우 패스워드 사용

      이것은 일반적으로 리눅스 설치시 옵션입니다. 이후에는 authconfig 유틸리티를 사용할 수 있습니다. 기존 암호들과 그룹등의 쉐도우 패스워드로의 전환은 pwconv, grpconv 같은 명령을 사용할수 있습니다.

     

  • root 계정

    루트 계정은 유닉스 시스템에서 가장 강력한 권한을 가지고 있는 계정입니다. 만약 관리자가 콘솔로의 접속후, 로그아웃하는 것을 잊고 루트 프롬프트를 그대로 놔두었다면, 위험한 상황이 벌어지겠지요? 이런 상황을 피하기 위해 TMOUT 변수를 사용할수 있습니다. /etc/profile 파일 또는 루트의 해당 쉘의 설정파일, 예를 들어 bash 라면 ~/.bash_profile 에 다음과 같이 설정해 둡니다.

     HISTSIZE=0
    HISTFILESIZE=0
    TMOUT=3600
    
    숫자는 초단위 입니다. 3600초 즉, 1시간동안 아무런 입력이 없다면 자동으로 로그아웃됩니다. HISTSIZE 와 HISTFILESIZE 를 0으로 해두는 것도 만약을 위한 조치입니다.

     

  • console-equivalent 접근

    일반 유저의 콘솔 관련 프로그램 사용을 방지합니다. 예를 들어 shutdown, reboot, halt와 같은 명령어들 입니다. 다음과 같이 합니다.

    rm -f /etc/security/console.apps/명령어

     

  • 사용하지 않는 서비스 지우기

    사용하지 않고, 불필요한 서비스 패키지는 삭제합니다. 일단 /etc/inetd.conf 파일을 수정해서 사용하지 않는 서비스는 모두 주석처리(#)한후, inetd를 재시동합니다.

    1. /etc/inetd.conf 파일을 600 모드로 바꾸어서 루트만이 억세스하도록 합니다.

      chmod 600 /etc/inetd.conf

       

    2. 반듯이 /etc/inetd.conf 파일의 오너는 root 이여야 합니다.

      chown root.root /etc/inetd.conf

       

    3. inetd.conf 를 수정합니다. 예를 들어 ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth등 사용하지 않는 서비스들은 모두 주석처리 합니다.

       

    4. inetd 를 재시동합니다. killall -HUP inetd

       

    5. /etc/inetd.conf 파일을 immunize 합니다.

      chattr +i /etc/inetd.conf

      다시 변경이 가능하게 하려면 chattr -i /etc/inetd.conf 하면 됩니다.

     

  • TCP_WRAPPER 사용하기

    tcp wrapper로 서버로의 접근을 제한할수 있습니다. 가장 좋은 정책은 일단 /etc/hosts.deny 에 ALL: ALL@ALL, PARANOID 로 모든 접근을 막은후, /etc/hosts.allow 에 허가 해주는 것입니다.

    1. hosts.deny 파일을 다음과 같이 수정합니다.

      ALL: ALL@ALL, PARANOID

       

    2. hosts.allow 를 다음 예와 같이 수정합니다.

      ftp: 202.54.15.99 foo.com

      위 설정은 ftp 억세스를 ip 주소인 202.54.15.99와 foo.com 도메인을 가지는 클라이언트 들에게 허용합니다.

       

    3. 마지막으로 tcpdchk 명령으로 설정파일들의 오류를 확인해 볼수 있습니다.

     

  • 시스템 정보를 보여주지 말자

    외부에 서버의 정보를 최대한 보여주지 않는 것도 공격을 예방하는 방법입니다. 예를 들어 "/etc/inetd.conf" 의 telnet 옵션을 다음과 같이 수정합니다.

     telnet  stream  tcp     nowait  root    /usr/sbin/tcpd  in.telnetd
    을...
    telnet  stream  tcp     nowait  root    /usr/sbin/tcpd  in.telnetd -h
    와 같이...
    
    -h 옵션은 시스템 정보를 보여주지 않고, 사용자에게 id 와 암호만 물어옵니다. 그러나 언제나 telnet 보다는 sshd 의 사용을 권장합니다.

     

  • "/etc/host.conf" 파일 수정

     

     # Lookup names via DNS first then fall back to /etc/hosts. 
    order bind,hosts 
    # We have machines with multiple IP addresses. 
    multi on 
    # Check for IP address spoofing. 
    nospoof on 
    
    첫번째 줄은 DNS 관련 설정입니다. 먼저 DNS 에서 host name을 resolve 하고, 다음 hosts 파일을 참조하라는 것입니다. multi 옵션은 /etc/hosts 파일에 다중 IP 주소를 가질수 있다는 것이며, 마지막 nospoof 옵션은 서버로의 스푸핑을 방지합니다.

     

  • "/etc/services" 파일은 immunize 합니다. chattr +i /etc/services

     

  • 루트 로그인의 제한

    /etc/securetty 파일은 어떤 TTY 디바이스로 루트 로그인이 가능한지 설정합니다. 불필요한 디바이스는 주석처리 합니다.

     

  • 일반 유저의 su root 방지

    특정 유저만 su root 할수 있도록 설정하려면 다음과 같이합니다.

     /etc/pam.d/su 파일의 처음에 다음을 추가합니다.
    
    auth sufficient /lib/security/pam_rootok.so debug
    auth required /lib/security/Pam_wheel.so group=wheel
    
    /etc/group 의 wheel 그룹에 su root를 허용하고자 하는 사용자 그룹 등록합니다.
    
    wheel:x:10:root,someone 
    
  • 쉘 로그 파일

    bash 쉘은 500여개의 지난 명령어를 ~/.bash_history 에 남깁니다. 다음과 같이 크기를 줄이거나, 0로 설정해 아예 로그를 남기지 않도록 합니다.

     ~/.bash_profile 에 
    HISTFILESIZE=30 
    HISTSIZE=30
    
  • Control-Alt-Delete 키를 사용하지 못하도록 합니다.

    /etc/inittab 파일에서 다음과 같은 라인을 찾아 주석처리 합니다.

    #ca::ctrlaltdel:/sbin/shutdown -t3 -r now

     

  • "/etc/rc.d/init.d" 디렉토리와 파일들의 퍼미션 수정

    chmod -R 700 /etc/rc.d/init.d/*

    위와 같이 설정해서 루트만이 억세스 할수 있도록 합니다.

     

  • 시스템 정보 숨기기

    기본적으로 리눅스 서버로 로그인 할때 배포본, 버젼, 커널 버젼, 서버이름 등이 나타나도록 되어 있습니다. 이것은 서버를 노리는 크랙커들에게 더 많은 정보를 줄뿐입니다.

    1. "/etc/rc.d/rc.local" 의 수정

      rc.local 매 부팅시마다 /etc/issue 파일을 생성하는 루틴이 있습니다. 이 부분을 모두 주석처리 합니다.

       # This will overwrite /etc/issue at every boot.  So, make any changes you 
      	# want to make to /etc/issue here or you will lose them when you reboot. 
      	#echo "" > /etc/issue 
      	#echo "$R" >> /etc/issue 
      	#echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue 
      	# 
      	#cp -f /etc/issue /etc/issue.net 
      	#echo >> /etc/issue 
      	
    2. 이슈 파일 삭제

       

       rm -f /etc/issue 
      	rm -f /etc/issue.net
      	
  • SUID/SGID 프로그램 찾기

    일반 유저가 루트 권한으로 실행 시킬수 있는 불필요한 SUID/SGID 프로그램들은 최소화 합니다. 먼저, 다음과 같이 SUID/SGID 퍼미션의 파일들을 찾아내서

    find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls ­lg {} \;

    모드를 바꾸어 줍니다. chmod a-s [program]


  • 신고



    댓글을 달아 주세요

    티스토리 툴바