출처: http://cafe.naver.com/q69.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=115869

// 넷필터라는 방화벽을 사용하기 위해 정보를 볼수 있는 홈페이지

http://www.netfilter.org

// 커널에 넷필터가 포함되어 있는지 확인하는 작업.. 커널에 필요한 파일은 /boot 안에 있습니다..

serv 컴: cd   /boot  &&  ls  -l
 vi  config-2.6.9-42.EL  ->   /NETFILTER  검색어 입력

 service   iptables  status -> 정지 상태면  start

 하지만 start는 안된다.. 왜?? 방화벽 활성화는 lokkit 으로 하자!!

 // 방화벽을 보여주는 명령어 입니다.. 우린 여기서 방화벽을 활성화를 시킵시다..

 lokkit

// 집중해서 잘 봐주시기 바랍니다...

@NETFILTER 방화벽의 구조
   1. 3개의 기본 table(filter,nat,mangle)로 구성
   2. 각 table 은 chain(패킷의 이동통로) 으로 구성
   3. 각 chain 에 rule 설정


        filter - 패킷의 허용/차단 판단
             FORWARD - 방화벽을 통과하는 패킷의 통로
             INPUT - 방화벽 자체의 서비스로 들어오는 패킷의 통로
             OUTPUT - 방화벽 자체에서 외부(내부망/외부망)으로 나가는 패킷의 통로


        nat - 패킷의 주소변환
             OUTPUT
             POSTROUTING
             PREROUTING


        mangle - 패킷의 속성(ttl,tos,,,) 변경
             FORWARD
             INPUT
             OUTPUT 
             POSTROUTING
             PREROUTING


@ iptables 문법
  1. table name (예: -t  filter/ -t  nat/  -t  mangle)
  2. chain name (예: -A  INPUT/ -D  FORWARD/ -I POSTROUTING)
  3. layer 3 object (예: -s 192.168.x.10 / -d 10.1.1.0/24)
  4. layer 4 object (예: -p tcp --dport 80/ -p udp  --sport 123)
  5. Jump (예: -j DROP/  -j  ACCEPT/ -j  REJECT/ -j  LOG ,,,)

예> 내부망의 특정 HOST(10.1.1.20)가 업무 시간에 업무는 등한시하고
     증권거래,웹서핑,채팅을 하는 것을 방화벽 로그를 통해 확인하였다.
     해당 HOST의 모든 인터넷 서비스 접속을 차단할 수 있도록 네트웍
     방화벽 셋팅을 하세요


iptables  -t  filter  -A  FORWARD  -s 10.1.1.20  -j  DROP

// iptables 의 룰 정보를 보여주는 명령어 입니다...

serv 컴: iptables  -L 

// iptables 의 룰을 전부 제거 하는 명령어 입니다..

 iptables  -F

주의: xp,work 컴에서 serv의 telnet,ftp,ssh 접속이 잘 되는지 반드시 확인

퀴즈> serv 컴에서  work 컴으로부터의 모든 서비스 접속을 차단할 수
        있도록 방화벽 셋팅을 하세요.
iptables  -t  filter  -A  INPUT  -s  192.168.x.20  -d 192.168.x.10 -j  DROPT


// 하지만 iptables 의 룰을 셋팅하고 서비스를 재시작 시키면 모든게 원상태 즉 초기화 되버리는 것을

   우리는 지금 볼수 잇습니다...

serv 컴: service   iptables   restart
 iptables   -L

 iptables   -F
 

// 그리하여 iptables-save 라는 명령으로 파일로 저장을 하는 모습입니다..
 iptables-save  >   /root/firewall.txt

// 그리고 다시 iptables의 룰 정보를 다시 보았습니다.. 하지만 또 다시 돌아가버렸네요 그쵸???

 service   iptables   restart   &&  iptables  -L

// 아까전에 firewall.txt라는 파일로 우린 룰 정보를 저장을 하였습니다.. 그걸로 다시 복구를 하네요..

 iptables-restore   <  /root/firewall.txt
 iptables   -L


// 이렇게 매번 부팅할때마다 iptables를 restore 해줘야 하냐구요??? 아닙니다.. ^^

// 밑에 환경설정 폴더로 가서 iptables-config 파일을 한번 열어볼까요~

 ls   /etc/sysconfig/
 
 vi   /etc/sysconfig/iptables-config

 // 19행에 보시면  IPTABLES_SAVE_ON_STOP="no" 를 yes로 바꿔주세요... 무슨뜻이냐구요?

    iptables가 정지를 할때에 저장을 할것이냐 하고 물어본것입니다.. 초기값은 no 이므로 우리는

    당연히 yes 를 눌러주시면 정지했을때 저장이 되겠죠... 또하나!!!
  -> 19행  IPTABLES_SAVE_ON_STOP="yes"


 // IPTABLES_SAVE_ON_RESTART="no" 를 yes로 변경~!!! 이건 iptable가 재부팅할때 저장

    할것인지 물어보는겁니다.. 당연히 yes!! 그럼 우린 정지했을때나 재부팅 했을때 전부 저장이 되는

    것입니다.. 한번 확인해 볼까요??
  -> 25행  IPTABLES_SAVE_ON_RESTART="yes"

 service   iptables   restart   &&  iptables  -L



* filter 라는 테이블에 -A (해당 체인의 맨 밑에 추가) 하는 구조이다..

serv 컴: iptables  -t  filter  -A  INPUT  -s 1.1.1.1  -d  2.2.2.2 
   -p tcp   --dport  80  -j   ACCEPT
 iptables  -L

 iptables  -t  filter  -A  INPUT  -s  3.3.3.3  -j  DROP
 iptables  -L

* -I 는 삽입될 체인의 위치를 지정할수 있다.. 생략하게 되면 맨위에 추가가 된다..

 iptables  -t  filter  -I  INPUT  -s  192.168.x.1  -j   REJECT
 iptables  -L

* 해당 체인의 3번째에 룰이 삽입 되는 모습이다..

 iptables  -t  filter  -I  INPUT  3   -s  192.168.x.20  -j  LOG
 iptables  -L

* 특정위치의 룰을 -D 라는 옵션으로 제거를 한다..

 iptables  -t  filter  -D  INPUT  4   
 iptables  -L

* 특정위치의 룰을 다시 재설정 하는 장면이다.. -s 는 192.168.x.30, -j ACCEPT 허용으로 ~

 iptables  -t  filter  -R  INPUT  3  -s  192.168.x.30  -j  ACCEPT
 iptables  -L

* iptables 의 정보를 보여주는데 -v를 써서 패킷과 바이트 까지 보여주게 된다.

 iptables  -L   -v   =  iptables  -vL

* iptables 의 정보를 패킷 즉 전체 체인의 패킷을 숫자형태로 보여주게 된다.

 iptables  -L   -n  =  iptables  -nL

* iptables 의 정보를 줄넘버를 붙여 보여준다.

 iptables  -L  --line-numbers

* iptables -Z 는 해당 패킷 및 바이트를 Zero로 초기화 하는 장면..!!

 iptables  -vL    ->   iptables  -Z    ->  iptables  -vL

* -X 는 사용자 정의 체인을 지우는 장면.. INPUT, FORWARD, OUTPUT 는 지울수 없다.

 iptables   -X   RH-Firewall-1-INPUT
 iptables  -L

* 밑에처럼 해보면 안지워짐을 알것이다..

 iptables  -X   INPUT

* 사용자 정의 체인을 TEST라는 이름으로 생성하는 모습.

 iptables  -N  TEST &&   iptables  -nL

* 사용자 정의 체인을 TEST 에서 SSH로 Rename을 하는 모습.

 iptables  -E   TEST   SSH   &&  iptables  -nL

* 사용자 정의 채인에 룰을 생성한다.. 해당체인의 맨 밑에 시작지의 ip를 허용을 한다.

 iptables  -A  SSH  -s  192.168.x.1  -j   ACCEPT

* 하지만 사용자 정의 체인에 허용을 한다고 했음에도 불구하고 INPUT에서  192.168.x.1을 차단하여

   xp 는 접속이 않됨을 알수 있다.. 접속이 되기 위해선 링크를 걸어주자...
 iptables  -nL
  -> xp 에서 serv 로 접속이 되는지 확인

* INPUT 1번째 라인에 xp를 DROP 했으니 우리는 그 위에 룰을 하나 생성하자..

   해당 룰 위치에 오면 SSH 사용자 정의 체인으로 점프를 시켜준다..

   이리 하여 이제 xp 에서 접속이 됨을 알수 있다..

 iptables  -I  INPUT  1  -j   SSH   &&  iptables  -nL


* 사용자 정의 체인을 삭제하기 위해선 아래와같은 순서가 필요하다..
 -> 실습 확인 다 하신 분은  사용자 정의 체인 SSH 를 삭제
       1. 링크 연결 해제
  iptables  -D  INPUT  1
       2. 사용자 정의 체인내의 모든 rule 삭제
  iptables  -F  SSH
       3. 사용자 정의 체인 삭제
  iptables  -X  SSH


* iptables (-t filter) 괄호 안의 부분은 생략이 가능하다.. 왜냐하면 filter 라는 테이블이 기본이기

   때문이다..


* -P 라는 옵션은 INPUT, FORWARD, OUTPUT의 Policy 기본정책을 의미한다..

   기본정책은 처음설정시 ACCEPT 로 허가가 되어있다.. 

* 그리하여 우리는 기본정책을 거부로 바꿔준다..

serv 컴: iptables  -P  INPUT  DROP
 iptables  -P  FORWARD  DROP
 iptables  -nL

 iptables  -D  INPUT  1   &&  iptables  -nL

* 하지만 OUTPUT 체인은 ACCEPT가 되어있다.. 그런데 ping 며 모든게 되지 않는다...

   아.......왜일까..???

확인> input,forward chain 의 기본정책을 DROP 바꾼후 serv 컴에서
        work로, 외부로 핑에 대한 응답이 오는지, "yum -y install  lynx"
        명령어 실행이 되는지 확인해 보세요.

* 잘 들어보자.. ping를 실행시켰을때 맨처음일어나는 일들이 무엇일까??.....

   3 way hand shake 계념을 잘 생각해보면 왜 ping가 않되는지 알것이다...

   그렇다 -0-;; 바로 설명하겠다..

   1 way -> SYN 을 보낸다. (즉 접속할라는데 괜찬냐??)

   2 way <- ACK/SYN 을 받는다.. (나 괜찬아.. 접속해~)

   3 way -> ACK 을 보낸다.. (알았어 접속한다~!!!)

   이리하여 tcp 세션이 맺어졌다.. 신뢰성있는 통신을 하기위해서 하는 과정이다..


   OUTPUT는 ACCEPT 인데 INPUT 가 DROP 라서 2 way 가 왔지만 거부당한다..


* 상태추적테이블이 있다.. 내가 나가면서 시작지 주소와 목적지 주소를 상태추적테이블에 저장한다.

   내가 목적지에 SYN 을 날려서 ACK/SYN을 유도한다.. 그러면 상태추적테이블에서 방화벽 룰

   검사를 하지 않고 내가 요청한거에 대해서는 허용을 해준다.. 그게 바로 ESTABLISHED 이다..


1. 상태추적은 메모리에 적재가 된다.. 그리하여 일정 시간이 지나면 자동으로 free가 된다..

   메모리를 바로 볼수 없으니 cat  /proc/net/ip_conntrack 를 통해 임시로 저장된 파일을

   볼수 있다..  이리하여 -m state --state ESTABLISHED 로 설정을 한다...


2. 또하나 그럼 RELATED는 무엇인가?? FTP 를 예로 들어보자.. FTP는 접속할때 21번 포트로 접속

   을 한다.. 모든 TCP 세션처리는 21번 포트에서 실행되지만 정작..데이터를 주고 받음에는

    20번 포트를 사용하게 된다.. 3way hand shake 로 21번 포트로 상태추적테이블에 저장이

    되었는데.. 전혀 생소한 20번 포트로 데이터가 전송이 되면 우리 컴퓨터는 당연히 INPUT에서

    DROP 된다.. ESTABLISHED의 이런점을 보안하고자 RELATED가 생겨났다..

    RELATED = 연관성을 가진 패킷을 허용한다.. 라는 의미로 알고 넘어가자!!!


* 이제 밑에처럼 설정 후 다시한번 ping 를 날려보자~ 그럼 시원하게 답이 올것이다..

serv 컴: iptables  -I  INPUT  -m  state  --state  ESTABLISHED,
 RELATED  -j   ACCEPT


* 아까 말했던 상태추적 메모리를 직접적이 아닌 간접적 으로 볼수 있는 파일이다..

 cat  /proc/net/ip_conntrack

serv 컴: telnet   localhost

 iptables  -A  INPUT  -i  lo  -j  ACCEPT
 telnet   localhost

 iptables  -F


퀴즈>  serv 컴에는 많은 서비스(ssh,telnet,ftp)가 동작중이다. 이러한
         서비스중 xp에는 telnet 서비스만 접속허용하고, work 에는
         ssh 서비스만 접속을 허용할 수 있도록 rule 셋팅하세요.
 iptables  -A  INPUT  -s  192.168.x.1  -d  192.168.x.10 
  -p  tcp  --dport  23  -j   ACCEPT


 iptables  -A  INPUT  -s  192.168.x.20  -d  192.168.x.10 
  -p  tcp  --dport  22  -j   ACCEPT



// 현재 iptables 의 정보를 -F 라는 옵션으로 제거 한 후 리스트를 찍어봅니다..

serv 컴: iptables  -F  &&  iptables  -nL


퀴즈> work 컴(관리자)의 ping test 에 대해서만 응답을 할 수 있도록
        serv 컴의 방화벽을 셋팅하세요.

// ping는 icmp 프로토콜을 사용하며 echo-request 는 클라이언트에서 들어오는 메시지를

   허용한다는 뜻이다... echo-request는 우리컴퓨터에서 보는게 되는것이다..

    하지만 지금은 OUTPUT 체인이 기본정책이 모든게 허용이 되있으니 이것만 추가하자!!
  iptables  -A  INPUT  -s  192.168.x.20   -p icmp  --icmp-type
  echo-request  -j  ACCEPT


// ESTABLISHED 는 관련성이 있는 어제 설명을 다 했다.. 어제껄 참조해 보기 바람..

serv 컴: iptables  -I INPUT -m state  --state  ESTABLISHED,
 RELATED  -j   ACCEPT

 yum  -y  install    httpd

 vi   /var/www/html/index.html
  <html>
  <body  bgcolor=green>
  <h1> Host Firewall</h1>
  </body>
  </html>
 service  httpd  start
 
퀴즈> serv 컴에는 많은 서비스(web,ftp,telnet,ssh) 가 동작중이다.
        이러한 서비스중 xp컴에는 web,telnet 접속을 허용할 수 있도록
        rule 셋팅을 하세요.(multiport 이용)

// 아래와 같이 처리하면된다.. -m multiport 여러개의 포트를 허가 및 거부할때 ~ 쓰인다.

 iptables  -A  INPUT  -s  192.168.x.1  -p tcp  -m multiport  --dport
 23,80  -j  ACCEPT

serv 컴: iptables  -A  INPUT  -s 192.168.x.20  -j  ACCEPT

work 컴: ifconfig   eth0   192.168.x.200
 -> serv 컴으로 ping test, telnet,ssh 접속을 시도
 -> ifconfig  eth0

serv 컴: iptables  -nL  --line-numbers


// 아이피를 차단했을 경우 그 사용자가 눈치를 까고 ip를 변경 해 주면 그사람은 또 인터넷에 접속을

   할수 잇다.. 그렇지 않기 위해서는 우린 맥 어드레스로 도 iptables를 사용할수 잇다는 점을 알자.


// 밑에는 해당 맥 어드레스만 확인하여 모든걸 다 허용을 해준다.

 iptables   -R  INPUT  -m  mac  --mac-source  00:0C:29
 :xx:xx:xx   -j   ACCEPT

serv 컴: iptables  -F
 iptables  -P  INPUT   ACCEPT
 iptables  -nL

// DROP과 REJECT의 차이점을 보기 위해 우린 두가지 상황을 만든다.

// DROP은 무조건 차단을한다.. 하지만 REJECT는 차단된 메시지를 보여준다..

// 여기서 DROP가 더 효율적이라 한다.. 이유는 REJECT같이 CPU 연산을 통하여 다시 해당

// Client로 메시지를 보내지 않아도 되기 때문이다.. CPU 작업 효율상 말이다.. ㅎ

 iptables  -A  INPUT  -s  192.168.x.1  -j  DROP
 iptables  -A  INPUT  -s  192.168.x.20  -j  REJECT
 iptables  -nL
   -> work, xp에서 serv 로 각각 ping test 시도


// 커널의 접속에 관란 정보를 LOG에 저장을 하기 위해 우리는 syslog.conf 파일의 주석을 풀어

    준다.. 하지만 이게 해당위치에 저장을 할뿐만 아니라 화면에도 계속적으로 뿌려주니 좀 귀찬다..

    그래서 Default는 주석이다 ㅎ

serv 컴: vi   /etc/syslog.conf
       -> 3행 주석제거후  kern.info      /var/log/firewall   수정
 service   syslog   restart

 ls   -l   /var/log/firewall

serv 컴: iptables  -F


// 해당 체인의 기본정책을 DROP로 설정하는 부분이다.. 어제 다 했지 않은가?ㅎㅎ
 iptables  -P   INPUT   DROP

// 항상 iptables 는 순서가 아주 중요하다.. 밑에 두 문장이 순서가 바뀌면 로그는 저장이 되지 않는다

   왜냐하면 INPUT 체인의 해당 룰을 체크하는 도중에 조건이 맞아버리면 바로 거기서 멈쳐버리기때문.

 iptables  -I  INPUT  -p tcp  --dport  80  -j  LOG
 --log-prefix " Web Access : "

 iptables   -A  INPUT  -d  192.168.x.10  -p tcp --dport  80
   -j  ACCEPT

 iptables   -nL

 tail   /var/log/firewall


// 여기도 어려울거 하나 없다.. 단지 추가된 계념이란건 내부망의 전체만 허용하면 된다는것..

    그건 192.168.59.0/24 로 ACCEPT 하면 이 네트워크는 전부다 허용이 되는 것이다..

    그리고 LOG를 기록해주면 된다.. 뭣만?? Telnet으로 접속하는 사람만!! ^^

퀴즈> TELNET 이란 사용자 정의 체인을 만들고, 내부망(192.168.X.0/24)
        의 사용자만 접속을 할 수 있도록 RULE 셋팅을 해당 체인에
        설정하세요. 또한 serv 컴에 telnet 접속을 한 사용자를 추적하기
        위해 log 가 남겨질 수 있도록 방화벽을 셋팅하세요.

iptables  -N  TELNET
iptables  -A  INPUT  -p tcp  --dport  23  -j  TELNET
iptables  -A  TELNET  -s  192.168.x.0/24  -p tcp  --dport  23 
  -j  ACCEPT
iptables  -I  TELNET  -s  192.168.x.0/24  -p tcp  --dport  23  -j
LOG  --log-prefix  " Telnet Access : "


serv 컴: iptables-restore   <  /root/firewall.txt
 iptables   -nL


// 이거는 각자 해보기 바란다.. 지난날 배웠던 기억을 마구마구 꺼내라..ㅎ

   그럼 기억나겠지 ^-^*

총정리 퀴즈> 1. serv 컴에는 여러 서비스(web,telnet,ftp,ssh) 가 동작중
     2. 내부망(192.168.x.0/24) 의 clinet 에게는 web,ftp,telnet
         접속만 허용(multiport 이용).
     3. 외부망(인터넷) 의 clinet 에게는 web 서비스만 허용
     4. 관리자컴(192.168.x.20) 는 ip주소가 바뀌더라도 항상
                     모든 서비스에 접속이 되도록 설정
     5. client 의 서비스 접속시에 방화벽에 log 가 남도록 설정
     6. serv 컴이 내부/외부망의 client 의 ping test 에
         응답하도록 설정
     7. 위에서 언급된 서비스 이외의 모든 접속은 차단.

------------------------------------------------------------------------------------------------
참고로 ip range로 막을려면? (211.x.x.1~211.x.x.15까지 80번만 허용)

 iptables -A FORWARD -p tcp -m iprange --src-range 211.x.x.1-211.x.x.15 -d x.x.x.x --dport 80  -j ACCEPT

신고

리눅스 서버 기본 보안정책
Step by Step
2005.7.25
작성: Securityproof(http://www.securityproof.net)
1
이 문서는 최근 중국 등을 비롯한 외국의 공격자들로부터 우리나라 서버를 보호하는데
작은 도움이 되기 위해 작성된 것입니다. 특히, 악용될 소지가 높은 리눅스 서버를
대상으로 했습니다. Windows의 경우 악용될 소지가 리눅스보다 적기 때문에 리눅스
서버 보안책만 여기에 포함시켰습니다. 질문이 있는 분은 http://www.securityproof.net
게시판에 글 남겨주시기 바랍니다.
2
[ 목 차 ]
# 머리말 ------------------------------------------------------------------- 3
1. 방화벽 설치 및 운영 ----------------------------------------------------- 8
2. 침입 탐지 및 방어 시스템 PORTSENTRY 운영 -------------------------------- 16
3. chkrootkit를 통한 백도어 설치 탐지 -------------------------------------- 28
4. 파일 퍼미션 설정을 통한 로컬 공격 방어 ---------------------------------- 34
5. 웹 서버 보안을 위한 기본 파일 설정 -------------------------------------- 38
5-1. httpd.conf 보안 설정 ---------------------------------------------- 38
5-2. php.ini 파일 설정 ------------------------------------------------- 60
3
머리말
최근 중국 해커들의 국내 서버에 대한 공격이 날로 증가하고 있습니다. 이에 따른 피해도 증가하고 있습니다.
보통 유럽이나 남미의 해커들의 경우 서버를 공격한 후 웹 페이지를 변조하여 자신들의 흔적을 남겨 사후
수습이 상대적으로 신속하게 이루어질 수 있었습니다.
그러나 중국 해커들의 경우 공격한 서버의 웹 페이지를 변조하는 일은 상대적으로 드물며, 공격한 서버를
추후 공격에 악용하기 위해 백도어를 설치하거나 웹 페이지에 악성 스크립트를 설치하는 경우가 빈번합니다.
가장 최근 MBC ESPN 등의 경우도 마찬가지였습니다. 서버가 공격을 당한 후 중국의 해커들은 백도어를
설치하고, 웹 페이지에 다음과 같은 악성 설치했습니다.
<iframe src=http://gua.wocaloe.com/asp/muma.htm>
<iframe src=http://gua.wocaloe.com/asp/index.htm>
이 악성 스크립트가 설치되어 있는 페이지를 방문하게 되면 악성 프로그램이 사용자의 시스템에 자동
설치되고, 이 결과 시스템의 정보와 개인이 사용하는 각종 패스워드가 공격자에게 노출되게 됩니다.
패스워드를 확보한 중국의 공격자는 게임 사이트의 아이디와 패스워드를 금전 거래에 사용하기도 했습니다.
아직도 이 악성 코드가 그대로 남아 있는 사이트가 있을 것으로 짐작됩니다. 패치가 되지 않은 Windows
시스템을 사용하고 있는 사용자가 그런 사이트에 접속하게 되면 계속적인 피해가 걱정됩니다. 그래서 웹
관리자는 사이트의 모든 소스를 확인할 필요가 있습니다. 관리자 자신이 삽입하지 않은 코드가 있다면 반드시
확인하여 없애야 할 것입니다.
중국의 해커들이 최근 가장 많이 사용하고 있는 공격 방법 중 어느정도 그 실체가 드러난 것은 대략 두
가지입니다. 서버 관리자들은 잘 알겠지만 첫 번째는 ssh bruteforce attack입니다. 이것은 /etc/passwd
파일에 등록되어 있는 각 계정과 패스워드를 무작위 대입 방법을 사용하여 서버에 접속하는 방법입니다. 이
공격을 하면 다음과 같은 로그가 /var/log/secure 파일에 남습니다.
Jul 25 08:31:32 localhost sshd[23569]: Failed password for invalid user samba from ::ffff:211.140.122.36 port 56974 ssh2
Jul 25 08:31:33 localhost sshd[23572]: Invalid user wwwrun from ::ffff:211.140.122.36
Jul 25 08:31:36 localhost sshd[23572]: Failed password for invalid user wwwrun from ::ffff:211.140.122.36 port 57533 ssh2
Jul 25 08:31:37 localhost sshd[23575]: Invalid user ldap from ::ffff:211.140.122.36
Jul 25 08:31:40 localhost sshd[23575]: Failed password for invalid user ldap from ::ffff:211.140.122.36 port 57725 ssh2
Jul 25 08:31:41 localhost sshd[23578]: Invalid user squid from ::ffff:211.140.122.36
Jul 25 08:31:43 localhost sshd[23578]: Failed password for invalid user squid from ::ffff:211.140.122.36 port 58279 ssh2
4
Jul 25 08:31:45 localhost sshd[23581]: Invalid user news from ::ffff:211.140.122.36
Jul 25 08:31:47 localhost sshd[23581]: Failed password for invalid user news from ::ffff:211.140.122.36 port 58440 ssh2
Jul 25 08:31:48 localhost sshd[23584]: Invalid user lp from ::ffff:211.140.122.36
Jul 25 08:31:51 localhost sshd[23584]: Failed password for invalid user lp from ::ffff:211.140.122.36 port 58991 ssh2
Jul 25 08:31:55 localhost sshd[23587]: Failed password for mail from ::ffff:211.140.122.36 port 59142 ssh2
Jul 25 08:31:56 localhost sshd[23589]: Invalid user yahoo from ::ffff:211.140.122.36
Jul 25 08:31:58 localhost sshd[23589]: Failed password for invalid user yahoo from ::ffff:211.140.122.36 port 59707 ssh2
Jul 25 08:32:02 localhost sshd[23592]: Failed password for bin from ::ffff:211.140.122.36 port 59854 ssh2
Jul 25 08:32:04 localhost sshd[23594]: Invalid user postfix from ::ffff:211.140.122.36
Jul 25 08:32:07 localhost sshd[23594]: Failed password for invalid user postfix from ::ffff:211.140.122.36 port 60430 ssh2
Jul 25 08:32:08 localhost sshd[23597]: Invalid user mailman from ::ffff:211.140.122.36
Jul 25 08:32:10 localhost sshd[23597]: Failed password for invalid user mailman from ::ffff:211.140.122.36 port 60991 ssh2
Jul 25 08:32:15 localhost sshd[23600]: Invalid user kathi from ::ffff:211.140.122.36
이 로그에 남아 있는 아이피를 조사해보면 중국 아이피임을 알 수 있습니다. 실제 이 공격에 의해 한번에
10개의 서버가 당한 경우도 있었습니다. 이에 대한 대비책으로 /etc/passwd 파일에 사용되지 않는 계정 앞에
comment 처리를 하고, 사용되는 계정의 패스워드는 ssh bruteforce attack에 사용되는 사전파일에 나오지
않는 강력한 패스워드를 사용해야 합니다. 강력한 패스워드란 흔한 사람 이름이나 지역 이름, 그리고
일반적으로 많이 사용되는 영어단어를 제외한 특수문자와의 조합을 말합니다.
/etc/passwd 파일에 사용되지 않는 계정 앞에 comment 처리는 다음과 같이 쉽게 할 수 있습니다. 먼저
/etc/passwd 파일을 보면 다음과 같습니다. 다음 예는 securityproof에서 제공하고 있는 테마해킹 서버의
내용으로, 보안 설정이 거의 되어 있지 않은 경우입니다.
[root@localhost root]# cat /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
5
nobody:x:99:99:Nobody:/:/sbin/nologin
rpm:x:37:37::/var/lib/rpm:/bin/bash
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
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
pcap:x:77:77::/var/arpwatch:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
squid:x:23:23::/var/spool/squid:/sbin/nologin
webalizer:x:67:67:Webalizer:/var/www/html/usage:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
named:x:25:25:Named:/var/named:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
gdm:x:42:42::/var/gdm:/sbin/nologin
amanda:x:33:6:Amanda user:/var/lib/amanda:/bin/bash
canna:x:39:39:Canna Service User:/var/lib/canna:/sbin/nologin
wnn:x:49:49:Wnn System Account:/home/wnn:/sbin/nologin
fax:x:78:78:mgetty fax spool user:/var/spool/fax:/sbin/nologin
netdump:x:34:34:Network Crash Dump user:/var/crash:/bin/bash
nut:x:57:57:Network UPS Tools:/var/lib/ups:/bin/false
ldap:x:55:55:LDAP User:/var/lib/ldap:/bin/false
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
ident:x:98:98:pident user:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
mailman:x:41:41:GNU Mailing List Manager:/var/mailman:/bin/false
privoxy:x:73:73::/etc/privoxy:/sbin/nologin
pvm:x:24:24::/usr/share/pvm3:/bin/bash
desktop:x:80:80:desktop:/var/lib/menu/kde:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
securityproof:x:500:500:securityproof:/home/securityproof:/bin/bash
[root@localhost root]#
여기서 사용되지 않는 계정들이 쉘을 사용하고 있는 것을 볼 수 있습니다. 서버에 사용되지 않는 계정은
다음과 같이 모두 앞에 comment 처리를 합니다.
- 이상 생략 -
# postfix:x:89:89::/var/spool/postfix:/sbin/nologin
# mailman:x:41:41:GNU Mailing List Manager:/var/mailman:/bin/false
# privoxy:x:73:73::/etc/privoxy:/sbin/nologin
# pvm:x:24:24::/usr/share/pvm3:/bin/bash
- 이하 생략 -
6
두 번째로 많이 사용되고 있는 것은 자동화된 공격툴입니다. 현재 가장 많이 사용되고 있는 자동화된
공격툴은 HDSI, MSSQL WEB SHELL, NBSI 등을 비롯한 툴들이 있습니다. 이 툴들의 공통점은 자동화된 웹해킹을
실행하고, 이를 통해 각종 데이터베이스의 정보를 빼 간다는 것입니다. 데이터베이스에는 각종 중요한
정보들이 들어 있습니다. 만약 그 정보들이 암호화되어 있지 않다면 심각한 결과를 초래할 수도 있습니다.
또한 웹 쉘을 이용해 로컬 공격을 실행하고, 이를 통해 시스템 전체를 장악한다는 것입니다.
[그림1. HDSI]
7
또 다른 한 예는 자동화된 SQL Injection 공격툴입니다.
[그림2. MSSQL WEB SHELL]
최근 언론의 발표에서 중국 해커들이 우리나라의 서버를 경유지로 이용하여 일본의 서버를 일제히
공격하겠다는 소식이 전해졌습니다. 일본에서 중국의 아이피를 차단하기 때문에 우리나라의 서버를 경유지로
삼겠다는 것입니다. 여태까지 수 없이 우리나라의 서버들은 외국 크래커들의 경유지로 사용되어 왔습니다.
이것은 인터넷 강국이라 불리는 우리나라의 자존심을 무너지게 하는 것입니다. 자존심은 차치하고, 중요한
정보들이 빠져나가 많은 피해자들이 생기고 있다는 것입니다.
우리나라의 자존심을 지키고, 각종 주요 정보가 빠져나가는 일이 없도록 하며, 피해를 최소화하기 위해
securityproof는 리눅스 보안 지침서를 만들었습니다. securityproof는 보안회사 직원들, 보안 전문가,
선의의 해커들이 모여 운영되는 보안 포탈 사이트입니다. 이 작은 보안 지침서가 우리나라의 보안을 지키는데
작은 도움이 될 수 있으면 기쁘겠습니다. 앞으로도 우리나라의 보안을 위해 securityproof는 최선을 다할
것입니다.
8
1. 방화벽 설치 및 운영
방화벽이라고 하면 어렵게만 들릴 수 있으나, 가장 기본적이면서 효율적인 운영 원칙만을 세운다면 그렇게
어렵지 않을 수 있습니다. 여기서 말하는 방화벽은 리눅스에 기본적으로 제공되는 iptables를 말합니다.
iptables는 아주 강력한 기능을 제공합니다. iptables를 이용하여 방화벽을 운영하기 위해서 먼저 포트
스캐닝을 해봐야 합니다. 포트 스캐닝은 서버에서 제공하는 각종 서비스 데몬의 포트를 확인하는 것을
말합니다.
(1) 포트 스캐닝
대부분의 리눅스 서버에는 nmap이라는 툴이 설치되어 있습니다. 이 툴은 포트 스캐닝을 하여 열린 포트를
확인하고, 불필요한 서비스가 열려있지 않은지를 확인해줍니다. 다음과 같이 명령을 내려봅니다. 여러분들에
직접 입력해야 하는 부분은 파란색으로 표시하겠습니다.
[root@localhost root]# nmap localhost
Starting nmap V. 3.00 ( www.insecure.org/nmap/ )
Interesting ports on localhost.localdomain (127.0.0.1):
(The 1593 ports scanned but not shown below are in state: closed)
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
23/tcp open telnet
25/tcp open smtp
80/tcp open http
3306/tcp open mysql
Nmap run completed -- 1 IP address (1 host up) scanned in 0.283 seconds
[root@localhost root]#
열린 포트를 확인해보니 ssh, telnet, smtp, http, mysql 등의 서비스가 제공되고 있는 것을 볼 수 있습니다.
ssh와 telnet은 관리자나 사용자가 원격으로 서버에 접속하여 서버를 관리하는데 사용되는 것입니다. 여기서
문제가 되는 것은 telnet 서비스입니다. telnet이 문제가 되는 것은 사용자의 아이디나 패스워드가
스니핑이라는 공격을 통해 노출될 수 있기 때문입니다. 그래서 만약 telnet 서비스가 제공 있고, 불가피한
경우가 아니라면 이 서비스는 꺼두는 것이 좋습니다. 방법은 다음과 같습니다.
[root@localhost root]# /etc/rc.d/init.d/telnetd stop
telnetd 를 정지함: [ 확인 ]
[root@localhost root]#
9
그리고 파일 업로드를 위해 ftp를 사용하는 경우가 있습니다. 그러나 ssh에는 sftp 기능이 있습니다. 그래서
굳이 ftp를 사용할 필요가 없습니다. sftp를 이용하기 위해 SSH Secure Shell이라는 프로그램을 이용하면
됩니다. 사용법이 그렇게 어렵지 않으니 다음 링크를 누르시면 바로 다운받을 수 있습니다.
ftp://ftp.sogang.ac.kr/pub/ssh/SSHSecureShellClient-3.2.0.exe
그렇다면 ftp 서비스도 꺼두도록 합니다.
[root@localhost root]# /etc/rc.d/init.d/ftpd stop
ftpd 를 정지함: [ 확인 ]
[root@localhost root]#
여기서 알아봐야 할 것은 각종 서비스 데몬 서비스의 실행과 중단을 하기 위해서는 어떻게 해야하는지
간단하게 알아봅니다. 먼저 다음과 같은 명령을 내립니다.
[root@localhost root]# cd /etc/rc.d/init.d
[root@localhost init.d]# ls
FreeWnn crond irda lpd ospf6d ripngd sshd
aep1000 cups irqbalance mailman ospfd routed syslog
amd dhcpd iscsi mars-nwe pcmcia rstatd tux
anacron dhcrelay isdn mdmonitor portmap rusersd ups
apmd firstboot isicom microcode_ctl postfix rwalld vncserver
arpwatch functions kadmin mysqld postgresql rwhod vsftpd
atalk gpm kdcrotate named privoxy saslauthd winbind
atd halt keytable netdump psacct sendmail xfs
autofs hpoj killall netdump-server pxe single xinetd
bcm5820 httpd kprop netfs radvd smartd ypbind
bgpd identd krb524 network random smb yppasswdd
bluetooth innd krb5kdc nfs rarpd snmpd ypserv
bootparamd ip6tables kudzu nfslock rawdevices snmptrapd ypxfrd
canna ipchains ldap nscd rhnsd spamassassin zebra
cpqarrayd iptables lisa ntpd ripd squid
[root@localhost init.d]#
여러 가지 파일들이 보입니다. 이 파일들이 각 서비스의 데몬을 실행시키고 중단시키는데 사용됩니다. 데몬을
실행시키기 위해서는 start, 중단시키기 위해서는 stop, 다시 시작시키기 위해서는 restart를 누르면 됩니다.
한가지 예로 가장 많이 사용되는 웹 서비스 데몬인 httpd 데몬을 실행 및 중단, 그리고 다시 실행시켜보도록
하겠습니다.
[root@localhost init.d]# /etc/rc.d/init.d/httpd start
10
httpd (을)를 시작합니다: [ 확인 ]
[root@localhost init.d]# /etc/rc.d/init.d/httpd stop
httpd 를 정지함: [ 확인 ]
[root@localhost init.d]# /etc/rc.d/init.d/httpd restart
httpd 를 정지함: [실패]
httpd (을)를 시작합니다: [ 확인 ]
[root@localhost init.d]#
그렇게 어렵지 않습니다. 이런 식으로 하면 지금 현재 실행 중인 불필요한 서비스를 꺼둘 수 있습니다. 그럼
다시 포트 스캐닝을 해보도록 하겠습니다.
[root@localhost root]# nmap localhost
Starting nmap V. 3.00 ( www.insecure.org/nmap/ )
Interesting ports on localhost.localdomain (127.0.0.1):
(The 1593 ports scanned but not shown below are in state: closed)
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
80/tcp open http
3306/tcp open mysql
Nmap run completed -- 1 IP address (1 host up) scanned in 0.283 seconds
[root@localhost root]#
메일 서버를 운영하지 않는다면 메일 서버도 꺼두도록 합니다. 한 가지 제안하고자 한다면 굳이 서버에 메일
서버를 운영할 필요가 없다고 생각합니다. 요즘 hotmail이나 gmail과 같은 메일 서비스를 제공하는 곳이 많이
있기 때문에 굳이 메일 서버를 소규모 서버에서 운영할 필요를 느끼지 못합니다.
[root@localhost init.d]# /etc/rc.d/init.d/sendmail stop
sendmail를 종료하고 있습니다: [ 확인 ]
sm-client을 종료하고 있습니다: [실패]
[root@localhost init.d]#
다시 최종 포트스캐닝을 합니다.
[root@localhost root]# nmap localhost
11
Starting nmap V. 3.00 ( www.insecure.org/nmap/ )
Interesting ports on localhost.localdomain (127.0.0.1):
(The 1593 ports scanned but not shown below are in state: closed)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
3306/tcp open mysql
Nmap run completed -- 1 IP address (1 host up) scanned in 0.283 seconds
[root@localhost root]#
이제 다시 확인을 해보니 서버에 원격으로 접속하여 관리를 할 수 있는 ssh 서비스가 돌아가고 있고, 웹
서버가 돌아가고 있으며, 홈페이지에서 보드를 운영할 수 있도록 mysql 서버도 돌아가고 있습니다. 사실 이
세가지 포트만 열려 있다면 홈페이지를 운영하는데 아무런 지장이 없습니다.
(2) 사용자 및 그룹 확인
여기서는 방화벽 설정을 할 때 특정 사용자만 접속하도록 설정하기 위한 정보를 알아볼 것입니다. 여기서
특정 사용자란 root와 웹 서버를 운영하는 사용자를 말합니다. 사실 콘솔에서 작업을 할 때는 root로 접속하지
않는 것이 보안을 위해 좋습니다. 하지만 어떨 경우 root로 접속해야 하는 경우가 있습니다. 그래서 여기서는
root와 웹 서버를 운영하는 사용자 두 사람만이 ssh로 접속할 수 있게 하는데 필요한 정보를 알아볼 것입니다.
먼저 /etc/passwd 파일의 내용을 확인합니다. 한가지 팁을 말하자면, 사용하지 않는 서비스 앞에 #를 붙이는
것이 좋습니다.
[root@localhost root]# cat /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
- 중략 -
radvd:x:75:75:radvd user:/:/sbin/nologin
securityproof:x:500:500:securityproof:/home/securityproof:/bin/bash
[root@localhost root]#
위의 결과를 보면 root 부분에 0이 보입니다. 그리고 securityproof에는 500이 보입니다. 이것을 잘 봐두시기
바랍니다. 이제 방화벽 설정 준비가 다 되었습니다.
12
(3) 방화벽 설정
지금 돌아가고 있는 서비스는 ssh, http, mysql 서버입니다. 여기에 대한 기본 설정과 해커들이 공격을 위해
사전에 반드시 하는 것이 있는데, 그것은 바로 포트 스캐닝입니다. 보안 관리자가 보안을 위해 열린 포트를
확인하듯, 공격자도 공격을 위해 포트 스캐닝을 합니다.
그런데 만약 포트 스캐닝을 해서 공격자가 원하는 결과를 얻지 못할 경우 성공적인 공격을 할 수 없을
것입니다. 그래서 포트 스캐닝을 하더라도 원하는 결과를 얻지 못하도록 방화벽에 설정할 것입니다. 다시
말하지만 방화벽 설정은 그렇게 어려운 것이 아니니 겁먹지 말고 하나씩 따라 해보시기 바랍니다.
우선 iptables라는 것이 어디에 있는지 확인해봅니다.
[root@localhost root]# which iptables
/sbin/iptables
[root@localhost root]#
확인해보니 /sbin 디렉토리에 있다는 것을 알 수 있습니다. 다음은 스크립트로 만든 방화벽 구성입니다.
여러분들은 word나 아니면 메모장에 작성하여 나중에 서버에 붙이면 됩니다. 먼저 메모장을 열어 다음과 같이
작성합니다. 작성할 때는 자기의 서버에 맞게 설정하는데, 만약 열린 포트가 22, 80, 3306이라면 다음과 같이
그대로 해도 무관할 것입니다. 일단 아래의 스크립트에서 알아둘 것은 #은 코멘트를 달아둔 것입니다. 이것은
실제로 실행이 안되는 것입니다. 필요한 부분은 파란색으로 표시합니다.
#!/bin/sh
#
# by securityproof.net (securityproof@hotmail.com)
#
# 기존의 정책을 초기화
/sbin/iptables -F
#
######################
# 포트 스캐닝 방지를 위한 설정
######################
#
/sbin/iptables -A INPUT -d 0.0.0.0/0 -p icmp -j DROP
# DoS 공격 방지를 위한 설정
13
# DoS 공격은 서비스를 원활히 운영하지 못하게 하기 때문에
# DoS 공격을 받으면 사이트의 신뢰성을 잃게 됨.
/sbin/iptables –t nat –A syn-flood –m limit –limit 12/s \ --limit-burst 24 –j RETURN
/sbin/iptables -t nat –A syn-flood –j DROP
#
################
# ssh(port 22) 정책
################
#
# 만약 관리자가 고정 아이피를 사용할 경우, 그 아이피만 사용하게 함
# 211.123.123.123라는 아이피 대신 여러분들의 아이피를 써줍니다.
# /sbin/iptables -A INPUT -p tcp --dport 22 -s 211.123.123.123 -j ACCEPT
# 그러나 여러분들이 다른 곳에 가서 서버에 접속할 경우가 있기 때문에
# 이 아이피를 사용하는 곳에 있을 경우 앞의 #를 없애고 실행하며
# 그렇지 않을 경우는 #을 붙여두는 것이 좋을 것입니다.
#
## 이제 특정 사용자만 접속하도록 설정합니다.
# 이는 앞에서 /etc/passwd 파일에 대해 알아볼 때 확인해둔 것입니다.
# root와securityproof가 접속 가능합니다.
# 여러분들은 여러분들의 서버에 맞게 설정하면 됩니다.
# 여기서 여러분들이 고쳐야 할 것은 securityproof에 대한 것이 500입니다.
# 대부분 사용자를 추가하면 500, 501.. 이런 식으로 나갑니다.
# 여러분들이 접속을 허용할 사용자에 해당하는 수를 500 대신 사용하면 됩니다.
#
/sbin/iptables -A INPUT -p tcp --dport 22 -m owner --uid-owner 0 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -m owner --gid-owner 0 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 22 -m owner --uid-owner 0 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 22 -m owner --gid-owner 0 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -m owner --uid-owner 500 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -m owner --gid-owner 500 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 22 -m owner --uid-owner 500 -j REJECT
/sbin/iptables -A OUTPUT -p tcp --dport 22 -m owner --gid-owner 500 -j REJECT
#
##############
# mySQL 정책
14
##############
#
/sbin/iptables -A INPUT -p tcp --dport 3306 -j REJECT
/sbin/iptables -A OUTPUT -p tcp --dport 3306 -j REJECT
# 끝
이제 최종 정리를 해보도록 하겠습니다.
****************************************************************************************
#!/bin/sh
# 기존의 정책을 초기화
/sbin/iptables -F
# 포트 스캐닝 방지를 위한 설정
/sbin/iptables -A INPUT -d 0.0.0.0/0 -p icmp -j DROP
# DoS 공격 방지를 위한 설정
/sbin/iptables –t nat –A syn-flood –m limit –limit 12/s ₩ --limit-burst 24 –j RETURN
/sbin/iptables -t nat –A syn-flood –j DROP
# ssh 정책
/sbin/iptables -A INPUT -p tcp --dport 22 -m owner --uid-owner 0 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -m owner --gid-owner 0 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 22 -m owner --uid-owner 0 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 22 -m owner --gid-owner 0 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -m owner --uid-owner 500 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -m owner --gid-owner 500 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 22 -m owner --uid-owner 500 -j REJECT
/sbin/iptables -A OUTPUT -p tcp --dport 22 -m owner --gid-owner 500 -j REJECT
# mySQL 정책
/sbin/iptables -A INPUT -p tcp --dport 3306 -j REJECT
/sbin/iptables -A OUTPUT -p tcp --dport 3306 -j REJECT
****************************************************************************************
이제 만들어진 스크립트를 서버에서 실행을 합니다.
[root@localhost root]# cat > firewall
#!/bin/sh
# 기존의 정책을 초기화
/sbin/iptables -F
15
# 포트 스캐닝 방지를 위한 설정
/sbin/iptables -A INPUT -d 0.0.0.0/0 -p icmp -j DROP
# DoS 공격 방지를 위한 설정
/sbin/iptables -t nat -A syn-flood -m limit -limit 12/s ₩ --limit-burst 24 -j RETURN
/sbin/iptables -t nat -A syn-flood -j DROP
# ssh 정책
/sbin/iptables -A INPUT -p tcp --dport 22 -m owner --uid-owner 0 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -m owner --gid-owner 0 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 22 -m owner --uid-owner 0 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 22 -m owner --gid-owner 0 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -m owner --uid-owner 500 -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -m owner --gid-owner 500 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 22 -m owner --uid-owner 500 -j REJECT
/sbin/iptables -A OUTPUT -p tcp --dport 22 -m owner --gid-owner 500 -j REJECT
# mySQL 정책
/sbin/iptables -A INPUT -p tcp --dport 3306 -j REJECT
/sbin/iptables -A OUTPUT -p tcp --dport 3306 -j REJECT
[root@localhost root]# chmod 700 firewall
[root@localhost root]# ./firewall
이제 다시 포트 스캐닝을 하여 포트의 상태를 알아봅니다.
[root@localhost root]# nmap localhost
Starting nmap 3.70 ( http://www.insecure.org/nmap/ )
Note: Host seems down. If it is really up, but blocking our ping probes, try -P0
Nmap run completed -- 1 IP address (0 hosts up) scanned in 0.117 seconds
[root@localhost root]#
방화벽 설정으로 인해 로컬에서 nmap을 돌려도 그 결과가 나오질 않습니다. 그래서 –P0옵션을 붙여 스캐닝을
해봅니다.
[root@localhost root]# nmap -P0 localhost
Starting nmap V. 3.00 ( www.insecure.org/nmap/ )
16
Interesting ports on localhost.localdomain (127.0.0.1):
(The 1593 ports scanned but not shown below are in state: closed)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
3306/tcp filtered mysql
Nmap run completed -- 1 IP address (1 host up) scanned in 0.294 seconds
[root@localhost root]#
설정한 부분이 보입니다. mysql 부분을 보면 필터링이 되고 있습니다. 물론 다른 설정도 제대로 돌아가고 있
습니다. 좀 있다가 알아볼 porsentry와 iptables가 조화를 이루어 실행되면 아주 강력한 보안 정책이 수립됩
니다. 외부 네트워크에서 –P0옵션을 붙여 스캐닝을 하더라도 그 결과는 보이지 않을 것입니다.
이렇게 해서 방화벽 설정을 위해 필요한 정보를 확인하는 것과 방화벽 스크립트, 그리고 최종 실행까지를 알
아보았습니다. 여러분들은 파란색으로 된 부분만 실행하면 됩니다.
2. 침입 탐지 및 방어 시스템 PORTSENTRY 운영
여기서는 portsentry라는 아주 멋있는 프로그램에 대해 알아볼 것입니다. 일반적으로 해커들은 특정 서버 공
격 전에 포트 스캐닝을 한다고 말했습니다. 이를 통해 필요한 정보를 구합니다. 이에 대한 좀 더 적극적인 방
어책으로 portsentry를 운영하면 각종 침입 시도를 멈추게 할 수 있습니다.
우선 portsentry를 구합니다. wget을 이용하여 바로 서버에 다운받도록 하겠습니다.
[root@localhost root]# wget http://packetstormsecurity.org/UNIX/IDS/portsentry-1.1.tar.gz
--15:49:20-- http://packetstormsecurity.org/UNIX/IDS/portsentry-1.1.tar.gz
=> `portsentry-1.1.tar.gz'
Resolving packetstormsecurity.org... 212.130.50.194
17
Connecting to packetstormsecurity.org[212.130.50.194]:80... connected.
HTTP 요청을 보냅니다, 서버로부터의 응답을 기다림...200 OK
길이: 45,871 [application/x-tar]
100%[============================================================>] 45,871 33.58K/s
15:49:28 (33.53 KB/s) - `portsentry-1.1.tar.gz' saved [45,871/45,871]
[root@localhost root]#
이제 압축을 풀고 설치를 합니다. 설치는 파란색으로 나와 있는 부분대로 따라 하시면 됩니다.
[root@localhost root]# tar xvfz portsentry-1.1.tar.gz
portsentry-1.1/
portsentry-1.1/CHANGES
portsentry-1.1/CREDITS
portsentry-1.1/LICENSE
portsentry-1.1/Makefile
portsentry-1.1/README.COMPAT
portsentry-1.1/README.install
portsentry-1.1/README.methods
portsentry-1.1/README.stealth
portsentry-1.1/ignore.csh
portsentry-1.1/portsentry.c
portsentry-1.1/portsentry.conf
portsentry-1.1/portsentry.h
portsentry-1.1/portsentry.ignore
portsentry-1.1/portsentry_config.h
portsentry-1.1/portsentry_io.c
portsentry-1.1/portsentry_io.h
portsentry-1.1/portsentry_tcpip.h
portsentry-1.1/portsentry_util.c
portsentry-1.1/portsentry_util.h
[root@localhost root]# cd portsentry-1.1
[root@localhost portsentry-1.1]# make linux
SYSTYPE=linux
18
Making
cc -O -Wall -DLINUX -DSUPPORT_STEALTH -o ./portsentry ./portsentry.c ₩
./portsentry_io.c ./portsentry_util.c
[root@localhost portsentry-1.1]# make install
Creating psionic directory /usr/local/psionic
Setting directory permissions
Creating portsentry directory /usr/local/psionic/portsentry
Setting directory permissions
chmod 700 /usr/local/psionic/portsentry
Copying files
cp ./portsentry.conf /usr/local/psionic/portsentry
cp ./portsentry.ignore /usr/local/psionic/portsentry
cp ./portsentry /usr/local/psionic/portsentry
Setting permissions
chmod 600 /usr/local/psionic/portsentry/portsentry.ignore
chmod 600 /usr/local/psionic/portsentry/portsentry.conf
chmod 700 /usr/local/psionic/portsentry/portsentry
Edit /usr/local/psionic/portsentry/portsentry.conf and change
your settings if you haven't already. (route, etc)
WARNING: This version and above now use a new
directory structure for storing the program
and config files (/usr/local/psionic/portsentry).
Please make sure you delete the old files when
the testing of this install is complete.
[root@localhost portsentry-1.1]#
설치는 끝났으며, 이제 설정 파일인 portsentry.conf를 수정합니다. 이 파일이 있는 디렉토리로 가서 이제 설
정 파일을 수정하도록 하겠습니다. 이 파일은 /usr/local/psionic/portsentry 디렉토리에 있습니다.
[root@localhost portsentry-1.1]# cd /usr/local/psionic/portsentry
[root@localhost portsentry]# ls -la
19
합계 68
drwx------ 2 root root 4096 7월 19 15:52 .
drwx------ 3 root root 4096 7월 19 15:51 ..
-rwx------ 1 root root 41510 7월 19 15:52 portsentry
-rw------- 1 root root 11198 7월 19 15:52 portsentry.conf
-rw------- 1 root root 480 7월 19 15:52 portsentry.ignore
[root@localhost portsentry]#
3개의 파일들이 보입니다. 제일 위에 있는 것은 실행파일이고, 두 번째 것은 설정 파일이며, 세 번째 있는 것
은 탐지를 할 때 무시를 해도 좋은 유저와 아이피 주소를 기록하는 곳입니다. 제일 먼저 portsentry.conf라는
파일을 수정하도록 하겠습니다. 수정한 부분은 파란색으로 표시하겠습니다. 그리고 많은 수정이 필요하지 않
으므로 간단한 vi 사용법만 아시면 됩니다.
[root@localhost portsentry]# vi portsentry.conf
# PortSentry Configuration
#
# $Id: portsentry.conf,v 1.23 2001/06/26 15:20:56 crowland Exp crowland $
#
# IMPORTANT NOTE: You CAN NOT put spaces between your port arguments.
#
# The default ports will catch a large number of common probes
#
# All entries must be in quotes.
#######################
# Port Configurations #
#######################
#
#
# Some example port configs for classic and basic Stealth modes
#
# I like to always keep some ports at the "low" end of the spectrum.
# This will detect a sequential port sweep really quickly and usually
# these ports are not in use (i.e. tcpmux port 1)
#
# ** X-Windows Users **: If you are running X on your box, you need to be sure
# you are not binding PortSentry to port 6000 (or port 2000 for OpenWindows users).
20
# Doing so will prevent the X-client from starting properly.
#
# These port bindings are *ignored* for Advanced Stealth Scan Detection Mode.
#
# Un-comment these if you are really anal:
#TCP_PORTS="1,7,9,11,15,70,79,80,109,110,111,119,138,139,143,512,513,514,515,540,635,1080,1524,2000,2001,4000,4001
,5742,6000,6001,6667,12345,12346,20034,27665,30303,32771,32772,32773,32774,31337,40421,40425,49724,54320"
#UDP_PORTS="1,7,9,66,67,68,69,111,137,138,161,162,474,513,517,518,635,640,641,666,700,2049,31335,27444,34555,32770
,32771,32772,32773,32774,31337,54321"
#
# Use these if you just want to be aware:
# 다음 부분은 앞에 #를 붙입니다.
#TCP_PORTS="1,11,15,79,111,119,143,540,635,1080,1524,2000,5742,6667,12345,12346,20034,27665,31337,32771,32772,3277
3,32774,40421,49724,54320"
#UDP_PORTS="1,7,9,69,161,162,513,635,640,641,700,37444,34555,31335,32770,32771,32772,32773,32774,31337,54321"
#
# Use these for just bare-bones
#TCP_PORTS="1,11,15,110,111,143,540,635,1080,1524,2000,12345,12346,20034,32771,32772,32773,32774,49724,54320"
#UDP_PORTS="1,7,9,69,161,162,513,640,700,32770,32771,32772,32773,32774,31337,54321"
# 우리가 사용하고 있는 포트만 다음처럼 대로 작성합니다.
TCP_PORTS="22,80,3306"
UDP_PORTS="22,80,3306"
###########################################
# Advanced Stealth Scan Detection Options #
###########################################
#
# This is the number of ports you want PortSentry to monitor in Advanced mode.
# Any port *below* this number will be monitored. Right now it watches
# everything below 1024.
#
# On many Linux systems you cannot bind above port 61000. This is because
# these ports are used as part of IP masquerading. I don't recommend you
# bind over this number of ports. Realistically: I DON'T RECOMMEND YOU MONITOR
# OVER 1024 PORTS AS YOUR FALSE ALARM RATE WILL ALMOST CERTAINLY RISE. You've been
# warned! Don't write me if you have have a problem because I'll only tell
21
# you to RTFM and don't run above the first 1024 ports.
#
#
ADVANCED_PORTS_TCP="1024"
ADVANCED_PORTS_UDP="1024"
#
# This field tells PortSentry what ports (besides listening daemons) to
# ignore. This is helpful for services like ident that services such
# as FTP, SMTP, and wrappers look for but you may not run (and probably
# *shouldn't* IMHO).
#
# By specifying ports here PortSentry will simply not respond to
# incoming requests, in effect PortSentry treats them as if they are
# actual bound daemons. The default ports are ones reported as
# problematic false alarms and should probably be left alone for
# all but the most isolated systems/networks.
#
# Default TCP ident and NetBIOS service
ADVANCED_EXCLUDE_TCP="113,139"
# Default UDP route (RIP), NetBIOS, bootp broadcasts.
ADVANCED_EXCLUDE_UDP="520,138,137,67"
######################
# Configuration Files#
######################
#
# Hosts to ignore
IGNORE_FILE="/usr/local/psionic/portsentry/portsentry.ignore"
# Hosts that have been denied (running history)
HISTORY_FILE="/usr/local/psionic/portsentry/portsentry.history"
# Hosts that have been denied this session only (temporary until next restart)
BLOCKED_FILE="/usr/local/psionic/portsentry/portsentry.blocked"
##############################
# Misc. Configuration Options#
##############################
#
22
# DNS Name resolution - Setting this to "1" will turn on DNS lookups
# for attacking hosts. Setting it to "0" (or any other value) will shut
# it off.
RESOLVE_HOST = "1"
###################
# Response Options#
###################
# Options to dispose of attacker. Each is an action that will
# be run if an attack is detected. If you don't want a particular
# option then comment it out and it will be skipped.
#
# The variable $TARGET$ will be substituted with the target attacking
# host when an attack is detected. The variable $PORT$ will be substituted
# with the port that was scanned.
#
##################
# Ignore Options #
##################
# These options allow you to enable automatic response
# options for UDP/TCP. This is useful if you just want
# warnings for connections, but don't want to react for
# a particular protocol (i.e. you want to block TCP, but
# not UDP). To prevent a possible Denial of service attack
# against UDP and stealth scan detection for TCP, you may
# want to disable blocking, but leave the warning enabled.
# I personally would wait for this to become a problem before
# doing though as most attackers really aren't doing this.
# The third option allows you to run just the external command
# in case of a scan to have a pager script or such execute
# but not drop the route. This may be useful for some admins
# who want to block TCP, but only want pager/e-mail warnings
# on UDP, etc.
#
#
# 0 = Do not block UDP/TCP scans.
# 1 = Block UDP/TCP scans.
23
# 2 = Run external command only (KILL_RUN_CMD)
BLOCK_UDP="1"
BLOCK_TCP="1"
###################
# Dropping Routes:#
###################
# This command is used to drop the route or add the host into
# a local filter table.
#
# The gateway (333.444.555.666) should ideally be a dead host on
# the *local* subnet. On some hosts you can also point this at
# localhost (127.0.0.1) and get the same effect. NOTE THAT
# 333.444.555.66 WILL *NOT* WORK. YOU NEED TO CHANGE IT!!
#
# ALL KILL ROUTE OPTIONS ARE COMMENTED OUT INITIALLY. Make sure you
# uncomment the correct line for your OS. If you OS is not listed
# here and you have a route drop command that works then please
# mail it to me so I can include it. ONLY ONE KILL_ROUTE OPTION
# CAN BE USED AT A TIME SO DON'T UNCOMMENT MULTIPLE LINES.
#
# NOTE: The route commands are the least optimal way of blocking
# and do not provide complete protection against UDP attacks and
# will still generate alarms for both UDP and stealth scans. I
# always recommend you use a packet filter because they are made
# for this purpose.
# 이 부분에는 각 OS별로 설정이 나와 있는데, 대부분 #가 붙어 있지요.
# 우리가 사용할 부분에는 파란색으로 표시하겠습니다.
# 리눅스용은 다음과 같습니다.
# 다른 부분은 모두 삭제하였습니다.
KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP"
###############
# TCP Wrappers#
###############
24
# This text will be dropped into the hosts.deny file for wrappers
# to use. There are two formats for TCP wrappers:
#
# Format One: Old Style - The default when extended host processing
# options are not enabled.
#
KILL_HOSTS_DENY="ALL: $TARGET$"
# Format Two: New Style - The format used when extended option
# processing is enabled. You can drop in extended processing
# options, but be sure you escape all '%' symbols with a backslash
# to prevent problems writing out (i.e. ₩%c ₩%h )
#
#KILL_HOSTS_DENY="ALL: $TARGET$ : DENY"
###################
# External Command#
###################
# This is a command that is run when a host connects, it can be whatever
# you want it to be (pager, etc.). This command is executed before the
# route is dropped or after depending on the KILL_RUN_CMD_FIRST option below
#
#
# I NEVER RECOMMEND YOU PUT IN RETALIATORY ACTIONS AGAINST THE HOST SCANNING
# YOU!
#
# TCP/IP is an *unauthenticated protocol* and people can make scans appear out
# of thin air. The only time it is reasonably safe (and I *never* think it is
# reasonable) to run reverse probe scripts is when using the "classic" -tcp mode.
# This mode requires a full connect and is very hard to spoof.
#
# The KILL_RUN_CMD_FIRST value should be set to "1" to force the command
# to run *before* the blocking occurs and should be set to "0" to make the
# command run *after* the blocking has occurred.
#
#KILL_RUN_CMD_FIRST = "0"
#
25
#
#KILL_RUN_CMD="/some/path/here/script $TARGET$ $PORT$"
#####################
# Scan trigger value#
#####################
# Enter in the number of port connects you will allow before an
# alarm is given. The default is 0 which will react immediately.
# A value of 1 or 2 will reduce false alarms. Anything higher is
# probably not necessary. This value must always be specified, but
# generally can be left at 0.
#
# NOTE: If you are using the advanced detection option you need to
# be careful that you don't make a hair trigger situation. Because
# Advanced mode will react for *any* host connecting to a non-used
# below your specified range, you have the opportunity to really
# break things. (i.e someone innocently tries to connect to you via
# SSL [TCP port 443] and you immediately block them). Some of you
# may even want this though. Just be careful.
#
SCAN_TRIGGER="0"
######################
# Port Banner Section#
######################
#
# Enter text in here you want displayed to a person tripping the PortSentry.
# I *don't* recommend taunting the person as this will aggravate them.
# Leave this commented out to disable the feature
#
# Stealth scan detection modes don't use this feature
#
#PORT_BANNER="** UNAUTHORIZED ACCESS PROHIBITED *** YOUR CONNECTION ATTEMPT HAS BEEN LOGGED. GO AWAY."
# EOF
[root@localhost portsentry]#
26
이제 portsentry.ignore 파일 하나만 설정하면 되는데, 굳이 손볼 필요는 없습니다. 하지만 고정 아이피를 사
용하시는 분이라면 설정을 해두는 것이 좋습니다. 고정 아이피를 사용하지 않는다면 모든 준비가 된 것입니다.
[root@localhost portsentry]# vi portsentry.ignore
# Put hosts in here you never want blocked. This includes the IP addresses
# of all local interfaces on the protected host (i.e virtual host, mult-home)
# Keep 127.0.0.1 and 0.0.0.0 to keep people from playing games.
#
# PortSentry can support full netmasks for networks as well. Format is:
#
# <IP Address>/<Netmask>
#
# Example:
#
# 192.168.2.0/24
# 192.168.0.0/16
# 192.168.2.1/32
# Etc.
#
# If you don't supply a netmask it is assumed to be 32 bits.
#
#
127.0.0.1/32
0.0.0.0
# 관리자의 고정 아이피를 추가합니다. 만약 그 아이피가 123.123.123.123이라면,
# 아래에 이 아이피 주소를 입력합니다.
123.123.123.123
[root@localhost portsentry]#
이제 설정이 모두 끝났고, 실행만 하면 됩니다. 실행을 위해 간단한 스크립트를 만듭니다. 이것은 아래 나오
는 것 그대로 사용하시면 됩니다. 이것은 일일이 명령을 입력할 필요 없이 한번의 실행으로 각 모드를 실행할
수 있게 해줍니다. 다시 root 디렉토리로 와서 다음과 같은 작업을 합니다.
[root@localhost portsentry]# cd
[root@localhost root]# cat > portsentry
27
#!/bin/sh
#
# portsentry 정책
#
/usr/local/psionic/portsentry/portsentry -tcp
/usr/local/psionic/portsentry/portsentry -udp
/usr/local/psionic/portsentry/portsentry -atcp
/usr/local/psionic/portsentry/portsentry -audp
[root@localhost root]# chmod 700 portsentry
[root@localhost root]# ./portsentry
이제 portsentry가 제대로 실행되고 있는지 확인해봅니다. 프로세스를 확인해보도록 하겠습니다.
[root@localhost root]# ps -aux | grep portsentry
root 12114 0.0 0.0 1384 460 ? S 16:53 0:00 /usr/local/psionic/portsentry/portsentry -tcp
root 12116 0.0 0.0 1384 460 ? S 16:53 0:00 /usr/local/psionic/portsentry/portsentry -udp
root 12120 0.0 0.0 1380 452 ? S 16:53 0:00 /usr/local/psionic/portsentry/portsentry -atcp
root 12124 0.0 0.0 1384 460 ? S 16:53 0:00 /usr/local/psionic/portsentry/portsentry -audp
root 12128 0.0 0.1 4668 656 pts/3 S 16:54 0:00 grep portsentry
[root@localhost root]#
모든 것이 정상적으로 돌아가고 있습니다. 이제 간단한 테스트를 통해 portsentry가 그 역할을 잘 하고 있는
지 확인을 해보도록 하겠습니다. 먼저 스캐닝을 해보도록 하겠습니다. portsentry가 설치되어 있는 곳은
securityproof.net에서 운영하는 프리해킹 존입니다.
[root@test cracker]# nmap -P0 211.xxx.xxx.xxx
Starting nmap 3.70 ( http://www.insecure.org/nmap/ ) at 2005-07-19 15:02 KST
[root@test cracker]#
더 이상 스캐닝이 진행되지 않아 Ctrl-c키를 눌렀습니다. 이제 서버에 남아 있는 로그를 보겠습니다. 로그는
보통 두 군데 쌓이게 됩니다. 먼저 /var/log/messages에 기록된 로그를 보도록 하겠습니다. 다음 로그는 실제
28
서버에 공격한 흔적입니다.
[root@localhost root]# cd /var/log
[root@localhost root]# cat messages
Jul 19 17:32:14 localhost portsentry[12011]: attackalert: Host 211.195.203.70 has been blocked via wrappers with
string: "ALL: 211.195.203.70"
Jul 19 17:32:14 localhost portsentry[12011]: attackalert: Host 211.195.203.70 has been blocked via dropped route
using command: "/sbin/iptables -I INPUT -s 211.195.203.70 -j DROP"
로그를 보니 iptables를 이용해 공격자의 아이피를 막아버렸습니다. 이 공격자는 이제 공격에 사용된 아이피
로는 서버에 접근하지 못하게 됩니다. 즉, 공격이 힘들어지게 된 것입니다. 공격자가 프록시를 사용하지 않는
다면 웹 서버, 즉 홈페이지에도 접근을 못하게 됩니다. 다른 로그는 /usr/local/psionic/portsentry 디렉토리
에 있는 portsentry.history라는 파일에 다음과 같이 기록됩니다.
1121752534 - 07/19/2005 17:32:14 Host: 211.195.203.70 /211.195.203.70 Port: 135 TCP Blocked
이제까지 portsentry를 통해 침입탐지 및 방어 시스템을 구축하는 것에 대해 알아보았습니다.
3. chkrootkit를 통한 백도어 설치 탐지
악의적인 공격자들은 공격 성공 후 서버에 백도어를 설치하는 경우가 있습니다. 이는 단순한 프로세스 확인만
으로는 탐지가 되지 않는 경우가 더 많습니다. 남미나 유럽 크래커들은 서버 공격 후 자신들의 무용담을 자랑
하기 위해 웹 페이지를 변조하여 공격 여부를 확인할 수 있으나, 중국 해커들의 경우 웹 페이지 변조 없이 서
버를 악의적으로 사용하는 경우가 많습니다.
이런 경우 chkrootkit란 툴을 이용하여 서버에 설치되어 있는 백도어를 탐지할 수 있습니다. 현재 가장 최신
버전은 0.45 버전입니다. 먼저 chkrootkit를 다운받아 설치합니다. 이번에도 역시 wget을 이용하여 바로 서버
로 다운 받도록 하겠습니다.
29
[root@localhost root]# wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
--17:33:16-- ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
=> `chkrootkit.tar.gz'
Resolving ftp.pangeia.com.br... 200.239.53.35
Connecting to ftp.pangeia.com.br[200.239.53.35]:21... connected.
anonymous로서 로그인하고 있습니다...로그인 했습니다!
==> SYST ... 완료. ==> PWD ... 완료.
==> TYPE I ... 완료. ==> CWD /pub/seg/pac ... 완료.
==> PASV ... 완료. ==> RETR chkrootkit.tar.gz ... 완료.
길이: 36,359 (unauthoritative)
100%[=========================================================================================>] 36,359
7.23K/s ETA 00:00
17:33:27 (6.90 KB/s) - `chkrootkit.tar.gz' saved [36,359]
[root@localhost root]#
이제 압축을 풀고 설치를 하도록 하겠습니다. chkrootkit은 설치가 쉬우며, 별도의 설정 파일이 없습니다.
[root@localhost root]# tar xvfz chkrootkit.tar.gz
chkrootkit-0.45/
chkrootkit-0.45/ifpromisc.c
chkrootkit-0.45/COPYRIGHT
chkrootkit-0.45/chkdirs.c
chkrootkit-0.45/check_wtmpx.c
chkrootkit-0.45/chkrootkit.lsm
chkrootkit-0.45/Makefile
chkrootkit-0.45/ACKNOWLEDGMENTS
chkrootkit-0.45/README.chkwtmp
chkrootkit-0.45/chklastlog.c
chkrootkit-0.45/chkrootkit
chkrootkit-0.45/chkutmp.c
chkrootkit-0.45/chkwtmp.c
chkrootkit-0.45/README
chkrootkit-0.45/README.chklastlog
30
chkrootkit-0.45/strings.c
chkrootkit-0.45/chkproc.c
[root@localhost root]# cd chkrootkit-0.45
[root@localhost chkrootkit-0.45]# make sense
gcc -DHAVE_LASTLOG_H -o chklastlog chklastlog.c
gcc -DHAVE_LASTLOG_H -o chkwtmp chkwtmp.c
gcc -DHAVE_LASTLOG_H -D_FILE_OFFSET_BITS=64 -o ifpromisc ifpromisc.c
gcc -o chkproc chkproc.c
gcc -o chkdirs chkdirs.c
gcc -o check_wtmpx check_wtmpx.c
gcc -static -o strings-static strings.c
gcc -o chkutmp chkutmp.c
[root@localhost chkrootkit-0.45]#
설치가 끝났습니다. 아주 간단합니다. 어떤 파일들이 있는지 확인해보도록 하겠습니다.
[root@localhost chkrootkit-0.45]# ls -la
합계 632
drwxr-xr-x 2 1000 1000 4096 7월 19 17:39 .
drwxr-x--- 20 root root 4096 7월 19 17:35 ..
-r--r--r-- 1 1000 1000 3365 2월 22 04:31 ACKNOWLEDGMENTS
-r--r--r-- 1 1000 1000 1343 9월 7 2004 COPYRIGHT
-r--r--r-- 1 1000 1000 1556 2월 22 08:13 Makefile
-r--r--r-- 1 1000 1000 12963 2월 22 21:56 README
-r--r--r-- 1 1000 1000 1323 9월 7 2004 README.chklastlog
-r--r--r-- 1 1000 1000 1292 9월 7 2004 README.chkwtmp
-rwxr-xr-x 1 root root 2704 7월 19 17:39 check_wtmpx
-r--r--r-- 1 1000 1000 7195 9월 7 2004 check_wtmpx.c
-rwxr-xr-x 1 root root 6052 7월 19 17:39 chkdirs
-r--r--r-- 1 1000 1000 6781 9월 7 2004 chkdirs.c
-rwxr-xr-x 1 root root 6640 7월 19 17:39 chklastlog
-r--r--r-- 1 1000 1000 7730 11월 17 2004 chklastlog.c
-rwxr-xr-x 1 root root 6808 7월 19 17:39 chkproc
-r--r--r-- 1 1000 1000 7613 9월 14 2004 chkproc.c
-rwxr-xr-x 1 1000 wheel 71149 2월 22 21:57 chkrootkit
-r--r--r-- 1 1000 1000 571 2월 22 06:20 chkrootkit.lsm
31
-rwxr-xr-x 1 root root 5944 7월 19 17:39 chkutmp
-r--r--r-- 1 1000 1000 5388 2월 22 08:10 chkutmp.c
-rwxr-xr-x 1 root root 3960 7월 19 17:39 chkwtmp
-r--r--r-- 1 1000 1000 2081 9월 7 2004 chkwtmp.c
-rwxr-xr-x 1 root root 6868 7월 19 17:39 ifpromisc
-r--r--r-- 1 1000 1000 8771 9월 7 2004 ifpromisc.c
-rwxr-xr-x 1 root root 402496 7월 19 17:39 strings-static
-r--r--r-- 1 1000 1000 2437 9월 7 2004 strings.c
[root@localhost chkrootkit-0.45]#
이제 chkrootkit을 실행하여 백도어가 설치되어 있는지 확인만 해보면 됩니다.
[root@localhost chkrootkit-0.45]# ./chkrootkit
ROOTDIR is `/'
Checking `amd'... not infected
Checking `basename'... not infected
Checking `biff'... not infected
Checking `chfn'... not infected
Checking `chsh'... not infected
Checking `cron'... not infected
Checking `date'... not infected
Checking `du'... not infected
Checking `dirname'... not infected
Checking `echo'... not infected
Checking `egrep'... not infected
Checking `env'... not infected
Checking `find'... not infected
Checking `fingerd'... not infected
Checking `gpm'... not infected
Checking `grep'... not infected
Checking `hdparm'... not infected
Checking `su'... not infected
Checking `ifconfig'... not infected
Checking `inetd'... not tested
Checking `inetdconf'... not found
Checking `identd'... not infected
32
Checking `init'... not infected
Checking `killall'... not infected
Checking `ldsopreload'... not infected
Checking `login'... not infected
Checking `ls'... not infected
Checking `lsof'... not infected
Checking `mail'... not found
Checking `mingetty'... not infected
Checking `netstat'... not infected
Checking `named'... not infected
Checking `passwd'... not infected
Checking `pidof'... not infected
Checking `pop2'... not found
Checking `pop3'... not found
Checking `ps'... not infected
Checking `pstree'... not infected
Checking `rpcinfo'... not infected
Checking `rlogind'... not infected
Checking `rshd'... not infected
Checking `slogin'... not found
Checking `sendmail'... not infected
Checking `sshd'... not infected
Checking `syslogd'... not infected
Checking `tar'... not infected
Checking `tcpd'... not infected
Checking `tcpdump'... not infected
Checking `top'... not infected
Checking `telnetd'... not infected
Checking `timed'... not found
Checking `traceroute'... not infected
Checking `vdir'... not infected
Checking `w'... not infected
Checking `write'... not infected
Checking `aliens'... no suspect files
Searching for sniffer's logs, it may take a while... nothing found
Searching for HiDrootkit's default dir... nothing found
Searching for t0rn's default files and dirs... nothing found
33
Searching for t0rn's v8 defaults... nothing found
Searching for Lion Worm default files and dirs... nothing found
Searching for RSHA's default files and dir... nothing found
Searching for RH-Sharpe's default files... nothing found
Searching for Ambient's rootkit (ark) default files and dirs... nothing found
Searching for suspicious files and dirs, it may take a while...
/usr/lib/perl5/5.8.0/i386-linux-thread-multi/.packlist /usr/lib/openoffice/share/gnome/net/.directory
/usr/lib/openoffice/share/gnome/net/.order /usr/lib/openoffice/share/kde/net/applnk/OpenOffice.org/.directory
/usr/lib/openoffice/share/kde/net/applnk/OpenOffice.org/.order /usr/lib/qt-3.1/etc/settings/.qtrc.lock
Searching for LPD Worm files and dirs... nothing found
Searching for Ramen Worm files and dirs... nothing found
Searching for Maniac files and dirs... nothing found
Searching for RK17 files and dirs... nothing found
Searching for Ducoci rootkit... nothing found
Searching for Adore Worm... nothing found
Searching for ShitC Worm... nothing found
Searching for Omega Worm... nothing found
Searching for Sadmind/IIS Worm... nothing found
Searching for MonKit... nothing found
Searching for Showtee... nothing found
Searching for OpticKit... nothing found
Searching for T.R.K... nothing found
Searching for Mithra... nothing found
Searching for LOC rootkit... nothing found
Searching for Romanian rootkit... nothing found
Searching for HKRK rootkit... nothing found
Searching for Suckit rootkit... nothing found
Searching for Volc rootkit... nothing found
Searching for Gold2 rootkit... nothing found
Searching for TC2 Worm default files and dirs... nothing found
Searching for Anonoying rootkit default files and dirs... nothing found
Searching for ZK rootkit default files and dirs... nothing found
Searching for ShKit rootkit default files and dirs... nothing found
Searching for AjaKit rootkit default files and dirs... nothing found
Searching for zaRwT rootkit default files and dirs... nothing found
Searching for Madalin rootkit default files... nothing found
34
Searching for Fu rootkit default files... nothing found
Searching for ESRK rootkit default files... nothing found
Searching for anomalies in shell history files... nothing found
Checking `asp'... not infected
Checking `bindshell'... not infected
Checking `lkm'... chkproc: nothing detected
Checking `rexedcs'... not found
Checking `sniffer'... eth0: PF_PACKET(/sbin/dhclient)
Checking `w55808'... not infected
Checking `wted'... chkwtmp: nothing deleted
Checking `scalper'... not infected
Checking `slapper'... not infected
Checking `z2'... chklastlog: nothing deleted
Checking `chkutmp'... The tty of the following user process(es) were not found
in /var/run/utmp !
! RUID PID TTY CMD
! root 4161 tty6 /sbin/mingetty tty6
chkutmp: nothing deleted
[root@localhost chkrootkit-0.45]#
결과를 보니 이상한 점이 없습니다. 만약 실행하여 이상한 부분이 있으면 즉시 확인을 하고, 대책을 세워야
합니다. 어떤 대책을 세워야할지를 모를 경우 정부의 관련기관이나 securityproof 사이트에 글 올려주시기 바
랍니다.
4. 파일 퍼미션 설정을 통한 로컬 공격 방지
공격자는 원격 취약점을 이용하여 시스템을 장악할 수 있지만 원격 취약점이 없으면 보통 웹 페이지의 취약점
을 이용하여 로컬 공격을 하고, 이를 통해 시스템을 장악하는 경우가 있습니다. 보통 웹 공격을 통해 획득할
수 있는 것은 nobody 또는 apache 권한입니다. 이는 웹 서버 설정 파일인 httpd.conf라는 파일의 설정에 따라
사용하는 용어가 달라질 수 있으며, 공격에 성공할 경우 보통 ‘웹 권한을 획득했다’고 합니다.
웹 권한을 획득하면 웹 페이지의 변조가 가능할 수 있고, 시스템 장악을 위해 로컬 공격을 할 수 있습니다.
35
이를 경우를 대비하여 공격자가 원활한 로컬 공격을 하지 못하도록 파일 퍼미션을 설정하는 것입니다. 여기서
는 공격자가 웹 권한을 획득하고, 로컬 공격 시 반드시 사용하거나 사용할 가능성이 높은 파일들을 대상으로
퍼미션 조정을 할 것입니다. 제일 먼저 /bin 디렉토리의 파일 설정에 대해 알아보도록 하겠습니다.
많은 사용자 계정이 없는 경우라면 이 파일들은 모두 퍼미션을 700으로 수정합니다. 다른 사용자들이 있으면
특정 그룹의 사용자만 이용할 수 있도록 설정을 해야 합니다. 그러나 이 문서가 대상으로 하고 있는 독자들의
서버는 많은 계정이 없는, 대부분 root만이 서버에 접속하여 서버를 관리하는 경우입니다.
[root@localhost root]# cd /bin
[root@localhost bin]# ls -al
합계 5448
-rwxr-xr-x 1 root root 14364 2월 19 2003 cat
-rwxr-xr-x 1 root root 18076 2월 19 2003 chgrp
-rwxr-xr-x 1 root root 18076 2월 19 2003 chmod
-rwxr-xr-x 1 root root 47732 2월 19 2003 cp
-rwxr-xr-x 1 root root 28596 2월 19 2003 df
-rwxr-xr-x 1 root root 11356 2월 19 2003 env
-rwxr-xr-x 1 root root 294332 1월 25 2003 gawk
-rwxr-xr-x 1 root root 75668 1월 25 2003 grep
-rwxr-xr-x 1 root root 7996 2월 25 2003 kill
-rwxr-xr-x 1 root root 10780 2월 19 2003 link
-rwxr-xr-x 1 root root 22204 2월 19 2003 ln
-rwxr-xr-x 1 root root 67668 2월 19 2003 ls
-rwxr-xr-x 1 root root 18396 2월 19 2003 mkdir
-rwsr-xr-x 1 root root 68508 2월 25 2003 mount
-rwxr-xr-x 1 root root 51028 2월 19 2003 mv
-rwxr-xr-x 1 root root 85240 2월 11 2003 netstat
-r-xr-xr-x 1 root root 69772 2월 20 2003 ps
-rwxr-xr-x 1 root root 10620 2월 19 2003 pwd
-rwxr-xr-x 1 root root 26556 2월 19 2003 rm
-rwxr-xr-x 1 root root 11804 2월 19 2003 rmdir
-rwx------ 1 rpm rpm 77404 2월 28 2003 rpm
36
-rwxr-xr-x 1 root root 26332 2월 19 2003 touch
-rwxr-xr-x 1 root root 12188 2월 19 2003 uname
-rwxr-xr-x 1 root root 10848 2월 19 2003 unlink
-rwxr-xr-x 1 root root 456108 2월 12 2003 vi
[root@localhost bin]#
이 파일들의 퍼미션을 700으로 조정해도 홈페이지를 운영하는 데는 아무런 문제가 없습니다. 퍼미션 조정 방
법은 다음과 같습니다. 순서대로 ‘chmod 700 파일명’으로 하면 됩니다. 예를 한 가지 들어보겠습니다.
[root@localhost bin]# chmod 700 cat
퍼미션을 확인해보도록 하겠습니다.
[root@localhost bin]# ls -la cat
-rwx------ 1 root root 26556 2월 19 2003 cat
[root@localhost bin]#
퍼미션 조절하는 것은 전혀 어렵지 않습니다. 이제는 /sbin 디렉토리에서 퍼미션 조정이 필요한 파일을 찾아
보도록 하겠습니다. 역시 퍼미션을 700으로 수정합니다.
[root@localhost bin]# cd /sbin
[root@localhost sbin]# ls -la
합계 17400
drwxr-xr-x 2 root root 8192 7월 4 09:22 .
drwxr-xr-x 21 root root 4096 7월 18 05:38 ..
-rwxr-xr-x 1 root root 38556 2월 11 2003 arp
-rwxr-xr-x 1 root root 51672 2월 11 2003 ifconfig
-rwxr-xr-x 1 root root 47560 2월 4 2003 iptables
[root@localhost sbin]#
이제 /usr/bin 디렉토리의 파일들 중에서 700으로 수정이 필요한 것들을 찾아보겠습니다.
37
[root@localhost sbin]# cd /usr/bin
[root@localhost bin]# ls –al
[root@localhost bin]# ls -la | more
합계 283228
lrwxrwxrwx 1 root root 3 7월 4 08:55 cc -> gcc
-rwxr-xr-x 1 root root 62268 1월 26 2003 dig
-rwxr-xr-x 1 root root 51028 1월 25 2003 find
-rwxr-xr-x 2 root root 80644 2월 25 2003 gcc
-rwxr-xr-x 2 root root 81864 2월 12 2003 gcc296
-rwxr-xr-x 1 root root 2116372 2월 25 2003 gdb
-rwxr-xr-x 1 root root 44800 2월 25 2003 gdbserver
-rwxr-xr-x 1 root root 14236 2월 19 2003 id
-rwxr-xr-x 1 root root 15260 2월 19 2003 kill
-rwxr-xr-x 1 root root 13144 1월 25 2003 killall
-rwxr-xr-x 1 root root 11068 2월 11 2003 last
-rwxr-xr-x 1 root root 127932 1월 25 2003 make
-rwxr-xr-x 1 root root 55068 2월 19 2003 mysql
-rwxr-xr-x 1 root root 257788 1월 26 2003 nmap
-rwxr-xr-x 1 root root 55968 1월 26 2003 nslookup
-rwxr-xr-x 2 root root 12572 2월 19 2003 perl
-rwxr-xr-x 2 root root 12572 2월 19 2003 perl5.8.
-rwxr-xr-x 2 root root 791232 2월 25 2003 python
-rwxr-xr-x 3 root root 57468 1월 25 2003 rz
-rwxr-xr-x 1 root root 64632 2월 15 2003 ssh-add
-rwxr-xr-x 1 root root 47544 2월 15 2003 ssh-agent
-rwxr-xr-x 1 root root 64760 2월 15 2003 ssh-keygen
-rwxr-xr-x 1 root root 135800 2월 15 2003 ssh-keyscan
-rwxr-xr-x 1 root root 35604 2월 19 2003 tail
-rwxr-xr-x 1 root root 1893740 2월 12 2003 vim
-rwxr-xr-x 1 root root 7168 2월 25 2003 whereis
-rwxr-xr-x 1 root root 15324 1월 25 2003 which
-rwxr-xr-x 1 root root 10784 2월 19 2003 whoami
[root@localhost bin]#
38
이제 /usr/sbin 디렉토리입니다. 여기는 그렇게 많지 않습니다. lsof 파일을 700으로 설정합니다.
[root@localhost bin]# cd /usr/sbin
[root@localhost sbin]# ls -al
-rwxr-xr-x 1 root root 95640 1월 25 2003 lsof
마지막으로 /proc 디렉토리는 디렉토리 자체를 700으로 설정합니다.
[root@localhost sbin]# cd
[root@localhost root]# chmod 700 /proc
[root@localhost root]#
이제 파일 및 디렉토리 퍼미션 설정을 다 알아보았습니다. 앞에서 언급되지 않은 파일이나 디렉토리를 굳이
변경할 필요는 없을 것입니다. 이 정도 설정하면 많은 공격을 막을 수 있을 것입니다.
5. 웹 서버 보안
5-1.httpd.conf 파일 설정
httpd.conf 파일은 웹 서버 Apache의 설정 파일입니다. 여기서는 가장 기본적인 것을 위주로 설정하는 것을
알아볼 것입니다. 이 파일은 /etc/httpd/conf에 있습니다. 지금부터 보안 상 중요한 부분에 대해 하나씩 수정
해보도록 하겠습니다. 파란색으로 표시된 부분이 수정된 부분이며, 수정되기 전의 원래 부분은 파란색으로 표
시하되 앞에 #를 붙이도록 하겠습니다.
그리고 한가지 말씀드릴 것은 httpd.conf 파일의 퍼미션을 600으로 수정하시기 바랍니다.
[root@localhost root]# chmod 600 /etc/httpd/conf/httpd.conf
39
이제 수정에 들어갑니다. 그렇게 수정할 부분이 많지는 않습니다.
[root@localhost root]# vi /etc/httpd/conf/httpd.conf
#
# Based upon the NCSA server configuration files originally by Rob McCool.
#
# This is the main Apache server configuration file. It contains the
# configuration directives that give the server its instructions.
# See <URL:http://httpd.apache.org/docs-2.0/> for detailed information about
# the directives.
#
# Do NOT simply read the instructions in here without understanding
# what they do. They're here only as hints or reminders. If you are unsure
# consult the online docs. You have been warned.
#
# The configuration directives are grouped into three basic sections:
# 1. Directives that control the operation of the Apache server process as a
# whole (the 'global environment').
# 2. Directives that define the parameters of the 'main' or 'default' server,
# which responds to requests that aren't handled by a virtual host.
# These directives also provide default values for the settings
# of all virtual hosts.
# 3. Settings for virtual hosts, which allow Web requests to be sent to
# different IP addresses or hostnames and have them handled by the
# same Apache server process.
#
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path. If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "logs/foo.log"
# with ServerRoot set to "/etc/httpd" will be interpreted by the
# server as "/etc/httpd/logs/foo.log".
#
### Section 1: Global Environment
#
# The directives in this section affect the overall operation of Apache,
# such as the number of concurrent requests it can handle or where it
# can find its configuration files.
#
#
# Don't give away too much information about all the subcomponents
# we are running. Comment out this line if you don't mind remote sites
# finding out what major optional modules you are running
# ServerTokens OS
ServerTokens Prod
40
# OS를Prod로 변경하였습니다.
# 웹 상으로 운영체제의 정보나 민감한 정보가 노출되는 것을 막아줍니다.
# 공격자는 일부러 에러를 내어 서버의 정보를 확인하는 경우가 많습니다.
#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE! If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the LockFile documentation
# (available at <URL:http://httpd.apache.org/docs-2.0/mod/core.html#lockfile>);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
ServerRoot "/etc/httpd"
#
# ScoreBoardFile: File used to store internal server process information.
# If unspecified (the default), the scoreboard will be stored in an
# anonymous shared memory segment, and will be unavailable to third-party
# applications.
# If specified, ensure that no two invocations of Apache share the same
# scoreboard file. The scoreboard file MUST BE STORED ON A LOCAL DISK.
#
#ScoreBoardFile run/httpd.scoreboard
#
# PidFile: The file in which the server should record its process
# identification number when it starts.
#
PidFile run/httpd.pid
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive Off
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
41
#
MaxKeepAliveRequests 100
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 15
##
## Server-Pool Size Regulation (MPM specific)
##
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
MaxClients 150
MaxRequestsPerChild 1000
</IfModule>
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
# perchild MPM
# NumServers: constant number of server processes
# StartThreads: initial number of worker threads in each server process
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# MaxThreadsPerChild: maximum number of worker threads in each server process
42
# MaxRequestsPerChild: maximum number of connections per server process
<IfModule perchild.c>
NumServers 5
StartThreads 5
MinSpareThreads 5
MaxSpareThreads 10
MaxThreadsPerChild 20
MaxRequestsPerChild 0
</IfModule>
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, in addition to the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
#
#Listen 12.34.56.78:80
Listen 80
#
# Load config files from the config directory "/etc/httpd/conf.d".
#
Include conf.d/*.conf
#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule access_module modules/mod_access.so
LoadModule auth_module modules/mod_auth.so
LoadModule auth_anon_module modules/mod_auth_anon.so
LoadModule auth_dbm_module modules/mod_auth_dbm.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule cern_meta_module modules/mod_cern_meta.so
LoadModule expires_module modules/mod_expires.so
43
LoadModule headers_module modules/mod_headers.so
LoadModule usertrack_module modules/mod_usertrack.so
LoadModule unique_id_module modules/mod_unique_id.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule asis_module modules/mod_asis.so
LoadModule info_module modules/mod_info.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule imap_module modules/mod_imap.so
LoadModule actions_module modules/mod_actions.so
LoadModule speling_module modules/mod_speling.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
<IfModule prefork.c>
LoadModule cgi_module modules/mod_cgi.so
</IfModule>
<IfModule worker.c>
LoadModule cgid_module modules/mod_cgid.so
</IfModule>
#
# ExtendedStatus controls whether Apache will generate "full" status
# information (ExtendedStatus On) or just basic information (ExtendedStatus
# Off) when the "server-status" handler is called. The default is Off.
#
#ExtendedStatus On
### Section 2: 'Main' server configuration
#
# The directives in this section set up the values used by the 'main'
# server, which responds to any requests that aren't handled by a
# <VirtualHost> definition. These values also provide defaults for
# any <VirtualHost> containers you may define later in the file.
#
# All of these directives may appear inside <VirtualHost> containers,
# in which case these default settings will be overridden for the
44
# virtual host being defined.
#
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# . On SCO (ODT 3) use "User nouser" and "Group nogroup".
# . On HPUX you may not be able to use shared memory as nobody, and the
# suggested workaround is to create a user www and use that user.
# NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET)
# when the value of (unsigned)Group is above 60000;
# don't use Group #-1 on these systems!
#
User apache
Group apache
#
# ServerAdmin: Your address, where problems with the server should be
# e-mailed. This address appears on some server-generated pages, such
# as error documents. e.g. admin@your-domain.com
#
ServerAdmin root@localhost
#
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If this is not set to valid DNS name for your host, server-generated
# redirections will not work. See also the UseCanonicalName directive.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
# You will have to access it by its address anyway, and this will make
# redirections work in a sensible way.
#
#ServerName new.host.name:80
#
# UseCanonicalName: Determines how Apache constructs self-referencing
# URLs and the SERVER_NAME and SERVER_PORT variables.
# When set "Off", Apache will use the Hostname and Port supplied
# by the client. When set "On", Apache will use the value of the
# ServerName directive.
#
UseCanonicalName Off
#
45
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html"
#
# Each directory to which Apache has access can be configured with respect
# to which services and features are allowed and/or disabled in that
# directory (and its subdirectories).
#
# First, we configure the "default" to be a very restrictive set of
# features.
#
# <Directory />
# Options FollowSymLinks
# AllowOverride None
# </Directory>
<Directory />
Options
AllowOverride None
</Directory>
# FollowSymLinks 부분을 삭제하였습니다.
#
# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something's not working as
# you might expect, make sure that you have specifically enabled it
# below.
#
#
# This should be changed to whatever you set DocumentRoot to.
#
<Directory "/var/www/html">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI Multiviews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs-2.0/mod/core.html#options
46
# for more information.
#
# Options Indexes FollowSymLinks
Options FollowSymLinks
# Indexes라는 부분을 삭제하였습니다. Indexes 부분을 그대로 두면
# 특정 디렉토리의 파일 내용이 모두 보이게 됩니다. 예를 들어,
# 제로보드를 우리나라에서 많이 사용하는데, 제로보드의 data 디렉토리는 퍼미션이 707로
# 보통 설정되어 있습니다.
# Indexes 부분을 그대로 두면 이 디렉토리의 모든 파일을 보고, 다운 받을 수 있습니다.
# 제로보드를 통해 올라간 모든 자료들이 저장되는 곳이 data 디렉토리입니다.
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Order allow,deny
Allow from all
</Directory>
#
# Disable autoindex for the root directory, and present a
# default Welcome page if no other index page is present.
#
<LocationMatch "^/$>
Options -Indexes
ErrorDocument 403 /error/noindex.html
</LocationMatch>
#
# UserDir: The name of the directory that is appended onto a user's home
# directory if a ~user request is received.
#
# The path to the end user account 'public_html' directory must be
# accessible to the webserver userid. This usually means that ~userid
# must have permissions of 711, ~userid/public_html must have permissions
# of 755, and documents contained therein must be world-readable.
# Otherwise, the client will only receive a "403 Forbidden" message.
#
# See also: http://httpd.apache.org/docs/misc/FAQ.html#forbidden
#
47
<IfModule mod_userdir.c>
#
# UserDir is disabled by default since it can confirm the presence
# of a username on the system (depending on home directory
# permissions).
#
UserDir disable
#
# To enable requests to /~user/ to serve the user's public_html
# directory, remove the "UserDir disable" line above, and uncomment
# the following line instead:
#
#UserDir public_html
</IfModule>
#
# Control access to UserDir directories. The following is an example
# for a site where these directories are restricted to read-only.
#
#<Directory /home/*/public_html>
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# <Limit GET POST OPTIONS>
# Order allow,deny
# Allow from all
# </Limit>
# <LimitExcept GET POST OPTIONS>
# Order deny,allow
# Deny from all
# </LimitExcept>
#</Directory>
#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
# The index.html.var file (a type-map) is used to deliver content-
# negotiated documents. The MultiViews Option can be used for the
# same purpose, but it is much slower.
#
# DirectoryIndex index.html index.html.var
DirectoryIndex index.html
# index.html.var를 삭제하였습니다.
#
48
# AccessFileName: The name of the file to look for in each directory
# for access control information. See also the AllowOverride directive.
#
AccessFileName .htaccess
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<Files ~ "^₩.ht">
Order allow,deny
Deny from all
</Files>
#
# TypesConfig describes where the mime.types file (or equivalent) is
# to be found.
#
TypesConfig /etc/mime.types
#
# DefaultType is the default MIME type the server will use for a document
# if it cannot otherwise determine one, such as from filename extensions.
# If your server contains mostly text or HTML documents, "text/plain" is
# a good value. If most of your content is binary, such as applications
# or images, you may want to use "application/octet-stream" instead to
# keep browsers from trying to display binary files as though they are
# text.
#
DefaultType text/plain
#
# The mod_mime_magic module allows the server to use various hints from the
# contents of the file itself to determine its type. The MIMEMagicFile
# directive tells the module where the hint definitions are located.
#
<IfModule mod_mime_magic.c>
# MIMEMagicFile /usr/share/magic.mime
MIMEMagicFile conf/magic
</IfModule>
#
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
49
HostnameLookups Off
#
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog logs/error_log
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t ₩"%r₩" %>s %b ₩"%{Referer}i₩" ₩"%{User-Agent}i₩"" combined
LogFormat "%h %l %u %t ₩"%r₩" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here. Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
# CustomLog logs/access_log common
CustomLog logs/access_log combined
#
# If you would like to have agent and referer logfiles, uncomment the
# following directives.
#
#CustomLog logs/referer_log referer
#CustomLog logs/agent_log agent
#
# If you prefer a single logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#
#CustomLog logs/access_log combined
50
#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (error documents, FTP directory listings,
# mod_status and mod_info output etc., but not CGI generated documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of: On | Off | EMail
#
ServerSignature On
#
# Aliases: Add here as many aliases as you need (with no limit). The format is
# Alias fakename realname
#
# Note that if you include a trailing / on fakename then the server will
# require it to be present in the URL. So "/icons" isn't aliased in this
# example, only "/icons/". If the fakename is slash-terminated, then the
# realname must also be slash terminated, and if the fakename omits the
# trailing slash, the realname must also omit it.
#
# We include the /icons/ alias for FancyIndexed directory listings. If you
# do not use FancyIndexing, you may comment this out.
#
Alias /icons/ "/var/www/icons/"
<Directory "/var/www/icons">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
#
# This should be changed to the ServerRoot/manual/. The alias provides
# the manual, even if you choose to move your DocumentRoot. You may comment
# this out if you do not care for the documentation.
#
Alias /manual "/var/www/manual"
<Directory "/var/www/manual">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<IfModule mod_dav_fs.c>
# Location of the WebDAV lock database.
DAVLockDB /var/lib/dav/lockdb
</IfModule>
51
#
# ScriptAlias: This controls which directories contain server scripts.
# ScriptAliases are essentially the same as Aliases, except that
# documents in the realname directory are treated as applications and
# run by the server when requested rather than as documents sent to the client.
# The same rules about trailing "/" apply to ScriptAlias directives as to
# Alias.
#
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<IfModule mod_cgid.c>
#
# Additional to mod_cgid.c settings, mod_cgid has Scriptsock <path>
# for setting UNIX socket for communicating with cgid.
#
Scriptsock run/httpd.cgid
</IfModule>
#
# "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
#
# Redirect allows you to tell clients about documents which used to exist in
# your server's namespace, but do not anymore. This allows you to tell the
# clients where to look for the relocated document.
# Example:
# Redirect permanent /foo http://www.example.com/bar
#
# Directives controlling the display of server-generated directory listings.
#
#
# FancyIndexing is whether you want fancy directory indexing or standard.
# VersionSort is whether files containing version numbers should be
# compared in the natural way, so that `apache-1.3.9.tar' is placed before
# `apache-1.3.12.tar'.
#
IndexOptions FancyIndexing VersionSort NameWidth=*
#
52
# AddIcon* directives tell the server which icon to show for different
# files or filename extensions. These are only displayed for
# FancyIndexed directories.
#
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
#
# DefaultIcon is which icon to show for files which do not have an icon
# explicitly set.
#
DefaultIcon /icons/unknown.gif
#
# AddDescription allows you to place a short description after a file in
# server-generated indexes. These are only displayed for FancyIndexed
# directories.
# Format: AddDescription "description" filename
#
#AddDescription "GZIP compressed document" .gz
#AddDescription "tar archive" .tar
#AddDescription "GZIP compressed tar archive" .tgz
53
#
# ReadmeName is the name of the README file the server will look for by
# default, and append to directory listings.
#
# HeaderName is the name of a file which should be prepended to
# directory indexes.
ReadmeName README.html
HeaderName HEADER.html
#
# IndexIgnore is a set of filenames which directory indexing should ignore
# and not include in the listing. Shell-style wildcarding is permitted.
#
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
#
# AddEncoding allows you to have certain browsers (Mosaic/X 2.1+) uncompress
# information on the fly. Note: Not all browsers support this.
# Despite the name similarity, the following Add* directives have nothing
# to do with the FancyIndexing customization directives above.
#
AddEncoding x-compress Z
AddEncoding x-gzip gz tgz
#
# DefaultLanguage and AddLanguage allows you to specify the language of
# a document. You can then use content negotiation to give a browser a
# file in a language the user can understand.
#
# Specify a default language. This means that all data
# going out without a specific language tag (see below) will
# be marked with this one. You probably do NOT want to set
# this unless you are sure it is correct for all cases.
#
# * It is generally better to not mark a page as
# * being a certain language than marking it with the wrong
# * language!
#
# DefaultLanguage nl
#
# Note 1: The suffix does not have to be the same as the language
# keyword --- those with documents in Polish (whose net-standard
# language code is pl) may wish to use "AddLanguage pl .po" to
# avoid the ambiguity with the common suffix for perl scripts.
#
# Note 2: The example entries below illustrate that in some cases
# the two character 'Language' abbreviation is not identical to
# the two character 'Country' code for its country,
# E.g. 'Danmark/dk' versus 'Danish/da'.
54
#
# Note 3: In the case of 'ltz' we violate the RFC by using a three char
# specifier. There is 'work in progress' to fix this and get
# the reference data for rfc1766 cleaned up.
#
# Danish (da) - Dutch (nl) - English (en) - Estonian (et)
# French (fr) - German (de) - Greek-Modern (el)
# Italian (it) - Norwegian (no) - Norwegian Nynorsk (nn) - Korean (kr)
# Portugese (pt) - Luxembourgeois* (ltz)
# Spanish (es) - Swedish (sv) - Catalan (ca) - Czech(cz)
# Polish (pl) - Brazilian Portuguese (pt-br) - Japanese (ja)
# Russian (ru) - Croatian (hr)
#
AddLanguage da .dk
AddLanguage nl .nl
AddLanguage en .en
AddLanguage et .et
AddLanguage fr .fr
AddLanguage de .de
AddLanguage he .he
AddLanguage el .el
AddLanguage it .it
AddLanguage ja .ja
AddLanguage pl .po
AddLanguage kr .kr
AddLanguage pt .pt
AddLanguage nn .nn
AddLanguage no .no
AddLanguage pt-br .pt-br
AddLanguage ltz .ltz
AddLanguage ca .ca
AddLanguage es .es
AddLanguage sv .se
AddLanguage cz .cz
AddLanguage ru .ru
AddLanguage tw .tw
AddLanguage zh-tw .tw
AddLanguage hr .hr
#
# LanguagePriority allows you to give precedence to some languages
# in case of a tie during content negotiation.
#
# Just list the languages in decreasing order of preference. We have
# more or less alphabetized them here. You probably want to change this.
#
LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ltz ca es sv tw
#
55
# ForceLanguagePriority allows you to serve a result page rather than
# MULTIPLE CHOICES (Prefer) [in case of a tie] or NOT ACCEPTABLE (Fallback)
# [in case no accepted languages matched the available variants]
#
ForceLanguagePriority Prefer Fallback
#
# Specify a default charset for all pages sent out. This is
# always a good idea and opens the door for future internationalisation
# of your web site, should you ever want it. Specifying it as
# a default does little harm; as the standard dictates that a page
# is in iso-8859-1 (latin1) unless specified otherwise i.e. you
# are merely stating the obvious. There are also some security
# reasons in browsers, related to javascript and URL parsing
# which encourage you to always set a default char set.
#
AddDefaultCharset ISO-8859-1
#
# Commonly used filename extensions to character sets. You probably
# want to avoid clashes with the language extensions, unless you
# are good at carefully testing your setup after each change.
# See ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets for
# the official list of charset names and their respective RFCs
#
AddCharset ISO-8859-1 .iso8859-1 .latin1
AddCharset ISO-8859-2 .iso8859-2 .latin2 .cen
AddCharset ISO-8859-3 .iso8859-3 .latin3
AddCharset ISO-8859-4 .iso8859-4 .latin4
AddCharset ISO-8859-5 .iso8859-5 .latin5 .cyr .iso-ru
AddCharset ISO-8859-6 .iso8859-6 .latin6 .arb
AddCharset ISO-8859-7 .iso8859-7 .latin7 .grk
AddCharset ISO-8859-8 .iso8859-8 .latin8 .heb
AddCharset ISO-8859-9 .iso8859-9 .latin9 .trk
AddCharset ISO-2022-JP .iso2022-jp .jis
AddCharset ISO-2022-KR .iso2022-kr .kis
AddCharset ISO-2022-CN .iso2022-cn .cis
AddCharset Big5 .Big5 .big5
# For russian, more than one charset is used (depends on client, mostly):
AddCharset WINDOWS-1251 .cp-1251 .win-1251
AddCharset CP866 .cp866
AddCharset KOI8-r .koi8-r .koi8-ru
AddCharset KOI8-ru .koi8-uk .ua
AddCharset ISO-10646-UCS-2 .ucs2
AddCharset ISO-10646-UCS-4 .ucs4
AddCharset UTF-8 .utf8
# The set below does not map to a specific (iso) standard
# but works on a fairly wide range of browsers. Note that
56
# capitalization actually matters (it should not, but it
# does for some browsers).
#
# See ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets
# for a list of sorts. But browsers support few.
#
AddCharset GB2312 .gb2312 .gb
AddCharset utf-7 .utf7
AddCharset utf-8 .utf8
AddCharset big5 .big5 .b5
AddCharset EUC-TW .euc-tw
AddCharset EUC-JP .euc-jp
AddCharset EUC-KR .euc-kr
AddCharset shift_jis .sjis
#
# AddType allows you to add to or override the MIME configuration
# file mime.types for specific file types.
#
AddType application/x-tar .tgz
#
# AddHandler allows you to map certain file extensions to "handlers":
# actions unrelated to filetype. These can be either built into the server
# or added with the Action directive (see below)
#
# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add "ExecCGI" to the "Options" directive.)
#
#AddHandler cgi-script .cgi
#
# For files that include their own HTTP headers:
#
#AddHandler send-as-is asis
#
# For server-parsed imagemap files:
#
AddHandler imap-file map
#
# For type maps (negotiated resources):
# (This is enabled by default to allow the Apache "It Worked" page
# to be distributed in multiple languages.)
#
AddHandler type-map var
# Filters allow you to process content before it is sent to the client.
57
#
# To parse .shtml files for server-side includes (SSI):
# (You will also need to add "Includes" to the "Options" directive.)
#
AddOutputFilter INCLUDES .shtml
#
# Action lets you define media types that will execute a script whenever
# a matching file is called. This eliminates the need for repeated URL
# pathnames for oft-used CGI file processors.
# Format: Action media/type /cgi-script/location
# Format: Action handler-name /cgi-script/location
#
#
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
#
#
# Putting this all together, we can Internationalize error responses.
#
# We use Alias to redirect any /error/HTTP_<error>.html.var response to
# our collection of by-error message multi-language collections. We use
# includes to substitute the appropriate text.
#
# You can modify the messages' appearance without changing any of the
# default HTTP_<error>.html.var files by adding the line;
#
# Alias /error/include/ "/your/include/path/"
#
# which allows you to create your own set of files by starting with the
# /var/www/error/include/ files and
# copying them to /your/include/path/, even on a per-VirtualHost basis.
#
Alias /error/ "/var/www/error/"
<IfModule mod_negotiation.c>
<IfModule mod_include.c>
<Directory "/var/www/error">
AllowOverride None
Options IncludesNoExec
58
AddOutputFilter Includes html
AddHandler type-map var
Order allow,deny
Allow from all
LanguagePriority en es de fr
ForceLanguagePriority Prefer Fallback
</Directory>
ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var
ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
ErrorDocument 410 /error/HTTP_GONE.html.var
ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
ErrorDocument 415 /error/HTTP_SERVICE_UNAVAILABLE.html.var
ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var
ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var
ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var
ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var
</IfModule>
</IfModule>
#
# The following directives modify normal HTTP response behavior to
# handle known problems with browser implementations.
#
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4₩.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4₩.0" force-response-1.0
BrowserMatch "Java/1₩.0" force-response-1.0
BrowserMatch "JDK/1₩.0" force-response-1.0
#
# The following directive disables redirects on non-GET requests for
# a directory that does not include the trailing slash. This fixes a
# problem with Microsoft WebFolders which does not appropriately handle
# redirects for folders with DAV methods.
#
BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
BrowserMatch "^WebDrive" redirect-carefully
#
59
# Allow server status reports, with the URL of http://servername/server-status
# Change the ".your-domain.com" to match your domain to enable.
#
#<Location /server-status>
# SetHandler server-status
# Order deny,allow
# Deny from all
# Allow from .your-domain.com
#</Location>
#
# Allow remote server configuration reports, with the URL of
# http://servername/server-info (requires that mod_info.c be loaded).
# Change the ".your-domain.com" to match your domain to enable.
#
#<Location /server-info>
# SetHandler server-info
# Order deny,allow
# Deny from all
# Allow from .your-domain.com
#</Location>
#
# Proxy Server directives. Uncomment the following lines to
# enable the proxy server:
#
#<IfModule mod_proxy.c>
#ProxyRequests On
#
#<Proxy *>
# Order deny,allow
# Deny from all
# Allow from .your-domain.com
#</Proxy>
#
# Enable/disable the handling of HTTP/1.1 "Via:" headers.
# ("Full" adds the server version; "Block" removes all outgoing Via: headers)
# Set to one of: Off | On | Full | Block
#
#ProxyVia On
#
# To enable the cache as well, edit and uncomment the following lines:
# (no cacheing without CacheRoot)
#
#CacheRoot "/etc/httpd/proxy"
#CacheSize 5
#CacheGcInterval 4
60
#CacheMaxExpire 24
#CacheLastModifiedFactor 0.1
#CacheDefaultExpire 1
#NoCache a-domain.com another-domain.edu joes.garage-sale.com
#</IfModule>
# End of proxy directives.
### Section 3: Virtual Hosts
#
# VirtualHost: If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at
# <URL:http://httpd.apache.org/docs-2.0/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual host
# configuration.
#
# Use name-based virtual hosting.
#
#NameVirtualHost *
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for requests without a known
# server name.
#
#<VirtualHost *>
# ServerAdmin webmaster@dummy-host.example.com
# DocumentRoot /www/docs/dummy-host.example.com
# ServerName dummy-host.example.com
# ErrorLog logs/dummy-host.example.com-error_log
# CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>
5-2.php,ini 파일 설정
php.ini 파일은 Apache, MySQL 서버와 함께 연동되어 사용되고 있습니다. 이 파일에 대해 설정을 잘못할 경우
각종 형태의 웹 해킹을 허용하게 됩니다. php.ini 파일은 /etc 디렉토리에 있습니다. 바로 수정에 들어가겠습
61
니다. 수정한 부분은 파란색으로 표시하며, 원래 부분은 앞에 ;를 붙이고 파란색으로 표시할 것입니다.
[root@localhost root]# vi /etc/php.ini
[PHP]
;;;;;;;;;;;
; WARNING ;
;;;;;;;;;;;
; This is the default settings file for new PHP installations.
; By default, PHP installs itself with a configuration suitable for
; development purposes, and *NOT* for production purposes.
; For several security-oriented considerations that should be taken
; before going online with your site, please consult php.ini-recommended
; and http://php.net/manual/en/security.php.
;;;;;;;;;;;;;;;;;;;
; About this file ;
;;;;;;;;;;;;;;;;;;;
; This file controls many aspects of PHP's behavior. In order for PHP to
; read it, it must be named 'php.ini'. PHP looks for it in the current
; working directory, in the path designated by the environment variable
; PHPRC, and in the path that was defined in compile time (in that order).
; Under Windows, the compile-time path is the Windows directory. The
; path in which the php.ini file is looked for can be overridden using
; the -c argument in command line mode.
;
; The syntax of the file is extremely simple. Whitespace and Lines
; beginning with a semicolon are silently ignored (as you probably guessed).
; Section headers (e.g. [Foo]) are also silently ignored, even though
; they might mean something in the future.
;
; Directives are specified using the following syntax:
; directive = value
; Directive names are *case sensitive* - foo=bar is different from FOO=bar.
;
; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one
; of the INI constants (On, Off, True, False, Yes, No and None) or an expression
; (e.g. E_ALL & ~E_NOTICE), or a quoted string ("foo").
;
; Expressions in the INI file are limited to bitwise operators and parentheses:
; | bitwise OR
; & bitwise AND
; ~ bitwise NOT
; ! boolean NOT
;
; Boolean flags can be turned on using the values 1, On, True or Yes.
; They can be turned off using the values 0, Off, False or No.
62
;
; An empty string can be denoted by simply not writing anything after the equal
; sign, or by using the None keyword:
;
; foo = ; sets foo to an empty string
; foo = none ; sets foo to an empty string
; foo = "none" ; sets foo to the string 'none'
;
; If you use constants in your value, and these constants belong to a
; dynamically loaded extension (either a PHP extension or a Zend extension),
; you may only use these constants *after* the line that loads the extension.
;
; All the values in the php.ini-dist file correspond to the builtin
; defaults (that is, if no php.ini is used, or if you delete these lines,
; the builtin defaults will be identical).
;;;;;;;;;;;;;;;;;;;;
; Language Options ;
;;;;;;;;;;;;;;;;;;;;
; Enable the PHP scripting language engine under Apache.
engine = On
; Allow the <? tag. Otherwise, only <?php and <script> tags are recognized.
short_open_tag = On
; Allow ASP-style <% %> tags.
asp_tags = Off
; The number of significant digits displayed in floating point numbers.
precision = 14
; Enforce year 2000 compliance (will cause problems with non-compliant browsers)
y2k_compliance = Off
; Output buffering allows you to send header lines (including cookies) even
; after you send body content, at the price of slowing PHP's output layer a
; bit. You can enable output buffering during runtime by calling the output
; buffering functions. You can also enable output buffering for all files by
; setting this directive to On. If you wish to limit the size of the buffer
; to a certain size - you can use a maximum number of bytes instead of 'On', as
; a value for this directive (e.g., output_buffering=4096).
output_buffering = Off
; You can redirect all of the output of your scripts to a function. For
; example, if you set output_handler to "ob_gzhandler", output will be
; transparently compressed for browsers that support gzip or deflate encoding.
; Setting an output handler automatically turns on output buffering.
63
output_handler =
; The unserialize callback function will called (with the undefind class'
; name as parameter), if the unserializer finds an undefined class
; which should be instanciated.
; A warning appears if the specified function is not defined, or if the
; function doesn't include/implement the missing class.
; So only set this entry, if you really want to implement such a
; callback-function.
unserialize_callback_func=
; Transparent output compression using the zlib library
; Valid values for this option are 'off', 'on', or a specific buffer size
; to be used for compression (default is 4KB)
;
; Note: output_handler must be empty if this is set 'On' !!!!
;
zlib.output_compression = Off
; Implicit flush tells PHP to tell the output layer to flush itself
; automatically after every output block. This is equivalent to calling the
; PHP function flush() after each and every call to print() or echo() and each
; and every HTML block. Turning this option on has serious performance
; implications and is generally recommended for debugging purposes only.
implicit_flush = Off
; Whether to enable the ability to force arguments to be passed by reference
; at function call time. This method is deprecated and is likely to be
; unsupported in future versions of PHP/Zend. The encouraged method of
; specifying which arguments should be passed by reference is in the function
; declaration. You're encouraged to try and turn this option Off and make
; sure your scripts work properly with it in order to ensure they will work
; with future versions of the language (you will receive a warning each time
; you use this feature, and the argument will be passed by value instead of by
; reference).
allow_call_time_pass_reference = On
; Safe Mode
;
;safe_mode = Off
safe_mode = On
; By default, Safe Mode does a UID compare check when
; opening files. If you want to relax this to a GID compare,
; then turn on safe_mode_gid.
safe_mode_gid = Off
; When safe_mode is on, UID/GID checks are bypassed when
64
; including files from this directory and its subdirectories.
; (directory must also be in include_path or full path must
; be used when including)
safe_mode_include_dir =
; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
safe_mode_exec_dir =
; open_basedir, if set, limits all file operations to the defined directory
; and below. This directive makes most sense if used in a per-directory
; or per-virtualhost web server configuration file.
;
;open_basedir =
; Setting certain environment variables may be a potential security breach.
; This directive contains a comma-delimited list of prefixes. In Safe Mode,
; the user may only alter environment variables whose names begin with the
; prefixes supplied here. By default, users will only be able to set
; environment variables that begin with PHP_ (e.g. PHP_FOO=BAR).
;
; Note: If this directive is empty, PHP will let the user modify ANY
; environment variable!
safe_mode_allowed_env_vars = PHP_
; This directive contains a comma-delimited list of environment variables that
; the end user won't be able to change using putenv(). These variables will be
; protected even if safe_mode_allowed_env_vars is set to allow to change them.
safe_mode_protected_env_vars = LD_LIBRARY_PATH
; This directive allows you to disable certain functions for security reasons.
; It receives a comma-delimited list of function names. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
disable_functions =
; Colors for Syntax Highlighting mode. Anything that's acceptable in
; <font color="??????"> would work.
highlight.string = #CC0000
highlight.comment = #FF9900
highlight.keyword = #006600
highlight.bg = #FFFFFF
highlight.default = #0000CC
highlight.html = #000000
;
; Misc
;
; Decides whether PHP may expose the fact that it is installed on the server
65
; (e.g. by adding its signature to the Web server header). It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
expose_php = On
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;
max_execution_time = 30 ; Maximum execution time of each script, in seconds
memory_limit = 8M ; Maximum amount of memory a script may consume (8MB)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; error_reporting is a bit-field. Or each number up to get desired error
; reporting level
; E_ALL - All errors and warnings
; E_ERROR - fatal run-time errors
; E_WARNING - run-time warnings (non-fatal errors)
; E_PARSE - compile-time parse errors
; E_NOTICE - run-time notices (these are warnings which often result
; from a bug in your code, but it's possible that it was
; intentional (e.g., using an uninitialized variable and
; relying on the fact it's automatically initialized to an
; empty string)
; E_CORE_ERROR - fatal errors that occur during PHP's initial startup
; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's
; initial startup
; E_COMPILE_ERROR - fatal compile-time errors
; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
; E_USER_ERROR - user-generated error message
; E_USER_WARNING - user-generated warning message
; E_USER_NOTICE - user-generated notice message
;
; Examples:
;
; - Show all errors, except for notices
;
;error_reporting = E_ALL & ~E_NOTICE
;
; - Show only errors
;
;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
;
; - Show all errors except for notices
66
;
error_reporting = E_ALL & ~E_NOTICE
; Print out errors (as a part of the output). For production web sites,
; you're strongly encouraged to turn this feature off, and use error logging
; instead (see below). Keeping display_errors enabled on a production web site
; may reveal security information to end users, such as file paths on your Web
; server, your database schema or other information.
; Error Page 또는 Warning Page 노출을 피하기 위한 것입니다.
; 공격자들은 일부러 에러를 발생하여 서버에 대한 정보를 확인합니다.
; 이를 막기 위해 다음과 같이 수정합니다.
; display_errors = On
display_errors = Off
; Even when display_errors is on, errors that occur during PHP's startup
; sequence are not displayed. It's strongly recommended to keep
; display_startup_errors off, except for when debugging.
display_startup_errors = Off
; Log errors into a log file (server-specific log, stderr, or error_log (below))
; As stated above, you're strongly advised to use error logging in place of
; error displaying on production web sites.
log_errors = Off
; Store the last error/warning message in $php_errormsg (boolean).
track_errors = Off
; Disable the inclusion of HTML tags in error messages.
;html_errors = Off
; String to output before an error message.
;error_prepend_string = "<font color=ff0000>"
; String to output after an error message.
;error_append_string = "</font>"
; Log errors to specified file.
;error_log = filename
; Log errors to syslog (Event Log on NT, not valid in Windows 95).
;error_log = syslog
; Warn if the + operator is used with strings.
warn_plus_overloading = Off
;;;;;;;;;;;;;;;;;
67
; Data Handling ;
;;;;;;;;;;;;;;;;;
;
; Note - track_vars is ALWAYS enabled as of PHP 4.0.3
; The separator used in PHP generated URLs to separate arguments.
; Default is "&".
;arg_separator.output = "&"
; List of separator(s) used by PHP to parse input URLs into variables.
; Default is "&".
; NOTE: Every character in this directive is considered as separator!
;arg_separator.input = ";&"
; This directive describes the order in which PHP registers GET, POST, Cookie,
; Environment and Built-in variables (G, P, C, E & S respectively, often
; referred to as EGPCS or GPC). Registration is done from left to right, newer
; values override older values.
variables_order = "EGPCS"
; Whether or not to register the EGPCS variables as global variables. You may
; want to turn this off if you don't want to clutter your scripts' global scope
; with user data. This makes most sense when coupled with track_vars - in which
; case you can access all of the GPC variables through the $HTTP_*_VARS[],
; variables.
;
; You should do your best to write your scripts so that they do not require
; register_globals to be on; Using form variables as globals can easily lead
; to possible security problems, if the code is not very well thought of.
; register_globals = On
register_globals = Off
; 혹시라도 낮은 버전을 사용하는 경우 이 부분이 디폴트로 On 되어 있는데,
; 특별한 이유가 없다면 Off로 설정하는 것이 좋습니다.
; This directive tells PHP whether to declare the argv&argc variables (that
; would contain the GET information). If you don't use these variables, you
; should turn it off for increased performance.
register_argc_argv = On
; Maximum size of POST data that PHP will accept.
post_max_size = 8M
; This directive is deprecated. Use variables_order instead.
gpc_order = "GPC"
; Magic quotes
;
68
; Magic quotes for incoming GET/POST/Cookie data.
; magic_quotes_gpc = Off
magic_quotes_gpc = On
; SQL Injection과 같은 공격을 막는데 도움이 됩니다.
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
; Use Sybase-style magic quotes (escape ' with '' instead of ₩').
magic_quotes_sybase = Off
; Automatically add files before or after any PHP document.
auto_prepend_file =
auto_append_file =
; As of 4.0b4, PHP always outputs a character encoding by default in
; the Content-type: header. To disable sending of the charset, simply
; set it to be empty.
;
; PHP's built-in default is text/html
default_mimetype = "text/html"
;default_charset = "iso-8859-1"
; Always populate the $HTTP_RAW_POST_DATA variable.
;always_populate_raw_post_data = On
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;
; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
;
; Windows: "₩path1;₩path2"
;include_path = ".;c:₩php₩includes"
; The root of the PHP pages, used only if nonempty.
; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root
; if you are running php as a CGI under any web server (other than IIS)
; see documentation for security issues. The alternate is to use the
; cgi.force_redirect configuration below
doc_root =
; The directory under which PHP opens the script using /~usernamem used only
; if nonempty.
user_dir =
69
; Directory in which the loadable extensions (modules) reside.
extension_dir = /usr/lib/php4
; Whether or not to enable the dl() function. The dl() function does NOT work
; properly in multithreaded servers, such as IIS or Zeus, and is automatically
; disabled on them.
enable_dl = On
; cgi.force_redirect is necessary to provide security running PHP as a CGI under
; most web servers. Left undefined, PHP turns this on by default. You can
; turn it off here AT YOUR OWN RISK
; **You CAN safely turn this off for IIS, in fact, you MUST.**
; cgi.force_redirect = 1
; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape
; (iPlanet) web servers, you MAY need to set an environment variable name that PHP
; will look for to know it is OK to continue execution. Setting this variable MAY
; cause security issues, KNOW WHAT YOU ARE DOING FIRST.
; cgi.redirect_status_env = ;
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;
; Whether to allow HTTP file uploads.
file_uploads = On
; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
;upload_tmp_dir =
; Maximum allowed size for uploaded files.
upload_max_filesize = 2M
;;;;;;;;;;;;;;;;;;
; Fopen wrappers ;
;;;;;;;;;;;;;;;;;;
; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
; allow_url_fopen = On
; 앞에 ;를 붙였습니다. 버전별로 다른데, 특별한 이유가 없다면 앞에 ;을 붙입니다.
; Define the anonymous ftp password (your email address)
;from="john@doe.com"
;;;;;;;;;;;;;;;;;;;;;;
70
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
;
; If you wish to have an extension loaded automatically, use the following
; syntax:
;
; extension=modulename.extension
;
; For example:
;
; extension=msql.so
;
; Note that it should be the name of the module only; no directory information
; needs to go here. Specify the location of the extension with the
; extension_dir directive above.
;;;;
; Note: For Red Hat Linux, packaged extension modules are now loaded via
; the ini files in the directory /etc/php.d.
;;;;
;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;
[Syslog]
; Whether or not to define the various syslog variables (e.g. $LOG_PID,
; $LOG_CRON, etc.). Turning it off is a good idea performance-wise. In
; runtime, you can define these variables by calling define_syslog_variables().
define_syslog_variables = Off
[mail function]
; For Win32 only.
SMTP = localhost
; For Win32 only.
sendmail_from = me@localhost.com
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = /usr/sbin/sendmail -t -i
[Java]
;java.class.path = .₩php_java.jar
;java.home = c:₩jdk
;java.library = c:₩jdk₩jre₩bin₩hotspot₩jvm.dll
;java.library.path = .₩
[SQL]
71
sql.safe_mode = Off
[ODBC]
;odbc.default_db = Not yet implemented
;odbc.default_user = Not yet implemented
;odbc.default_pw = Not yet implemented
; Allow or prevent persistent links.
odbc.allow_persistent = On
; Check that a connection is still valid before reuse.
odbc.check_persistent = On
; Maximum number of persistent links. -1 means no limit.
odbc.max_persistent = -1
; Maximum number of links (persistent + non-persistent). -1 means no limit.
odbc.max_links = -1
; Handling of LONG fields. Returns number of bytes to variables. 0 means
; passthru.
odbc.defaultlrl = 4096
; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char.
; See the documentation on odbc_binmode and odbc_longreadlen for an explanation
; of uodbc.defaultlrl and uodbc.defaultbinmode
odbc.defaultbinmode = 1
[MySQL]
; Allow or prevent persistent links.
mysql.allow_persistent = On
; Maximum number of persistent links. -1 means no limit.
mysql.max_persistent = -1
; Maximum number of links (persistent + non-persistent). -1 means no limit.
mysql.max_links = -1
; Default port number for mysql_connect(). If unset, mysql_connect() will use
; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the
; compile-time value defined MYSQL_PORT (in that order). Win32 will only look
; at MYSQL_PORT.
mysql.default_port =
; Default socket name for local MySQL connects. If empty, uses the built-in
; MySQL defaults.
mysql.default_socket =
; Default host for mysql_connect() (doesn't apply in safe mode).
72
mysql.default_host =
; Default user for mysql_connect() (doesn't apply in safe mode).
mysql.default_user =
; Default password for mysql_connect() (doesn't apply in safe mode).
; Note that this is generally a *bad* idea to store passwords in this file.
; *Any* user with PHP access can run 'echo cfg_get_var("mysql.default_password")
; and reveal this password! And of course, any users with read access to this
; file will be able to reveal the password as well.
mysql.default_password =
[mSQL]
; Allow or prevent persistent links.
msql.allow_persistent = On
; Maximum number of persistent links. -1 means no limit.
msql.max_persistent = -1
; Maximum number of links (persistent+non persistent). -1 means no limit.
msql.max_links = -1
[PostgresSQL]
; Allow or prevent persistent links.
pgsql.allow_persistent = On
; Detect broken persistent links always with pg_pconnect(). Need a little overhead.
pgsql.auto_reset_persistent = Off
; Maximum number of persistent links. -1 means no limit.
pgsql.max_persistent = -1
; Maximum number of links (persistent+non persistent). -1 means no limit.
pgsql.max_links = -1
[Sybase]
; Allow or prevent persistent links.
sybase.allow_persistent = On
; Maximum number of persistent links. -1 means no limit.
sybase.max_persistent = -1
; Maximum number of links (persistent + non-persistent). -1 means no limit.
sybase.max_links = -1
;sybase.interface_file = "/usr/sybase/interfaces"
; Minimum error severity to display.
sybase.min_error_severity = 10
73
; Minimum message severity to display.
sybase.min_message_severity = 10
; Compatability mode with old versions of PHP 3.0.
; If on, this will cause PHP to automatically assign types to results according
; to their Sybase type, instead of treating them all as strings. This
; compatability mode will probably not stay around forever, so try applying
; whatever necessary changes to your code, and turn it off.
sybase.compatability_mode = Off
[Sybase-CT]
; Allow or prevent persistent links.
sybct.allow_persistent = On
; Maximum number of persistent links. -1 means no limit.
sybct.max_persistent = -1
; Maximum number of links (persistent + non-persistent). -1 means no limit.
sybct.max_links = -1
; Minimum server message severity to display.
sybct.min_server_severity = 10
; Minimum client message severity to display.
sybct.min_client_severity = 10
[bcmath]
; Number of decimal digits for all bcmath functions.
bcmath.scale = 0
[browscap]
;browscap = extra/browscap.ini
[Informix]
; Default host for ifx_connect() (doesn't apply in safe mode).
ifx.default_host =
; Default user for ifx_connect() (doesn't apply in safe mode).
ifx.default_user =
; Default password for ifx_connect() (doesn't apply in safe mode).
ifx.default_password =
; Allow or prevent persistent links.
ifx.allow_persistent = On
; Maximum number of persistent links. -1 means no limit.
ifx.max_persistent = -1
74
; Maximum number of links (persistent + non-persistent). -1 means no limit.
ifx.max_links = -1
; If on, select statements return the contents of a text blob instead of its id.
ifx.textasvarchar = 0
; If on, select statements return the contents of a byte blob instead of its id.
ifx.byteasvarchar = 0
; Trailing blanks are stripped from fixed-length char columns. May help the
; life of Informix SE users.
ifx.charasvarchar = 0
; If on, the contents of text and byte blobs are dumped to a file instead of
; keeping them in memory.
ifx.blobinfile = 0
; NULL's are returned as empty strings, unless this is set to 1. In that case,
; NULL's are returned as string 'NULL'.
ifx.nullformat = 0
[Session]
; Handler used to store/retrieve data.
session.save_handler = files
; Argument passed to save_handler. In the case of files, this is the path
; where data files are stored. Note: Windows users have to change this
; variable in order to use PHP's session functions.
session.save_path = /tmp
; Whether to use cookies.
session.use_cookies = 1
; Name of the session (used as cookie name).
session.name = PHPSESSID
; Initialize session on request startup.
session.auto_start = 0
; Lifetime in seconds of cookie or, if 0, until browser is restarted.
session.cookie_lifetime = 0
; The path for which the cookie is valid.
session.cookie_path = /
; The domain for which the cookie is valid.
session.cookie_domain =
75
; Handler used to serialize data. php is the standard serializer of PHP.
session.serialize_handler = php
; Percentual probability that the 'garbage collection' process is started
; on every session initialization.
session.gc_probability = 1
; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
session.gc_maxlifetime = 1440
; Check HTTP Referer to invalidate externally stored URLs containing ids.
; HTTP_REFERER has to contain this substring for the session to be
; considered as valid.
session.referer_check =
; How many bytes to read from the file.
session.entropy_length = 0
; Specified here to create the session id.
session.entropy_file =
;session.entropy_length = 16
;session.entropy_file = /dev/urandom
; Set to {nocache,private,public} to determine HTTP caching aspects.
session.cache_limiter = nocache
; Document expires after n minutes.
session.cache_expire = 180
; use transient sid support if enabled by compiling with --enable-trans-sid.
session.use_trans_sid = 1
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
[MSSQL]
; Allow or prevent persistent links.
mssql.allow_persistent = On
; Maximum number of persistent links. -1 means no limit.
mssql.max_persistent = -1
; Maximum number of links (persistent+non persistent). -1 means no limit.
mssql.max_links = -1
; Minimum error severity to display.
76
mssql.min_error_severity = 10
; Minimum message severity to display.
mssql.min_message_severity = 10
; Compatability mode with old versions of PHP 3.0.
mssql.compatability_mode = Off
; Valid range 0 - 2147483647. Default = 4096.
;mssql.textlimit = 4096
; Valid range 0 - 2147483647. Default = 4096.
;mssql.textsize = 4096
; Limits the number of records in each batch. 0 = all records in one batch.
;mssql.batchsize = 0
[Assertion]
; Assert(expr); active by default.
;assert.active = On
; Issue a PHP warning for each failed assertion.
;assert.warning = On
; Don't bail out by default.
;assert.bail = Off
; User-function to be called if an assertion fails.
;assert.callback = 0
; Eval the expression with current error_reporting(). Set to true if you want
; error_reporting(0) around the eval().
;assert.quiet_eval = 0
[Ingres II]
; Allow or prevent persistent links.
ingres.allow_persistent = On
; Maximum number of persistent links. -1 means no limit.
ingres.max_persistent = -1
; Maximum number of links, including persistents. -1 means no limit.
ingres.max_links = -1
; Default database (format: [node_id::]dbname[/srv_class]).
ingres.default_database =
; Default user.
ingres.default_user =
77
; Default password.
ingres.default_password =
[Verisign Payflow Pro]
; Default Payflow Pro server.
pfpro.defaulthost = "test-payflow.verisign.com"
; Default port to connect to.
pfpro.defaultport = 443
; Default timeout in seconds.
pfpro.defaulttimeout = 30
; Default proxy IP address (if required).
;pfpro.proxyaddress =
; Default proxy port.
;pfpro.proxyport =
; Default proxy logon.
;pfpro.proxylogon =
; Default proxy password.
;pfpro.proxypassword =
[Sockets]
; Use the system read() function instead of the php_read() wrapper.
sockets.use_system_read = On
[com]
; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs
;com.typelib_file =
; allow Distributed-COM calls
;com.allow_dcom = true
; autoregister constants of a components typlib on com_load()
;com.autoregister_typelib = true
; register constants casesensitive
;com.autoregister_casesensitive = false
; show warnings on duplicate constat registrations
;com.autoregister_verbose = true
[Printer]
;printer.default_printer = ""
[mbstring]
;mbstring.internal_encoding = EUC-JP
;mbstring.http_input = auto
;mbstring.http_output = SJIS
78
;mbstring.detect_order = auto
;mbstring.substitute_character = none;
[FrontBase]
;fbsql.allow_persistent = On
;fbsql.autocommit = On
;fbsql.default_database =
;fbsql.default_database_password =
;fbsql.default_host =
;fbsql.default_password =
;fbsql.default_user = "_SYSTEM"
;fbsql.generate_warnings = Off
;fbsql.max_connections = 128
;fbsql.max_links = 128
;fbsql.max_persistent = -1
;fbsql.max_results = 128
;fbsql.batchSize = 1000
; Local Variables:
; tab-width: 4
; End:
자, 이제 기본적인 설정이 끝났습니다. httpd.conf 파일과 php.ini 파일 설정이 끝나면 반드시 해주어야할 마
지막 작업 하나가 남아 있습니다. 그것은 httpd 데몬을 다시 시작하는 것입니다. 이 방법은 이미 앞에서도 언
급했지만 다시 한번 더 보여주도록 하겠습니다.
[root@localhost root]# /etc/rc.d/init.d/httpd restart
httpd 를 정지함: [ 확인 ]
httpd (을)를 시작합니다: [ 확인 ]
[root@localhost root]#
이제 모든 작업이 끝났습니다.
비교적 간단한 작업으로 큰 피해를 예방할 수 있습니다. 하루 넉넉하게 시간을 투자하시면 됩니다. 이 작은
문서가 우리나라의 보안을 위해 도움이 되길 바라며, 이 글을 마칩니다. 감사합니다.

 

 

 

출처 카페 > 프로그램 개발자 | coolkkm1
원문 http://cafe.naver.com/coolkkm1/240

신고

denyhosts 설치
OS : CentOS 5.2(64nit)


#wget http://downloads.sourceforge.net/denyhosts/DenyHosts-2.6-python2.4.noarch.rpm?use_mirror=nchc

#rpm -Uvh DenyHosts-2.6-python2.4.noarch.rpm

#rpm -ql DenyHosts-2.6

cd /usr/share/denyhosts

cp denyhosts.cfg-dist denyhosts.cfg (cfg수정)

cp daemon-control-dist daemon-control (수정)

설치및 설정문서
cat /usr/share/denyhosts/README.txt

cd /etc/init.d
ln -s /usr/share/denyhosts/daemon-control denyhosts
chkconfig --add denyhosts

[출처 ] http://www.netnux.com/zbxe/817

신고

리눅스 시스템 관리자가 되기 위해서는 많은 것을 알아두어야 한다. 시스템 관리자의
관리 여하에 따라 많은 사람들의 시스템 장애를 초래할 수 있기 때문이다. 물론 시스

템 관리자가 모든 것을 미리 예방할 수 없다. 하지만 불가피한 상황을 제외하고는 시
스템이 정상적으로 작동되도록 해야한다.

이번호에는 시스템, 네트워크, APM, 메일, 보안, 장애발생시 복구등에서 일어날 수 있
는 시스템 관리자의 행동요령에 대해 알아볼 것이다. 시스템 관리자는 항상 모니터와
키보드아 함께 한다는 사실을 기억해야 한다.


[
막강한 시스템 길들이기 ]

 

1. 바이오스 타이머 조정

시스템이 네트워크에 연결되어 있다면, 다음과 같이 한국 표준시간 서버에서 표준시간
을 받아서 설정할 수 있다.

# rdate -s time.kriss.co.kr

시스템이 온라인 상태가 아니라면 아래와 같이 수동으로 설정할 수도 있다.

# date -s "1999-12-30 22:22:40"

위와 같이 실행하면 실행할 때만 적용되므로 이후 시간이 늦어지는 것을 막기 위해서
는 주기적으로 변경 가능하게 크론(/etc/crontab)에 설정하는 것이 좋다.

 

2. .profile rc.local의 차이

.profile은 로그인시 적용되는 내용들이고, rc.local은 시스템 부팅시 실행해야 할 것
들을 적어 놓은 것이다. 사용자 홈디렉토리의 .profile /etc에 있는 설정 파일보다
우선하기 때문에 홈 디렉토리에 .profile에 패스를 설정해주거나 쉘환경 파일 등을 설

정해주면 계정 내에서 적용이 된다. rc.local에는 부팅시 가장 마지막에 실행되므로
일반적으로 부팅시 실행되어야 할 데몬 등을 적어준다.

 

3. 커널 컴파일시 시스템 자원 확인법

리눅스 시스템의 자원정보는 proc 파일시스템 구조를 통해서 알 수 있다. 이는 실제로
디스크 용량을 차지하는 파일들이 아닌 가상의 디렉토리 구조이며 리눅스 커널에 의
해 사용되는 시스템의 정보를 담는 곳으로 사용된다. 다음의 위치에서 하드웨어에 대
한 정보 및 시스템 관련 정보들을 확인할 수 있다.

-------------------------------------------------------------------------------
/proc/cpuinfo | CPU
의 정보
-------------------------------------------------------------------------------
/proc/interrupts | interrupt
할당 정보
-------------------------------------------------------------------------------
/proc/ioports | I/O
포트 할당 정보
-------------------------------------------------------------------------------
/proc/devices | Character, Block
장치명
-------------------------------------------------------------------------------
/proc/swaps |
활성화된 스왑영역 정보
-------------------------------------------------------------------------------
/proc/meminfo |
물리적인 램용량, 램 사용량, 스왑 사용량 등
-------------------------------------------------------------------------------
1. proc 파일 시스템 구조를 통한 시스템 자원 정보

위와 같이 관련된 정보에 해당하는 파일 이름이 존재한다. 이 파일들은 텍스트 포맷이
므로 cat 명령을 통해서 확인할 수 있다.

 

4. vi 에디터로 유닉스에서 도스상의 ^M 문자 없애기

^M 문자를 공백으로 치환하면 된다.

:1,$s/^M//g

 

5. 특정 rpm 패키지의 설치 여부 확인

# rpm -qa | grep 패키지 명으로 확인할 수 있다.

 

6. RPM(Redhat Package Manager)에서 특정 패키지 복원시키기

rpm2cpio filename.rpm | cpio -I -make-deretories -E filename

 

7. TCP Syn Flooding 공격 대처방법

Tcp Syn Flooding은 웹으로의 공격이 대부분이므로 syn_recv 프로세스가 일정 개수가
넘게 되면 아파치를 재시작한다. 지속적인 공격일 경우 대처 방안으로 두 가지 방법이

있다. 첫째, sysctl -a | grep syn_backlog으로 확인 후 backlog를 늘려주거나 둘째,
sysctl -a | grep syncookies
로 확인 후 syncookies의 값을 1로 바꾸어준다
. syn_bac
klog
의 값을 조정해주는 방법은 다음과 같다.

# sysctl -w net.ipv4.tcp_max_syn_backlog=1024
# echo 1024 > /proc/sys/net/ipv4/tcp_max_syn_backlog

syncookies의 값은 다음과 같이 변경이 가능하다.

# sysctl -w net.ipv4.tcp_syncookies=1

 

8. TCP Syn Flooding 공격 대처방법

Umount시 위와 같은 메시지가 나는 것은 unmount하려는 디렉토리에서 실행되고 있는
프로세스가 있기 때문이다. 예로 /tmp 디렉토리를 umount 시키려 할때 위의 메시지가

뜨는 경우 mysql.socket파일이 /tmp에 있는 경우를 들 수 있다. 이 경우에는 해당 파

일시스템에서 실행중인 프로세스를 제거해야 하나 일일이 제거가 번거로우므로 Fuser
에서 -k 옵션을 사용하면 간단히 해결할 수 있다.

Fuser -k 장치명

 

9. setuserid

디렉토리나 파일 퍼미션 중 setuid는 소유자의 권한을 잠시 빌려 실행 후 권한을 돌려
주고 실행을 마치게 되는데 실행도중 인터럽트가 발생한다면 정상적으로 권한을 반환
하지 못하게 되어 소유자의 권한을 그대로 가지고 있게 된다. 이때 파일의 소유자가
루트였다면 이것은 보안에문제가 될수 있으며 이런 점을 이용해 해킹에 많이 사용된

. Setuid가 걸여 잇는 파일 중에 실행권하이 있으며 루트권한일 경우에는 위험하다.
특정 디렉토리에서 setuid가 걸려있는 파일을 찾으려면 find /usr -perm 4775와 같이

perm
옵션으로 찾을 수 있다.

 

10. bash_profile 변경 후 변경된 내용을 유효하게 만들기

다음과 같이 ~/.bash_profile를 실행해서 변경이 적용되도록 한다.

# source ~/.bash_profile

 

11. root 패스워드를 잊어 버렸을때 다시 세팅하는 방법

리눅스 시스템을 재부팅하고 lilo가 뜨면 ''linux single''로 부팅한다. Tab 키를 누르
면 등록되어 있는 라벨이 모두 보이므로, 여기에서 선택하도록 한다. 부팅 후 쉘 명령
어 화면에서 /etc/passwd 파일에서 암호 부분을 삭제하거나 passwd를 실행하여 루트의
패스워드를 새로 설정해 준다.

# passwd root

위의 명령을 입력한 후 변경할 패스워드를 입력하면 된다.

 

12. 파티션을 나누는 이유와 기준

보통 파티션을 나누는 것에 대해서 별다른 고려없이 /로 모든 것을 잡아서 설치하는
경우가 종종 있다. 이럴 경우 설치시 편리하지만, 나중에 파일시스템에 문제가 생기거

나 효율적으로파티션을 관리하기에는 많은 어려움이 있다. 파티션을 나눌때는 어떤
용도로 쓸것인지에 대해서 충분히 생각한 후 파티션을 해야 한다. 다음은 9.1GB 스카

시 하드디스크를 기준으로 웹 서버에서 이용될 서버에 대해 파티션한 경우의 예다.

-------------------------------------------------------------------------------
/boot | 30M | boot
에 필요한 booting 지원 파일들이 있다.
| |
커널 컴파일시 1MB 씩 늘어난다는 것을 염두해 둔다
.
-------------------------------------------------------------------------------
/ | 1000M |
-------------------------------------------------------------------------------
/usr | 2000M |
리눅스에서 사용되는 모든 application 및 시스템 파일들이 위치

| |
하고 있으며, library 파일과 실행파일이 존재한다.
-------------------------------------------------------------------------------
/var | 1000M |
-------------------------------------------------------------------------------
/tmp | 200M |
-------------------------------------------------------------------------------
/home | |
나머지 모두 웹 서버 용도로 사용한다면 home 부분에 자료가

| |
많아질 것이므로 home에 용량을 더 많이 배분했다. 이렇게 파티션
| |
을 나눠주면 서비스 거부 공격 방어, SUID 프로그램에 대한 보호,
| |
빠른 부팅속도, 백업과 업그레이드 등 관리의 편리성, 마운팅된

| |
파일 시스템에 대한 제어 가능성의 증대, 각 파일 시스템에 대한
| |
효율적인 제한이 가능하다는 이점이 있다.
-------------------------------------------------------------------------------
2. 9.1GB 스카시 하드디스크를 기준으로 한 웹 서버 파티션의 예

 

13. 기존의 ext2파일시스템과 저널링 파일시스템인 ext3, Reiser의 비교

-------------------------------------------------------------------------------
최대 파일사이즈 | ext2 | Journalling filesystem
| |---------------------------------------------
| | ext3 | Reiser FS
-------------------------------------------------------------------------------
최대저장용량 | 2TB (지원으로
| 4TB | 4GB of blocks, 16Tb
| 4TB
까지 가능
) | |
-------------------------------------------------------------------------------
블럭사이즈
| 1KB | 1KB - 4KB | Up to 64KB Currently
| | | Fixed 4KB
필요할 때마다

| | |
정확한 사이즈 할당가능
-------------------------------------------------------------------------------
최대 파일사이즈 | 2GB | 2GB | 4GB, 2^10 Petabytes in
| | | ReiserFS(3.6.XX)
-------------------------------------------------------------------------------
장점 및 단점 | 성능위주, 20KB | 파일복구 능력 | 공간저약 효과
,
|
저장에 유리, | 뛰어남, 항상 로그 | 속도향상

| access
속도저하| 남기므로 속도 저하|
-------------------------------------------------------------------------------
3. ext2, ext3, Resiser의 특징 및 장담점

/var 디렉토리와 같이 항상 새로운 자료가 쌓이는 곳은 안정성이 우선시 되므로, ext3
파일시스템이 유리하며, /usr와 같이 내용 변화 없이 빠르게 액세스하여 쓸 수 있어야

하는 부분은 ext2 시스템을 이용하여 성능에 초점을 두면 좋을 것이다.

 

14. 기본 데이터 블럭 사이즈 1024KB 4096KB의 차이

1024KB인 경우에는 블럭이 작은 만큼 4096KB보다 하드의 낭비가 적다. 1023KB의 데이
터를 저장하는 경우, 기본 블럭사이즈가 1024KB일 때는 1K 공간이 사용되지만, 4096KB
가 기본 블럭이라면 4K를 차지하게 된다. 하지만 아주 작은 파일들이 많은 경우 해당

데이터를 액세스하는 데는 1024KB 4096KB보다 더 걸리게 되므로 퍼포먼스가 급격히

떨어지게 된다. 따라서 자신이 이용하는 시스템의 특성과 용도에 맞게 블럭 사이즈를

지정해서 사용하면 된다.

 

15. RAID

RAID ''Redundant Array of Inexpensive (or Independant) Disks''의 약어다. RAID
스템은 여러 드라이브의 집합을 하나의 저장장치처럼 다룰 수 있게 하고, 장애가 발생
했을 때 데이터를 잃어버리지 않게 하며 각각에 대해 독립적으로 동작할 수 있도록 한
.

 

16. RAID 레벨 1과 레벨 5의 특성

시스템의 다운, 데이터 손실에 대비하여 보통 여러가지 RAID 레벨 중에서 1 5번 방
법을 많이 사용한다.

RAID 1(mirroring)의 특징은 빠른 기록 속도와 함께 장애복구능력이 있다는 것이다. 2
대의 드라이브만으로 구성할 수 있기 때문에 작은 시스템에 적합하다. 읽을 똑같은 하

드가 복제되고 있으므로, 시스템에 문제 발생시 서비스 지연시간이 매우 짧아서 웹 서
비스를 하는 곳에서 유용하게 쓸 수 있다. 하지만 한 하드의 내용이 또 다른 하드에
똑같이 복사되므로 하드용량의 낭비가 심하다.

RAID 5(distributed parity)는 작고 랜덤한 입출력이 많은 경우 더 나은 성능을 제공
한다. 빠른 기록 속도가 필수적이지 않다면, 일반적인 다중사용자 환경을 위해 가장
좋은 선택이다. 그러나 최소한 3, 일반적으로는 5대 이상의 드라이브가 필요하다
.
변경된 내용이 있을 경우 그것만 기록한다. 일반적으로 RAID 1 ECC 계산을 하지 않

으므로 RAID 5보단 빠르고, RAID 5는 하드 공간을 좀 더 여유있게 쓸 수 있다는 장점
을 지닌다.

 

17. 백업 계획 및 정책 수립의 요소와 Full 백업과 Incremental 백업

먼저 시스템의 전체 용량이 어떻게 되고, 그 중에서 백업할 가치가 있는 것은 어떤 부
분인지를 결정한다. 사용할 백업 장비와 종류를 알아보고, 총 백업 시간과 어느 정도
부하가 걸리는지 예상해보고 테스트해 본 후 마지막으로 백업 스케줄을 정한다
. Full
백업은 백업할 자료를 처음부터 끝까지 다 기록하는 것이고, Incremental 백업은 이전

의 데이터와 비교해서 새로 추가된 내용만 백업하는 방법이다. 따라서 Full 백업시 완
전히 데이터를 백업할 수 있지만 시간이 많이 걸리고, 시스템에 부하를 초래할 수 있
는 반면에 Incremental 백업은 빠른 시간내에 백업을 할 수 있지만, 백업하는 시간에
따라 데이터가 완전히 백업되지 못할 경우도 있을 수 있다.

 

18. SNMP의 의미와 구성요소

SNMP ''Simple Network Management Protocol''의 약자다. 네트워크에 연결되어 있는
장치에서 네트워크에 관련된 정보를 모으고 문제점 등을 보고할 수 있는 기능을 제공

하는 프로토콜이다. 구성요소는 에이전트와 매니저가 있다. 이것은 서버/클라이언트
구조로서 에이전트가 서버에 해당되고, 매니저가 클라이언트에 해당한다. 에러가 발생

하는 경우는 선택한 장비에 SNMP Enable이 안되었거나, 네트워크에 문제가 있어서
모니터링 하려는 장비까지 프로토콜이 전송되지 않는 경우, community 값이 잘못 사용

된 경우 등이 있다.

 

19. 데몬을 실행하고 정지하기

/etc/rc.d/init.d이 디렉토리에 있는 서비스를 ''서비스명'' stop 또는 start 시키거나
재시작시킨다.

 

20. 사용자별로 하드디스크 사용 용량 설정하기

quota를 이용하면 된다. df 명령으로 사용자의 홈디렉토리가 있는 디바이스를 확인한다.

-------------------------------------------------------------------------------
filesystem 1k-blocks Used Available Use% Mounted on
/dev/sda5 3028080 878480 1995780 31% /
/dev/sda1 62217 7713 51291 13% /boot
/dev/sda6 2759260 2088820 530276 80% /home2
/dev/sdb1 8744304 6496724 1803388 78% /home3
/dev/sdc1 3529628 25597928 7905940 76% /home4
/dev/sda10 202220 6 191774 0% /tmp
/dev/sda7 1517920 1280648 160164 89% /usr
/dev/sda8 608724 426992 150812 74% /var

# edquota username

Quotas for user jhk1:
/dev/sda6: blocks in use: 47584, limits (soft = 0, hard = 0) /*
이부분에 설정*/
inodes in use: 4590, limits (soft = 0, hard = 0)
/dev/sda8: blocks in user: 4, limits (soft = 0, hard = 0)
inodes in use: 1, limits (soft = 0, hard = 0)
-------------------------------------------------------------------------------

Soft는 용량에 설정되어 있는 용량은 넘어도 어느 정도 여유가 있지만, hard 용량에
설정된 크기는 절대적이다. 따라서 hard 용량을 사용자는 넘을 수 없다. 일반적으로
s
oft
용량을 hard 용량보다 조금 더 적게 설정해 놓는다. 쿼터 조정후
quotacheck /dev
/sda6
를 해줘서 체크를 해 주도록 한다.

 

21. -(하이픈)으로 시작하는 파일 지우기

파일명이 하이픈(-)으로 시작하는 파일

-------------------------------------------------------------------------------
rm ./-filename
상대경로를 이용하여 파일명을 지정해줌
rm -- -filename --
를 이용 그 이후에는 오는 ''-filename''이라는 파일이 옵션이
아닌 파일명이라는 것을 밝힘
-------------------------------------------------------------------------------

22. 사용하지 않은 가상 콘솔의 메모리 절약법

/etc/inittab에서 사용하지 않은 가상콘솔레벨을 주석처리 해주면 된다.

-------------------------------------------------------------------------------
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6
-------------------------------------------------------------------------------

 

23. 시스템 지원 모니터링 툴

-------------------------------------------------------------------------------
시스템 자원 | 모니터링 툴
-------------------------------------------------------------------------------
CPU | top, ps, uptime, vmstat, pstree
-------------------------------------------------------------------------------
메모리 문제 점검 | free, vmstat
-------------------------------------------------------------------------------
메모리에 문제가 없다면 디스트 I/O 점검 | df, du
-------------------------------------------------------------------------------
4. 시스템 자원과 모니터링 툴

[ 주 의 ]
디스크와 메모리에 문제가 없는데도 시스템에 문제가 생기면 CPU의 오버 헤드에 문제

가 있을 가능성이 크다.

 

24. 사용자들이 사용한 명령어 알아내기

먼저 psacct라는 패키지가 필요하다. 설치되지 않은 경우 rpm이나 소스 등을 직접 설
치한다(대부분 배포본에 기본적으로 포함되어 있으므로 그대로 사용하면 된다). 다음
과 같이 명령하면 사용한 명령어를 확인할 수 있다.

-------------------------------------------------------------------------------
더미 로그 파일 생성(데이타를 기록할 파일 생성)
# touch /var/log/pacct
# /sbin/accton /var/log/pacct
체크를 시작하게 하는 명령어 실행

# lastcomm
사용자계정 사용자가 수행한 명령어 체크
-------------------------------------------------------------------------------

 

25. tar로 특정 경로에 특정 파일 압축 해제하기

tar xvfpz 압축파일 또는 .tgz -C 특정경로 특정파일의 절대경로(또는 파일명)로 입력
하면 된다. test.tgz 파일에서 /home/test/test.txt 파일을 /tmp 디렉토리에 압축해제
를 한다면, tar xvfpz test.tgz -C /tmp /home/test/test.txt와 같이 하면 된다.

 

26. ping 명령어 실행시 ttl정보

TTL이란 Time To Live의 약자다. 이것은 라우팅 에러로 인하여 데이터그램이 네트워크
를 영원히 떠돌아다니는 것을 방지한다. 라우터는 네트워크 간을 이동하는 데이터그램
TTL 필드를 감소시키며 TTL 필드가 0이 되는 데이터그램은 버린다(drop). IPv4
티캐스트에서 TTL은 문턱값(threshold)의 의미를 지닌다.

다음 예를 보면 그 용도가 분명해진다. 회사에서 모든 호스트가 속하는 아주 길고 대
역폭에 한 부서가 대역폭을 많이 차지하는 인터넷 방송을 한다면, 랜에는 엄청난 용량
의 트래픽이 발생할 것이다. 인터넷 방송도 하길 원하지만, 멀티캐스트 트래픽 때문에
인터넷 전체가 마비되어서는 안된다. 멀티캐스트 트래픽이 라우터간을 얼마나 멀리까
지 이동할 것인지 제한할 필요가 있다. 이것이 TTL의 용도다.

 

27. 특정 IP에서 서버 접속 방지법

TCP Wrapper를 사용하는 방법과 ipchains를 사용할 수 있는데 커널 2.4버전부터는 ipt
ables
을 사용한다. hosts.allow hosts.deny를 사용한다면, hosts.deny 파일에서 다

음과 같이 모두 제한을 한다.

-------------------------------------------------------------------------------
all : ALL
-------------------------------------------------------------------------------

hosts.allow 파일에서 허용할 IP를 여러 개 설정할 경우 다음과 같이 스페이스로 구분
하여 준다.

-------------------------------------------------------------------------------
all : xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx. xxx.xxx.xxx.xxx ...
-------------------------------------------------------------------------------

ipchains iptables의 경우에는 다음과 같이 설정하여 주면 된다.

-------------------------------------------------------------------------------
# ipchains ?A input ?s xxx.xxx.xxx.xxx ?j DENY
# ipchains ?A INPUT ?s xxx.xxx.xxx.xxx ?j DROP
-------------------------------------------------------------------------------


[
안전한 네트워크 다지기 ]

 

28. 네트워크 설정법

시스템에 기본적으로 설치된 아래의 명령들을 사용하여 네트워크가 정상적으로 작동하
지 않은 경우 여러 가지 테스트를 해볼수 있다.

-------------------------------------------------------------------------------
ifconfig |
네트워크 인터페이스의 기본 설정에 관한 정보를 제공한다. 잘못된
| IP
, 서브넷 마스크 및 브로드 캐스트 주소를 확인하는데 효과적이다.
-------------------------------------------------------------------------------
arp |
이더넷/IP 주소의 변환에 관한 정보를 제공한다. 로컬 네트워크 내에

| IP
주소가 잘못 지정되었는지를 확인하는데 효과적이다.
-------------------------------------------------------------------------------
netstat |
네트워크 인터페이스, 네트워크 소켓, 네트워크 라우팅 테이블등에

|
대한 정보를 확인할 수 있다.
-------------------------------------------------------------------------------
ping |
원격 호스트가 도달 가능한지를 판단할 수 있다. 또한 패킷의 유실율과

|
전송 시간 등을 확인할 수 있다.
-------------------------------------------------------------------------------
nslookup | DNS
네임 서비스 관련 정보들을 확인할 수 있다
.
-------------------------------------------------------------------------------
dig |
역시 네임 서비스와 관련된 정보를 제공하면, nslookup과 유사하다
.
| BIND
버전의 확인 방법 및 각 도메인의 네임 서버를 확인하려면 다음과

|
같이 하면 된다.
|
| dig @
네임서버이름
txt chaos version.bin. | grep VERSION
| dig @ns.
도메인명 www.도메인명 위의 방법과 도메인을 등록 관리하는

|
업체에서 whois 검색을 도메인의 소유자 및 네임 서버 정보를 알아볼
|
수도 있다
.
-------------------------------------------------------------------------------
traceroute |
원격 시스템까지 패킷이 진행되는 동안의 라우팅 홉(hop) 정보를 확인

|
할 수 있다.
-------------------------------------------------------------------------------
tcpdump |
네트워크를 통해 전달되는 각각의 패킷들을 분석할 수 있으며, 각 패킷

|
의 내용과 헤더 등을 분석하는 TCP/IP 프로토콜 분석 소프트웨어다.
-------------------------------------------------------------------------------
5. 명령어와 설정 내용

 

29. 네트워크 정보로 이더넷 카드 IP 정보 재조정하기

/etc/sysconfig 디렉토리 밑에 하드웨어에 대한 정보가 나오는데 이더넷 카드가 여러
개 꽂혀 있다면 ifcfg-eth1, ifcfg-eth2 식으로 확인할 수 있다.

-------------------------------------------------------------------------------
/etc/sysconfig/network-scripts/ifcfg-eth0


# cat ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static /*
정적 아이피 */
BROADCAST=211.47.64.255
IPADDR=211.47.64.80
NETMASK=255.255.255.0
NETWORK=211.47.64.0
ONBOOT=yes /*
부팅시 자동인식
*/
-------------------------------------------------------------------------------

사용하는 IP를 변경하거나, 새로운 네트워크 카드 추가시에는 ifcfg-eth0 파일을 수정
한 후에 반드시 ifdown ifcfg-eth0, ifup ifcfg-eth0 명령을 실행해 주어야 변경된 IP
가 적용된다. 또는 /etc/rc.d/init.d/network restart를 실행해주어도 된다.

 

30. 스위치와 라우터의 비교

-------------------------------------------------------------------------------
|
스위치 | 라우터
-------------------------------------------------------------------------------
사용용도 | 두개 이상의 동일 네트워크를 연결 | 동종 또는 이종 네트워크 미디어를
|
하는 LAN/WAN에 적합 | 사용하는 LAN/WAN에 적합
-------------------------------------------------------------------------------
OSI
모델 | 2계층(Data Link), 3계층(Network) | 3계층(Network)
-------------------------------------------------------------------------------
목 적 | 특수한 목적의 장비 | 일반 목적의 장비

| -
대역폭 확장을 위하여 LAN seg- | - 다른 수많은 어플리케이션의
| mentation
| 주소를 유연하게 디자인
| -
거대한 트래픽을 해결하기 위함 | Limit broadcast traffic
| -
낮은 지연율과 고성능의 출력
| Redundant active paths
| -
과업을 최적화 하기 위함 | WAN 액세스

| | -
일반적으로 거대한 트래픽을
| |
전송할 때 요구되지 않음
-------------------------------------------------------------------------------
동작방식 | MAC 주소를 추적하여 장비의 위치를 | 서로 다른 네트워크 계층 프로토
|
인식 목적지 MAC 주소에 기초하여 | 콜을 구분할 필요가 있고 프로토
|
전송하기 위한 목적의 장비 | 콜 지식은 보다 효과적인 전송
| |
결정을 할 수 있다.
-------------------------------------------------------------------------------
설치시 | 설치가 간단하고, 비용이 낮다. | 노드의 경로 설정에 필요한 초기

|
유지보수가 간단하다. | setup이나 IP 주소 및 네트워크의
| |
수정시 복잡
-------------------------------------------------------------------------------
비고 | 브리지와 비슷하나 훨씬 빠름 | 두개의 기본 기능
| -
더 작은collision domain으로 | - 각 네트웍 계층 프로토콜을 위한
| LAN
을 분할 | 라우팅 테이블을 유지
| -
현재 사용되는 cable hardware | - 네트워크 계층 어드레스에 기반
|
를 그대로 사용 | 하여 각의각 프레임을 전송
| - Protocol transparent |
| -
쉽게 추가, 이동, 변경 가능 |
| - ASIC technology |
| -
통합된 넓은
bandwidth |
| -
저렴한 포트당 비용으로 고성능
|
|
제공 |

 

31. httpd.conf에서 ServerType standlone으로 설정하는 것과 inetd로 설정하는 것의 차이

아파치에만 적용되는 내용은 아니지만 standlone으로 설정한 경우에는 /etc/rc.d/rc.l
ocal
/etc/rc.d/rc3.d/밑에 설정되어 데몬으로 실행되면, inetd로 설정할 경우
/etc
/inetd.conf
에 추가되어 실행되어 텔넷이나 FTP와 같이 시스템프로세스로 실행되므로

접속이 많은 httpd인 경우 standalone으로 설정하여야 한다. 그리고 inetd로 설정시에

는 한정된 프로세스만 수용 가능하며 반응속도가 standalone방식에 비해 느리다.

 

32. 아파치에서 httpd.conf 수정 후 데몬이 뜨지 않은 경우 대처법

httpd -t 옵션으로 우선 syntax error부터 확인한 후 syntax error가 있으면 먼저 수
정을 해주고 Logs 디렉토리에서 에러 로그 파일을 확인하여 수정 후 재실행한다.

 

33. php 설치 후 버전 및 정상적인 설치 여부 확인법

php3 버전의 경우 index.php3 php4의 경우 index.php라는 파일을 다음과 같은 내용
으로 작성하여 웹에서 열어보면 버전 및 연동 현황을 확인할 수 있다.

-------------------------------------------------------------------------------
phpinfo();
?>
-------------------------------------------------------------------------------

 

34. APM 연동 설치시 php를 모듈로 삽입하기

먼저 php설치 후 apache 컴파일시 php모듈 넣어서 재컴파일 해준다.

-------------------------------------------------------------------------------
./configure --prefix=/usr/local/apache --activate-module=sr/modules/php4/libphp4
.a
-------------------------------------------------------------------------------

 

35. 아파치에서 속도제한하기

아파치에서 bandwidth 모듈이 삽입되어 있는 상태라면 모든 호스트에 대해 1024byte
속도를 제한하기 위해 아파치에서 설정해 주는 부분은 다음과 같다. Httpd.conf에서
BandWidthModule On
라고 설정 후 BandWidth all 1024라고 설정한다.

 

36. 디렉토리 목록 출력 금지법

아파치에서 index.html 파일이 없을 때 디렉토리 목록 출력을 원하지 않을 경우에는 D
ocumentRoot
디렉토리쪽에 설정되어져 있는 옵션에서 Indexes를 삭제한다. 또한 특정

디렉토리에서만 인덱스를 허용치 않을 경우에는 특정 디렉토리의 .htaccess 파일안에

''Options -Indexes''
이 부분을 삽입하면 된다.


안전한 메일 관리법

 

37. 센드메일에서 메일 용량을 제한하기

센드메일에서 한번에 보낼 수 있는 메일용량은 /etc/mail/sendmail.cf 파일에서 MaxMe
ssageSize
부분에서 다음과 같이 주석을 제거하고 바이트 단위로 설정을 해줄 수 있다

.
받는 메일 계정의용량은 Mlocal 부분에서 M=1000000 부분에서 바이트 단위로 제한
량을 적는다.

-------------------------------------------------------------------------------
MaxMessageSize=1000000
-------------------------------------------------------------------------------

 

38. 센드메일 데몬을 실행시 수신만하기

relay를 막는 방법도 있지만 그건 외부에서 로컬 서버를 SMTP로 사용하지 못하도록 할
수 있으며 iptables를 이용하면 로컬 서버에서 보내는 메일에 대해 제한이 가능하다.

-------------------------------------------------------------------------------
# iptables -A OUTPUT -p tcp --syn --dport 25 -j DROP

-A 기존의 iptables에 추가
-p
프로토콜
-dport
포트 넘버
-------------------------------------------------------------------------------

로컬에서 외부로 보내는 메일이라면 remote 25번 포트로 접속이 되므로 OUTPUT 패킷
중 목적지 포트가 25번인 패킷만 drop한다. 메일 송수신은 tcp이므로 --syn을 추가하
지 않을 경우에는 3 way-handshaking에 의해 메일을 받을 수도 없게 되므로 반드시 --
syn
을 추가해야 한다. 보내는 메일은 일단 메일큐 디렉토리에 저장된 후 발송되므로

메일큐 디렉토리를 삭제하거나 다른 이름으로 변경하면 메일을 발송할 수 없게 된다.

 

39. 릴레이 설정과 차단법

/etc/mail/access 파일에서 Relay 여부를 설정한다.

-------------------------------------------------------------------------------
localhost RELAY
-------------------------------------------------------------------------------

변경한 후 적용하려면 다음과 같이 실행해 준다. 또는 인증 기능(SMTP AUTH)이 지원되
는 최신 버전의 센드메일을 사용한다.

-------------------------------------------------------------------------------
# makemap hash /etc/mail/access < /etc/mail/access
-------------------------------------------------------------------------------

 

40. 특정시스템에 설치되어 있는 센드메일 버전 알아보기

간단한 방법으로 다음과 같이 텔넷으로 센드메일 포트인 25번으로 접속해보면 알 수
있다.

-------------------------------------------------------------------------------
# telnet jimy.tt.co.kr 25
-------------------------------------------------------------------------------

 

41. 다른 도메인의 웹마스터 계정 사용하기

가상 계정을 이용해서 해결할 수 있다. 아웃룩에서 jhk라는 계정을 설정하면 jhk@jung
heekim.co.kr, webmaster@jungheekim.co.kr
로 오는 메일을 모두 받아 볼 수 있다.

-------------------------------------------------------------------------------
# vi /etc/mail/virtusertable

webmaster@jungheekim.co.kr jhk(jhk계정에 webmaster라는 계정이 가상계정으
로 설정)
-------------------------------------------------------------------------------

 

42. 웹메일 포워딩

해외에 출장이 잦은 사용자가 메일을 자신이 사용하는 웹메일로 포워딩해 달라고 하고
,
회사에 돌아와서도 포워딩된 메일을 아웃룩에서 다시 받아보길 원한다면 다음과 같
이 한다. 해당 사용자의 홈디렉토리 밑에 .forward 파일을 만들어서 이메일 주소를 입
력하고 자신의 계정에는 를 추가해 주어야 루프를 막을 수 있다.

-------------------------------------------------------------------------------
vi ~junghee/.forward

sitsme75@hanmail.net, junghee.kim@tt.co.kr
-------------------------------------------------------------------------------

 

43. 자동응답 메일 작성법

메일을 확인할 수 없는 상황일 때, 메일 수신 후 자동으로 미리 작성되어 있는 메시지
를 보낼 수 있는 방법(즉 자동응답 메일 작성 방법)은 자신의 홈디렉토리에 ".procmai
lrc"
파일을 만들고 다음의 내용을 입력한다.

-------------------------------------------------------------------------------
:0 h c
* !^FROM_DAEMON
* !^X-Loop:
YOUR@EMAIL
| (formail -r -A"Prededence: junk"
-I"From: YOUR_NAME "
-A"X-Loop:
YOUR@EMAIL
cat $HOME/autoreply.txt) | $SENDMAIL -t
-------------------------------------------------------------------------------

그리고 ''autoreply.txt'' 파일에 답변글을 작성햐면 그 내용이 자동 답변된다.

 

44. POP3 다운시 설정법

아웃록에서 메일을 받아보려고 하는데, POP3가 다운되어 반응하지 않을때 다음과 같이
조정한다. inetd는 기본적으로 1분에 fork 할 수 있는 인스턴스가 40으로 제한되어
있으므로 이 값을 늘려줘야 한다. POP3 부분에서 nowait.200이나 적절한 수만큼 늘려

주면 된다. nowait 뒤에 반드시 .()을 찍고 허용할 만큼이 POP 데몬의 수를 입력한
. 이후 inetd를 재시작하면 적용된다.

-------------------------------------------------------------------------------
A # vi /etc/inetd.conf
# Pop and imap services et al
#pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d
pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
#imap stream tcp nowait root /usr/sbin/tcpd imapd
-------------------------------------------------------------------------------


철통 보안 관리

45. 일반적인 리눅스 보안법

1) 현재 서버에서 사용하지 않고, 보안상 취약점이 있는 데몬에 대해 서비스를 중지
한다.
2) TCP Wrapper
ipchains를 이용한다. 커널 2.4에서는 iptables를 이용해 각 서비

스에 대해서 접속을 허락하거나, 제한한다.
3)
새도우 패스워드를 반드시 이용한다
.
4) su
권한의 사용을 특정 사용자만 가능하도록 정의한다
.
5)
원격에서 루트 권한으로 접속할 수 없도록 한다
.
6)
지속적으로 패치한다.

46. Ping 요청 무시하기

-------------------------------------------------------------------------------
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
-------------------------------------------------------------------------------

다시 응답하게 하려면 다음과 같이 실행하면 된다.

-------------------------------------------------------------------------------
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
-------------------------------------------------------------------------------

 

47. 백도어 파일의 삭제

보통 백도어 파일은 rm 명령으로도 삭제되지 않는다. 속성이 있을 경우 다음과 같이
삭제한다.

-------------------------------------------------------------------------------
# lsattr /usr/sbin/in.fingerd

lsattr 1.12, 9-Jul-98 for EXT2 FS 0.5b, 95/08/09

-----a-- /usr/sbin/in.fingerd

==> a 속성이 있음을 확인


# chattr -a /usr/sbin/in.fingerd

chattr 1.12, 9-Jul-98 for EXT2 FS 0.5b, 95/08/09

==> -a로 속성을 해제

lsattr 1.12, 9-Jul-98 for EXT2 FS 0.5b, 95/08/09

-------- /usr/sbin/in.fingerd

==> 해제
-------------------------------------------------------------------------------

 

48. lpd(line printer daemon)의 취약점

lpd는 내부와 원격 프린트 작업을 수행하는 BSD 라인 프린터 데몬이다. lpd 데몬의 접
근 권한을 가지고 있는 내부 시스템이나 원격 시스템의 사용자가 특별히 변형된 불완
전한 프린트 작업을 요청하고 이어서 프린터 큐의 디스플레이를 요청하게 되면 해당
시스템에 버퍼 오버플로우를 일으킬 수 있다. 결국 관리자 권한으로 내부 시스템에 공

격코드를 실행시킬 수 있게 된다. 따라서 패치를 해주거나 서비스를 하지 않는다면 데
몬을 중지하는 것이 좋다.

 

49. BIND에서 보안상 문제가 있는 버전

BIND 4.x, 8.x에서 문제가 검출되었다. BIND 8버전에서는 트랜잭션 시그너쳐(TSIG)
들링 코드에 버퍼오버플로우 취약점을 포함하고 있다.

유효한 키를 포함하지 안는 TSIG를발견하는 경우 BIND 8버전에서는 에러응답을 보내
기 위한 코드를 실행하게 되며, 이때 발생하는 변수 초기화 방식의 차이에 의해 해당
취약점이 발생하게 된다. DNS 시스템에 대한 요청 접근만으로 해당 취약점을 발생시킬

수 있으므로 이로 인한 위험성은 크게 된다.

BIND 4버전에서는 nslookupComplain() 내부에 있는 문자 배열(syslog를 위한 에러 메
시지 작성 버퍼)에 대해 입력 검증(input validation) 취약점을 포함하고 있다. 이것
은 특수한 포맷 형태를 가진 쿼리를 전송함으로써 입력 검증 취약점을 발생시킨다.

BIND 4, 8버전에서는 해당 서버가 쿼리를 처리하는 동안 정보가 누출(information lea
k)
될 수 있는 취약점을 포함하고 있다. 특수한 포맷형태를 가진 쿼리 전송을 통해 공

격자가 프로그램 스택에 접근할 수 있게 함으로써 해당 취약점을 발생시킨다.

해결책은 BIND 버전은 8.2.3 이상이나 9.1 버전으로 업그레이드하는 것이다. 이것은
해결책이 아니라 시스템 관리자가 반드시 해야 할 일이다.


장애 발생시 복구

50. 비정상 종료시 하드디스크 체크요구 원인

대부분 정전이 발생한 후에도 시스템은 정상적으로 부팅되며 파일시스템도 자동으로 c
heck
하지만 간혹 관리자가 수동으로 해주어야 하는 경우가 발생한다. 리눅스가 다운

되었을때 보통 Power OFF를 하는데, 이때 문제가 발생할 수 있으므로 Magic SysRq라는

것을 이용하여 안전하게 재부팅하는 방법을 이용한다.

Magic SysRq key란 시스템의 제어가 불가능한 상태(일반적으로 ''다운''되었다고 한다)
에서도 제어를 가능하게 해주므로 커널 컴파일시
Kernel hacking ---> [*]Magic SysRq
key
를 체크해야 한다. Magic SysRq key를 사용하려면 다음과 같이
/proc/sys/kernel/
sysrq
값을 1로 만들어야 한다.

------------------------------------------------------------------------------
# echo 1 > /proc/sys/kernel/sysrq

lilo: linux init=/bin/sh
------------------------------------------------------------------------------

그러면 커널이 뜨고 바로 shell prompt ''#''가 나타난다. 이때에는 filesystem read
only
로 마운트 되고, 동작하는 daemon process도 전혀 없는 상태가 된다. 그 상태에서

수동으로 모든 파일시스템을 체크한다.

------------------------------------------------------------------------------
# fsck [-t ext2]
장치명
# e2fsck
장치명
------------------------------------------------------------------------------

위의 명령 사용시 문제가 생긴 블록의 수정여부를 묻게 되는데 ''y''를 선택하고 만약
수정여부를 묻는 질문이 많다면 -y 옵션을 사용하여 자동으로 ''y''를 선택하게 할 수

있다.

------------------------------------------------------------------------------
# e2fsck -y
장치명
------------------------------------------------------------------------------

Ctrl-Alt-Del로 리부팅하면 아주 심하게 깨지거나, 디스트에 이상이 있지 않는 한 복
구가 된다.

==================

본문스크랩 리눅스 명령어 정리 (Ver 2.26) 리눅스

2009/01/08 19:19

복사 http://blog.naver.com/websitte/70040104087

 

# centos5 기준

# 경로가 빈칸인 명령어는 어디서나 실행가능

# 사용유형이 빈칸인 명령어는 '실행'을 뜻함

 

명령어 경로 사용유형 설명
.bash_history 각 계정의 홈 디렉터리 편집 사용자가 적었던 명령어 기록
.bash_logout 각 계정의 홈 디렉터리 편집 로그아웃시 실행되는 배치파일
.bash_profile 각 계정의 홈 디렉터리 편집 로그인시 실행될 항목
.bashrc 각 계정의 홈 디렉터리 편집 단축키 설정
.vimrc 각 계정의 홈 디렉터리 생성->편집 vi편집기 설정
at     예약작업
at.allow /etc 편집 특정 계정 at 허용
at.deny /etc 편집 특정 계정 at 거부
atd /etc/init.d   at 데몬
atq     예약 작업 보기
atrm     예약 작업 지우기
bc     계산기
cal     달력
cat     파일 생성, 내용 보기
cd     디렉터리 이동
chage     계정, 암호 만료일자 설정
chattr     속성 변경
chgrp     파일의 그룹 변경
chkconfig     데몬 설정
chmod     파일의 퍼미션 변경
chown     파일의 사용자, 그룹 변경
clear     화면 청소
clock     시각, 날짜 보기.
cp     복사
cron.allow /etc 편집 특정 계정 cron 허용
cron.deny /etc 편집 특정 계정 cron 거부
crond /etc/init.d   예약작업 데몬
crontab   편집, 실행 예약작업
date     날짜, 시각 보기
df     전체 용량 보기
dhcpd /sbin   dhcp데몬(tar.gz의 경우)
dhcpd.conf /etc 편집 dhcp설정 파일
dhcpd.leases /var/db 생성->편집 dhcp로그 파일(tar.gz의 경우)
dhcpd.leases /var/lib/dhcp 편집 dhcp로그 파일(rpm의 경우)
du     디렉터리별 용량 보기
exit     로그아웃
fdisk     파티션 설정
fg     포그라운드로 불러내기
find     찾기
free     메모리 사용량 확인
fsck.ext3     수동 시스템 검사(꼭 싱글모드에서 해야함)
fstab /etc 편집 마운트 설정
ftp     파일 서버
gcc     컴파일
grep     내용 찾기
group /etc 편집 그룹 확인
groupadd     그룹 생성
groupdel     그룹 삭제
groupmod     그룹 수정
groups     유저가 속한 그룹 보기
grub.conf /boot/grub 편집 부팅 설정
gzip     압축
halt     컴 수동 종료
head     파일내용 앞부분 출력
history     사용 명령어 목록 출력
host.allow /etc 편집 ip 허용
host.deny /etc 편집 ip 차단
httpd /etc/init.d   웹서버 데몬
id     계정 정보 보기
ifcfg-eth0 /etc/sysconfig/network-scripts 편집 eth0의 네트워크 설정 보기
ifconfig     ip보기, 설정
init     부팅 모드 실행
inittab   편집 init 설정
issue /etc 편집 로그인전 출력할 내용
jobs     작업 보기
kill     프로세스 종료
last     부팅 로그 보기
lastlog     마지막 접속로그 보기
ln     링크하기
login.defs /etc 편집 계정 번호 설정
logout     로그아웃
ls     파일의 목록 보기
lsattr     속성 보기
man     매뉴얼 보기
mc     탐색기
messages /var/log 편집 로그인 로그 파일
mkdir     디렉터리 생성
motd /etc 생성->편집 로그인후 출력할 내용
mount     장치 연결하기
mv     이동, 이름 변경
network /etc/init.d   네트워크 데몬
ntsysv     데몬 사용, 사용안함
passwd /etc 편집 계정 목록
passwd     암호 설정
patch     패치하기
ping     핑 보내기
profile /etc 편집 로그인시 실행될 항목
proftpd     pro ftp 데몬
ps aux     프로세스 보기
pwconv     쉐도우 패스워드 설정
pwunconv     쉐도우 패스워드 해제
python     파이썬(프로그래밍 언어) 실행
reboot     재부팅
rm     파일, 디렉터리 삭제
rmdir     디렉터리 삭제
rpm     rpm 설치, 제거, 검색
scp     파일 주고받기
service     데몬을 시작시키거나 중지시킨다
setup     여러가지 시스템 설정
shadow /etc 편집 계정 목록(컨버전 안된 암호가 표시됨)
shutdown     컴 끄기
shutdown.allow /etc 편집 셧다운 명령을 허용할 유저목록
squid /etc/init.d   프록시 서버 데몬
ssh     암호화 지원하는 원격접속 프로그램
su /etc/pam.d 편집 su 설정
su     사용자 변경
tail     파일내용 뒷부분 출력
tar     파일 묶기, 압축
tee     파일로 출력
telnet /etc/xinetd.d 편집 텔넷 설정
telnet     원격접속 프로그램
touch     파일 생성
tty     터미널 번호 보기
tune2fs     자동 시스템 검사
umount     마운트 해제
uname -r     커널 버전 보기
useradd     계정 생성
userdel     계정 삭제
usermod     계정 수정
vi     편집기
vim     vi편집기 향상판
vipw     vi /etc/passwd
w     시스템에 접속한 사용자 상황 표시
wall     메시지 보내기
who am I     자세한 자신의 정보 보기
whoami     자신의 정보 보기
xinetd /etc/init.d   수퍼 데몬
yum     인터넷을 통한 rpm 설치

신고

Top 75 Security Tools

In May of 2003, I conducted a survey of Nmap users from the nmap-hackers mailing list to determine their favorite security tools. Each respondent could list up to 8. This was a followup to the highly successful June 2000 Top 50 list. An astounding 1854 people responded in '03, and their recommendations were so impressive that I have expanded the list to 75 tools! Anyone in the security field would be well advised to go over the list and investigate tools they are unfamiliar with. I discovered several powerful new tools this way. I also plan to point newbies to this page whenever they write me saying "I do not know where to start".

Respondents were allowed to list open source or commercial tools on any platform. Commercial tools are noted as such in the list below. Many of the descriptions were taken from the application home page or the Debian or Freshmeat package descriptions. I removed marketing fluff like "revolutionary" and "next generation". No votes for the Nmap Security Scanner were counted because the survey was taken on an Nmap mailing list. This audience also means that the list is slightly biased toward "attack" tools rather than defensive ones.

These icons are used:
Did not appear on the 2000 list

Generally costs money. These rarely includes source code. A free limited/demo/trial version may be available.
Works on Linux
Works on FreeBSD/NetBSD/OpenBSD and/or proprietary UNIX systems (Solaris, HP-UX, IRIX, etc.)
Supports Microsoft Windows

Translations:
Spanish Translation by ThiOsk (os_k&at&softhome.net) and Kerozene (kerozene&at&hackemate.com.ar)
Portuguese Translation by André Zúquete (avz&at&det.ua.pt)

Here is the list (starting with the most popular):


Nessus: The premier Open Source vulnerability assessment tool
Nessus is a remote security scanner for Linux, BSD, Solaris, and other Unices. It is plug-in-based, has a GTK interface, and performs over 1200 remote security checks. It allows for reports to be generated in HTML, XML, LaTeX, and ASCII text, and suggests solutions for security problems.



Ethereal: Sniffing the glue that holds the Internet together
Ethereal is a free network protocol analyzer for Unix and Windows. It allows you to examine data from a live network or from a capture file on disk. You can interactively browse the capture data, viewing summary and detail information for each packet. Ethereal has several powerful features, including a rich display filter language and the ability to view the reconstructed stream of a TCP session. A text-based version called tethereal is included.




Snort: A free intrusion detection system (IDS) for the masses
Snort is a lightweight network intrusion detection system, capable of performing real-time traffic analysis and packet logging on IP networks. It can perform protocol analysis, content searching/matching and can be used to detect a variety of attacks and probes, such as buffer overflows, stealth port scans, CGI attacks, SMB probes, OS fingerprinting attempts, and much more. Snort uses a flexible rule based language to describe traffic that it should collect or pass, and a modular detection engine. Many people also suggested that the Analysis Console for Intrusion Databases (ACID) be used with Snort.




Netcat: The network swiss army knife
A simple Unix utility which reads and writes data across network connections, using TCP or UDP protocol. It is designed to be a reliable "back-end" tool that can be used directly or easily driven by other programs and scripts. At the same time, it is a feature-rich network debugging and exploration tool, since it can create almost any kind of connection you would need and has several interesting built-in capabilities.




TCPDump / WinDump: The classic sniffer for network monitoring and data acquisition
Tcpdump is a well-known and well-loved text-based network packet analyzer ("sniffer"). It can be used to print out the headers of packets on a network interface that matches a given expression!. You can use this tool to track down network problems or to monitor network activities. There is a separate Windows port named WinDump. TCPDump is also the source of the Libpcap/WinPcap packet capture library, which is used by Nmap among many other utilities. Note that many users prefer the newer Ethereal sniffer.



Hping2: A network probing utility like ping on steroids
hping2 assembles and sends custom ICMP/UDP/TCP packets and displays any replies. It was inspired by the ping command, but offers far more control over the probes sent. It also has a handy traceroute mode and supports IP fragmentation. This tool is particularly useful when trying to traceroute/ping/probe hosts behind a firewall that blocks attempts using the standard utilities.




DSniff: A suite of powerful network auditing and penetration-testing tools
This popular and well-engineered suite by Dug Song includes many tools. dsniff, filesnarf, mailsnarf, msgsnarf, urlsnarf, and webspy passively monitor a network for interesting data (passwords, e-mail, files, etc.). arpspoof, dnsspoof, and macof facilitate the interception of network traffic normally unavailable to an attacker (e.g, due to layer-2 switching). sshmitm and webmitm implement active monkey-in-the-middle attacks against redirected SSH and HTTPS sessions by exploiting weak bindings in ad-hoc PKI. A separately maintained partial Windows port is available here.





GFI LANguard: A commercial network security scanner for Windows
LANguard scans networks and reports information such as service pack level of each machine, missing security patches, open shares, open ports, services/applications active on the computer, key registry entries, weak passwords, users and groups, and more. Scan results are outputted to an HTML report, which can be customized/queried. Apparently a limited free version is available for non-commercial/trial use.





Ettercap: In case you still thought switched LANs provide much extra security
Ettercap is a terminal-based network sniffer/interceptor/logger for ethernet LANs. It supports active and passive dissection of many protocols (even ciphered ones, like SSH and HTTPS). Data injection in an established connection and filtering on the fly is also possible, keeping the connection synchronized. Many sniffing modes were implemented to give you a powerful and complete sniffing suite. Plugins are supported. It has the ability to check whether you are in a switched LAN or not, and to use OS fingerprints (active or passive) to let you know the geometry of the LAN.




Whisker/Libwhisker: Rain.Forest.Puppy's CGI vulnerability scanner and library
Whisker is a scanner which allows you to test HTTP servers for many known security holes, particularly the presence of dangerous CGIs. Libwhisker is a perl library (used by Whisker) which allows for the creation of custom HTTP scanners. If you wish to audit more than just web servers, have a look at Nessus.




John the Ripper: An extraordinarily powerful, flexible, and fast multi-platform password hash cracker
John the Ripper is a fast password cracker, currently available for many flavors of Unix (11 are officially supported, not counting different architectures), DOS, Win32, BeOS, and OpenVMS. Its primary purpose is to detect weak Unix passwords. It supports several crypt(3) password hash types which are most commonly found on various Unix flavors, as well as Kerberos AFS and Windows NT/2000/XP LM hashes. Several other hash types are added with contributed patches.




OpenSSH / SSH: A secure way to access remote computers
Ssh (Secure Shell) is a program for logging into or executing commands on a remote machine. It provides secure encrypted communications between two untrusted hosts over an insecure network. X11 connections and arbitrary TCP/IP ports can also be forwarded over the secure channel. It is intended as a replacement for rlogin, rsh and rcp, and can be used to provide rdist, and rsync with a secure communication channel. OpenSSH is affiliated with the OpenBSD project, though a portable version runs on most UNIX systems. Note that the SSH.Com link above costs money for some uses, while OpenSSH is always free. Windows users may want to try the free PuTTY SSH Client or the nice terminal-based port of OpenSSH that comes with Cygwin. There are dozens of other clients (free or prorietary) available for most platforms - here is a huge list.



Sam Spade: Freeware Windows network query tool
SamSpade provides a consistent GUI and implementation for many handy network query tasks. It was designed with tracking down spammers in mind, but can be useful for many other network exploration, administration, and security tasks. It includes tools such as ping, nslookup, whois, dig, traceroute, finger, raw HTTP web browser, DNS zone transfer, SMTP relay check, website search, and more. Non-Windows users can enjoy online versions of many of their tools.




ISS Internet Scanner: Application-level vulnerability assessment
Internet Scanner started off in '92 as a tiny Open Source scanner by Christopher Klaus. Now he has grown ISS into a billion-dollar company with a myriad of security products. ISS Internet Scanner is pretty good, but is not cheap. So companies on a tight budget may wish to look at Nessus instead. A March 2003 Information Security magazine review of 5 VA tools (including these) is available here. Note that VA tools only report vulnerabilities. Commercial tools for actually exploiting them include CORE Impact and Dave Aitel's Canvas. Free exploits for some vulnerabilities can be found at sites like Packet Storm and SecurityFocus





Tripwire: The grand-daddy of file integrity checkers
A file and directory integrity checker. Tripwire is a tool that aids system administrators and users in monitoring a designated set of files for any changes. Used with system files on a regular (e.g., daily) basis, Tripwire can notify system administrators of corrupted or tampered files, so damage control measures can be taken in a timely manner. An Open Source Linux version is freely available at Tripwire.Org. UNIX users may also want to consider AIDE, which has been designed to be a free Tripwire replacement. Or you may wish to investigate Radmind.





Nikto: A more comprehensive web scanner
Nikto is a web server scanner which looks for over 2000 potentially dangerous files/CGIs and problems on over 200 servers. It uses LibWhisker but is generally updated more frequently than Whisker itself.





Kismet: A powerful wireless sniffer
Kismet is an 802.11b network sniffer and network dissector. It is capable of sniffing using most wireless cards, automatic network IP block detection via UDP, ARP, and DHCP packets, Cisco equipment lists via Cisco Discovery Protocol, weak cryptographic packet logging, and Ethereal and tcpdump compatible packet dump files. It also includes the ability to plot detected networks and estimated network ranges on downloaded maps or user supplied image files. Windows support is currently preliminary, so those users may want to look at Netstumbler if they run into trouble. Linux (and Linux PDAs like Zaurus) users may wish to also look at the Wellenreiter wireless scanner.




SuperScan: Foundstone's Windows TCP port scanner
A connect-based TCP port scanner, pinger and hostname resolver. No source code is provided. It can handle ping scans and port scans using specified IP ranges. It can also connect to any discovered open port using user-specified "helper" applications (e.g. Telnet, Web browser, FTP).




L0phtCrack 4 (now called "LC4"): Windows password auditing and recovery application
L0phtCrack attempts to crack Windows passwords from hashes which it can obtain (given proper access) from stand-alone Windows NT/2000 workstations, networked servers, primary domain controllers, or Active Directory. In some cases it can sniff the hashes off the wire. It also has numerous methods of generating password guesses (dictionary, brute force, etc). L0phtcrack currently costs $350/machine and no source code is provided. Companies on a tight budget may want to look at John the Ripper, Cain & Abel, and pwdump3.




Retina: Commertial vulnerability assessment scanner by eEye
Like Nessus and ISS Internet Scanner mentioned previously, Retina's function is to scan all the hosts on a network and report on any vulnerabilities found.


Netfilter: The current Linux kernel packet filter/firewall
Netfilter is a powerful packet filter which is implemented in the standard Linux kernel. The userspace iptables tool is used for configuration. It now supports packet filtering (stateless or stateful), all different kinds of NAT (Network Address Translation) and packet mangling. For non-Linux platforms, see pf (OpenBSD), ipfilter (many other UNIX variants), or even the Zone Alarm personal firewall (Windows).




traceroute/ping/telnet/whois: The basics
While there are many whiz-bang high-tech tools out there to assist in security auditing, don't forget about the basics! Everyone should be very familiar with these tools as they come with most operating systems (except that Windows omits whois and uses the name tracert). They can be very handy in a pitch, although for more advanced usage you may be better off with Hping2 and Netcat.




Fport: Foundstone's enhanced netstat
fport reports all open TCP/IP and UDP ports on the machine you run it on and shows what application opened each port. So it can be used to quickly identify unknown open ports and their associated applications. It only runs on Windows, but many UNIX systems now provided this information via netstat (try 'netstat -pan' on Linux). Here is a PDF-Format SANS article on using Fport and analyzing the results.




SAINT: Security Administrator's Integrated Network Tool
Saint is another commercial vulnerability assessment tool (like ISS Internet Scanner or eEye Retina). Unlike those Windows-only tools, SAINT runs exclusively on UNIX. Saint used to be free and open source, but is now a commercial product.




Network Stumbler: Free Windows 802.11 Sniffer
Netstumbler is the best known Windows tool for finding open wireless access points ("wardriving"). They also distribute a WinCE version for PDAs and such called Ministumbler. The tool is currently free but Windows-only and no source code is provided. They note that "the author reserves the right to change this license agreement as he sees fit, without notice." UNIX users (and advanced Win users) may want to look at Kismet instead.



SARA: Security Auditor's Research Assistant
SARA is a vulnerability assessment tool that was derived from the infamous SATAN scanner. They try to release updates twice a month and try to leverage other software created by the open source community (such as Nmap and Samba).





N-Stealth: Web server scanner
N-Stealth is a commercial web server security scanner. It is generally updated more frequently than free web scanners such as whisker and nikto, but do take their web site with a grain of salt. The claims of "30,000 vulnerabilities and exploits" and "Dozens of vulnerability checks are added every day" are highly questionable. Also note that essentially all general VA tools such as nessus, ISS, Retina, SAINT, and SARA include web scanning components. They may not all be as up-to-date or flexible though. N-stealth is Windows only and no source code is provided.





AirSnort: 802.11 WEP Encryption Cracking Tool
AirSnort is a wireless LAN (WLAN) tool that recovers encryption keys. It was developed by the Shmoo Group and operates by passively monitoring transmissions, computing the encryption key when enough packets have been gathered. Windows support is still very preliminary.





NBTScan: Gathers NetBIOS info from Windows networks
NBTscan is a program for scanning IP networks for NetBIOS name information. It sends NetBIOS status query to each address in supplied range and lists received information in human readable form. For each responded host it lists IP address, NetBIOS computer name, logged-in user name and MAC address.




GnuPG / PGP: Secure your files and communication w/advanced encryption
PGP is the famous encryption program by Phil Zimmerman which helps secure your data from eavesdroppers and other risks. GnuPG is a very well-regarded open source implentation of the PGP standard (the actual executable is named gpg). While GnuPG is always free, PGP costs money for some uses.



Firewalk: Advanced traceroute
Firewalk employs traceroute-like techniques to analyze IP packet responses to determine gateway ACL filters and map networks. This classic tool was rewritten from scratch in October 2002. Note that much or all of this functionality can also be performed by the Hping2 --traceroute option.




Cain & Abel: The poor man's L0phtcrack
Cain & Abel is a free password recovery tool for Microsoft Operating Systems. It allows easy recovery of various kind of passwords by sniffing the network, cracking encrypted passwords using Dictionary & Brute-Force attacks, decoding scrambled passwords, revealing password boxes, uncovering cached passwords and analyzing routing protocols. Source code is not provided.




XProbe2: Active OS fingerprinting tool
XProbe is a tool for determining the operating system of a remote host. They do this using some of the same techniques as Nmap as well as many different ideas. Xprobe has always emphasized the ICMP protocol in their fingerprinting approach.





SolarWinds Toolsets: A plethora of network discovery/monitoring/attack tools
SolarWinds has created and sells dozens of special-purpose tools targetted at systems administrators. Security related tools include many network discovery scanners and an SNMP brute-force cracker. These tools are Windows only, cost money, and do not include source code.




NGrep: Convenient packet matching & display
ngrep strives to provide most of GNU grep's common features, applying them to the network layer. ngrep is a pcap-aware tool that will allow you to specify extended regular or hexadecimal expression!s to match against data payloads of packets. It currently recognizes TCP, UDP and ICMP across Ethernet, PPP, SLIP, FDDI, Token Ring and null interfaces, and understands bpf filter logic in the same fashion as more common packet sniffing tools, such as tcpdump and snoop.




Perl / Python: Portable, general-purpose scripting languages
While many canned security tools are available on this page for handling common tasks, it is important to have the ability to write your own (or modify the existing ones) when you need something more custom. Perl and Python make it very easy to write quick, portable scripts to test, exploit, or even fix systems! Archives like CPAN are filled with modules such as Net::RawIP and protocol implementations to make your tasks even easier.




THC-Amap: An application fingerprinting scanner
Amap (by THC) is a new but powerful scanner which probes each port to identify applications and services rather than relying on static port mapping.





OpenSSL: The premier SSL/TLS encryption library
The OpenSSL Project is a collaborative effort to develop a robust, commercial-grade, full-featured, and Open Source toolkit implementing the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) protocols as well as a full-strength general purpose cryptography library. The project is managed by a worldwide community of volunteers that use the Internet to communicate, plan, and develop the OpenSSL toolkit and its related documentation.




NTop: A network traffic usage monitor
Ntop shows network usage in a way similar to what top does for processes. In interactive mode, it displays the network status on the user's terminal. In Web mode, it acts as a Web server, creating an HTML dump of the network status. It sports a NetFlow/sFlow emitter/collector, an HTTP-based client interface for creating ntop-centric monitoring applications, and RRD for persistently storing traffic statistics.




Nemesis: Packet injection simplified
The Nemesis Project is designed to be a commandline-based, portable human IP stack for UNIX/Linux (and now Windows!). The suite is broken down by protocol, and should allow for useful scripting of injected packet streams from simple shell scripts. If you enjoy Nemesis, you might also want to look at hping2. They complement each other well.



LSOF: LiSt Open Files
This Unix-specific diagnostic and forensics tool lists information about any files that are open by processes currently running on the system. It can also list communications sockets open by each process.


Hunt: An advanced packet sniffing and connection intrusion tool for Linux
Hunt can watch TCP connections, intrude into them, or reset them. Hunt is meant to be used on ethernet, and has active mechanisms to sniff switched connections. Advanced features include selective ARP relaying and connection synchronization after attacks. If you like Hunt, also take a look at Ettercap and Dsniff.





Honeyd: Your own personal honeynet
Honeyd is a small daemon that creates virtual hosts on a network. The hosts can be configured to run arbitrary services, and their TCP personality can be adapted so that they appear to be running certain versions of operating systems. Honeyd enables a single host to claim multiple addresses on a LAN for network simulation. It is possible to ping the virtual machines, or to traceroute them. Any type of service on the virtual machine can be simulated according to a simple configuration file. It is also possible to proxy services to another machine rather than simulating them. The web page is currently down for legal reasons, but the V. 0.5 tarball is still available here.




Achilles: A Windows web attack proxy
Achilles is a tool designed for testing the security of web applications. Achilles is a proxy server, which acts as a man-in-the-middle during an HTTP session. A typical HTTP proxy will relay packets to and from a client browser and a web server. Achilles will intercept an HTTP session's data in either direction and give the user the ability to alter the data before transmission. For example, during a normal HTTP SSL connection a typical proxy will relay the session between the server and the client and allow the two end nodes to negotiate SSL. In contrast, when in intercept mode, Achilles will pretend to be the server and negotiate two SSL sessions, one with the client browser and another with the web server. As data is transmitted between the two nodes, Achilles decrypts the data and gives the user the ability to alter and/or log the data in clear text before transmission.




Brutus: A network brute-force authentication cracker
This Windows-only cracker bangs against network services of remote systems trying to guess passwords by using a dictionary and permutations thereof. It supports HTTP, POP3, FTP, SMB, TELNET, IMAP, NTP, and more. No source code is available. UNIX users should take a look at THC-Hydra.





Stunnel: A general-purpose SSL cryptographic wrapper
The stunnel program is designed to work as an SSL encryption wrapper between remote client and local (inetd-startable) or remote server. It can be used to add SSL functionality to commonly used inetd daemons like POP2, POP3, and IMAP servers without any changes in the programs' code. It will negotiate an SSL connection using the OpenSSL or SSLeay libraries.




Paketto Keiretsu: Extreme TCP/IP
The Paketto Keiretsu is a collection of tools that use new and unusual strategies for manipulating TCP/IP networks. They tap functionality within existing infrastructure and stretch protocols beyond what they were originally intended for. It includes Scanrand, an unusually fast network service and topology discovery system, Minewt, a user space NAT/MAT router, linkcat, which presents a Ethernet link to stdio, Paratrace, which traces network paths without spawning new connections, and Phentropy, which uses OpenQVIS to render arbitrary amounts of entropy from data sources in three dimensional phase space. Got all that? :).




Fragroute: IDS systems' worst nightmare
Fragroute intercepts, modifies, and rewrites egress traffic, implementing most of the attacks described in the Secure Networks IDS Evasion paper. It features a simple ruleset language to delay, duplicate, drop, fragment, overlap, print, reorder, segment, source-route, or otherwise monkey with all outbound packets destined for a target host, with minimal support for randomized or probabilistic behaviour. This tool was written in good faith to aid in the testing of intrusion detection systems, firewalls, and basic TCP/IP stack behaviour. Like Dsniff, and Libdnet, this excellent tool was written by Dug Song.





SPIKE Proxy: HTTP Hacking
Spike Proxy is an open source HTTP proxy for finding security flaws in web sites. It is part of the Spike Application Testing Suite and supports automated SQL injection detection, web site crawling, login form brute forcing, overflow detection, and directory traversal detection.




THC-Hydra: Parallized network authentication cracker
This tool allows for rapid dictionary attacks against network login systems, including FTP, POP3, IMAP, Netbios, Telnet, HTTP Auth, LDAP NNTP, VNC, ICQ, Socks5, PCNFS, and more. It includes SSL support and is apparently now part of Nessus. Like Amap, this release is from the fine folks at THC.

The Next 25

To save space & time, the next 25 best tools are listed in a more compact table:

  • OpenBSD: The proactively secure operating system.
  • TCP Wrappers: A classic IP-based access control and logging mechanism
  • pwdump3: Allows for retreiving Windows password hashes locally or across the network whether or not syskey is enabled.
  • LibNet: A high-level API (toolkit) allowing the application programmer to construct and inject network packets
  • IpTraf: IP Network Monitoring Software
  • Fping: A parallel ping scanning program
  • Bastille: Security hardening script for Linux, Mac OS X, and HP-UX
  • Winfingerprint: A Win32 Host/Network Enumeration Scanner
  • TCPTraceroute: A traceroute implementation using TCP packets
  • Shadow Security Scanner: A commercial vulnerability assessment tool
  • pf: The innovative packet filter in OpenBSD
  • LIDS: A Linux kernel intrusion detection/defense system
  • hfnetchk: Microsoft tool for checking the patch status of all the Windows machines on a network from a central location
  • etherape: A graphical network monitor for Unix modeled after etherman
  • dig: A handy DNS query tool that comes free with Bind
  • Crack / Cracklib: Alec Muffett's classic local password cracker
  • cheops / cheops-ng: Gives a simple interface to many network utilities, maps local or remote networks and identifies OS of machines
  • zone alarm: Windows Personal firewall software. They offer a limited free version, but much of the functionality is disabled. Some users prefer Kerio Personal Firewall, which also sports free and commercial versions.
  • Visual Route: Obtains traceroute/whois data and plots it on a World map
  • The Coroner's Toolkit (TCT): A collection of tools that are either oriented towards gathering or analyzing forensic data on a Unix system
  • tcpreplay: a tool to replay saved tcpdump or snoop files at arbitrary speeds
  • snoop: A well-known gangsta rapper (Snoop Dogg)! It is also a network sniffer that comes with Solaris.
  • putty: An excellent Windows SSH client
  • pstools: A suite of free command-line tools for managing Windows systems (process listings, command execution, etc)
  • arpwatch: Keeps track of ethernet/ip address pairings and can detect certain monkey business
신고

'리눅스 서버 > Security' 카테고리의 다른 글

denyhosts 설치  (0) 2010.02.22
리눅스 관리자가 알아두어야할 50가지  (0) 2010.02.05
insecure.org이 선정한 75개 고급 보안툴  (2) 2010.02.05
SSH Brute-force 공격 분석  (0) 2010.02.05
rkhunter 체크 보고서 cron 작업화 하기  (0) 2010.01.31
Chrootkit  (0) 2010.01.31
  1. moncler online 2013.01.04 15:23 신고

    La Banque mondiale a annoncé samedi que son président Robert Zoellick effectuerait une visite de quatre jours en Inde à partir de lundi, http://www.moncleroutletespain.com/ http://www.moncleroutletespain.com/. Durant son séjour, il rencontrera notamment le Premier ministre Manmohan Singh, le ministre des Finances Pranab Mukherjee et des responsables de la Commission du Plan, http://www.moncleroutletespain.com/ moncler outlet, a indiqué l'institution internationale dans un communiqué, http://www.moncleroutletespain.com/ moncler. Son objectif est "d'avoir une meilleure compréhension de la fa, http://www.moncleroutletespain.com/ moncler españa?on dont la Banque Mondiale pourrait aider l'Inde à remplir ses objectifs de développement à l'approche du 12e plan quinquennal", précise le communiqué, http://www.moncleroutletespain.com/ moncler online. Les discussions avec les responsables gouvernementaux porteront également sur les préparations des prochaines réunions du G20, http://www.moncleroutletespain.com/ moncler chaquetas, a ajouté la Banque Mondiale.Related articles:


    http://kakeo.tistory.com/85 http://kakeo.tistory.com/85

    http://dokim.tistory.com/category/?page=6 http://dokim.tistory.com/category/?page=6

  2. moncler chaquetas 2013.01.05 17:12 신고

    Le ministère égyptien de l'Intérieur a diffusé mercredi soir une photo reconstituée du visage d'un inconnu soup, http://www.moncleroutletespain.com/ moncler?onné d'être le kamikaze à l'origine de l'attentat qui a fait 21 morts devant une église d'Alexandrie (nord de l'Egypte) la nuit du Nouvel an, http://www.moncleroutletespain.com/ moncler outlet. Politique Dominique Paillé privé de son poste de porte-parole de l'UMP Politique Dominique Paillé éconduit de son poste de porte-parole de l'UMPRelated articles:


    http://chocomlab.tistory.com/29 http://chocomlab.tistory.com/29

    http://tamassran.tistory.com/1745 http://tamassran.tistory.com/1745


-- 이글은 HOSTWAY korea cert의 분석을 퍼온글입니다. --

 

 

 SSH Brute-force 공격 분석

 

 최근 들어서 리눅스 서버의 secure 로그나 Abuse 메일들을 확인해 보


 면 일정한 ID를 이용해서 ssh 접속 시도를 하는 것을 볼수가 있다.


 이런 공격은 brute-force(무차별 공격)로서, 패스워드 사전 파일을 이용


 해서 미리 지정한 아이디와 대입하여, 접속 계정을 알아 내는 해킹 방법이다.


 brute-force 공격은 관리자만 부지런 하면 막을수 있는 공격이다.


 아래 예는 대표적인 ssh brute-force 공격툴이 어떤 방식으로 동작을
 

 하는지 실제 구현을 통하여 알아 보았다.

 


 

 아래는 ssh scan tools의 소스코드 로서, 이미 공개된 소스코드 이지만
 

 악의적으로 / 혹은 테스트를 하고자 하다가 잘못해서 다른 네트웍을 스

 캔하면 문제가 발생할수 있으므로 전체를 공개하지는 않았다.

 

 

  <소스 코드 >
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
int flag;
int where;
int shell(SSH_SESSION *session){
struct timeval tv;
int err;
char cmd[]="uname -r -s₩n";
char rd[2048];
BUFFER *readbuf=buffer_new();
time_t start,acum;
....... 중략 .......
checkauth("test","test",buff);
checkauth("guest","guest",buff);
checkauth("admin","admins",buff);
checkauth("admin","admin",buff);
checkauth("user","user",buff);
checkauth("root","password",buff);
checkauth("root","root",buff);
checkauth("root","123456",buff);
checkauth("test","123456",buff);
checkauth("root","
!@#$%^&*",buff);
checkauth("root","*",buff);
checkauth("root","000000",buff);
.......... 중략 .........
numforks++;
if (numforks > maxf)
for (numforks; numforks > maxf; numforks--)
wait(NULL);
}
}
}

 

 

소스코드를 컴파일 하여,실행파일을 파일을 생성하고/Victim Server


로 만들어 놓은 서버에 대해서 ssh brute-force 공격을 시도하였다.

그림 <1-1>은 실행 파일을 실행하는 도중에 한 계정에 대한 공격 성공

을 나타내고 있다.

그림 <1-2>는 Victim 서버의 secure 로그에 남는 로그 로서, 빨간색

테두리에는 해당 계정에 대해서 패스워드 접근이 허가되었다는 내용이

나오고 있다.

이렇게 됨으로써, 공격자는 Victim 서버에 대한 접근 권한을 취득하게

되었고,자연스럽게 서버에 접속 할수 있게 되었다.

만일 Victim 서버가 커널등 패키지 들을 제대로 패치를 하지 않은 서버

라면, root 권한까지 빼앗기는 것은 시간 문제이며, Victim 서버는 다른

서버를 공격하게 되는 중계 서버가 되어 버리게 될것이다.

 

이렇게 됨으로써, 공격자는 Victim 서버에 대한 접근 권한을 취득하게

되었고,자연스럽게 서버에 접속 할수 있게 되었다.

만일 Victim 서버가 커널등 패키지 들을 제대로 패치를 하지 않은 서버

라면, root 권한까지 빼앗기는 것은 시간 문제이며, Victim 서버는 다른

서버를 공격하게 되는 중계 서버가 되어 버리게 될것이다.

 

그렇게 되면 머지 않아 Victim 서버의 관리자는 어느날 외부기관으로부

터 혹은 개인으로부터 Victim 서버가 그들의 서버에 공격 또는 스팸 등

을 보내고 있다는 메일을 받게 될 것이다.

 

 

① 포트를 변경하라.

여러 ssh 공격 코드를 분석해본 결과 포트를 직접 지정하는 공격툴도

있었지만, 대부분은 (위의 공격툴 역시) ssh는 22번으로 고정되어 있

다. 그러므로 ssh 포트를 22번이 아닌 다른 포트로 바꾸는 것만으로도

90% 이상의 공격은 방어할수 있다.

(실제로 ssh를 22번으로 설정해 놓은 서버의 경우에는 수많은 공격로

그가 secure에 쌓여 있었지만, 포트를 변경해 놓은 서버에서는 공격로

그를 찾아 볼수 없었다.)

일반적으로 ssh의 포트를 변경하기 위해서는 /etc/ssh/sshd_config의

#port 22 항목의 주석을 제거 해주고, 22번을 다른 포트 번호로 변경

해 주고, sshd를 restart 해주면 된다.

 

② 패스워드를 변경하라.


부득이 포트를 변경하지 못할 상황이라면, 패스워드를 강력하게 설정

해야 한다. 대부분의 brute-force 공격은 사전(dictionary) 공격이기

 

때문에,영단어와 숫자등으로 구성되어 있다.

(간혹 !@#$%^& 등의 숫자키로 연속되는 패스워드도 등록이 되어 있

다.)

그렇기 때문에 패스워드를 유추할수 없도록 만들면, 해당 ssh 공격에

대해서 안전하다.

강력한 패스워드라는 것은 숫자와 영문자(대/소문자) 그리고 특수문자를

조합하는 방식으로 유추하기는 어렵지만, 외우기는 쉬운 패스워드를 생

성해야 한다.

즉 Kimhoon 이라는 서버 관리자가 자신의 이름으로 패스워드를 만든다

면,다음과 같이 만들 수 있겠다.
                                       

                                          K!mh0oN

 ( 대문자 K, 특수문자 !, 소문자 m, h, 숫자 0, 소문자 o, 대문자 N )

 

외우기 쉬우면서도 대/소문자, 숫자, 특수문자가 모두 들어간 유추하기

어려운 강력한 패스워드가 생성되었다.

이런방식을 이용해서 자신만의 강력한 패스워드를 생성한다면, 비단 이

ssh 공격뿐만 아니라, 일반적인 서버 운영에서도 보안을 향상시킬수가

있다.

 

 

③ 필터링 툴을 사용하라.

tcpwrapper / iptables 등과 같은 필터링 툴로서 ssh에 접속할수 있는

IP를 제한시켜 준다.

 

▷ tcpwrapper
- /etc/hosts.allow와 /etc/hosts.deny를 이용한다.

 /etc/hosts.deny를 vi로 열어서 아래와 같이 설정한 뒤에,

 ------------------

 sshd: ALL (모든 ssh 접속을 막겠다는 의미이다.)

 ------------------

 /etc/hosts.allow를 vi로 열어서 아래와 같이 설정한다.

-------------------
 sshd : 211.239.xxx.xxx 211.239.xxx.xx3

 (ssh 접속에는 211.239.xxx.xxx 와 211.239.xxx.xx3 만이 접속할

 수 있다.)
 

 -------------------

tcpwrapper로 제한을 한뒤에는 반드시 외부에서 연결 테스트를 해

봐야 한다. (허가된곳에서는 정상적으로 접속되는지, 나머지에서는

접속이 되지 않는지 확인 - 테스트가 끝날때까지 현재 서버에 연결

된 터미널은 닫지 않는다.)

 

▷ iptables

- iptables -A INPUT -p tcp -s 211.239.xxx.xxx --dport 22 -j

ACCEPT

위와 같은 방식으로 22번에 접속할수 있는 사용자를 제한해 주면 된

다. (자세한 iptables 사용법은 책/검색엔진을 참고바람)

 

 

④ 방화벽을 사용하라.

위와 같은 방법을 모두 사용할 수가 없다면,방화벽을 사용하면 된다.

방화벽은 이번 공격뿐만 아니라, 현재 알려진 공격에 대해서는 차단을

해줄수 있으므로,서버 보안이 상당히 향상된다.

(다만 어떤 방화벽도 완벽한 것은 없기 때문에,늘 취약점이 발표되면,

관심을 가지고 필요하다면 패치를 시행해야 한다.)

몇가지 방법으로 ssh brute-force 공격에 대비할수 있는 방법을 알아

보았다.

 

이런 공격외에도 네트웍 상에는 엄청나게 많은 공격이 시행되어지고 있

다. 수많은 해커들이 지금도 불특정 다수에 대해서 공격을 시도하고 있

다. 이런 위협으로부터 안전하게 서버를 지키는 길은 주기적인 서버의

패치, 패스워드의 변경, 최신 공격에 대한 정보 수집과 대책이 동시에

마련되어져야 한다.

 

 

< 관련 로그 >

다음은 여러프로그램으로 외부에서 스캔을 했을때 secure에 남는 로그

들이다.

해당 로그를 눈에 익혀두면, 어떤 류의 공격툴에 의한 scan이었는지

확인하는데 도움이 될것이다.

scanssh 라는 프로그램으로 외부 스캔시

#일반 스캔시

#./scanssh 211.239.xxx.xxx

Sep 18 15:28:41 qos1 sshd[317]: scanned from 211.239.xxx.xxx with

SSH-1.0-SSH_Version_Mapper. Don't panic.

#식별 strings을 전송하지 않는 옵션 사용 ( -I )

[root@qos1 test1111]# ./scanssh -I 211.239.xxx.xxx

211.239.xxx.xxx SSH-1.99-OpenSSH_3.1p1

Sep 18 15:27:29 qos1 sshd[32721]: Did not receive identification string

from 211.239.xxx.xxx

 

 

 

sshbsdx 라는 툴로서 스캔/공격시

# ./sshbsdx -l kegos -v 211.239.xxx.xxx

Sep 18 15:31:04 qos1 sshd[366]: input_userauth_request: illegal user

kegos

Sep 18 15:31:04 qos1 sshd[366]: Failed none for illegal user kegos from

211.239.xxx.xxx port 32817 ssh2

Sep 18 15:31:04 qos1 sshd[366]: Failed keyboard-interactive for illegal

user kegos from 211.239.xxx.xxx port 32817 ssh2

Sep 18 15:31:04 qos1 sshd[366]: Failed keyboard-interactive for illegal

user kegos from 211.239.xxx.xxx port 32817 ssh2

Sep 18 15:31:04 qos1 sshd[366]: Connection closed by 211.239.xxx.xxx

bigsshf 툴을 사용해서 스캔/공격시

# ./bigsshf 2

Oct 19 16:28:11 qos1 sshd[32409]: User test not allowed because not

listed in AllowUsers

Oct 19 16:28:11 qos1 sshd[32409]: input_userauth_request: illegal user

test

Oct 19 16:28:13 qos1 sshd[32409]: Failed password for illegal user test

from 211.239.151.21 port 35847 ssh2

Oct 19 16:28:13 qos1 sshd[32409]: Received disconnect from

211.239.151.21: 11: Bye Bye

신고
# rkhunter --cronjob
위 명령은, 일반적으로 명령을 내렸을경우 컬러 레이아웃과 함께 키 입력대기 상태가 되는데 그 두가지 기능을 off 한 모드에서의 체크 명령이다. 따라서, cron 작업시 체크결과를 단일 색상으로 모든 체크(checkall) 내용이 한번에 출력된다. 따라서 위 명령의 결과를 임의의 파일로 저장후 그 파일 내용을 관리자(일반적으로 root)에게로 메일발송을 하면 주기적으로 체크된 결과를 받아 볼수 있게 된다.

우선 최신버전의 rkhunter 를 다운 받아 설치 하여야 겠죠.
http://www.rootkit.nl/projects/rootkit_hunter.html
위사이트에서 최신버전을 다운로드 받아 압축을 푼후 설치 스크립터를 실행만 해주면 설치는 끝납니다.

** 본글 기재당시 최신버전 다운로드 링크
http://downloads.rootkit.nl/rkhunter-1.2.7.tar.gz

--- 적용법 ---

/etc/cron.daily/rkhunter_report.sh 파일 내용에 아래 내용을 추가한후 실행권한(700)을 준다.
=======================================================================================
#/bin/bash
/usr/local/bin/rkhunter --cronjob > /tmp/rkhunter_report.txt
mail -s "RkHunter Check Running Report !!" [관리자메일주소] < /tmp/rkhunter_report.txt
rm -f /tmp/rkhunter_report.txt
=======================================================================================
( [관리자메일주] 대신에 뭘 넣어야 할런진 알죠??? -_-;;;; )
이제, 하루 간격으로 메일 관리자 메일로 rootkit 체크결과를 보고 받을수 있다.
체크 주기나 메일 제목등은, 관리자 입맛에 맞게 바꾸시든지~~~~~~~~~

내용출처 : http://www.nehome.net/

신고

[ Original Document ]



Chkrootkit

2003년 4월 3일

CERTCC-KR / 장윤숙연구원(jys@certcc.or.kr)

 

1. 개요

chkrootkit이란 시스템에 루트킷(rootkit)이 설치되었는지 여부를 손쉽게 체크할 수 있는 프로그램으로 chkrootkit은 일반적인 루트킷뿐 아니라, 커널기반의 루트킷, worm까지도 탐지가 가능하다.

■ chkrootkit에서 탐지 가능한 루트킷 및 worm목록


Solaris rootkit, FreeBSD rootkit, lrk3, lrk4, lrk5, lrk6, t0rn (t0rn v8), Ambient's Rootkit for Linux (ARK), Ramen Worm, rh[67]-shaper, RSHA, Romanian rootkit, RK17, Lion Worm, Adore Worm, LPD Worm, kenny-rk, Adore LKM, ShitC Worm, Omega Worm, Wormkit Worm, dsc-rootkit, RST.b, duarawkz, knark LKM, Monkit, Hidrootkit, Bobkit, Pizdakit, Showtee, Optickit, T.R.K, MithRa's Rootkit, George, SucKIT, Scalper Worm, Slapper Worm, OpenBSD rk v1, Illogic, SK rootkit, sebek LKM, Romanian rootkit, LOC rootkit.

■ 루트킷(rootkit)이란


공격자가 해킹에 성공한 후 다음번 침입을 쉽게 하기 위해 백도어 및 트로이잔 프로그램을 설치하는데 이런 프로그램들을 루트킷이라고 한다. 

루트킷에 포함되는 프로그램으로는 ps, ls, netstat, login등의 시스템 프로그램들이 있는데, 이런 루트킷은 시스템에 원래 있었던 프로그램들과 바꿔치기 되서 관리자가 시스템을 점검해도 이상 없게 보이도록 하고 공격자의 행동을 숨기기도 한다. 
예를 들어 ps, ls를 바꿔치기해서 공격자가실행한 프로세스나 설치한 파일들을 확인할수 없도록 하는 것이다. 

요즘은 이런 일반적인 루트킷들이 관리자들에 의해 쉽게 탐지되자 자신의 흔적을 보다 완벽하게 감추기 위해 커널기반의 루트킷을 설치하는데, 커널기반의 루트킷은 현재 실행되고 있는 커널에 공격자가 만든 커널모듈을 적재해서 시스템 함수의 정상적인 실행을 바꾸는 방법이다. 커널루트킷에 대한 자료는 아래를 참고하기 바란다.

커널기반 루트킷 분석 보고서

■ 지원 시스템


Linux 2.0.x, 2.2.x, 2.4.x 
FreeBSD 2.2.x, 3.x, 4.x 
OpenBSD 2.x and 3.x 
NetBSD 1.5.2 
Solaris 2.5.1, 2.6 , Solaris 8


2. Chkrootkit 설치

■ Chkrootkit 다운받기 

http://www.chkrootkit.org에서 freeware로 다운받을수 있다.

(여기서는 2003년 4월 현재 가장최신버전인 chkrootkit-0.39a을 Linux 7.2환경에서 설치하는 것으로 한다. )

■ 압축풀기 

다운로드받은 압축 파일을 푼다.


# tar -xzvf chkrootkit.tar.gz
chkrootkit-0.39a/
chkrootkit-0.39a/COPYRIGHT
chkrootkit-0.39a/Makefile
chkrootkit-0.39a/README
chkrootkit-0.39a/README.chklastlog
chkrootkit-0.39a/README.chkwtmp
chkrootkit-0.39a/check_wtmpx.c
chkrootkit-0.39a/chkdirs.c
chkrootkit-0.39a/chklastlog.c
chkrootkit-0.39a/chkproc.c
chkrootkit-0.39a/chkrootkit
chkrootkit-0.39a/chkrootkit.lsm
chkrootkit-0.39a/chkwtmp.c
chkrootkit-0.39a/ifpromisc.c
chkrootkit-0.39a/strings.c
chkrootkit-0.39a/ACKNOWLEDGMENTS

압축을 풀면 chkrootkit-0.39a 디렉토리가 생성된다.


# ls -alct|more
total 152
drwxr-xr-x 2 1000 1000 4096 Apr 2 19:28 .
drwx------ 3 jys jys 4096 Apr 2 19:28 ..
-r--r--r-- 1 1000 1000 2985 Apr 2 19:28 ACKNOWLEDGMENTS
-r--r--r-- 1 1000 1000 7191 Apr 2 19:28 check_wtmpx.c
-r--r--r-- 1 1000 1000 6680 Apr 2 19:28 chkdirs.c
-r--r--r-- 1 1000 1000 7746 Apr 2 19:28 chklastlog.c
-r--r--r-- 1 1000 1000 4976 Apr 2 19:28 chkproc.c
-rwxr-xr-x 1 1000 1000 59470 Apr 2 19:28 chkrootkit
-r--r--r-- 1 1000 1000 553 Apr 2 19:28 chkrootkit.lsm
-r--r--r-- 1 1000 1000 1945 Apr 2 19:28 chkwtmp.c
-r--r--r-- 1 1000 1000 1343 Apr 2 19:28 COPYRIGHT
-r--r--r-- 1 1000 1000 3358 Apr 2 19:28 ifpromisc.c
-r--r--r-- 1 1000 1000 1421 Apr 2 19:28 Makefile
-r--r--r-- 1 1000 1000 11279 Apr 2 19:28 README
-r--r--r-- 1 1000 1000 1323 Apr 2 19:28 README.chklastlog
-r--r--r-- 1 1000 1000 1292 Apr 2 19:28 README.chkwtmp
-r--r--r-- 1 1000 1000 2437 Apr 2 19:28 strings.c
-r--r--r-- 1 1000 1000 11279 Apr 2 19:28 README

■ 컴파일 하기

설치는 make sense 명령어를 치면 아래와 같이 컴파일 과정을 거치는 것으로 쉽게 완성할 수 있다.


# make sense
gcc -DHAVE_LASTLOG_H -o chklastlog chklastlog.c
gcc -DHAVE_LASTLOG_H -o chkwtmp chkwtmp.c
gcc -DHAVE_LASTLOG_H -o ifpromisc ifpromisc.c
gcc -o chkproc chkproc.c
gcc -o chkdirs chkdirs.c
gcc -o check_wtmpx check_wtmpx.c
gcc -static -o strings strings.


■ Chkrootkit 사용하기

Chkrootkit은 루크권한에서 사용하여야만 하며, chkrootkit-0.39a 디렉토리에서 ./chkrootkit 만으로 실행할 수 있다. 

실행하면 아래와 같이 점검해서 결과를 알려준다.




# ./chkrootkit
ROOTDIR is `/'
Checking `amd'... not found
Checking `basename'... not infected
...(생략)
Searching for LPD Worm files and dirs... nothing found
Searching for Ramen Worm files and dirs... nothing found
Searching for Maniac files and dirs... nothing found
Searching for RK17 files and dirs... nothing found
Searching for Ducoci rootkit... nothing found
Searching for Adore Worm... nothing found
Searching for ShitC Worm... nothing found
Searching for Omega Worm... nothing found
Searching for Sadmind/IIS Worm... nothing found
...

■ 옵션

전체를 다 점검하지 않고 일부분만을 하고 싶은 경우 옵션을 사용할 수 있는데, 아래의 리스트중 몇 개를 정해 할 수도 있다.


aliens asp bindshell lkm rexedcs sniffer wted scalper slapper z2 amd basename 
biff chfn chsh cron date du dirname echo egrep env find fingerd gpm grep 
hdparm su ifconfig inetd inetdconf identd killall ldsopreload login ls lsof mail 
mingetty netstat named passwd pidof pop2 pop3 ps pstree rpcinfo rlogind 
rshd slogin sendmail sshd syslogd tar tcpd tcpdump top telnetd timed traceroute 
w write


옵션의 예를 들어 보면 ps, ls 바이너리 파일만이 트로이잔으로 바뀌었는지 확인하고 싶으면 아래와 같이 하면 된다.


# ./chkrootkit ps ls 
ROOTDIR is `/'
Checking `ps'... not infected
Checking `ls'... not infected


또한 해킹당한 시스템의 disk를 떼어다가 다른 시스템에서 점검할 수도 있는데 이때는 -r옵션을 쓰면 된다. 


# ./chkrootkit -r /mnt


■ 메시지 해석

chkrootkit으로 점검했을 때 나오는 메시지는 아래와 같다. 


infected
루트킷으로 변형되었음을 말하는 것이다.
not infected
어떤 루트킷의 증후를 발견하지 못했다.
not tested
점검이 수행되지 못했다.
not found
점검한 command가 없을 때

■ 트로이잔으로 변경되었을 때 조치 방법

시스템이 해킹을 당해 공격자가 루트권한을 획득하였을 가능성이 높으므로 트로이잔으로 변경된 명령어들을 찾아 원래 것으로 바꿔 줄 수 있으나 가장 안전한 방법으로는 시스템을 재설치하고 관련 취약점등을 패치하고, 불필요한 서비스등을 중지하는 등의 조치를 취해 시스템을 안전하게 한 후 사용 하는 것이 바람직하다.

해킹당한 시스템에서 공격툴이나 백도어등 보다 자세한 분석을 위해서는 다음의 문서를 참고하기 바란다.

신고

'리눅스 서버 > Security' 카테고리의 다른 글

SSH Brute-force 공격 분석  (0) 2010.02.05
rkhunter 체크 보고서 cron 작업화 하기  (0) 2010.01.31
Chrootkit  (0) 2010.01.31
리눅스보안 - 필수 보안 조치법  (0) 2010.01.31
리눅스 해킹여부 간단히 알아보기  (0) 2010.01.31
logwatch 설치 및 설정  (0) 2010.01.30

리눅스보안 - 필수 보안 조치법



1. SUID 점검하기.(root 소유의 SetUID및 SetGID 파일들 점검


    find / -user root -perm -4000 -print (SetUID)

    find / -user root -perm -2000 -print (SetGID)

    find / -user root -perm -4000 -print -xdev


2. 파티션별 디스크사용량 점검

    df -h


3. 파일무결성 점검.


    http://weblog.websea.co.kr/tripwire/tripwire


4. 백도어 설치여부 점검.(/dev 체크 및 rootkit 점검)


    find /dev -type f -exec ls -l {} \;

    ./chkrootkit

    

5. 현재 열려진 포트 및 응답가능한 포트 점검.


    netstat -atp | grep LISTEN (사용 프로토콜 : TCP인가? 또는 UDP인가?

           사용중인 포트번호

           서버와 연결된 IP 및 도메인명

           생성 PID

           서비스중인 프로세스명

           현재 응답가능상태인가?

    lsof | grep LISTEN(현재 서비스 중인 프로세스명(데몬명)

               현재 생성중인 PID번호.

           현재 서비스중인 프로세스의 소유자

           프로토콜 버전 : Ipv4 또는 Ipv6

           TCP 또는 UDP의 여부

           응답가능 상태인가?


6. 실생중인 프로세스 및 데몬점검.(프로세스의 생성관계)


    pstree


7. 시스템 운용상황 점검.


   top -d2


8. 백업점검.


   /home2/backup/nexfor/

   /home2/backup/websea/


9. 스팸메일 점검.(메일큐 디렉토리 점검)


  /var/spool/mqueue    (동일한 날짜, 동일한 사이즈를 가진 다수 파일구분)


10. Core 점검.


 서버내에 긴급한 이상이 발생하였을 경우나 시스템의 정확한 분석을 위해

 서버의 메모리 상태를 순간적으로 dump 받는 경우의 파일

  find / -name core -exec ls -l {} \;

  

11. 파일용량 점검


 repquota -av -ag

 df -h


12. 최근 서버 접속자 점검.


  vi /var/log/secure

  last -n 10  최근 10번째까지의 접속기록을 확인.


13. 계정별 최후접속기록 점검.


           lastlog는 현재 /etc/passwd에 존재하는 모든 계정을 대상으로 하

여 언제 마지막으로

           서버에 접속을 했는가를 확인.

           Mail, adm, bin 등의 계정들은 모두 "** Never logged in **" 이라

고 되어 있는것이 정상.


  lastlog


14. 현재 서버접속자 보기


   w (telnet)

   ftpwho(ftp)


15. root명령어 사용기록 점검.


           vi /root/.bash_history  (.set nu) 

           cat /root/..bash_history | wc -l    (1000라인 이상 되어야 정상)


16. 계정별 사용명령어파일 점검.


           find / -name .bash_history -exec ls -l {} \;    (각 계정

별 .bash_history 파일의 존재여부)

           find / -name .bash_history -exec cat {} \;     (파일의 내용까

지 모두 확인해 볼 수 있음)


17. root소유자 점검(UID와 GID가 0인 사용자 점검)


           cat /etc/passwd | grep 0:0


18. 서버내에 중요한 디렉토리 점검


           /etc/xinetd.d/    (xinetd로 서비스되는 인터넷서비스 파일들이 존재하는 디렉토리)

           /etc/rc.d/           (부팅에 관계된 파일) (파일들을 복사 후 파일용량등을 비교하기) (커널패닉의원인)

           /etc/rc.d/init.d/ (부팅시에 특정 서비스나 데몬들을 시작시키는 스키립트 파일)


19. .rhosts 파일 점검


           원격에서 패스워드등의 확인과정없이 바로 접속하기 위해서 사용되는 파일

           

           find / -name .rhosts -exec ls -l {} \;

           find / -name .rhosts -exec cat {} \;


20. 메모리사용량 점검.


           free -m

           cat /proc/meminfo   (free 와 top 는 이 파일을 참조하여 보여준다.)

           top -d2


21. 중요 관리자용명령어 점검.


           아래의 명령어들을 퍼미션을 100으로 설정한다. 변경 후 퍼미션 변경여부를 확인.

           

           chmod 100 /usr/bin/top

           chmod 100 /usr/bin/pstree

           chmod 100 /usr/bin/w

           chmod 100 /bin/ps

           chmod 100 /usr/bin/who

           chmod 100 /usr/bin/find

           chmod 100 /bin/df

           chmod 100 /bin/netstat

           chmod 100 /sbin/ifconfig

           chmod 100 /usr/sbin/lsof

           chmod 100 /usr/bin/make

           chmod 100 /usr/bin/gcc

           chmod 100 /usr/bin/g++

           chmod 100 /usr/bin/c++


22. su 명령어를 이용한 root권한 사용자 점검.


           su 명령어의 사용내역을 확인할 수 있음.


           cat /var/log/messages | grep root


23. 최근 n 일전 변경된 파일 점검. (단위는 일)


           find / -ctime -1 -print | more


24. http://weblog.websea.co.kr/


25. find 를 이용한 특정파일 점검하기.


           .exec 파일찾기

           find / -name '.exec' -exec cat {} \; -print


           .forward 파일체크

           find / -name '.forward' -exec cat {} \; -print


           write 퍼미션이 있는 파일(디렉토리)찾기

           find / -type f  \( -perm -2 -o -perm -20 \) -exec ls -lg {} \;

           find / -type d \( -perm -2 -o -perm -20 \) -exec ls -ldg {} \;


           SteUID SetGID 체크하기

           find / -type f \( -perm -004000 -o -perm -002000 \) -exec ls -

lg {} \;


           /dev 체크

           find /dev -type f -exec ls -l {} \;


           소유자없는 파일 및 디렉토리 찾기

           find / -nouser -o -nogroup -print


           원격리모트 접속허용 파일(.rhosts)찾기

           find / -name .rhosts -print


           최근 변경된 파일들 찾기.(파일or디렉토리) 단위는 일

           find / -ctime -20 -type f or d


           현재 서버에서 열려진 포트 및 접근저보 점검


           netstat -an | grep LISTEN   (포트들과 열결되어 있는 실행데몬들을 확인)

           lsof | grep LISTEN   (좀 더 자세히 확인)


26. 관리자용 명령어 퍼미션 수정하기.


           chmod 100 /usr/bin/top

           chmod 100 /usrbin/pstree

           chmod 100 /usr/bin/w

           chmod 100 /bin/ps

           chmod 100 /usr/bin/who

           chmod 100 /usr/bin/find

           chmod 100 /bin/df

           chmod 100 /bin/netstat

           chmod 100 /sbin/ifconfig

           chmod 100 /usr/sbin/lsof

           chmod 100 /usr/bin/make

           chmod 100 /usr/bin/gcc

           chmod 100 /usr/bin/g++

           chmod 100 /usr/bin/c++


27. 중요한 파일퍼미션과 소유권 제한 및 점검.


           chmod 644 /etc/service

           chmod 600 /etc/xinetd

           chmod 644 /etc/mail/aliases

           chmod 600 /etc/httpd/conf/httpd.conf

           chmod 644 /var/log/wtmp

           chmod 644 /var/run/utmp

           chmod 644 /etc/motd

           chmod 644 /etc/mtab

           chmod 600 /etc/syslog.conf

           

           /etc, /usr/etc, /bin, /usr/bin, /sbin, /usr/sbin


           chmod 1777 /tmp

           chmod 1777 /var/tmp

           

28. umask 값 확인하기.


           root의 umask 값 확인하기.

           umask

           022 -->파일은 644 디렉토리는 755로 생성됨.

           027 -->파일은 640 디렉토리는 750로 생성됨.


29. /dev 에 device 파일 이외의 것이 존재하고 있는지 확인.


           find /dev -type f -exec ls -l {} \;


30. 일반사용자의 명령어 패스


           /usr/local/bin:usr/local/mysql/bin:/home/hosting/bin/

           일반사용자가 사용가능한 명령어를 모두 이것에 둠.


31. 관리자의 명령어 패스


           :/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin


           /X11:/usr/X11R6/bin:/usr/kerberos/bin:/root/bin


32. 특정 그룹만의 su 사용권한 허용하기


           vi /etc/group  (wheel구릅에 su 사용권한을 가질 유저 추가하기)

           wheel:x:10:root,cream


           vi /etc/pam.d/su (두줄 추가하기)


           auth            sufficient            /lib/security/pam_rootok.so

           auth            required                        /lib/security/pam_wheel.so allow group=wheel


           vi /var/log/message 에서 확인


33. chmod 400 /etc/shadow


34. 시스템 기본로그파일.


           /var/log/messages

           /var/log/secure

           /var/log/wtmp

           /var/run/utmp

           /var/log/lastlog


35. utmp, wtmp, lastlog 파일


           utmp파일 : 현재시스템에 접속해 있는 사용자의 정보를 가지고 있음.

           

           strings utmp | more

           

           정보 이용 명령어

           login(1), who(1), init(8), last(8), lastcomm(8)


           wtmp파일 : 처음부터 접속했던 모든 사용자의 로그인정보와 로그아웃정보를 가지고 있음.


           strings wtmp | more


           정보 이용 명령어

           login(1), who(1), init(8), last(8), lastcomm(8)


           lastlog 파일


           가장 최근에 로그인한 정보를 저장함.


           last 라는 명령어로 확인할 수 있음.


36.  패스워드 유출대처방안(웹)


           perl을 이용한 방법.



   AllowOverride FileInfo AuthConfig Limit

   Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec

   Options Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI

   Options Indexes SymLinksIfOwnerMatch IncludesNoExec

   

       Order allow,deny

       Allow from all

   

   

       Order deny,allow

       Deny from all

   



           SSI의 exec 명령어를 이용하는 방법


#    AddType text/html .shtml

#    AddHandler server-parsed .shtml


27. PortSentry를 이용한 실시간 해킹방어 구현.(잘못 사용할시 서버접속 안됨)


           tar -xvzf portsentry-1.1.tar.gz

           make linux

           make install


           /usr/local/psionic/portsentry/portsentry -tcp

           /usr/local/psionic/portsentry/portsentry -udp

           /usr/local/psionic/portsentry/portsentry -stcp

           /usr/local/psionic/portsentry/portsentry -atcp

           /usr/local/psionic/portsentry/portsentry -stdp


           vi /etc/hosts.deny 점검.


28. Chkrootkit 로 백도어 점검.


           tar -xvzf chkrootkit.tar.gz

           make sense

           ./chkrootkit     (점검명령어)


29 ping 을 이용한 DOS 공격 막는 방법.


           vi  /etc/sysctl.conf

           net.ipv4.icmp_echo_ignore_broadcasts = 1


           sysctl -w

           /etc/rc.d/init.d/network restart

           sysctl -a | grep ignore_broadcasts


30. Nmap를 이용 포트스켄 하여 해킹가능성 체크.


           nmap -sS -p80 211.42.48.110 -O -v www.armian.net

           nmap -sS -O -v 211.42.48.114





출처 : IT네트워크정보보안교육센터


신고

'리눅스 서버 > Security' 카테고리의 다른 글

rkhunter 체크 보고서 cron 작업화 하기  (0) 2010.01.31
Chrootkit  (0) 2010.01.31
리눅스보안 - 필수 보안 조치법  (0) 2010.01.31
리눅스 해킹여부 간단히 알아보기  (0) 2010.01.31
logwatch 설치 및 설정  (0) 2010.01.30
ssh bruteforce 공격 차단  (0) 2010.01.27

출처: 해커즈뉴스

1. vi /var/log/messages 확인

 

2. ls -alR /tmp 나 ls -alR /var/tmp로 /tmp 디렉토리의 숨겨진 폴더 확인

 

3. /etc/passwd, /etc/shadow파일 확인

 /etc/passwd 파일에서 uid가 0이거나 불법적인 새로운 계정이 있는지 확인한다.
 /etc/shadow 파일에서 암호가 없는 계정이 있는지 확인한다.

 

4. 열린 포트 확인

 ps -ef나 netstat -an으로 현재 연결되어 있는 상태를 점검한다.
 nmap등의 스캔프로그램으로 열린포트 확인
 lsof로 확인(lsof는 System에서 돌아가는 모든 Process에 의해서 Open된 파일들에 대한 정보를 보여주는 프로그램)

 

5. rkhunter 설치

http://downloads.rootkit.nl/rkhunter-1.2.7.tar.gz
tar zxf rkhunter-1.2.7.tar.gz
cd rkhunter
./installer.sh
rkhunter -c

 

6. bind 버전 확인

rpm -q bind

 

7. setuid나 setgid파일 확인

setuid를 가지는 실행 프로그램은 실행도중에 슈퍼유저(root)의 권한을 가지고 실행되므로 find를 이용하여 setuid나 setgid 파일이 있는지 확인한다.

 find / -user root -perm -4000 -print>suidlist
 find / -user root -perm -2000 -print>sgidlist

 

8. find /dev -type f -print
(/dev 밑에 일반파일이 있는지 찾음->원래 dev밑에는 일반화일이 있으면 안됨)

* fc3 이후에는 /dev내에 /udev관련 파일이 존재함

 

9. rpm 변조 여부 체크

rpm -Va | grep ^..5


신고

'리눅스 서버 > Security' 카테고리의 다른 글

rkhunter 체크 보고서 cron 작업화 하기  (0) 2010.01.31
Chrootkit  (0) 2010.01.31
리눅스보안 - 필수 보안 조치법  (0) 2010.01.31
리눅스 해킹여부 간단히 알아보기  (0) 2010.01.31
logwatch 설치 및 설정  (0) 2010.01.30
ssh bruteforce 공격 차단  (0) 2010.01.27

+ Recent posts

티스토리 툴바