*PHP [#cb044a87]
[[PHP:+http://php.net/]]
色々なWebアプリを動かすのに必須なミドルウェア。LAMPの"P"たる所以。
PHP5.4以下とPHP5.5以上の間に開発の壁があり、5.4だと動いた物が5.5だと動かなかったりする。
また、現在のPHPオフィシャルメンテナー期間はメジャーバージョンリリースがされた2世代前までなので、
PHP5.7が公開されたら、オフィシャル版PHP5.4も終息となる予定。
*Snort [#n0cf71cc]
[[Snort:+https://www.snort.org/]]
ネットワーク型IDS(不正アクセス検知システム)の一種。
ユーザ登録をすればフリーで使えるので、自鯖屋にとってはありがたい存在。
正確な検出を行う為にはルールを自分で書く必要があるが、初期テンプレートが数種類用意されているので、
そのまんまでもある程度は動いてくれる。
~
ただし、CentOSプロジェクトとか他メンテナーが絡んでいる物は、そっち側の意向によって変化する。
例:CentOSのyumのBaseリポジトリで提供しているPHP5.3はCentOS6が終了するまでメンテナンスする予定 --> [[メモ記事>+http://www.ns-lab.org/digiloog/2014/09/article_2613/]]
検出結果は生ログを出力する方法と、BASEを経由させてWeb画面で見る方法等がある。
Snortの以前のバージョンではログをMySQLへ直接出力し、その結果をBASEで表示させる事が出来たのだが、
現在のSnortではMySQLへの直接出力をサポートしていない。
その為、間にBarnyard2を噛ませる事によってMySQLへ出力も行い、BASEからの参照を可能にする構成を取る事が多い。
~
*インストール [#sa509faa]
&size(16){&font(b){0. ビルドオプション};};
長いオプションを使うので、オプションの意味は割愛。大体は『$ ./configure --help』打てば出る。
以下は改行してあるが、実際には一行化した上でconfigure.optionとかに出力しておき、
『$ ./configure `cat ../configure.option`』とかにすると楽。
 --prefix=/usr/local/php \
 --sysconfdir=/etc \
 --with-apxs2=/usr/local/apache/bin/apxs \
 --with-mysql=/usr/local/mysql \
 --with-mysqli=mysqlnd \
 --with-pdo-mysql=mysqlnd \
 --with-libdir=lib64 \
 --with-curl=/usr/lib64 \
 --with-jpeg-dir=/usr/lib64 \
 --with-png-dir=/usr/lib64 \
 --with-vpx-dir=/usr/lib64 \
 --with-xpm-dir=/usr/lib64 \
 --with-bz2 \
 --with-gd \
 --with-gettext \
 --with-gmp \
 --with-iconv \
 --with-kerberos \
 --with-layout \
 --with-openssl \
 --with-pic \
 --with-xmlrpc \
 --with-zlib \
 --without-pspell \
 --without-unixODBC \
 --enable-bcmath \
 --enable-calendar \
 --enable-cli \
 --enable-exif \
 --enable-ftp \
 --enable-gd-native-ttf \
 --enable-intl \
 --enable-mbstring \
 --enable-pcntl \
 --enable-pdo \
 --enable-shmop \
 --enable-soap \
 --enable-sockets \
 --enable-sysvmsg \
 --enable-sysvsem \
 --enable-sysvshm \
 --enable-xml \
 --enable-xmlreader \
 --enable-xmlwriter \
 --enable-zip \
 --disable-dba \
 --disable-debug \
 --disable-dom \
 --disable-fileinfo \
 --disable-phar \
 --disable-posix \
 --disable-rpath \
 --disable-sysvmsg \
 --disable-sysvsem \
 --disable-sysvshm \
 --disable-wddx
一連の構成は、
 "Snort" -> [BinaryLOG] -> "Barnyard2" -> [SQL] -> "MySQL" -> [http] -> "BASE"
の流れになる。
~
&size(16){&font(b){1. ビルド};};
上記のconfigureオプションを別ファイル化した場合のビルド例
 # tar jxvf php-5.6.1.tar.bz2
 # cd php-5.6.1
 # ./configure `cat ../configure.option`
*インストール [#f8c63645]
&size(16){&font(b){0. 事前準備};};
&font(b){今回のメモは、"Snort+Barnyard2+BASE"の構成とする。}; -> Barnyard2の構築方法は[[コチラ:+http://www.ns-lab.org/wiki/?Linux%2FSource%2FBarnyard2]]
Snortの利用登録(無料)とSnort本体+ルールファイルのダウンロードは事前に行っておく。
本体とルールファイルのバージョンは同じ物を使用する事。
 Snort本体:snort-2.9.x.x.tar.gz
 ルールファイル:snortrules-snapshot-29xx.tar.gz
~
&size(16){&font(b){1. daqのビルド};};
Snortに必要なDAQをインストールする。
 # tar zxvf daq-2.0.2.tar.gz
 # cd daq-2.0.2
 # ./configure --prefix=/usr/local/daq-2.0.2
 # make && make install
 # cd /usr/local
 # ln -s /usr/local/daq-2.0.2 ./daq
~
&size(16){&font(b){2. Snortのビルド};};
configure.optionのレシピは以下の通り
 # vi configure.option
 =====
 --prefix=/usr/local/snort-2.9.6.2 \
 --with-mysql-libraries=/usr/local/mysql/lib \
 --with-daq-includes=/usr/local/daq/include \
 --with-daq-libraries=/usr/local/daq/lib \
 --enable-targetbased \
 --enable-dynamicplugin \
 --enable-sourcefire \
 --enable-reload \
 --enable-zlib \
 --enable-gre \
 --enable-ppm \
 --enable-perfprofiling
~
 # tar zxvf snort-2.9.6.2.tar.gz
 # cd snort-2.9.6.2
 # ./configure `cat configure.option`
 # make
 # make test
 # make install
 # cd /usr/local
 # ln -s /usr/local/snort-2.9.6.2 ./snort
~
&size(16){&font(b){2. 設定};};
ソースコードの中にphp.iniが入っているので、それを/etcにコピーして使用する。
また、apacheとの連携をしている場合はhttpd.confにPHPのLoadModuleが追記されているかも確認する
 # cp {$PHP_SrcDIR}/php.ini-development /etc/php.ini
 # cd ${SnortSrcDir}
 # cp -a etc /etc/snort
 # chown -R root.root /etc/snort && chmod -R 644 /etc/snort
 # rm /etc/snort/Makefile*
 # cp rpm/snortd /etc/init.d/snortd
 # cp rpm/snort.sysconfig /etc/sysconfig/snort
 # cp rpm/snort.logrotate /etc/logrotate.d/snort
 # mkdir /var/log/snort
 # chown snort.snort /var/log/snort && chmod 755 /var/log/snort
~
『$ ./configure --sysconfdir=/etc』を外した場合はコンフィグの場所が変わる
&font(b){/usr/local/php/etcでは無い};ので注意
 # cp {$PHP_SrcDIR}/php.ini-development /usr/local/php/lib/php.ini
&size(16){&font(b){3. Snortのコンフィグ};};
Snortのコンフィグや起動スクリプトを書き換える。
上記の通りBarnyard2との連携を前提とする為、ログの出力は行わない設定にする。
※以下のメモでは変更した箇所のみを記載
 # vi /etc/init.d/snortd
 =====
 6 :: # chkconfig: 2345 90 10
 11 :: SNORT_BIN=/usr/local/snort/bin/snort
 107 :: daemon ${SNORT_BIN} ...~... $BPFFILE $BPF
 116 :: daemon ${SNORT_BIN} ...~... $BPFFILE $BPF
 120 :: daemon ${SNORT_BIN} ...~... $BPFFILE $BPF
~
 # vi /etc/sysconfig/snort
 =====
 59 :: #LOGDIR=/var/log/snort
 69 :: #ALERTMODE=fast
 75 :: #DUMP_APP=1
 81 :: #BINARY_LOG=1
 87 :: #NO_PACKET_LOG=0
 92 :: #PRINT_INTERFACE=0
~
 # vi /etc/snort/snort.conf
 =====
 45 :: ipvar HOME_NET 192.168.0.0/24
 48 :: ipvar EXTERNAL_NET !$HOME_NET
 104 :: var RULE_PATH /etc/snort/rules
 105 :: var SO_RULE_PATH /etc/snort/so_rules
 106 :: var PREPROC_RULE_PATH /etc/snort/preproc_rules
 109 :: var WHITE_LIST_PATH /etc/snort/rules
 110 :: var BLACK_LIST_PATH /etc/snort/rules
 242 :: # path to dynamic preprocessor libraries
 243 :: dynamicpreprocessor directory /usr/local/snor/lib/snort_dynamicpreprocessor/
 245 :: # path to base preprocessor engine
 246 :: dynamicengine /usr/local/snort/lib/snort_dynamicengine/libsf_engine.so
 248 :: # path to dynamic rules libraries
 249 :: #dynamicdetection directory /usr/local/snort/lib/snort_dynamicrules
 517 :: output unified2: filename snort-barnyard.log, limit 128
 674 :: # dynamic library rules
 675 :: include $SO_RULE_PATH/bad-traffic.rules
 676 :: include $SO_RULE_PATH/browser-ie.rules
 677 :: include $SO_RULE_PATH/chat.rules
 678 :: include $SO_RULE_PATH/dos.rules
 679 :: include $SO_RULE_PATH/exploit.rules
 680 :: include $SO_RULE_PATH/file-flash.rules
 681 :: include $SO_RULE_PATH/icmp.rules
 682 :: include $SO_RULE_PATH/imap.rules
 683 :: include $SO_RULE_PATH/misc.rules
 684 :: include $SO_RULE_PATH/multimedia.rules
 685 :: include $SO_RULE_PATH/netbios.rules
 686 :: include $SO_RULE_PATH/nntp.rules
 687 :: include $SO_RULE_PATH/p2p.rules
 688 :: include $SO_RULE_PATH/smtp.rules
 689 :: include $SO_RULE_PATH/snmp.rules
 690 :: include $SO_RULE_PATH/specific-threats.rules
 691 :: include $SO_RULE_PATH/web-activex.rules
 692 :: include $SO_RULE_PATH/web-client.rules
 693 :: include $SO_RULE_PATH/web-iis.rules
 694 :: include $SO_RULE_PATH/web-misc.rules
~
&size(16){&font(b){4. ルールファイルの設置};};
Snortは不正パケットの検出ルールが必要。
ルールファイルはSnortのオフィシャルからダウンロード可能。もちろん、自作する事も可能。
 # tar snortrules-snapshot-2962.tar.gz
 # cp etc/sid-msg.map /etc/snort/
 # cp -a preproc_rules /etc/snort/
 # cp -a rules /etc/snort/
 # cp -a so_rules /etc/snort/
 # touch /etc/snort/rules/black_list.rules
 # touch /etc/snort/rules/white_list.rules
~
&size(16){&font(b){5. ログローテート};};
ローテートスクリプトは色々な書き方がある。
今回は一例としてsystemctlを使いつつ、Snortのローテートに対応した書き方をメモ。
この時、Barnyard2で使っている"barnyard2.waldo"ファイルはローテートさせない事。
waldoファイルをローテートしてしまうと、Barnyard2がSnortのタイムスタンプを追えなくなってしまい、
"/var/log/messages"に大量のワーニングが出る。
 # vi /etc/logrotate.d/snort
 =====
 # /etc/logrotate.d/snort
 # $Id$
 
 /var/log/snort/alert /var/log/snort/snort* {
     weekly
     rotate 4
     missingok
     nocompress
     sharedscripts
     postrotate
         /bin/systemctl restart snortd.service && /bin/systemctl restart barnyard2.service || true
     endscript
 }
上のlogrotateスクリプトでも"/var/log/messages"にWARNINGが出る時は、
cronでsnortを再起動してあげれば、勝手にローテーションがかかる。
 # vi /etc/cron.weekly/logrotate.snort
 =====
 #!/bin/sh
 /bin/systemctl restart snortd.service && /bin/systemctl restart barnyard2.service
~
*起動テスト [#sa600521]
Snortの動作テスト用に、pingをalertとして検知する検出ルールを自作する。
 # vi /etc/snort/rules/icmp.rules
 =====
 21 :: alert icmp any any -> $HOME_NET any (msg:"ICMP alert test"; sid:20000001; rev:20000001)