Snort은 Sourcefire의 창립자이자 전 CTO, Martin Roesch에 의해 1998년에 만들어진 자유와 오픈-소스 네트워크 침입 탐지 시스템 (IDS) 및 침입 방지 시스템 (IPS)입니다. Snort는 이제 2013년에 Sourcefire를 인수한 Cisco에서 개발되었습니다.
2009년에, Snort는 "역사상 가장 위대한 오픈-소스 소프트웨어" 중 하나로 InfoWorld의 오픈-소스 명예의 전당에 입성했습니다.
Installation
데비안 저장소에서 설치할 수 있습니다:
- sudo apt install snort
Configurations
아래의 디렉토리 파일 중에 빠져 것이 있는지 확인을 하시고, 빠진 부분은 명령을 실행하셔서 만드시기 바랍니다.
- sudo mkdir /etc/snort/preproc_rules
- sudo mkdir /etc/snort/so_rules
- sudo mkdir /var/log/snort/archived_logs
- sudo cp etc/*.conf* /etc/snort
- sudo cp etc/*.map /etc/snort
- sudo cp etc/*.dtd /etc/snort
HOME_NET은 터미널에 ifconfig eth0 | grep "inet add"을 내려서 얻은 결과로부터 적절히 조절해 주어야 합니다. 아래 예제는 ip주소가 192.168.xxx.xxx이고 netmask가 255.255.0.0일 때 설정한 것입니다. 만약 ip가 203.202.129.34이고 netmask 255.255.255.0인 경우에는 203.202.129.0/24로 /etc/snort/snort.conf에 설정합니다.
ipvar HOME_NET 192.168.0.0/16
...
# Path to your rules files (this can be a relative path)
# Note for Windows users: You are advised to make this an absolute path,
# such as: c:\snort\rules
var RULE_PATH /etc/snort/rules
var SO_RULE_PATH /etc/snort/so_rules
var PREPROC_RULE_PATH /etc/snort/preproc_rules
# If you are using reputation preprocessor set these
# Currently there is a bug with relative paths, they are relative to where snor$
# not relative to snort.conf like the above variables
# This is completely inconsistent with how other vars work, BUG 89986
# Set the absolute path appropriately
var WHITE_LIST_PATH /etc/snort/rules
var BLACK_LIST_PATH /etc/snort/rules
설정 파일은 내려받아서 사용할 것이기 때문에 전부 주석 처리합니다.
- sudo sed -i 's/include \$RULE\_PATH/#include \$RULE\_PATH/' /etc/snort/snort.conf
테스트
- sudo snort -T -i eth0 -c /etc/snort/snort.conf
오류 없이 동작하고 있다면 rule을 /etc/snort/rules/local.rules에 넣어서 제대로 동작하는지 확인해 봅니다.
...
alert icmp any any -> $HOME_NET any (msg:"ICMP test detected"; GID:1; sid:10000001; rev:001; classtype:icmp-event;)
/etc/snort/snort.conf에 local.rules를 사용하도록 설정합니다.
# site specific rules
include $RULE_PATH/local.rules
- sudo snort -T -i eth0 -c /etc/snort/snort.conf
...
+++++++++++++++++++++++++++++++++++++++++++++++++++
Initializing rule chains...
1 Snort rules read
1 detection rules
0 decoder rules
0 preprocessor rules
1 Option Chains linked into 1 Chain Headers
0 Dynamic rules
+++++++++++++++++++++++++++++++++++++++++++++++++++
...
다음과 같이 실행한 후에 다른 터미널에서 이 서버에 핑(ping)을 보내면 출력을 얻을 수 있습니다.
- sudo snort -A console -q -u snort -g snort -c /etc/snort/snort.conf -i eth0
10/11-22:16:25.431707 [**] [1:10000001:1] ICMP test detected [**] [Classification: Generic ICMP event] [Priority: 3] {ICMP} 220.79.48.45 -> 168.126.63.2
10/11-22:16:25.431707 [**] [1:402:7] ICMP Destination Unreachable Port Unreachable [**] [Classification: Misc activity] [Priority: 3] {ICMP} 220.79.48.45 -> 168.126.63.2
10/11-22:16:25.466659 [**] [1:10000001:1] ICMP test detected [**] [Classification: Generic ICMP event] [Priority: 3] {ICMP} 220.79.48.45 -> 168.126.63.2
10/11-22:16:25.466659 [**] [1:402:7] ICMP Destination Unreachable Port Unreachable [**] [Classification: Misc activity] [Priority: 3] {ICMP} 220.79.48.45 -> 168.126.63.2
^C*** Caught Int-Signal
다른 터미널을 열어서 ping을 보내면 위에 열어둔 터미널에서 결과가 출력됩니다.
- ping -c 2 dawoum.duckdns.org
Barnyard2
설치
설치 전에 의존성 패키지를 먼저 설치합니다.
- sudo apt-get install -y libmysqlclient-dev libpcap-dev
Barnyard2에서 이용가능하도록 snort의 경고 파일을 바이너리 형식으로 바꾸어 주어야 합니다. /etc/snort/snort.conf의 530줄 근방에 있습니다.
...
# unified2
# Recommended for most installs
# output unified2: filename merged.log, limit 128, nostamp, mpls_event_types, vlan_event_types
#output unified2: filename snort.log, limit 128, nostamp, mpls_event_types, vlan_event_types
output unified2: filename snort.u2, limit 128
...
우분투에서 제공하는 패키지가 없기 때문에 이전 패키지를 가져와서 문서에 있는 판을 패키지로 만들어 보겠습니다.
- wget https://launchpad.net/~hurricanedefense/+archive/ubuntu/testing/+files/barnyard2_1.13-hl1~trusty.tar.gz
- tar zxvf barnyard2_1.13-hl1~trusty.tar.gz
- wget https://github.com/firnsy/barnyard2/archive/7254c24702392288fe6be948f88afb74040f6dc9.tar.gz -O barnyard2-2-1.14-336.tar.gz
- tar zxvf barnyard2-2-1.14-336.tar.gz
- mv barnyard2-7254c24702392288fe6be948f88afb74040f6dc9 barnyard2-2-1.14-336
- cd barnyard2-2-1.14-336
이전 설정을 가져와서 문서에 맞게 적절히 바꾸어 줍니다.
- cp -a ../barnyard2-1.13/debian/ .
업데이트 정보를 debian/changelog에 수정합니다.
barnyard2 (1.14-336+ut-1ubuntu0.1) wily; urgency=low
* New upstream release
-- user <user@email.com> Thu, 11 Oct 2016 09:49:00 +0900
debian/patches/series를 수정합니다.
#spo_alert_json.diff
컴파일 중에 중간에 오류가 발생하기 때문에 아래와 같이 심볼릭 링크를 걸어줍니다.
- sudo apt-get install libdumbnet-dev
- sudo ln -s /usr/include/dumbnet.h /usr/include/dnet.h
- sudo ldconfig
여러 부분을 수정해야 때문에 barnyard2-common, barnyard2-mysql을 제외하고 모든 패키지를 삭제해서 컴파일합니다.
- dpkg-buildpackage -b
- cd ..
- sudo dpkg -i barnyard2-common_1.14-336+ut-1ubuntu0.1_all.deb
- sudo dpkg -i barnyard2-mysql_1.14-336+ut-1ubuntu0.1_amd64.deb
- sudo cp etc/barnyard2.conf /etc/snort/
- sudo chown snort.snort /var/log/barnyard2
- sudo touch /var/log/snort/barnyard2.waldo
- sudo touch /etc/snort/sid-msg.map
- sudo chown snort.snort /var/log/snort/barnyard2.waldo
데이터베이스를 아래와 같이 만듭니다.
- mysql -u root -p
MariaDB [(none)]> create database snort;
MariaDB [(none)]> use snort;
MariaDB [(none)]> source ~/package/barnyard2/barnyard2-2-1.14-336/schemas/create_mysql
MariaDB [(none)]> CREATE USER 'snort'@'localhost' IDENTIFIED BY 'MySqlSNORTpassword';
MariaDB [(none)]> grant create, insert, select, delete, update on snort.* to 'snort'@'localhost';
MariaDB [(none)]> exit;
설정
이제 barnyard2가 mysql 서버를 이용할 수 있도록 /etc/snort/barnyard2.conf 설정파일을 수정합니다. 맨 아래줄에 추가하시면서 MySqlSNORTpassword는 바꾸어 주어야 합니다.
output database: log, mysql, user=snort password=MySqlSNORTpassword dbname=snort host=localhost
암호가 있기 때문에 파일을 읽지 못하도록 바꾸어 줍니다.
- sudo chmod o-r /etc/snort/barnyard2.conf
테스트
Snort을 alert 모드로 시작해 줍니다.
- sudo snort -q -u snort -g snort -c /etc/snort/snort.conf -i eth0
다른 터미널에서 ping을 보냅니다. 다른 터미널에서 ping을 보내도 -A console 선택사항이 빠져서 화면에는 아무런 출력도 생성되지 않습니다.
로그가 제대로 만들어졌는지 확인을 합니다.
- ls -l /var/log/snort
합계 260
drwxr-sr-x 2 snort adm 4096 10월 11 21:52 archived_logs
-rw-r--r-- 1 snort snort 2056 10월 12 04:01 barnyard2.waldo
-rw-r----- 1 snort adm 398 10월 12 00:04 snort.log
-rw-r----- 1 snort adm 102619 10월 12 01:34 snort.u2.1476198805
-rw-r----- 1 snort adm 132768 10월 12 04:01 snort.u2.1476203882
-rw-r----- 1 snort snort 5 10월 12 01:38 snort_eth0.pid
-rw-r----- 1 snort snort 0 10월 12 01:38 snort_eth0.pid.lck
로그는 snort.u2.xxxxxxxxxx 형태로 만들어집니다. 이제 barnyard2가 제대로 동작하는지 아래와 같이 확인합니다.
- sudo barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort -f snort.u2 -w /var/log/snort/barnyard2.waldo -g snort -u snort
...
Running in Continuous mode
--== Initializing Barnyard2 ==--
Initializing Input Plugins!
Initializing Output Plugins!
Parsing config file "/etc/snort/barnyard2.conf"
+[ Signature Suppress list ]+
----------------------------
+[No entry in Signature Suppress List]+
----------------------------
+[ Signature Suppress list ]+
...
===============================================================================
Closing spool file '/var/log/snort/snort.u2.1476203882'. Read 528 records
데이터베이스에 접근해서 입력이 제대로 되었는지 확인을 합니다.
- mysql -u snort -p -D snort -e "select count(*) from event"
Enter password:
+----------+
| count(*) |
+----------+
| 617 |
+----------+
System D startup script
시작 스크립트 /lib/systemd/system/snort.service를 만듭니다.
[Unit]
Description=Snort NIDS Daemon
After=syslog.target network.target
[Service]
Type=simple
ExecStart=/usr/sbin/snort -m 027 -D -d -l /var/log/snort -u snort -g snort -c /etc/snort/snort.conf -i enp4s0
[Install]
WantedBy=multi-user.target
시작 스크립트 /lib/systemd/system/barnyard2.service를 만듭니다.
[Unit]
Description=Barnyard2 Daemon
After=syslog.target network.target
[Service]
Type=simple
ExecStart=/usr/sbin/barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort -f snort.u2 -q -w /var/log/snort/barnyard2.waldo -g snort -u snort -D -a /var/log/snort/archived_logs
[Install]
WantedBy=multi-user.target
- sudo systemctl enable barnyard2
- sudo systemctl start barnyard2
Pulledpork
설치
설치 전에 의존성 패키지를 먼저 설치합니다.
- sudo apt-get install -y libcrypt-ssleay-perl liblwp-useragent-determined-perl
우분투에서 제공하는 패키지가 없기 때문에 이전 패키지를 가져와서 문서에 있는 판을 패키지로 만들어 보겠습니다.
- wget https://launchpad.net/~hurricanedefense/+archive/ubuntu/testing/+files/pulledpork_0.7.0-hl1~trusty.tar.gz
- tar zxvf pulledpork_0.7.0-hl1~trusty.tar.gz
- wget https://github.com/finchy/pulledpork/archive/8b9441aeeb7e1477e5be415f27dbc4eb25dd9d59.tar.gz -O pulledpork-0.7.2-196.tar.gz
- tar xvfvz pulledpork-0.7.2-196.tar.gz
- mv pulledpork-8b9441aeeb7e1477e5be415f27dbc4eb25dd9d59 pulledpork-0.7.2-196
- cd pulledpork-0.7.2-196
이전 설정을 가져와서 문서에 맞게 적절히 바꾸어 줍니다.
- cp -a ../pulledpork-0.7.0/debian/ .
업데이트 정보를 debian/changelog에 기록합니다.
pulledpork (0.7.2-196+ut-1ubuntu0.1) trusty; urgency=medium
* New upstream release
-- user <user@email.com> Mon, 10 Oct 2016 05:23:00 +0900
debian/pulledport.install을 수정합니다.
ulledpork.pl usr/bin/
etc/* etc/snort/
debian/pulledport.dirs를 수정합니다.
etc/snort
usr/bin
var/lib/pulledpork
var/log/pulledpork
다음과 같이 패키지를 만들고 설치합니다.
- dpkg-buildpackage -b
- cd ..
- sudo dpkg -i pulledpork_0.7.2-196+ut-1ubuntu0.1_all.deb
설정
먼저 snort.org에 가입하시고, Oinkcode를 얻어냅니다. 다음 파일에서 19줄, 26줄에 있는 <oinkcode>를 snort 홈페이지에서 얻은 숫자로 /etc/snort/pulledpork.conf를 바꿉니다.
Line 19 & 26: enter your oinkcode where appropriate (or comment out if no oinkcode)
Line 29: Un-comment for Emerging threats ruleset (not tested with this guide)
Line 74: change to: rule_path=/etc/snort/rules/snort.rules
Line 89: change to: local_rules=/etc/snort/rules/local.rules
Line 92: change to: sid_msg=/etc/snort/sid-msg.map
Line 96: change to: sid_msg_version=2
Line 111: change to: sorule_path=/usr/lib/snort_dynamicrules/
Line 114: change to: snort_path=/usr/sbin/snort
Line 118: change to: config_path=/etc/snort/snort.conf
Line 132: change to: distro=Ubuntu-12-04
Line 140: change to: black_list=/etc/snort/rules/iplists/black_list.rules
Line 149: change to: IPRVersion=/etc/snort/rules/iplists
Line 152: change to: #snort_control=/usr/bin/snort_control
필요한 디렉토리와 파일을 만든 후에 rule을 가져옵니다.
- sudo mkdir /etc/snort/rules/iplists
- sudo touch /etc/snort/rules/iplists/black_list.rules
- sudo touch /etc/snort/rules/iplists/white_list.rules
- sudo /usr/bin/pulledpork.pl -c /etc/snort/pulledpork.conf -l
설정 /etc/snort/snort.conf에 추가합니다. 530번줄 근방입니다.
include $RULE_PATH/snort.rules
내려받기가 설정이 잘 되었는지 아래와 같이 확인합니다.
- sudo snort -T -c /etc/snort/snort.conf -i enp4s0
테스트 중에 룰에 오류가 생기는 것들은 해당 줄을 주석처리해 줍니다.
cron
하루에 한번씩 snort 규칙을 가져오도록 설정해 줍니다. 4시 1분에 가져옵니다.
- sudo crontab -e
01 04 * * * /usr/bin/pulledpork.pl -c /etc/snort/pulledpork.conf -l
규칙을 가져오고 나서는 snort을 재시작해야 합니다.
- sudo systemctl restart snort
BASE
Image_Graph 설치
- sudo apt-get install php-pear
- sudo pear install -f Image_Graph
adodb5 설치
- wget http://sourceforge.net/projects/adodb/files/adodb-php5-only/adodb-520-for-php5/adodb-5.20.7.tar.gz
- tar zxvf adodb-5.20.7.tar.gz
- sudo mv adodb5 /var/adodb
BASE 설치
- wget http://sourceforge.net/projects/secureideas/files/BASE/base-1.4.5/base-1.4.5.tar.gz
- tar zxvf base-1.4.5.tar.gz
- sudo mv base-1.4.5 /var/www/html/base/
- cd /var/www/html/base
- sudo cp base_conf.php.dist base_conf.php
- sudo chown -R www-data:www-data /var/www/html/base
- sudo chmod o-r /var/www/html/base/base_conf.php
설정 /var/www/html/base/base_conf.php를 수정합니다.
$BASE_urlpath = '/base'; # 50번째 줄
$DBlib_path = '/var/adodb'; # 80번째 줄
$alert_dbname = 'snort'; # 102번째 줄
$alert_host = 'localhost';
$alert_port = '';
$alert_user = 'snort';
$alert_password = 'mypassword';
웹서버 설정을 수정하고 재시작합니다. http://localhost/base 로 접근하면, BASE 설정 화면이 나옵니다.
Setup page 링크를 클릭하셔서 오른쪽에 있는 Create BASE AG 버튼을 누릅니다.
Main page를 눌러서 이용해 봅니다.
Snorby
Ruby gems
Snorty는 다수의 ruby gem을 설치해야 동작합니다. Gem 설치 속도를 높이기 위해서 아래와 같이 설정을 추가합니다.
- echo "gem: --no-rdoc --no-ri" > ~/.gemrc
- sudo sh -c "echo gem: --no-rdoc --no-ri > /etc/gemrc"
Ruby를 설치합니다.
- sudo apt-get install ruby
필요한 gem을 설치합니다.
- sudo gem install wkhtmltopdf
- sudo gem install bundler
- sudo gem install rails
...
Fetching: activesupport-5.0.0.1.gem (100%)
ERROR: Error installing rails:
activesupport requires Ruby version >= 2.2.2.
https://launchpad.net/%7Ebrightbox/+archive/ubuntu/ruby-ng/+packages?batch=75&memo=75&start=75 에서 ruby2.3을 받아옵니다.
- tar jxvf ruby2.3_2.3.1.orig.tar.bz2
- tar xvf ruby2.3_2.3.1-1bbox1~wily1.debian.tar.xz -C ruby-2.3.1/
- cd ruby-2.3.1
- sudo apt-get install chrpath
- sudo apt-get install libffi-dev libgdbm-dev libgmp-dev libncurses5-dev libncursesw5-dev libreadline6-dev libyaml-dev systemtap-sdt-dev tcl8.5-dev tk8.5-dev
- dpkg-ubildpackage -b
- cd ..
- sudo dpkg -i -i ruby2.3_2.3.1-1bbox1~wily1_amd64.deb libruby2.3_2.3.1-1bbox1~wily1_amd64.deb
- sudo dpkg -i ruby2.3-dev_2.3.1-1bbox1~wily1_amd64.deb
- sudo gem install rails
이전 설치를 계속 진행합니다.
- sudo gem install rake --version=0.9.2
ruby-dev를 설치하지 않으면, mkmf.rb can't find header files for ruby at /usr/lib/ruby/ruby.h 메시지가 출력됩니다.
snorby
Snorby를 받아서 설정해 줍니다.
- cd /var/www/html
- sudo git clone https://github.com/Snorby/snorby
- cd snorby
- sudo apt-get install postgresql-server-dev-9.4
- sudo gem install do_postgres -v '0.10.16'
- sudo bundle install
- sudo cp config/database.yml.example config/database.yml
설정 config/database.yml을 수정합니다.
# Snorby Database Configuration
#
# Please set your database password/user below
# NOTE: Indentation is important.
#
snorby: &snorby
adapter: mysql
username: root
password: "MysqlRootPassword" # Example: password: "s3cr3tsauce"
host: localhost
development:
- sudo cp /var/www/html/snorby/config/snorby_config.yml.example /var/www/html/snorby/config/snorby_config.yml
- sudo sed -i s/"\/usr\/local\/bin\/wkhtmltopdf"/"\/usr\/bin\/wkhtmltopdf"/g /var/www/html/snorby/config/snorby_config.yml
작동 여부를 확인해 봅니다.
- cd /var/www/html/snorby
- sudo bundle exec rake snorby:setup
접근할 사용자를 만듭니다.
- sudo mysql -u root -p
MariaDB [(none)]> create user 'snorby'@'localhost' IDENTIFIED BY 'PASSWORD123';
MariaDB [(none)]> grant all privileges on snorby.* to 'snorby'@'localhost' with grant option;
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit
이제 설정 config/database.yml을 수정합니다.
# Snorby Database Configuration
#
# Please set your database password/user below
# NOTE: Indentation is important.
#
snorby: &snorby
adapter: mysql
username: snorby
password: "PASSWORD123" # Example: password: "s3cr3tsauce"
host: localhost
development:
이제 snorby를 다시 테스트합니다.
- cd /var/www/html/snorby
- sudo bundle exec rails server -e production
브라우저를 열어서 http://localhost:3000 접근해서 snorby 로긴화면이 나오면 정상적으로 동작하는 것입니다.
Nginx 용 Passenger 모듈 설치
ppa 설치
다음 과정은 Phusion의 APT 저장소를 통해 Passenger + Nginx 모듈을 설치합니다. 이 과정 전에 공식 저장소에서 Nginx를 설치했다고 가정합니다. 그렇지 않다면 Nginx를 먼저 설치해야 합니다.
- sudo apt-get install dirmngr gnupg
- sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
- sudo apt-get install apt-transport-https ca-certificates
- sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bionic main > /etc/apt/sources.list.d/passenger.list'
- sudo apt-get update
- sudo apt-get install libnginx-mod-http-passenger
이 모듈 설치 시에 nginx-common (= 1.14.0-0ubuntu1.1)에 의존성이 걸려 있습니다. 공식 저장소는 1.14.0-0ubuntu1 버전이고, 아마도 이 버전은 Phusion의 저장소에서 제공하는 nginx 버전인 것으로 보입니다. 만약 Google PageSpeed for nginx와 함께 사용하고 싶을 때에는 아래의 nginx 패키지를 이용하시기 바랍니다. 그렇지 않으면, Phusion의 저장소에서 필요한 패키지를 전부 설치해서 사용하시기 바랍니다.
설정
모듈을 사용하도록 설정 /etc/nginx/nginx.conf를 수정합니다.
##
# Phusion Passenger config
##
# Uncomment it if you installed passenger or passenger-enterprise
##
passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
passenger_ruby /usr/bin/passenger_free_ruby;
만약 passenger_root가 보이지 않는다면, 아래와 같이 찾아서 추가해 줍니다.
- passenger-config --root
/usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
passenger_ruby는 아래 명령어로 찾을 수 있습니다.
- dpkg -L passenger
##
# Phusion Passenger config
##
# Uncomment it if you installed passenger or passenger-enterprise
##
include /etc/nginx/passenger.conf;
확인
- sudo systemctl restart nginx
- sudo /usr/bin/passenger-config validate-install
- sudo /usr/sbin/passenger-memory-stats
Barnyard2 수정
barnyard2 설정 수정 후에 제대로 동작하는지 확인하는 과정입니다. 설정 /etc/snort/barnyard2.conf에서 맨 아래쪽에 추가한 줄을 주석처리하고 아래쪽에 설정을 추가합니다. PASSWORD123을 자신에 맞게 수정해 주어야 합니다.
...
#output database: log, mysql, user=snort password=MySqlSNORTpassword dbname=snort host=localhost
output database: log, mysql, user=snorby password=PASSWORD123 dbname=snorby host=localhost sensor_name=sensor1
Barnyard2의 설정이 동작하는지 아래와 같이 명령을 줍니다. 데이터 크기에 따라 다르지만, 시간이 꽤 걸리는 과정(수십 분)입니다.
- sudo barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort -f snort.u2 -w /var/log/snort/barnyard2.waldo -g snort -u snort
자료가 데이터베이스에 들어갔는지 확인해 봅니다.
- mysql -u snorby -p -D snorby -e "select count(*) from event"
Enter password:
+----------+
| count(*) |
+----------+
| 403 |
+----------+
이제 barnyard2를 재시작합니다.
- sudo systemctl restart barnyard2
Snorby Worker 데몬
자체로 데이터베이스 유지 관리를 위해서 데몬이 필요합니다. 파일 /lib/systemd/system/snorby_worker.service을 만듭니다.
[Unit]
Description=Snorby Worker Daemon
Requires=nginx.service
After=syslog.target network.target nginx.service
[Service]
Type=forking
WorkingDirectory=/var/www/html/snorby
ExecStart=/usr/bin/ruby script/delayed_job start
[Install]
WantedBy=multi-user.target
이제 시스템이 시작할 때 서비스가 동작하도록 설정해 줍니다.
- sudo systemctl enable snorby_worker
- sudo systemctl start snorby_worker
- sudo systemctl status snorby_worker.service
Nginx 설정
웹서버에서 접근하도록 설정 /etc/nginx/site-available/snorby을 추가해 줍니다.
server {
listen 5000;
root /var/www/html/snorby/public;
passenger_enabled on;
passenger_min_instances 3;
rails_spawn_method smart;
rails_env production;
server_name localhost;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ @passenger;
error_page 404 422 500;
}
location @passenger {
passenger_app_root /var/www/html/snorby;
passenger_document_root /var/www/html/snorby/public;
passenger_enabled on;
}
}
서비스를 시작합니다.
- cd /etc/nginx/site-enabled
- sudo ln -sf /etc/nginx/site-available/snorby .
- sudo systemctl restart nginx
이제 모든 설정이 끝났습니다. http://localhost:5000 으로 접근합니다. 로긴 화면이 보이면 아래의 값을 입력합니다.
user | password |
snorby@example.com | snorby |
처음은 접속은 되지만 제대로 대시보드가 보이지 않습니다. 새로 고침을 누르면 대시보드가 보일 것입니다.
반드시 우측 상단의 Settings를 눌러서 사용자와 암호를 바꾸어 줍니다.
문제/해결
문제점 : barnyard2가 제대로 동작을 하지 않는지 데이터베이스에 자료가 입력되지 않습니다. 이전에 작업한 내용 때문에 발생하는 것으로 추정해서 모든 로그를 지우고 새롭게 시작해 줍니다.
- sudo systemctl stop barnyard2
- sudo rm /var/log/snort/*
- sudo touch /var/log/snort/barnyard2.waldo
- sudo chown snort:snort /var/log/snort/barnyard2.waldo
- sudo systemctl start barnyard2
문제점 : The Snorby worker is not currently running. 메시지가 나옵니다. 여러 가지로 찾아보았으나 무엇 때문인지 원인을 알기 어렵고 작동은 제대로 하는 것 같아 파일 /var/www/html/snorby/lib/snorby/worker.rb를 수정해서 사용하고 있습니다. 추후에 다시 정리해 봐야겠습니다. https://groups.google.com/forum/#!topic/snorby/gnzU6qPwOrY
<nowiki>
def self.process
if Worker.pid
if RUBY_PLATFORM =~ /solaris/ then
Snorby::Process.new(`ps -o ruser,pid,pcpu,pmem,vsz,rss,tty,s,stime ,etime,args -p #{Worker.pid} |grep delayed_job |grep -v grep`.chomp.strip)
else
Snorby::Process.new("www -1 0.0 0.0 0 0 ?? S 00:00PM 00:00 ruby: delayed_job (ruby)")
end
end
end
문제점 : timezone이 ROK로 검색되지만 제대로 동작하지 않습니다. 보안의 이유로 UTC를 사용한다고 합니다. https://github.com/Security-Onion-Solutions/security-onion/wiki/TimeZones
문제점 : HIGU, MIDEUM, LOW SEVERITY에 표시가 되지 않습니다. 1일이 지나야 표시가 된다고 합니다. https://github.com/Snorby/snorby/issues/290
문제점 : ruby1.9.1을 설치해서 중간에 작업을 했었는데, 뭔가 꼬여서 생긴 문제를 해결합니다.
- sudo bundle exec rails console
irb(main):001:0> Snorby::Worker.stop
Ignoring RedCloth-4.2.9 because its extensions are not built. Try: gem pristine RedCloth --version 4.2.9
Ignoring bcrypt-3.1.10 because its extensions are not built. Try: gem pristine bcrypt --version 3.1.10
Ignoring byebug-6.0.0 because its extensions are not built. Try: gem pristine byebug --version 6.0.0
Ignoring do_mysql-0.10.17 because its extensions are not built. Try: gem pristine do_mysql --version 0.10.17
- sudo gem pristine --all
- sudo sudo bundle exec rails console
irb(main):002:0> Snorby::Worker.stop
/var/lib/gems/2.3.0/gems/actionpack-3.2.22/lib/action_dispatch/http/mime_type.rb:102: warning: already initialized constant Mime::PDF
/var/lib/gems/2.3.0/gems/actionpack-3.2.22/lib/action_dispatch/http/mime_type.rb:102: warning: previous definition of PDF was here
=> "No time_zone specified in snorby_config.yml; detected time_zone: ROK\ndelayed_job: trying to stop process with pid 5057...\ndelayed_job: process with pid 5057 successfully stopped.\n"
irb(main):003:0> exit
문제점 : 시스템 로그를 보니, Snort [xxxx] : Dynamic Rule [xxx:xxxxx] was not initialized properly.라는 오류가 지속적으로 발생합니다. 이것은 snort이 실행되고 있는 상황에서 barnyard2가 rule을 갱신함으로써 생기는 문제라고 알려져 있지만, 제 경우에는 고쳐지지 않았습니다.정보
- sudo chown -R snort:snort /usr/lib/snort_dynamicrules/
- sudo chown -R snort:snort /etc/snort/
소유자를 수정한 후에 아직은 메시지가 발생하고 있지 않습니다. 확인이 필요합니다. 우분투 패키지에서는 /etc/snort/snort.conf를 root:snort으로 0640으로 되어 있습니다. 별도의 확인이 필요합니다.
문제점 : ICMP test detected.가 지속적으로 발생합니다. 이전에 테스트를 위해 local.rules에 삽입한 내용을 제거한 후에 발생하지 않는 것으로 판단됩니다.
문제점 : http_inspect: NO CONTENT-LENGTH OR TRANSFER-ENCODING IN HT...이 지속적으로 발생하고 있습니다. 이 부분은 문제점이 무엇인지 아직 파악이 되지 않았습니다.
문제점 : stream5: TCP Small Segment Threshold Exceeded도 위와 같은 방법으로 처리해 두었습니다. 아래와 같은 출력이 되면 다음과 같이 조치해 두었습니다.
Generator ID Sig. ID Sig. Revision
129 12 1
/etc/snort/disablesid.conf를 수정합니다.
1:12
12:129
129:12
1:129
129:1
/etc/snort/threshold.conf를 수정합니다.
suppress gen_id 129, sig_id 12
메시지가 더 이상 출력되지 않는지 확인을 해 두어야 합니다.
문제점 : stream5: TCP Small Segment Threshold Exceeded도 위와 같은 방법으로 처리해 두었습니다.
Xenial (16.04)
16.04에서 변화된 내용이 있습니다. 더 이상 인터페이스 이름이 eth0만을 사용하지 않습니다. ifconfig를 실행해서 네트워크 장치를 확인해야 합니다. 이후에 필요한 과정입니다. 여기서는 예제로 ens160을 이용합니다. 먼저 /etc/rc.local을 수정합니다.
...
# By default this script does nothing.
ip link set ens160 promisc on
exit 0
다음은 /etc/network/interfaces를 수정합니다.
auto lo
iface lo inet loopback
post-up ethtool -K ens160 gro off
post-up ethtool -K ens160 lro off
아래와 같이 설정 확인을 합니다.
- ethtool -k ens160 | grep receive-offload
generic-receive-offload: off
large-receive-offload: off [fixed]
이후의 과정은 이 문서의 내용을 기반으로 최신의 git판을 내려받아서 패키지를 만드셔도 작동을 합니다.
See also
External Resources
- https://www.snort.org/documents/snort-2-9-8-x-on-ubuntu-12-lts-and-14-lts-and-15
- https://launchpad.net/~hurricanedefense/+archive/ubuntu/testing
- http://www.ubuntu-howtodoit.com/?p=138
- https://techanarchy.net/2015/01/home-ids-with-snort-and-snorby/
- http://sublimerobots.com/2015/12/snort-2-9-8-x-on-ubuntu-part-1/
- http://sublimerobots.com/2014/12/installing-snort-part-6/
- https://www.phusionpassenger.com/library/install/nginx/install/oss/wily/
- https://disloops.com/snort-2-9-8-3-on-ubuntu-16-04/
- http://www.ubuntu-howtodoit.com/?p=138