'base'에 해당되는 글 2건

  1. 2011.04.08 Snort 2.9.0.5 is available for download!
  2. 2009.02.25 Snort 네트워크 침입탐지 시스템(IDS) 구축 (Bridge 탐지)
2011. 4. 8. 09:46

Snort 2.9.0.5 is available for download!


This is the changelog for Snort 2.9.0.5:

  * src/build.h:
      Increment Snort build number to 134
  * src/: decode.h, encode.c:
  * src/dynamic-plugins/sf_engine/: sf_snort_packet.h:
  * src/preprocessors/: spp_sfportscan.c, spp_frag3.c:
  * src/output-plugins/: spo_alert_fast.c:
  * src/preprocessors/Stream5/: stream5_common.c:
      Updated portscan to set protocol correctly in raw packet for
      IPv6 and changed the encoder to recognize portscan packets as pseudo
 packets so that the checksum isn't calculated
  * src/: sfdaq.c, util.c:
      Improve handling of DAQ failure codes when Snort is shutting down.
  * src/preprocessors/spp_perfmonitor.c:
      Update perfmonitor to create now files prior to dropping privs
  * src/build.h:
      Increment Snort build number to 132
  * src/snort.c:
  * src/preprocessors/: normalize.c, perf-base.c, perf-base.h,
    Stream5/snort_stream5_tcp.c:
      TCP timestamp options are only NOPed by the Normalization preprocessor
      if Stream5 has seen a full 3-way handshake, and timestamps weren't
      negotiated.

      The IPS mode reassembly policy has been refactored to do stream
      normalization within the first policy.

      Packets injected by the normalization preprocessor are now counted
      in the packet statistics.
  * doc/snort_manual.tex:
  * src/: parser.c, parser.h:
  * src/preprocessors/: spp_frag3.c, Stream5/snort_stream5_session.c:
      Added a "config vlan_agnostic" setting that globally disables Stream's
      use of vlan tag in session tracking.
  * src/: snort.c, preprocessors/normalize.c,
    preprocessors/spp_normalize.c, preprocessors/spp_normalize.h,
    preprocessors/perf-base.c, preprocessors/perf-base.h:
  * doc/: README.normalize, snort_manual.pdf, snort_manual.tex:
      Fixed the normalization preprocessor to call its post-initialization
      config functions during a policy reload.

      Packets can no longer be trimmed below the minimum ethernet frame
      length. Trimming is now configurable with the "normalize_ip4: trim;"
      option. TOS clearing is now configurable with "normalize_ip4: tos;".

      The "normalize_ip4: trim" option is automatically disabled if the
      DAQ can't inject packets. If the DAQ tries and fails to inject
      a given packet, the wire packet is not blocked.

      Updated documentation regarding these changes.
  * src/detection-plugins/sp_cvs.c:
      Fixed a false positive in the CVS detection plugin. It was incorrectly
      parsing CVS entries that had a '+' in between the 3rd and 4th slashes.
  * src/preprocessors/HttpInspect/: client/hi_client.c,
    server/hi_server.c:
      Changed a pointer comparison to a size check for code readability.
      Belated thanks to Dwane Atkins and Parker Crook for reporting a
      related issue that was fixed in Snort 2.9.0.4 build 111.

      Moved the zlib initialization such that gzipped responses are still
      inspected if the zipped data starts after the first Stream-reassembled
      packet is inspected.
  * src/decode.c:
      Fixed an issue with decoding too many IP layers in a single packet. The
      Teredo proto bit was not unset after hitting the limit on IP layers.
      Thanks to Dwane Atkins for reporting this issue.

      IPv6 fragmented packets are no longer inspected unless they have an
      offset of zero and the next layer is UDP. This behavior is consistent
      with IPv4 decoding.
      Thanks to Martin Schütte for reporting an issue where fragged ICMPv6
      packets were being inspected.

      The decoder no longer attempts to decode Teredo packets inside of
      IPv4 fragments, instead waiting for the reassembled packet.
  * src/encode.c:
      Fixed a problem where encoded packets had their lengths calculated
      incorrectly. This caused the active response feature to generate
      incorrect RST packets if the original packet had a VLAN tag.
  * preproc_rules/preprocessor.rules:
      Updated references to rule 125:1:1
  * src/preprocessors/spp_perfmonitor.c:
      Perfmonitor files are now created after Snort changes uid/gid.
  * src/dynamic-plugins/sf_preproc_example/sf_dynamic_preproc_lib.c:
      Fixed the size formatting of an error message argument when
      compiling with --enable-rzb-saac.
      Thanks to Cleber S. Brandão for reporting this issue.
  * etc/snort.conf:
      Updated the default snort.conf with max compress and decompress
      depths to enable unlimited decompression of gzipped HTTP responses.
  * snort.8:
      Fixed the man page's URL regarding the location of Snort rules.
      Thanks to Michael Scheidell for reporting an out-of-date man page section.
  * doc/README.http_inspect, doc/snort_manual.tex,
    src/preprocessors/snort_httpinspect.c:
      HTTP Inspect's "unlimited_decompress" option now requires that
      "compress_depth" and "decompress_depth" are set to their max values.
  * src/: fpcreate.c, dynamic-plugins/sf_dynamic_define.h,
    dynamic-plugins/sf_dynamic_engine.h,
    preprocessors/Stream5/snort_stream5_tcp.c:
      Fixed an error that prevented compiling with --disable-dynamicplugin.
      Thanks to Jason Wallace for reporting this issue.
  * src/dynamic-preprocessors/ftptelnet/: snort_ftptelnet.c,
    snort_ftptelnet.h, spp_ftptelnet.c:
      Changed the names of ProcessGlobalConf() and PrintGlobalConf() inside
      the ftp_telnet preprocessor to avoid a naming conflict with similar
      functions in HTTP Inspect.
      Thanks to Bruce Corwin for reporting this issue.
  * src/preprocessors/: perf.c, perf-base.c, perf-base.h, perf-flow.c,
    perf-flow.h:
      Fixed comparisons between signed and unsigned int, which lead to
      a faulty length check.
      Thanks to Cihan Ayyildiz and Jason Wallace for helping us debug this
      issue.

Download Snort v2.9.0.5 (snort-2.9.0.5.tar.gz/Snort_2_9_0_5_Installer.exe) here.



Trackback 0 Comment 0
2009. 2. 25. 11:20

Snort 네트워크 침입탐지 시스템(IDS) 구축 (Bridge 탐지)

작성일시: 2008년 2월 1일
작성자   : 박재영(jypark@secuwiz.net)

Snort는 네트워크 침입탐지 프로그램으로 libpcap 라이브러리를 사용하여 네트워크 패킷을 검사하여 불법적인 네트워크 접근이나 스니핑, 스캔 등등 네트워크 공격을 탐지하는 툴이다. 전세계적으로 가장 많이 사용되는 IDS로써 사실표준(De facto)이다. (자세한 정보: http://www.snort.org/)

네트워크 구성

네트워크 구성도

위와 같이 DMZ 구역에 설치 할 예정이며 외부에서 들어온 패킷들 중 방화벽을 통과한 트래픽에 대하여 침입탐지를 수행하게 된다.

필요한 라이브러리
libpcap(패킷 캡춰 라이브러리) 다운로드: http://www.tcpdump.org
pcre(Perl 호환 정규식 라이브러리) 다운로드: http://www.pcre.org

어플리케이션
Snort 다운로드: http://www.snort.org
Snortrules 다운로드: http://www.snort.org
Apache 다운로드: http://www.apache.org 
PHP 다운로드: http://www.php.org 
MySQL 다운로드: http://www.mysql.org
ADODB(php로 작성된 ADO객체): http://sourceforge.net/projects/adodb/
BASE 다운로드: http://sourceforge.net/projects/secureideas/

동작방식을 간단히 보면 Snort가 libpcap을 사용하여 패킷을 캡춰하고 정규식으로 작성된 룰을 기반으로 pcre를 사용하여 매칭을 한다. 공격으로 판단된 로그는 MySQL DB에 남기게 되고 사용자는 PHP로 작성된 BASE로 접속하여 웹페이지에서 로그를 쉽게 볼 수 있게된다.

1) 라이브러리 설치
libpcap과 pcre설치는 아래와 같은 명령으로 설치 할 수 있다.
/usr/local/src 밑에서 압축을 해제 한 다음 아래와 같이 명령어를 입력한다.
> ./configure
> make && make install

2) 어플리케이션 설치
MySQL 설치는 생략한다. 웹 문서에도 많이 나와 있으며 홈페이지에서도 쉽게 나와 있으므로 참조를 하자.

Snort를 /usr/local/src에 압축을 해제하고 아래와 같은 명령어를 입력한다. 이때 --with-mysql 옵션은 MySQL이 설치된 디렉토리를 지정한다.(위치가 다를 수 있으니 확인)
> ./configure --with-mysql=/usr/local/mysql --enable-dynamic
> make && make install

snort라는 그룹과 사용자를 등록하고 룰과 로그를 남길 디렉토리를 만든다.
> groupadd snort
> useradd -g snort snort -s /sbin/nologin
>
> mkdir -p /etc/snort/rules
> mkdir /var/log/snort
>
> cp etc/* /etc/snort

snortrules는 /etc/snort에 압축을 해제하면 된다.

MySQL 설정은 다음과 같이한다. 다른 이름으로 줘도 상관없다.
User: snort
PW: snort
DB: snort

사용자 계정과 패스워드를 지정하고 snort라는 DB를 생성하여 사용자가 snort라는 DB에 권한을 가지도록 설정한다. 기본적인 내용이므로 이 문서에는 설명하지 않도록 하겠다.

snort 소스파일에 schems/create_mysql이라는 DB 덤프 파일이 들어 있다. 아래의 명령어로 테이블들을 생성한다.

> mysql -u snort -p snort < create_mysql
Enter password: *****


snort DB를 확인해보면 테이블들이 생성된 것을 확인 할 수 있다.

Apache 와 PHP 설치
아파치를 /usr/local/src에 압축 해제 후 다음 명령어로 설치를 진행하자

> ./configure --prefix=/usr/local/apache \
 --enable-so \
 --enable-cgi \
 --enable-info \
 --enable-rewrite \
 --enable-speling \
 --enable-usertrack \
 --enable-deflate \
 --enable-ssl \
 --enable-mime-magic
> make && make install

빌드 옵션에 대한 내용은 Apache홈페이지의 Document에 자세하게 나와 있으니 참조하자

PHP를 /usr/local/src에 압축 해제 후 아래와 같이 입력하자

> ./configure \
 --with-apxs2=/usr/local/apache/bin/apxs \
 --with-mysql=/usr/local/mysql \
 --prefix=/usr/local/apache/php \
 --with-config-file-path=/usr/local/apache/php \
 --enable-force-cgi-redirect \
 --disable-cgi \
 --with-zlib \
 --with-gettext
> make && make install
> cp -p php.ini.recommended /usr/local/apache/php/php.ini


Apache와 PHP가 설치 되었으면 /usr/local/apache/conf/httpd.conf파일을 아래와 같이 수정한다.

# Make sure there's only **1** line for each of these 2 directives:
# Use for PHP 4.x:
#LoadModule php4_module        modules/libphp4.so
#AddHandler php-script   php

# Use for PHP 5.x:
LoadModule php5_module        modules/libphp5.so
AddHandler php5-script php

# Add index.php to your DirectoryIndex line:
DirectoryIndex index.html index.php

AddType text/html       php

# PHP Syntax Coloring
# (optional but useful for reading PHP source for debugging):
AddType application/x-httpd-php-source phps

ADODB와 BASE를 /usr/local/apache/htdocs에 압축을 해제하면 모든 설치가 완료 되었다.

마지막으로 snort와 BASE의 환경 설정만 남았다. /etc/snort/snort.conf 파일을 자신의 환경에 맞게 설정한 후 다음의 내용을 추가한다.

var RULE_PATH=/etc/snort/rules
output database:log,mysql,user=snort password=snort dbname=snort host=localhost


/usr/local/apache/htdocs/base/base_conf.php.dist 파일을 base_conf.php파일로 복사한 다음 수정한다.

$DBlib_path="/usr/local/apache/htdocs/adodb";
$DBtype="mysql";

$alert_dbname="snort";
$alert_host="localhost";
$alert_port="3306";
$alert_user="snort";
$alert_password="snort";

설정이 완료 된 후 MySQL을 실행하고 Apache를 실행하고 snort를 실행한 후 http://[설치된IP]/base로 접속하면 다음과 같은 화면이 보일 것이다.

> /usr/local/mysql/bin/mysqld_safe &
> /usr/local/apache/bin/apachectl start
> snort -i eth0 -c /etc/snort/snort.conf -D
-i 옵션은 감시할 NIC카드를 선택하고 -c는 설정파일을 지정하고 -D는 데몬으로 띄우겠다는 옵션이다.



다른 호스트에서 스노트가 설치된 PC로 nmap으로 포트 스캐닝을 수행하고 로그가 남는지 확인해 보자
> nmap -O -sS [snort IP]

자 이제 모든 설치가 완료 되었고 정상적으로 수행하는 것도 확인을 했다. 이제 마지막으로 남은 것은 브릿지 유틸을 사용하여 NIC카드 2개를 브릿지 한다음 snort가 브릿지를 탐지하도록 설정하면 완료가 된다. brctl을 사용하여 브릿지를 구성한 후 snort를 실행할 때 -i [브릿지 이름] 옵션을 주면 된다.

bridge-utils는 NIC(Network Interface Card) 두개를 하나로 묶어 브릿지로 만들어 주는 역할을 한다. 정식 프로젝트 명칭은 IEEE 802.1d ethernet bridging으로 IEEE의 표준 이더넷 브릿지의 구현이다.

이더넷 브릿지 구성 후의 네트워크 구성도


위의 그림은 네트워크를 절제한 후 bridge를 적용한 상태의 모습이다. 네트워크 일부분을 절제한 후 브릿지로 구성된 머신을 삽입한 상태이다. 브릿지는 방화벽이나 IPS, IDS에서도 사용되는 기술로 네트워크 일부분에 삽입하여 공격을 차단하거나 탐지하여 트래픽을 조정 할 수 있도록 해주는 방식이다. 예를 들어 iptables와 bridge를 사용하면 브릿지 방식의 방화벽이 되고 snort와 bridge를 사용하면 inline방식의 IDS를 구축할 수 있다.

과거 linux kernel 2.4 버전에서는 bridge를 사용하기 위해서는 kernel patch를 사용하여 커널 모듈을 올리고 커널 컴파일을 하는 과정이 필요하였으나. 요즘에 나오는 배포판 리눅스(kernel 2.6 이상)에서는 대부분 기본으로 지원하고 있다. 만일 커널 옵션을 살펴봐서 bridge에 관련된 모듈이 설치되어 있지 않다면 모듈을 선택하고 커널을 새로 컴파일 하는 것만으로도 브릿지를 위한 커널을 생성할 수 있다.

Network options --->
<*> 802.1d Ethernet Bridging                                                            
    [*]   netfilter (firewalling) support

* 대부분 위와 같이 커널 옵션 설정을 마칠 수 있는데 일부 커널 버전에서는 다를 수도 있다.

http://sourceforge.net/project/showfiles.php?group_id=26089 에서 bridge-utils를 다운로드 받을 수 있다. 다운로드 받은 후 아래와 같은 명령으로 설치 할 수 있다.

> tar -xvzf bridge-utils-1.4.tar.gz
> cd bridge-utils-1.4
> autoconf
> ./configure
> make && make install
* autoconf가 설치되어 있지 않을 경우에는.... 그냥 autoconf를 설치하자.. 그게 확실히 간단하다.

브릿지를 구성하기 위해서는 최소 2개의 NIC가 필요하다. 서버 장비의 경우에는 포트가 10~20개인 것도 있지만 일반 PC의 경우 대부분 하나의 NIC만 있을 것이다. 어떻게든 구해서 2개를 달고 드라이버를 설치해주면 두개의 장치를 볼 수 있을 것이다. 설명을 간단하게 하기 위해 2개의 NIC가 있는 상태를 가정하고 eth0, eth1이라고 명명하겠다.

브릿지 설정
> modprobe bridge         // bridge를 커널 모듈 형식으로 작성했을 경우에만 적재해 주면 된다.
> brctl addbr br0            // br0의 이름으로 브릿지를 생성한다.
> brctl addif br0 eth0      // br0브릿지에 eth0을 추가한다.
> brctl addif br0 eth1      // br0브릿지에 eth1을 추가한다.
> brctl stp br0 off           // Spanning-Tree Protocol 사용 유무를 설정. 자신의 상황에 맞게 설정 하자

* STP(Spanning-Tree Protocol)란 브릿지를 redundancy구성을 할 경우. 즉, 이중화 할 경우 브릿지 loop가 발생할 수 있는데 이를 제거하거나 형상(Topology) 관리를 할 때 사용하는 프로토콜로써 이중화 하지 않았을 경우에는 off로 설정하자.
 
IP 설정
> ifconfig eth0 0.0.0.0     // eth0를 0.0.0.0으로 초기화
> ifconfig eth1 0.0.0.0     // eth1을 0.0.0.0으로 초기화
> ifconfig br0 <IP_ADDR> netmask <NETMASK> up
> route add -net 0/0 gw <GATEWAY>

* IP를 꼭 부여할 필요는 없다. 단순히 ifconfig br0 up 만으로도 통신은 브릿지 통신은 가능하나 브릿지 머신에 접속하기 위해서 IP를 부여한 것이다.

자 이 것으로 브릿지의 모든 구성은 완료되었다. 네트워크를 절제 한 후 브릿지 장비를 집어넣고 통신이 되는지 확인만하면 모든것이 완료된다.

Trackback 0 Comment 0