시스템이야기2008. 7. 28. 21:23
2주전의 일인 것 같다. 문득, 리눅스에서는 인터페이스명이 eth0, eth1 처럼 사용하는데, 반드시 eth로 시작해야할까라는 생각이 들었다. 서버에 있는 2개의 랜카드중 하나만 설정을 변경해봤다. /etc/sysconfig/network-scripts/ifcfg-eth1을 ifcfg-coffeenix0을 변경하고, 설정값 중 DEVICE=coffeenix0로 설정한 다음 리부팅했다. (CentOS 기준)

DEVICE=coffeenix0
BOOTPROTO=static
BROADCAST=192.168.XX.XXX
HWADDR=00:0F:XX:XX:XX:XX
IPADDR=192.168.XX.XXX


아~ 임의로 인터페이스명을 지정해도 된다.

# ifconfig
coffeenix0 Link encap:Ethernet  HWaddr 00:0F:XX:XX:XX:XX
          inet addr:192.168.XX.XXX  Bcast:192.168.XX.XXX  Mask:255.255.XXX.XXX
          inet6 addr: ...생략.../64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:13 errors:0 dropped:0 overruns:0 frame:0
          TX packets:453 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:832 (832.0 b)  TX bytes:47862 (46.7 KiB)
          Interrupt:217
eth0      Link encap:Ethernet  HWaddr 00:0F:XX:XX:XX:XX
... 생략 ...

'그럼 변경해서 뭐하냐? 쓸모 없는 것 같고...'라고 한다면, 인터페이스명을 보고 직관성을 높일 수 있다. 미러링을 하는 포트라면 mir0 처럼 인터페이스를 설정하면 보다 직관적으로 확인이 가능할 것 같다. 랜카드가 3개이상이고, 그 중 하나는 meta data 통신용이라면 meta0처럼 지정하면 보다 쉽게 알 수 있을 것이다. 참고로 ifcfg-eth1 파일명을 그대로 두고 안의 DEVICE= 설정만 변경해도 된다. 단지 파일명은 직관적으로 보기위한 용도일뿐이다.

주의할 것은 몇몇 프로그램은 eth로 시작하지 않는 것은 인식하지 못할 수도 있다는 것. mii-tool은 eth0~eth7의 인터페이스만 자동으로 체크하므로 다른 인터페이스일 경우 별도로 지정해줘야 한다. sysctl로 'net.ipv4.conf.인터페이스명' 설정시 인터페이스별로 설정하여  사용해왔다면 이부분도 수정이 필요하다.

# mii-tool
eth0: negotiated 100baseTx-FD, link ok
# mii-tool coffeenix0
coffeenix0: negotiated 100baseTx-FD, link ok

고정관념이 무섭다. ^^

Posted by 좋은진호
시스템이야기2008. 6. 9. 23:10
아파치 웹서버에는 UseCanonicalName 이라는 옵션이 있다. 이 옵션은 CGI나 php등에 SERVER_NAME과 SERVER_PORT변수값을 넘길 때, 어떤값을 넘길 것인지 결정한다. On으로 설정되어 있을 경우는 아파치의 ServerName으로 지정한 값이 넘겨지고, Off로 설정되어 있을 경우는 클라이언트가 요청한 호스트명과 포트명이 넘겨진다.

이런 경우를 가정해보자. www.coffeenix.net 로 서비스되는 서버가 5대라고 하고, 각 5대의 서버는 w101~w105.coffeenix.net 이름을 갖고 있다.

ServerName www.coffeenix.net

위처럼 설정되어 있을 때 On과 Off의 차이를 확인홰보자. 유저가 브라우저에서 w101.coff...를 요청했을 때이다.

다음은 On으로 설정한 경우이며, ServerName에 설정된 호스트명이 출력된다.
사용자 삽입 이미지

Off으로 설정한 경우이며, 브라우저에서 요청한 호스트명이 출력된다.
phpinfo _SERVER변수

UseCanonicalName 옵션은 아피치 1.3에선 기본값이 On으로, 2.x대(2.0, 2.2)는 Off로 되어 있다. 기본값의 차이가 있으니 반드시 ServerName에서 지정한 호스트명이 나와야할 경우 주의가 필요하다. 다음은 아파치 웹서버의 httpd.conf 일부다.

[ 아파치 1.3.x의 httpd.conf ]
# UseCanonicalName:  (new for 1.3)  With this setting turned on, whenever
# Apache needs to construct a self-referencing URL (a URL that refers back
# to the server the response is coming from) it will use ServerName and
# Port to form a "canonical" name.  With this setting off, Apache will
# use the hostname:port that the client supplied, when possible.  This
# also affects SERVER_NAME and SERVER_PORT in CGI scripts.
#
UseCanonicalName On

[ 아파치 2.2.x의 httpd-default.conf ]
# UseCanonicalName: Determines how Apache constructs self-referencing
# URLs and the SERVER_NAME and SERVER_PORT variables.
# When set "Off", Apache will use the Hostname and Port supplied
# by the client.  When set "On", Apache will use the value of the
# ServerName directive.
#
UseCanonicalName Off

Posted by 좋은진호
시스템이야기2008. 5. 17. 00:40
.html이나 .js 등의 파일들을 전송할 때 압축해서 보낸다면, 웹페이지 접속시에 약간의 전송속도 향상을 가져올 수 있을 것이다. 요즘 워낙 회선속도가 좋아 그 영향이 미비할 수도 있지만. 주요 포털들과 랭킹 상위 사이트 몇개를 대상으로 gzip 압축 전송을 지원하는지를 체크해봤다. 메인페이지를 기준으로 확인해봤으며, 메인페이지 접속시에 함께 요청되는 페이지도 체크에 포함했다.

gzip 압축 전송 지원여부 체크는 초기에는 직접 Request 헤더에 'Accept-Encoding: gzip, deflate'를 포함해서 만들어 보내고, Response 헤더에 'Content-Encoding: gzip'가 포함되어 있는지를 파악했다. 그러나 정확도가 떨어진데다가 한 페이지에 .css, .js등 여러 request가 있는 경우까지 체크하기 위해서 Fiddler툴을 이용해서 결과를 정리했다.

사용자 삽입 이미지

gzip을 지원하는 사이트들이다.

1. 다음( www.daum.net )
   .html 파일의 gzip 압축 전송을 지원했으며, top-sc.daum.net 의 .js 파일과 top-sc.daum-img.net 의 .xml 파일도 지원한다.

2. 네이버( www.naver.com )
   20bytes의 작은 사이즈도 gzip 압축했으며, .js, .css 파일은 사이즈에 무관하게 압축을 하지 않았다.
   auto.naver.com의 .html 파일, .js 파일, .css 파일의 gzip 압축 전송 지원

3. 네이트( www.nate.com )
   .html 파일, .js 파일, .ico 파일의 gzip 압축 전송을 지원한다. 특이하게 .ico까지 한다. 아니, 일반적인 이미지파일을 제외하고는 확장자에 무관하게 gzip을 지원하는 것일 수도 있다. 300bytes대의 사이즈도 gzip 압축을 했다. 메인페이지의 최소사이즈 파일이 300bytes였으며, 이보다 작은 사이즈의 파일이 있었으면 압축을 지원했을 수 있다. 적용범위를 폭넓게 생각하면, 파일확장자와 사이즈에 무관하게 압축할 가능성이 있다.
   .css파일은 존재하지 않아 gzip 압축 전송 여부 확인할 수 없었다.
   
4. 야후! 코리아( kr.yahoo.com )
   .html 파일의 gzip 압축을 지원한다. .js와 .css는 img.yahoo.co.kr 이미지 웹서버에 존재하는데 .js, .css 파일의 압축을 지원한다.
   adz.kr.yahoo.com 요청 중에 .js 파일의 압축을 지원한다.

5. 싸이월드( www.cyworld.com )
   .asp(.html), .js 파일의 gzip 압축을 지원한다. 31bytes의 작은 사이즈도 압축했으므로, 사이즈 상관없이 압축한다는 의미일 것이다.
   .css는 압축 지원을 하지 않았다.

6. 구글( www.google.co.kr )
   .html, .js, .css 파일의 gzip 압축 전송을 지원한다.

7. Live Search( www.live.com )
   .html 파일의 gzip 압축 전송을 지원한다.

8. MSN Korea( kr.msn.com )
   .html 파일의 gzip 압축 전송을 지원한다.
   stckr.msn.com의 .css 파일, stjkr.msn.com 의 .js 파일의 gzip 압축을 지원하며,
   특이하게도 ads1.msn.com의 js 파일과 stj.msn.com의 .js 파일은 deflate 압축을 지원한다. 아마도 'Footprint 4.2/FPMCP' 캐싱 서버 때문일 것 같다.

위 사이트를 확장자별로 지원 여부를 표시했다.

                 .html       .js       .css       .ico       .xml
다음               O          O          X          X          O
네이버             O          X          X          X          -
네이트             O          O          -          O          -
야후!코리아        O          O          O          X          -
싸이월드          O          O          X          X          -
구글               O          O          O          X          -
Live Search        O          -          -          X          -
MSN Korea          O          O          O          X          -

다음은 지원하지 않는 사이트이다.

엠파스( www.empas.com ), 파란닷컴( www.paran.com ), 드림위즈( www.dreamwiz.com )
Posted by 좋은진호
시스템이야기2008. 4. 23. 23:19
MaxMind의 GeoIP 데이터와 GeoIP apache 모듈을 사용하여, 아파치의 웹로그에 국가코드를 남겨보자.

1. GeoIP C API 설치한다.
2. 그리고, Apache mod_geoip2 모듈을 설치한다. (apache 2.x 기준임)

apache 모듈이 설치된 상태에서 phpinfo() 를 살펴보면, Apache Environment 부분에서 GEOIP_CONTINENT_CODE, GEOIP_COUNTRY_CODE, GEOIP_COUNTRY_NAME환경 변수를 볼 수 있다.
이중에서 GEOIP_COUNTRY_CODE 변수값을 로그에 남기면 된다.

사용자 삽입 이미지

<IfModule geoip_module>
        GeoIPEnable On
        GeoIPDBFile /usr/local/GeoIP/share/GeoIP/GeoIP.dat
</IfModule>

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{Host}i %{GEOIP_COUNTRY_CODE}e" cnxlog

CustomLog logs/access_log cnxlog

위에서 %{변수명}i 형식은 Header중 해당 변수값을 말한다. %{변수명}e 는 환경변수를 의미한다.

%{Host}i : 요청한 호스트명을 로그에 남긴다. 이를테면 하나의 서버에 2개 이상의 도메인을 갖고 있을 때 유용하다.  www.foobar.com, www.foobar.net, foobar.com 등의 도메인이 있을 때 어떤 도메인으로 요청했는지를 남길 수 있게 된다.
%{GEOIP_COUNTRY_CODE}e : GEOIP_COUNTRY_CODE 환경변수, 즉 국가코드를 남긴다.

로그는 다음과 같이 남는다.

125.129.xxx.xxx - - [01/Apr/2008:01:07:15 +0900] "GET /bbs/ HTTP/1.1" 200 29388 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; ko; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13" foobar.com KR
61.243.xxx.xxx - - [01/Apr/2008:01:17:20 +0900] "GET /data/linux_base/editors.html HTTP/1.1" 403 520 "-" "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; DigExt)" foobar.com CN

자세한 것은 커피닉스의 'GeoIP 활용(아파치 웹로그에 국가코드 남기기 외)' 에 정리해뒀다.

Posted by 좋은진호
시스템이야기2008. 3. 7. 22:57
FreeBSD 7.0의 사용기 몇가지를 적어보겠다.

1. make buildworld 시간 : 1시간 2분 (FreeBSD 6.x대와 별반 차이 없음)

2. 차세대 전송 프로토콜인 SCTP를 사용하기 위해서는 커널에서 INET, INET6 모두 define되어 있어야 한다. INET6을 define하지 않고 커널 컴파일을 하면 에러가 발생한다. ( /usr/src/sys/conf/NOTES )

    Note YOU MUST have both INET and INET6 defined.
    you don't have to enable V6, but SCTP is
    dual stacked and so far we have not teased apart
    the V6 and V4.. since an association can span
    both a V6 and V4 address at the SAME time :-)
'INET, INET6가 모두 정의되어 있어야 한다. V6를 enable할 필요는 없다. 그러나 SCTP가 dual stack으로 되어 있어서 지금까지 우리는 V6과 V4를 별도로 분리하지(teased apart) 않았다. (dual-stacked라 분리할 필요가 없었다는 의미) 왜냐하면 SCTP 커넥션(association)은 V6과 V4주소가 동시에 펼쳐지기(span) 때문이다.'
SCTP 에서는 커넥션을 association라고 부르므로, 위의 문장중 'association'은 커넥션으로 이해하면 된다.

3.  TCP 디버깅 로그가 이전 보다 자세하다.

1) 6.x 버전
kernel: Connection attempt to TCP ???.???.???.???:??? from ???.???.???.???:??? flags:0x12
2) 7 버전
kernel: TCP: [???.???.???.???]:80 to [???.???.???.???]:64938 tcpflags 0x12<SYN,ACK>; tcp_input: Connection attempt to closed port
    그리고, Connection attempt 외에 또다른 로그.
kernel: TCP: [???.???.???.???]:21 to [???.???.???.???]:40255 tcpflags 0x18<PUSH,ACK>; tcp_do_segment: FIN_WAIT_2: Received 10 bytes of data after socket was closed, sending RST and removing tcpcb

4. ZFS 파일시스템

/boot/loader.conf 에 다음과 같이 설정하고 리부팅하면, XFS와 ZFS 파일시스템을 사용할 수 있다.
xfs_load="YES"                   # XFS
zfs_load="YES"                   # ZFS

kldstat로 동적링크된 커널모듈(.ko) 목록을 확인해보자.
# kldstat
Id Refs Address    Size     Name
 1    5 0xc0400000 8fb638   kernel
 2    1 0xc0cfc000 81404    xfs.ko
 3    1 0xc0d7e000 b8344    zfs.ko
 4    1 0xc0e37000 6a22c    acpi.ko
#
# kldstat -v
... 생략 ...
 2    1 0xc0cfc000 81404    xfs.ko
        Contains modules:
                Id Name
                 1 xfs
 3    1 0xc0d7e000 b8344    zfs.ko
        Contains modules:
                Id Name
                 2 zfsctrl
                 3 zfs
                 4 zfs_zvol
                 5 zfs_vdev
... 생략 ...

ZFS 사용을 위한 준비는 완료됐다. zfs, zpool 등의 명령으로 ZFS 파일시스템을 만들고 확인해본다.
# zpool create data /dev/da0s1h
# mount
... 생략 ...
data on /data (zfs, local)
# zfs list
NAME   USED  AVAIL  REFER  MOUNTPOINT
data   105K  17.1G    18K  /data

ZFS와 UFS간의 성능테스트와 그 이외의 응용프로그램 등의 성능은 추후 테스트를 해볼 것이다.
덧붙여서 FreeBSD 7 리뷰글과 Live CD로 설치하는 화면을 'Review of FreeBSD 7'에서 볼 수 있다.

※ 시스템 환경 : Dell 1950, CPU 5310 X 2개, 2G 메모리, SAS, No RAID
Posted by 좋은진호
시스템이야기2008. 2. 28. 13:24
FreeBSD logo

http://www.freebsd.org/releases/7.0R/announce.html
http://www.freebsd.org/releases/7.0R/relnotes.html

Dramatic improvements in performance and SMP scalability shown by various database and other benchmarks, in some cases showing peak performance improvements as high as 350% over FreeBSD 6.X under normal loads and 1500% at high loads. When compared with the best performing Linux kernel (2.6.22 or 2.6.24) performance is 15% better.


  • 가장 눈에 띄는 것은 릴리즈 페이지에도 나와 있듯이 드라마틱할 정도로 놀라운 성능향상이다.
  • 실험적이긴 하지만 ZFS 지원. XFS 읽기 기능 가능
  • 저널링(journaling) 지원 (gjournal 툴을 통해서 저널링 설정) (FreeBSD 6.3에도 포함하려고 했으나 다음버전에서 지원될 듯)
  • 차세대 TCP라 불리는 SCTP(Stream Control Transmission Protocol) 프로토콜 지원
          SCTP는 TCP, UDP처럼 전송프로토콜로, 이 둘의 프로토콜이 제공하지 않는 멀티스트리밍과 멀티 호밍(multi homing)을 지원한다. 또한 HTTP 프로토콜에서 전송시 SCTP를 이용한다면 속도를 향상시킬 수 있다.  참고로 SCTP는 Linux kernel 2.6.x에서도 지원하며, 관련툴인 lksctp를 sourceforge에서 받을 수 있다.
          TCP, UDP, SCTP가 전송프로토콜로 같이 공존하다가 미래에 SCTP이 보편화되는 시점이 다가올 것으로 보인다.  이 때 UDP를 대체할 정도로 보편성을 갖게 된다면, 개인적인 생각으론 UDP flooding을 통한 공격은 해결될 시점이 다가올 수도 있다.
  • OpenBSD/NetBSD에서 가져온 네트웍 링크 aggregation과 failover를 위한 인터페이스인 lagg 지원 (FreeBSD 6.3에도 포함됨)

나머지 자세한 내용이나 포함된 프로그램의 버전 정보등에 대해서는 릴리즈 정보를 살펴보기 바란다.

* Down 1 : ftp://ftp.kaist.ac.kr/FreeBSD/ISO-IMAGES-i386/7.0/ (ftp.kr.freebsd.org는 글 쓰는 현재 미러링이 안되어 있음)
* Down 2 : ftp://ftp.jp.freebsd.org/pub/FreeBSD/ISO-IMAGES-i386/7.0/

Posted by 좋은진호
시스템이야기2008. 2. 11. 23:22
리눅스 커널 2.6.17부터 2.26.24.1 까지의 vmsplice() 콜의 버그로 로컬에서 root 권한을 획득할 수 있다. KLDP에도 나와있듯이, milw0rm에는 2개의 local root exploit 코드가 공개되어 있다. 테스트결과 너무 쉽게 root 권한이 획득되었다.

$ uname -r
2.6.18-8.1.8.el5
$ ./exploit
-----------------------------------
 Linux vmsplice Local Root Exploit
 By qaaz
-----------------------------------
[+] mmap: 0x0 .. 0x1000
[+] page: 0x0
[+] page: 0x20
[+] mmap: 0x4000 .. 0x5000
[+] page: 0x4000
[+] page: 0x4020
[+] mmap: 0x1000 .. 0x2000
[+] page: 0x1000
[+] mmap: 0xb7ee1000 .. 0xb7f13000
[+] root
# id
uid=0(root) gid=0(root) groups=501(truefeel)
#

개인사용자나 외부 접근이 제한된 시스템은 그나마 다행인데, 커널 2.6.x을 사용하는 호스팅업체나 공동 사용 서버는 빨리 대처해야할 것이다. 커널 패치를 적용하여 리부팅을 해야할 것이나 재부팅할 수 없는 서버도 있을 것이다. 이 땐 임시 메모리 패치hkpco님의 방어 커널 모듈을 이용하면 된다.

* 관련글


------------------------------------------------------------------
[ 내용 추가 ]

*2.13(수) 현재 RHEL5, Cent5 패치 커널 나옴
http://lists.centos.org/pipermail/centos-announce/2008-February/014684.html
https://rhn.redhat.com/errata/RHSA-2008-0129.html

==================================================================== Package                 Arch       Version          Repository        Size
==================================================================== Installing:
kernel                  i686       2.6.18-53.1.13.el5  updates            13 M
kernel-devel            i686       2.6.18-53.1.13.el5  updates           4.7 M
Updating:
kernel-headers          i386       2.6.18-53.1.13.el5  updates           785 k
====================================================================

Posted by 좋은진호
시스템이야기2008. 1. 26. 03:10
라드웨어에서 준비한 '2008 Radware DDoS 보안 세미나'에 갔다왔다. 평점을 주면 5점만점에 3점 정도. 사례중심의 발표를 기대했지만, 보편적인 내용으로 흘러갔다. 저와 함께 참석했던 커피닉스( http://coffeenix.net/ )의 나머지 다섯분도 같은 의견이다.

생각난김에 DDoS 공격 유형따라 막을 수 있는지 여부를 정리했다.

국내 DDoS공격이 곳곳에서 터지기 시작한 2007년 초반에만 하더라도, DDoS공격을 막을 수 있느냐, 없느냐의 논의가 몇몇 커뮤니티에서 있었다. 그러나 요즘은 막을 수 없는 공격이 주를 이룬다는 것을 잘 알고 있다.

결론적으로는 회선 대역폭을 공격량보다 많이 확보( 보유한 회선 > 공격량 )해야 공격의 주를 이루는 UDP, ICMP flooding 공격을 버텨낼 수 있는 최소한의 조건을 만족한다. 이 때 네트웍장비의 CPU load 가 낮아야만, 사용자는 불편함없이 서비스를 이용하게 될 것이다. 10G, 20G 이상의 공격량이 많을 경우엔, 다른 고객사에게 피해를 주거나 연동망 장애를 가져올 수 있다. 이럴 경우 IDC나 ISP에서 먼저 차단할 것이다. 즉, 서비스 업체의 인프라만으로는 서비스의 완벽보장은 이뤄내기 힘들다.

UDP, ICMP이외에 공격 유형에 따라, 시스템(네트웍, 서버, 보안장비) 인프라가 되면 막을 수 있는 유형도 있다. Radware 세미나에서 제시한 공격유형 6가지 정도를 갖고 살펴보도록 하겠다.

사용자 삽입 이미지

1. HTTP Flood

  웹페이지를 과다하게 호출하여 서버의 load가 높아지거나 처리가능한 커넥션수를 초과하게 만드는 공격이다.
  '웹페이지 과다 호출 방식의 DDoS공격 사례' (글 좋은진호, 2008.1.23)를 참고하기 바란다.
  IPS, L4스위치의 성능, 웹서버의 설정을 통해서 막아 낼 수 있다.

  1) IPS없고, L4스위치도 없다면.
      몇대 안되는 웹서버를 로드밸런싱하고 있는데, 다량의 공격(세션이 몇만이상)이라면 서버 load가 높아져 서비스가 불가능할 것이다.
  2) IPS없고, 성능 좋은 L4스위치. 그리고 몇 십대의 웹서버를 L4에 물려 서비스 한다면.
      이 때는 '웹페이지 과다 호출 방식의 DDoS공격 사례'에 써진 것처럼 막아 낼 수 있는 방법을 찾을 수 있다.
      그러나 몇 십대에 분산되어 서버가 다 받아드리더라도, 세션이 몇만~몇십만의 공격일 때 L4의 처리한계로 서비스가 느려질 수 있다.
  3) IPS있다면, 웹서버의 설정까지 조합해서 가능

2. SYN Flood, TCP Flag Flood, Half-Open Flood

  방화벽, L4스위치(SYN proxy기능을 갖는 L4. 그러나 SYN proxy기능을 이용하려면 DSR구성 방식은 불가능함), IPS등으로 막아낼 수 있다.

3. UDP Flood, ICMP Flood

  초기에 얘기했던 것처럼 공격량보다 많은 회선을 확보하지 못하면 어떠한 장비를 도입하더라도 막아낼 수 없다.  본인의 백본보다 상위단의 백본을 관리하는 곳(IDC, 호스팅 등)에 요청하여 dest. IP를 차단해달라고 요청해야할 것이다.

  작년 초에는 방화벽, ISP의 장비 업체의 실력있는 엔지니어들도 '우리 장비는 막을 수 있을 것 같다.'라고 얘기하는 경우도 있었다. UDP는 포트가 오픈되어 있지 않더라도 백본까지는 UDP 트래픽이 들어온다는 것(백본에서 UDP를 막았을 때)을 알면서도 저렇게 생각하고 있는 경우가 있었다. 요즘은 국내의 DDoS공격이 주위 사람에게만 뒤져봐도 흔하게 일어나는 안타까운 현실 때문에, 업체에서도 저런 얘기를 하는 경우는 줄었을 것이다.

  참고로 UDP는 주로 80포트와 53(DNS) 포트로 공격하지만 이외에 1024이하의 임의로 포트로 공격하는 경우도 있다.

DDoS 대응 장비로 거론되는 것은 다음 3가지 정도일 것이다.

1. 시스코의 Guard & Detector
   - 대규모 사이트에서 위의 2~3번 유형 대처할 때 적합
   - 초기 훈련을 통해 평상시의 트래픽을 인지하는 방식이라서 1번의 유형을 대처할 수도 있다.
      확인해본 적이 없어서 ^^
   - 1G 장비
   - 어플라이언스 제품과 Catalyst 6500시리지의 모듈형이 있다.
2. 라드웨어의 DefensePro(DP)
   - 대규모 사이트에서 1~3번 유형 대처할 때 적합
   - DP6000의 경우 10G모듈이며, 5~6G정도 공격은 커버 가능
3. 기가핀네트웍스의 Slimline, Flowline
   - 소규모 사이트에서 2번 유형을 대처할 때 적합
   - 약간 두꺼운 책 한 권 크기 정도이며, 가격이 저렴하다.
   - 1G UDP모듈만 제공(역시 소규모 사이트를 위한 제품임을 알 수 있음)했으나
     최근에 Flowline 500-F를 통해 광모듈 지원 장비도 나왔다.

시스코장비나 라드웨어 장비가 3번 유형을 막아준다고 표시해뒀는데, 유해한 UDP를 필터로 걸러내고 하위로 보내준다는 의미이지 보유한 회선을 넘는 공격을 막아낸다는 의미는 아니다.

※ 위의 모든 내용은 공격유형의 이름만 세미나에서 뽑아왔을 뿐이지 세미나 내용과는 전혀 무관하다.

세미나 내용중 흥미있는 슬라이드 2장만 올린다.

사용자 삽입 이미지
[ 공격대상 사이트가 시기별로 차이가 있으며 다양하다는 것을 보여줌 ]

사용자 삽입 이미지
[ 공격하겠다는 메일 ]
Posted by 좋은진호
시스템이야기2008. 1. 10. 19:55
apache 웹로그, php 에러로그, syslog를 통한 로그를 모니터링할 때 특정 문자열에 대해서는 highlight해주면 원하는 부분만 쉽게 볼 수 있을 것이다. 또한 수치를 모니터링하는 경우, 0~59는 양호, 60~79 주의, 80~99는 경고를 나타내기위해 각각 녹색, 파란색, 빨간색으로 표시해준다면, 많은 로그가 순간적으로 스크롤되더라도 눈에 쉽게 띌 것이다.
이 글은 highlight 처리를 해주는 1) sed를 이용한 쉘스크립트와 2) 이보다 더 나은 perl 스크립트를 통해 모니터링하는 방법을 설명한다.

1. sed를 이용한 highlight 스크립트

* view.sh 내려받기

#!/bin/bash
#
# 특정 문자를 highlight한다. (view.sh)
#
# by 좋은진호(truefeel, http://coffeenix.net/ )

# color
szColBk="^[[;30m";      szColBk1="^[[1;30m"     # black
szColRe="^[[;31m";      szColRe1="^[[1;31m"     # red
szColGr="^[[;32m";      szColGr1="^[[1;32m"     # green
szColYe="^[[;33m";      szColYe1="^[[1;33m"     # yellow
szColBl="^[[;34m";      szColBl1="^[[1;34m"     # blue
szColPu="^[[;35m";      szColPu1="^[[1;35m"     # magenta(purple)
szColCy="^[[;36m";      szColCy1="^[[1;36m"     # cyan
szColGy="^[[;37m";      szColWh="^[[1;37m"      # white
szNormal="^[[;m"

#
sed \
        -e "s/^[A-Z][a-z][a-z] *[0-9]* //g" \
        \
        -e "s/ \(192.168.123.[0-9]*\)/${szColGr} \\1$szNormal/g" \
        \
        -e "s/\(httpd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(vsftpd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(proftpd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(ftpd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(sshd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(xinetd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(Connection attempt\)/${szColRe1}\\1$szNormal/g" \
        -e "s/\(authentication failure\)/${szColRe1}\\1$szNormal/g" \
        -e "s/\(BAD SU\)/${szColRe1}\\1$szNormal/g" \
        \
        -e "s/\(nfs server\)/${szColYe}\\1/g" \
        \
        -e "s/$/$szNormal/g"
[/quote]

사용은 tail -f 로그파일명 |./view.sh 형태로 사용하면 된다.

첫번째 부분은 색깔을 정의한 변수이다. 여기서 ^[[;31m ANSI코드로, ^[ 문자는 ESC키를 의미한다. 쉘에서 입력할 때 Ctrl+V를 누른 후 ESC키를 누르면 입력할 수 있다. 색깔은 사용하는 터미널에 따라서 약간 다르게 표시될 수도 있다.

사용자 삽입 이미지


그 다음부터는 sed를 이용해서 문자열을 변환처리하며, 한줄당 하나의 정규표현식을 사용하였다. 부분적으로 살펴보자.

 1:     -e "s/^[A-Z][a-z][a-z] *[0-9]* //g" \

기본적으로 -e s/변환전문자열/변환후문자열/g 형식을 사용하는데, 위는 syslog를 통해 남은 로그중 'Oct 30'과 같이 '월일'을 표시하지 않기 위한 정규표현식이다.
 
 1:     -e "s/ \(192.168.123.[0-9]*\)/${szColGr} \\1$szNormal/g" \
 2:     \
 3:     -e "s/\(httpd\)/${szColCy}\\1$szNormal/g" \
 4:     -e "s/\(vsftpd\)/${szColCy}\\1$szNormal/g" \

첫번째줄은 특정 IP대역을 highlight하기 위한 것으로 서버의 IP, 접속하는 PC의 IP등을 한줄에 하나씩 적어주면 좋을 것이다. 두번째줄의 \ 은 보기 좋게 구분하기 위한 것이며, 세번째와 네번째줄은 각각 httpd와 vsftpd를 highlight한다.

 1:     -e "s/\(nfs server\)/${szColYe}\\1/g" \
 2:     \
 3:     -e "s/$/$szNormal/g"

첫번째줄은 'nfs server'로 문자열이 나온다면, 해당 줄 끝까지 highlight한다. ${szColYe}\\1과 server과 ${szColYe}\\1$szNormal 의 차이를 생각하면 쉽게 이해가 될 것이다. 세번째줄은 줄의 끝부분에서 색깔 표시는 정상으로 돌려놓으라는 의미이다.

2. perl을 이용한 highlight 스크립트


위의 예제를 통해서 원하는 문자열을 원하는 색깔로 highlight하는 것은 쉽게 할 수 있을 것이다. 이젠 perl이용한 방법을 소개한다.

* view.pl 내려받기

#!/usr/bin/perl
#
# 특정 문자를 highlight한다. (view.pl)
#
# by 좋은진호(truefeel, http://coffeenix.net/ )

# color
$szColBk ="^[[;30m";    $szColBk1 ="^[[1;30m";  # black
$szColRe ="^[[;31m";    $szColRe1 ="^[[1;31m";  # red
$szColGr ="^[[;32m";    $szColGr1 ="^[[1;32m";  # green
$szColYe ="^[[;33m";    $szColYe1 ="^[[1;33m";  # yellow
$szColBl ="^[[;34m";    $szColBl1 ="^[[1;34m";  # blue
$szColPu ="^[[;35m";    $szColPu1 ="^[[1;35m";  # magenta(purple)
$szColCy ="^[[;36m";    $szColCy1 ="^[[1;36m";  # cyan
$szColGy ="^[[;37m";    $szColWh  ="^[[1;37m";  # white
$szNormal="^[[;m";

#
$szBeep="\a";

#
while(&lt;STDIN&gt;) {
    # log에서 필요없는 부분 삭제
        s/^[A-Z][a-z][a-z] *[0-9]* //g;

    # IP
        s/(192\.168\.123\.[1-9][0-9]{0,2})/$szColGr$1$szNormal/g;

    # 줄 끝은 정상 색으로 변경
    s/$/$szNormal/;

    # 원하는 문자열에 색을 입힌다
        s/(httpd)/$szColCy$1$szNormal/g;
        s/(vsftpd|proftpd|ftpd)/$szColCy$1$szNormal/g;
        s/(sshd)/$szColCy$1$szNormal/g;
        s/(xinetd)/$szColCy$1$szNormal/g;
        s/(Connection attempt)/$szColRe1$1$szNormal/g;
        s/(authentication failure)/$szColRe1$1$szNormal/g;
        s/(BAD SU)/$szColRe1$1$szNormal/g;

    # 원하는 문자열을 찾으면 줄 끝까지 색을 읽힌다.
        s/(nfs server)/$szColYe$1/g;

    print $_;
}

사용은 shell스크립트를 사용할 때와 동일하게 tail -f 로그파일명 |./view.pl 형태로 사용하면 된다.

 1:     s/(192\.168\.123\.[1-9][0-9]{0,2})/$szColGr$1$szNormal/g;
 2:     ... 생략...
 3:     s/(vsftpd|proftpd|ftpd)/$szColCy$1$szNormal/g;

첫번째줄에서 192\.168\.123\.[1-9][0-9]{0,2} 은 sed를 이용할 때보다 더 정교하게 IP를 체크한 것으로, 1) 192.168.123. 시작하는 IP대역 2) 그 다음 1~9까지 숫자이고, 그다음에 숫자가 오게된다면 0~9까지 숫자가 0자리~2자리까지 가능하다. 정규 표현식에 대한 자세한 사항은 이 글의 주제를 벗어나는 내용이므로 '4 참고 자료'를 살펴보기 바란다. 세번째줄은 vsftpd, proftpd, ftpd 등의 문자를 highlight한다.

다음은 위의 스크립트를 이용하여 로그를 모니터링한 화면이다.
사용자 삽입 이미지


3. 수치에 따라 다른 색으로 표시

어떤 로그에 수치가 다음과 같이 실시간으로 쌓인다고 가정하자. 그리고, 그 수치는 'disk 54'와 같은 형태로 되어 있다.

---------  ------   --------
측정수치    상태     색깔
---------  ------   --------
0~59       양호      녹  색
60~79      주의      파란색
80~100     경고      빨간색
---------  ------   --------

다음은 perl을 이용하여 색을 표시하는 예이다. 그리고, 수치가 80이상일 땐 beep음을 발생한다. 이런한 방법은 서버의 load, disk 사용량, disk I/O, 커넥션 수, 메모리 사용량 등을 모니터링할 때 유용하게 사용할 수 있다.

 s/(disk [0-9][^0-9])/$szColGr$1$szNormal/;
 s/(disk [1-5][0-9][^0-9])/$szColGr$1$szNormal/;
 s/(disk [6-7][0-9])/$szColBl$1$szNormal/;
 s/(disk [8-9][0-9])/$szColRe1$1$szNormal$szBeep/;
 s/(disk 100)/$szColRe1$1$szNormal$szBeep/;

4. 참고 자료

* ANSI color codes
  http://pueblo.sourceforge.net/doc/manual/ansi_color_codes.html
* 정규표현식
  http://coffeenix.net/dir_catagory.php?cata_code=99
* Perl regular expressions
  http://www.perl.com/doc/manual/html/pod/perlre.html
Posted by 좋은진호
시스템이야기2007. 9. 19. 21:58
SSL인증서를 사용할 때, https는 왜 도메인기반 virtual host가 안되는가에 대해서 http://linuxchannel.net/board/read.php?table=qna&no=6427 에 2006년 1월에 답변한 내용을 정리한 것이다. 단일도메인 인증서(인증서 1개에 하나의 도메인만 갖고 있음)를 기준으로 답변한 내용이다. 와일드카드 인증서(*.foo.com 형태의 인증서)와 멀티인증서(foo.com, bar.com 등 여러 도메인을 하나에 넣은 인증서. 즉, Common Name(CN)을 여러개 갖고 있음)는 1개의 인증서로 같은 IP, 같은 포트(443)로 여러 도메인의 SSL 서비스가 가능하다.

한편 Channy's Blog( http://channy.creation.net/blog/?p=444 )에 따르면 TLS 프로토콜(RFC 2246)의 확장 규약(RFC 3546)에서 웹 서버와 브라우저 사이의 통신을 할 때 서버명을 미리 보내는 SNI(Server Name Indication)을 추가하였다고 한다. 따라서, 브라우저와 서버가 지원하게 되면 쉽게 virtual 설정이 가능할 날이 올 것으로 보인다.

----------------------------------------------------------------------------------------------------
글쓴이 : 좋은진호
글쓴날 : 2006년 01월 10일

     [이현철]님이 남기신 글:

> 상용화용 CA와 서버에서 만든 CA(테스트용 CA)를 사용할 경우
> 다른점은 단지 웹브라우저 접속시 서버에서 만든 CA를 사용해서 서명한 사이트 경우에는 경고창이 뜬다는것으로 알고 있습니다.
> (신뢰성이 없는 사이트라는 형태의 메세지)
>
> 상용화 CA라는것을 사용하는 이유는 신뢰성을 믿고 사이트를 이용해도 된다는 판단이라고 생각합니다.
>
> 그 이외 기능은 같다고 생각합니다.(암호화 처리)
    
예. 그렇습니다.

사설인증서를 사용하더라도 테스트는 동일하게 하실 수 있으며,
내부용으로 사용하는 것이나 단지 암호화를 위한거라면 사설인증서를 사용해도 됩니다.

> ----------------   ------------------ --------------------
> 현재 1대서버에 2개의 도메인이 존재하고 두개의 도메인 전부(http)웹서비스 그리고
> 하나의 도메인에 관해서만(https) 이용하고있습니다.(상용화키를 이용하지 않음-테스트용ca를 가지고 https형태로 이용중)
>
> httpd.conf에는
> ---------------------------------------------------
> <VirtualHost xxx.xxx.xxx.xxx:80>
>    ServerAdmin xxxxxxxxx
>    DocumentRoot /home/xxxxxxx
>    ServerName zec.gigaprize.co.jp
>    ErrorLog logs/error.log
>    CustomLog logs/access.log common
> </VirtualHost>
> <VirtualHost xxx.xxx.xxx.xxx:80>
>    ServerAdmin xxxxxxxxx
>    DocumentRoot /home/xxxxxxx
>    ServerName gourmet-star.gigaprize.co.jp
>    ErrorLog logs/error_1.log
>    CustomLog logs/access_1.log common
> </VirtualHost>
> ---------------------------------------------
>
> http://zec.gigaprize.co.jp/index.html (현재 index.html와 존재하지 않치만 도메인까지 접속은 가능함)
> http://gourmet-star.gigaprize.co.jp/index.html (현재 test용 index.html)이 존재함
>
> ----------------------------------
> ssl.conf에는
> ----------------------------------
> <VirtualHost _default_:443>
> #   General setup for the virtual host
> DocumentRoot /home/xxxxxxx
> ServerName gourmet-star.gigaprize.co.jp:443
> ErrorLog logs/ssl-error_log
> TransferLog logs/ssl-access_log
> -----------------------------------------------
> gourmet-star.gigaprize.co.jp 만 https(ssl)형태로 설정이 되어 있음.
>
> ----
> 실제 접속을 해보시면 알시겠지만 https://gourmet-star.gigaprize.co.jp/index.html
> 제대로 접속이 되고 있습니다.
>
> 그런데
> https://zec.gigaprize.co.jp/index.html
> 로 접속해보면 이 도메인도 https로 접속되어 버립니다.(index.html은 실제 존재하지 않는데, 내용을 보면 gourmet-gigaprize.co.jp 형태로 접속해버립니다.(웹브라우저 URL은 zec.gigaprize.co.jp 인데 index.html은
> gourmet-star.gigaprize.co.jp 내용이 보이고 있습니다)
>
> -------질문 1입니다..-----------------
> 위의 결과를 보면 1대의 서버에 443의 포트로 요청이(https가 설치되어있지않은 도메인도 ) ssl.conf에 설정된 도메인으로 결과를 보여주고 있는데 이것이 정상인지요?
> 개인적으로 https 설정되지 않은 도메인 경우에는 80은 보여주지만
> 443관해서는 에러가 나는 것이 정상이라고 생각하는데, 아니면 제 설정이 잘못되었습니까?
>------------------------------------

정상적인 현상입니다.
이유는 아래 질문에서 답변.

> --------질문2입니다-------------------
> 그리고 위의 두개 도메인을 전부 https형태로 시험해봤지만.
> (ssl.conf에 버츄얼로 두개의 도메일 등록-물론 ca와 각각 도메인별로 만들었음-테스트용 ca를 사용)
>
> 두개의 도메인을 등록 후 아파치설정 syntax테스트
> #sh apache2/bin/apachectl configtest
> Syntax OK
> 그리고 restart 한후 error.log를 보면 기존의 443포트가 이용하고 있기때문에 apachessl를 기동할수없다고 나옵니다.
> 결국 한대의 서버에 443포트는 하나의 도메인만 움직일수 있다는 결론인데요.(80포트는 몇개의 도메인을  띄울수있는데 말이죠)
>
> 결국 한대의 서버에 하나의 도메인만 https형태로 작동하는지요.
> --------------------------------------------------------------
> (상용화 CA사이트에 보면 700달러 정도주면 서브도메인(aaa.domail.com ,
> bbb.domail.com) 까지 전부 대응하는 CA도 팔고 있는데요..
> --------------------------------------------------------------

우선 처음 질문올릴 때 말씀하신, 여러 도메인을 SSL로 서비스를 한다면

1) 한 서버에 여러 IP를 할당하고, 웹서버는 각각의 IP에 바인딩해서 올리셔야 합니다.
   또는 https 포트를 443외에 각 도메인별로 다르게 하여 바인딩하거나.

2) 완전히 다른 서버에 한대당 하나의 도메인을 사용해야 합니다.

http(80포트)에서 virtual host 설정하는 것처럼 https를 도메인기반 virtual 설정으로는 안됩니다.

이유는 프로토콜의 계층만 이해하면 간단합니다.
HTTPS로 표시되는 SSL프로토콜층은 HTTP보다 하위에 있습니다.
그런데 웹서버의 virtual host설정에 의한 도메인정보는 HTTP의 헤더에 붙어있습니다.
즉, SSL프로토콜은 HTTP보다 하위이니 HTTP의 헤더를 이해를 못하는 것이겠죠.
따라서 도메인기반 virtual host설정과는 다르게 어떤 도메인으로 들어오든 첫 설정에 따라 결정이 되는겁니다.

layer는 http://coffeenix.net/doc/network/ssl_fig3.gif 에서 볼 수 있고,

사용자 삽입 이미지

이유는 http://www.modssl.org/docs/2.8/ssl_faq.html 에서 볼 수 있습니다.
    
Why can't I use SSL with name-based/non-IP-based virtual hosts?

The reason is very technical. Actually it's some sort of a chicken and egg problem: The SSL protocol layer stays below the HTTP protocol layer and encapsulates HTTP. When an SSL connection (HTTPS) is established Apache/mod_ssl has to negotiate the SSL protocol parameters with the client. For this mod_ssl has to consult the configuration of the virtual server (for instance it has to look for the cipher suite, the server certificate, etc.). But in order to dispatch to the correct virtual server Apache has to know the Host HTTP header field. For this the HTTP request header has to be read. This cannot be done before the SSL handshake is finished. But the information is already needed at the SSL handshake phase. Bingo!
Posted by 좋은진호