ファイヤーウォールの設定

本当はサーバーの前段に設置したいのですが余裕ないのでサーバーに組み込み。なぜ前段にしないといけないのかというとDos攻撃によって回線がパンクするだけならまだしもログでパーティションがパンクしたりCPUの過負荷でデーターが破損したりと二次災害の危険があるからです。

ファイヤーウォールの設定はカーネルの再構築かカーネルモジュールの組み込みが必要になるので慎重に作業を進めてください。(リモートで接続できなくなっても保証できませんよ)

まずは、カーネルに組み込まれているか確認

# kldstat
Id Refs Address Size Name
1 7 0xc0400000 63070c kernel
2 16 0xc0a31000 568dc acpi.ko
3 1 0xc15af000 15000 linux.ko

# kldstat -v | grep ip
106 ips/ipsd
107 pci/ips
119 miibus/ciphy
160 ppbus/plip
# kldstat -v | grep fw
91 fwohci/firewire
92 pci/fwohci
93 cardbus/fwohci
94 firewire/fwe

カーネルモジュールがあるか確認

# find / -name ipl.ko
/boot/kernel/ipl.ko

設定ファイルがあるか確認

# find /etc -name ipf.rules

いきなり有効にするとSSHが切断されるので
ipf.rulesを編集してlocalhostとSSHの経路のみ確保。
ifconfigコマンドでインターフェースを確認を忘れずに

fxp0:WAN
lo0:localhost

# プログラム本体があるかどうか
# which ipf
/sbin/ipf

# vi /etc/ipf.rules

rc.confに記述を追加
# vi /etc/rc.conf

ipfilter_enable=”YES”
ipfilter_rules=”/etc/ipf.rules”
ipmon_enable=”YES”
ipmon_flags=”-D /var/log/ipf.log”
/boot/loader.confに記述を追加(最小環境では空でした)
ipl_load=”YES”

モジュール組み込み
# kldload ipl

上手くいったかな?すぐに確認
# kldstat
Id Refs Address Size Name
1 8 0xc0400000 63070c kernel
2 16 0xc0a31000 568dc acpi.ko
3 1 0xc15af000 15000 linux.ko
4 1 0xc1aa0000 2a000 ipl.ko

とりあえず切断はされていない。

運命の再起動
# reboot

SSHでまったく問題なしに入れた。
ここまで楽にできると本当にファイヤーウォールが機能しているか不安だ。

PostgreSQLが起動しているのでtelnetで不正アクセスしてみる。
反応しました、全然機能していません。orz…

起動しているか確認
# /etc/rc.d/ipfilter status
ipf: IP Filter: v4.1.8 (416)
Kernel: IP Filter: v4.1.8
Running: yes
Log Flags: 0 = none set
Default: pass all, Logging: available
Active list: 0
Feature mask: 0x10f

フィルターの確認(-iはイン、-oはアウト)
# ipfstat -i
# ipfstat -o

全然フィルタリングされていませんでした。orz…
設定ファイルの修正
# vi /etc/ipf.rules

設定を反映
# ipf -Fa -Z -f /etc/ipf.rules

2005年12月 1日 07:51
/var/log/auth.logを見ると見知らぬIPからSSHを狙われているのを発見。どうもファイアーウォールが効いてない。実際にログインされた形跡はないので実害はありませんがipf.rulesを見直し。

『全ブロックの後に必要なIPとポートのみ受け入れ』のつもりが『全パスの後に…』になっていた。orz…

要するに単なる設定ミスだが、初めてLinuxサーバー立てたときに漏れクシを作ってしまった以上に恥ずかしい失敗をしてしまった。二段階に予防しておいて良かったと思ったのはSSHハッキングを受けるときに使用されたユーザー名がwww, web, root, test, bin等システムで登録されている事が多いアカウントでした。SSH側でログインユーザーを限定し、システムで不要なユーザーは削除していたので助かったもののこれがLinuxでパッケージに入れたままの状態ならログイン成功してサーバーを破壊されていたかもしれません。

こわいこわい・・・。

セキュリティ強化

必要なサービスは揃ったので最後の仕上げにセキュリティ強化を行う。
元々無駄は省いていたが残っているのが下記の項目

・不要なユーザー/グループの削除
・ログイン時のメッセージを削除
・SSHでログインできるユーザーを制限(posrgresとかでログインされないようにする)
・ファイヤーウォールでポートの制限をする

ユーザー管理は特に説明の必要はないですね。余計なユーザーアカウントがあるとクラッキングの対象にされます。BSDだとgameユーザーとかあるので消しましょう。

ログイン時に出るメッセージによってOSの種類やバージョンがバレます。すぐに編集しましょう。
対象になっているファイルは/etc/motdです。

SSHユーザーの制限は/etc/ssh/sshd_configにAllowUsersの項目を追加し
AllowUsers user1 user2のようにスペースを開けて記述します。

ファイヤーウォールは個別に紹介。

Perl-5.8.7とDBI Pg XML::Parserのインストール

前回makeに失敗してパッケージでいれてしまったPerlですが、PostgreSQLを入れる際にgmakeが無かったという発見もあったので再度ソースからコンパイルに挑戦することにしました。

そういうことでパッケージのPerlを削除します。
# pkg_info
linux_base-8-8.0_6 Base set of packages needed in Linux mode (only for i386)
perl-5.8.7 Practical Extraction and Report Language

# pkg_delete perl-5.8.7

次にPerlと必要モジュールのダウンロードをします。今回の構成はProject-mmo用のゲームサーバーとしての構築なのでDBIやDBD::Pgの他にFLASHクライアントからのデータを処理するXML::Parserが必要になります。

Perlとモジュールの配布元
http://www.perl.com/CPAN/

Configureで問答するのはイヤなのであらかじめ用意されているconfigure.gnuを利用。
# tar zxvf perl-5.8.7.tar.gz
# cd perl-5.8.7
# ./configure.gnu
# make
# make install

make時に一部errorの表示があったがお構いなし。(後々解析して影響が無いか調べないといけないな)
Perlのインストールが終わったらこれからインストールするモジュールが既に組み込まれていないか確認する。

# find `perl -e ‘print “@INC”‘` -name ‘*.pm’ -print

DBIのインストール

# tar zxvf DBI-1.48.tar.gz
# cd DBI-1.48
# perl Makefile.PL
# make
# make install

DBD::Pgのインストール
# tar zxvf DBD-Pg-1.41.tar.gz
# cd DBD-Pg-1.41
# perl Makefile.PL
# make
# make install

ここまでは順調だったがXML::Parserについてはperl Makefile.PLを実行した段階でexpatが必要と警告が出て止まる。

XML::Parserインストールの前にexpatをインストール
http://sourceforge.net/projects/expat/

# tar zxvf expat-1.95.8.tar.gz
# cd expat-1.95.8
# ./configure
# make
# make install

XML::Parserのインストール

# tar zxvf XML-Parser-2.34.tar.gz
# cd XML-Parser-2.34
# perl Makefile.PL
# make
# make install

これで完了。用意したゲームサーバースクリプトも動作できました。