JavaScript 表示ができません。お使いのブラウザの JavaScript を有効にしてください。

はじめに

2011年01月23日
● このぺージでは、VineLinux5.2 x86_64 を使って出来るだけセキュリティに配慮した自宅サーバを構築していきます。また、次のようなネットワーク構成を前提として進めていきますので、ホスト名やIPアドレスなどは各自の環境に置き換えて下さい。
このサーバ構築にあたっては HP(Hewlett Packard:旧コンパック) の ML115 G5 を利用しています。 少し古くなってしまいましたが、2010年3月に NTT-X Store にて、送料・税込みで12800円、2台まとめてだと特別価格19,600円と言う格安な値段で販売されていました。 もちろん?2台購入して、そのうちの1台からメモリとハードディスクを移設してソフトウエアRAIDを利用したサーバを新たに構築していきます。

Linux の教科書は?

2011年01月23日
一昔前までは、いざ Linux を始めようと思っても、あるのはすでにある程度のスキルを持った方しか理解できないような難解な書物が一般でした。解からない語句を調べようとしても、その調べた先にある言葉がまた解からなく、どんどんと底無し沼に嵌まっていくような暗澹たる気分にさせられたのは一度や二度ではありません。 しかし、インターネットが整備されてきて検索によって膨大な情報に接することが出来るようになると同時に、ディストリビューション側でもより簡単に Linux に親しめる環境作りがなされてきた結果、今では本当に誰でもそれほどの苦労なく Linux を扱えるようになってきています。
とは言え、やはり最低限の知識は必要になります。これは何も Linux に限ったことではなくて、Windows であろうが Mac OS-X であろうが、もうちょっとコンピュータと近付きたい・理解したいと思うようになれば自然と必要となってくるものです。
Linux に関しては、2008年の秋に学習教材として「Linux標準教科書」が無料で提供されるようになりました。内容は、基礎知識や基本操作、Linuxを用いた簡単なサーバ構築など入門者の方にも適したものとなっており、まだ読まれていない方は是非目を通されることをお薦めします。
詳しくは「Linux標準教科書」開発プロジェクトのページまで。教科書のダウンロードも同じページから行えます。

インストールの手順

2011年01月23日
● インストールの方法についてはVine Linux 5.0 インストールガイドに詳しい説明がありますので、そちらも必ず目を通すようにしてください。
今回は RAID1 を使ったミラーリング構成でのインストールを行っていきますが、ここでは全体の大まかな流れを説明していきます。
最初にインストール手順の中の
”インストールの種類” の選択時に 「カスタム」 を選択しておきます。これはサーバ構築にあたってのインストールでは、必要のない物は入れないという基本姿勢で行っていますので、後で出てくる ”パッケージグループの選択” 時にインストールするパッケージを自分で選びたいからです。 もちろんここで「サーバ」を選んでもまったく問題はありません。 次の
”ディスクパーティションの設定” では、「DiskDruid を使用して手動パーティション設定」を選択し ”次へ” をクリックします。 ここでRAIDの設定を行っていく訳ですが、詳しくは次のコーナーで説明していきます。
次の ”ネットワークの設定” ですが、インストール終了後に改めて設定していきますのでここではそのまま進んでください。次の ”ファイアウォールの設定” も、後で自前で設定していきますので「ファイアーウォールなし」を選択します。 次の ”追加の言語サポート” ですが、X Window System を使わないサーバ運用であれば「English(USA)」を追加しておくと良いでしょう。
”パッケージグループの選択” では、私の場合「DNSサーバ」「NFSサーバ」「ネットワークサーバ」「開発ツール」「管理ツール」などをインストールするようにしています。

RAID1 の設定

2011年01月23日
● 「DiskDruid を使用して手動パーティション設定」を選択した後の”ディスクの設定”画面の右ペインに、/dev/sda と /dev/sdb の2つのハードディスクが認識されていると思います。 ここで「RAID(A)」タブをクリックして、「ソフトウエアRAIDパーティションを作成」を選び「OK」。以下、次のように繰り返し設定していきます。パーティションの切り方はあくまで参考です。

★ /boot 用パーティションを作る
「RAID(A)」タブをクリック
「ソフトウエアRAIDパーティションを作成」を選び「OK」

使用可能なドライブ
レ sda
  sdb	  <-- チェックを外す
容量 100MB
プライマリパーティションにする チェックを入れる
★ / 用パーティションを作る
「RAID(A)」タブをクリック
「ソフトウエアRAIDパーティションを作成」を選び「OK」

使用可能なドライブ
レ sda
  sdb	  <-- チェックを外す
容量 5000MB
★ 同様にswap 用パーティションとして 1000MB、 /var 用パーティションとして 5000MB、 /home には残り全部(最大許容量まで)としてパーティションを切っておく。(あくまで参考です)

次にもう一度「RAID(A)」をクリックして、「RAIDデバイス作成用にデバイス互換ドライブを作成」を選択して「OK」。
ソースドライブ:sda ターゲットドライブ:sdb -> 「OK」
最終警告 クローンデバイス チェック
ここで /dev/sda のパーティションが /dev/sdb にコピーされる。この時点でのパーティションは次のようになっている。
/dev/sda
/dev/sda1 ソフトウェアRAID
/dev/sda2 ソフトウェアRAID
/dev/sda3 ソフトウェアRAID
/dev/sda5 ソフトウェアRAID
/dev/sda6 ソフトウェアRAID
/dev/sdb
/dev/sdb1 ソフトウェアRAID
/dev/sdb2 ソフトウェアRAID
/dev/sdb3 ソフトウェアRAID
/dev/sdb5 ソフトウェアRAID
/dev/sdb6 ソフトウェアRAID
★ 再度「RAID(A)」をクリックして、「RAIDデバイスを作成」を選択して「OK」。
マウントポイント → /boot
ファイルシステム → ext3
RAIDデバイス → md0
RAIDレベル → RAID1
RAIDメンバー → sda1とsdb1 のみチェックを入れる
→ OK
以下、同様に
マウントポイント → /
ファイルシステム → ext3
RAIDデバイス → md1
RAIDレベル → RAID1
RAIDメンバー → sda2とsdb2 のみチェックを入れる
→ OK

マウントポイント → /var
ファイルシステム → ext3
RAIDデバイス → md2
RAIDレベル → RAID1
RAIDメンバー → sda3とsdb3 のみチェックを入れる
→ OK

ファイルシステム → swap
RAIDデバイス → md3
RAIDレベル → RAID1
RAIDメンバー → sda5とsdb5 のみチェックを入れる
→ OK

マウントポイント → /home
ファイルシステム → ext3
RAIDデバイス → md4
RAIDレベル → RAID1
RAIDメンバー → sda6とsdb6 のみチェックを入れる
→ OK
ここでのポイントは、RAIDデバイスに割り振りする番号を間違えないことと、RAIDレベルをRAID1にするのを忘れないことです。

★ 最終的に
/dev/sda1 -> /dev/md0  /boot
/dev/sda2 -> /dev/md1  /
/dev/sda3 -> /dev/md2  /var
/dev/sda5 -> /dev/md3  swap
/dev/sda6 -> /dev/md4  /home
と認識されていればOK。これで再起動すると自動的にミラーリングが始まります。その様子は
$ cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[0] sdb1[1]
      104320 blocks [2/2] [UU]

md2 : active raid1 sda3[0] sdb3[1]
      3582400 blocks [2/2] [UU] 
      
md4 : active raid1 sda6[0] sdb6[1]
      146464448 blocks [2/2] [UU]           
            [>....................]  resync =  6.8% (9980544/146464448) finish=155.0min
             speed=14664K/sec
                 :
                 :
                 :
	    unused devices: [none]
最後に
$ cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sda1[0] sdb1[1] 104320 blocks [2/2] [UU] md2 : active raid1 sda3[0] sdb3[1] 5116608 blocks [2/2] [UU] md4 : active raid1 sda6[0] sdb6[1] 144930240 blocks [2/2] [UU] md3 : active raid1 sda5[0] sdb5[1] 1020032 blocks [2/2] [UU] md1 : active raid1 sda2[0] sdb2[1] 5116608 blocks [2/2] [UU]
と、[2/2] [UU] となっていれば OK です。これが [2/1] とか [_U] とか [U_] になっていると NG です。
★ 仮りに以下のように md4 に何らかの問題が起きてリカバリをする際には
$ cat /proc/mdstat
         :
         :
md4 : active raid1 sdb6[1]
      144930240 blocks [2/1] [_U]
         :

$sudo mdadm /dev/md4 -a /dev/sda6
としてリカバリを行います。
★ ハードディスクの片方が壊れた場合に備えて、ミラーリングされた両方のハードディスクから起動できるように、 MBR(マスターブートレコード)にパーティションの設定を書き込む。
$ sudo /usr/sbin/grub
grubのプロンプトが表れたら、以下のコマンドを入力する。

grub>root (hd0,0)
grub>setup (hd0)
grub>root (hd1,0)
grub>setup (hd1)
grub>quit

これからのサーバ構築の進め方について

最終更新日 2011年01月23日
● これから各種設定を行っていく訳ですが、ある程度の順番を決めておきます。最小構成に近いインストールを前提としているため、途中で追加パッケージが必要となる場合があります。 そのためインターネットに接続する必要性が出てくるのですが、無防備な状態での接続はあまりに危険です。そこで最初にやるべきことは、ファイアーウォールの設定になります。この後、DHCP ADSL の設定と進んでいきます。 また追加パッケージが必要になってくる場合がありますが、メンテナンスと取扱いの容易さを考えて極力 apt による rpm パッケージのインストールとします。

コンソールでの文字化け対策

最終更新日 2011年01月23日
● インストールを無事に終了してコンソールで各種設定を始めていく場合、日本語が文字化けしてしまう状態になります。 これを解消するために jfbterm が使えるようにします。 /VineSeed/x86_64/RPMS.plus から jfbterm-0.4.7-0vl3.x86_64.rpm を落としてきます。まだネットワークへ継っていない場合には、 一旦他のマシンで落としてきて、それを USBメモリなどでサーバ機へ移します。
$ sudo rpm -Uvh jfbterm-0.4.7-0vl3.x86_64.rpm

$ jfbterm
これで日本語が正常に表示されるようになります。

Vine5.0 から vi での挙動がおかしくなっているのに対処する方法

Vine Linux 5 の FAQ vimの使い勝手が4.2の時より悪くなっているのですが

を参照してください。

sudo の設定

最終更新日 2011年01月23日
● sudo とは何か?
コンピュータを使う場合、Windows(NT/2000/XP)・Linux にかかわらず一般ユーザーアカウントと管理者アカウントとがある。後者は Windows では Administrator と呼ばれ、Linux では多くの場合 root と称されている。

OS が何であれ普段は一般ユーザーでコンピュータを使用するのが大前提だが、アプリケーションのインストールとか設定の変更で管理者権限が必要となるときがある。一般ユーザーから管理者(root)権限を得る方法としては su があるのだが、 この場合だとその都度 root のパスワードを要求されてしまう。仮りにシステムにバックドアなどが仕掛けられていたりすると当然パスワードが流出してしまうことになる。 また su したまま作業を続けた結果、ちょとした勘違い・タイプミスなどでシステム設定を削除・破壊してしまうなどの危険性もある(経験あり)。

そのような時に sudo を使えばパスワードは一般ユーザーのもので済み、その sudo を使ったコマンドが終われば一般ユーザーにプロンプトが戻るので、忘れてしまって root のまま作業を続ける心配もなくなる。
設定の仕方は最初だけ root 権限になってコンソールから # visudo と打ち、下記のように一般ユーザー名を追加する。
# visudo

        :
        :
## Allow root to run any commands anywhere         
root    ALL=(ALL) ALL
pub    ALL=(ALL) ALL          <-  追加する(pub は自分のユーザー名)

# Allow people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL

● 追加の仕方:root ALL=(ALL) ALL の次の行までカーソルを移動し、そこでキーボードから ”i” を打つと入力モードになる。 user ALL=(ALL) ALL を入力し終わったら ”Esc” キーでコマンドモードに戻ります。最後に ”Shiftキー+zz” とすることで保存終了することができます。

● 終わった後は忘れずに # exit で一般ユーザーに戻っておくこと。また sudo が使えるコマンドを制限することもできるので、サーバとして運用している場合には一般ユーザーから OS を起動・停止するコマンドが使えないように次のように設定することもできる。

最初に設定しておくと便利なチップス

最終更新日 2011年01月23日
● デーモンの確認。
  インストールの初期状態だと、自動起動されるデーモンが必ずしも自分の期待と合致していないことがあるので整理しておく。
$ /sbin/chkconfig --list
saslauthd       0:off   1:off   2:off   3:off   4:off   5:off   6:off
portmap         0:off   1:off   2:off   3:on    4:on    5:on    6:off
atd             0:off   1:off   2:off   3:off   4:on    5:on    6:off
gpm             0:off   1:off   2:on    3:on    4:on    5:on    6:off
ntpd            0:off   1:off   2:off   3:on    4:on    5:on    6:off
 :
 :
ここでは run level 3 と 5 を見ておけば良いでしょう。止めたり起動したりするには

$ sudo /sbin/chkconfig dhcpd off

 run level を指定したい場合には
 
$ sudo /sbin/chkconfig --level=5 dhcpd off (或は on)
● 上記の /sbin/chkconfig の代わりに
$ sudo ntsysv

を使って設定することも出来ます。
● Vine5.X で NIC を2枚以上使ったサーバを構築する場合は次のデーモンは必ず止めておく(X を使わない場合)。
$ sudo /sbin/chkconfig NetworkManager off
$ sudo /etc/rc.d/init.d/NetworkManager stop
● root になれるユーザーの制限。/etc/group の wheel に root になることを許可するユーザー名を追加
$ sudo vi /etc/group
    wheel:x:10:root,pub       ← pub(ユーザー名)を追加  
  
● あるファイルがインストールされているかどうかなどを調べてたい時に便利なコマンドに locate が あります。システムをインストールしたばかりだとまだデータベースが出来ていないため、最初に次のコマンドで更新します。
  $ sudo updatedb
  
  終わるまでに少し時間がかかります。 その後調べたいファイルがある時には
  
  $ locate hogehoge  ←  hogehoge はファイル名です
  

ネットワークの確認とDHCPのインストール

最終更新日 2011年01月23日
● 次のようなネットワークを想定しています。
    ネットワーク  アドレス : 192.168.3.0/24
    サーバ    IPアドレス : 192.168.3.1
    クライアント IPアドレス : 192.168.3.128 ~ 192.168.3.254
● DHCP をインストールする。
$ rpm -q dhcp として、インストールされてなければ
$ sudo apt-get install dhcp としてインストール。

dhcpd.conf を作成

最終更新日 2011年01月23日
● dhcpd.conf の作成。Vine5 よりファイルの置き場所が /etc/dhcpd.conf から /etc/dhcp/dhcpd.conf に変わっていますので注意してください。
$ sudo cp /usr/share/doc/dhcp-4.1.0p1/dhcpd.conf.sample /etc/dhcp/

としてサンプルファイルを利用するか、下記のように直接作成する。  

$ sudo vi /etc/dhcp/dhcpd.conf
        ddns-update-style ad-hoc;
                     option domain-name-servers 192.168.3.1;   # 自分のネットワークに合わせる
                     option domain-name "penguin-mura";   # 自分のネットワークに合わせる
        subnet 192.168.3.0 netmask 255.255.255.0  # 自分のネットワークに合わせる
{
                        option broadcast-address 192.168.3.255;   # 自分のネットワークに合わせる
                        option routers 192.168.3.1;   # 自分のネットワークに合わせる
                        default-lease-time 86400;
                        max-lease-time 604800;
                        range 192.168.3.128 192.168.3.253;   # 自分のネットワークに合わせる
        }

DHCPサーバの起動と自動起動設定

最終更新日 2011年01月23日
$ sudo /etc/rc.d/init.d/dhcpd start
$ sudo /sbin/chkconfig dhcpd on

クライアント側での設定

最終更新日 2011年01月23日
● Linux クライアント側でDHCPサーバから自動でアドレスを取得出来るよう設定をする。
$ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
      DEVICE=eth0
      BOOTPROTO=dhcp
      HWADDR=XX:XX:XX:XX:XX:XX # MACアドレスがわからない場合は下記参照。
      ONBOOT=yes
      TYPE=Ethernet
● ネットワークカードの MAC アドレスの調べ方
$ /sbin/ifconfig | grep ハードウェアアドレス
      eth0 リンク方法:イーサネット ハードウェアアドレス XX:XX:XX:XX:XX:XX
● クライアント側でのネットワーク再起動
$ sudo /etc/rc.d/init.d/network restart
● クライアント側での IPアドレス取得状況の確認。
$ /sbin/ifconfig
      eth0 リンク方法:イーサネット ハードウェアアドレス XX:XX:XX:XX:XX:XX
      inetアドレス:192.168.3.253 ブロードキャスト:192.168.3.255 マスク
            :255.255.255.0
      inet6アドレス: xxxx::xxx:xxxx:xxxx:xxxx/xx 範囲:リンク
      UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1
      RXパケット:122376 エラー:0 損失:0 オーバラン:0 フレーム:0
      TXパケット:84125 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:100
      RX bytes:70686517 (67.4 Mb) TX bytes:8192442 (7.8 Mb)
  

DNS サーバ(BIND) の設定

最終更新日 2011年01月23日
● bind と caching-nameserver がインストールされているかチェックします。
$ rpm -q bind caching-nameserver
まだインストールされていなければ入れておきます。
● named.conf を編集します。
$ sudo vi /etc/named.conf

acl localnet{
    192.168.3.0/24;  //内部ネットワークアドレスを指定
    127.0.0.1;
};

options {
           directory "/var/named";
           version "unknown";       //bindのバージョン情報の非表示化
           allow-query {              //設定が有効な範囲(自分自身とLAN)
                127.0.0.1;
                192.168.3.0/24;
        };
           allow-recursion {          //再帰的なクエリを許可するホストを指定する。
                127.0.0.1;
                192.168.3.0/24;
        };
           allow-transfer             //{ゾーン転送を許可するホストを指定する。
                 127.0.0.1;
                 192.168.3.0/24;
        };
           forwarders {               //クエリを転送するネームサーバを指定する。
                xxx.xxx.xxx.xxx;//プロバイダから通知されたDNSサーバー(プライマリ)のIPアドレスを指定
                xxx.xxx.xxx.xxx;//プロバイダから通知されたDNSサーバー(セカンダリ)のIPアドレスを指定
        };
};

controls {
        inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};     // rndcで制御可能なホストを指定(localhostのみ許可)

logging {
        category lame-servers { null; };     // 逆引きのエラーをログらないようにするための設定
};

view "internal" {
        match-clients {
                127.0.0.1;            //内部向き設定
                192.168.3.0/24;
};

include "/etc/rndc.key";     // rndc秘密鍵の読込みパスを指定

zone "." IN {
          type hint;
          file "named.ca";
};

zone "localhost" IN {
          type master;
          file "localhost.zone";
          allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {
          type master;
          file "named.local";
          allow-update { none; };
};

zone "penguin.violet" IN {
          type master;
          file "violet.db";
          allow-update { none; };
};

zone "3.168.192.in-addr.arpa" IN {
          type master;
          file "3.168.192.in-addr.arpa.db";
          allow-update { none; };
}; 

};
● ゾーンファイルの作成
内部向け正引きゾーンデータベースの作成

$TTL    86400
@       IN      SOA     penguin.violet. root.penguin.violet.(
                                2008072201      ; Serial
                                28800           ; Refresh
                                14400           ; Retry
                                3600000         ; Expire
                                86400 )         ; Minimum
        IN      NS      penguin.violet.
        IN      MX 10   penguin.violet.
@       IN      A       192.168.3.1
*       IN      A       192.168.3.1

内部向け逆引きゾーンデータベースの作成

$TTL    86400
@       IN      SOA     penguin.violet. root.penguin.violet.(
                                2008072201      ; Serial
                                28800           ; Refresh
                                14400           ; Retry
                                3600000         ; Expire
                                86400 )         ; Minimum
        IN      NS      penguin.violet.
        IN      MX 10   penguin.violet.
1       IN      PTR     penguin.violet.
● rndc.key の作成

$ sudo /usr/sbin/rndc-confgen -a -b 512 -k rndckey
$ sudo cat /etc/rndc.key 

SSH の設定

最終更新日 2011年01月23日
● SSH を使ってクライアントからリモート接続出来るようにします。但し、ここでは SSHサーバーは外部に開放せず、内部からのアクセスのみとします。
まず最初に、設定ファイルの編集をします。
$ sudo vi /etc/ssh/ssh_config

#ServerKeyBits 1024      #を外して暗号強度を1024ビットにします

PermitRootLogin no      rootログイン禁止(デフォルトのまま)

#PubkeyAuthentication yes     #を外して「公開鍵」での認証許可にします

#PermitEmptyPasswords no     #を外しパスワード無しのログインを禁止します

PasswordAuthentication yes -> no    「公開鍵」でログインするため、一般の認証方式は使用しない

#UsePam no     パスワードでの認証を使わないので、#を外します
UsePam yes     こちらに # を追加しておきます

:wq で保存終了
● 設定変更を反映させるため、sshd を再起動します。
$ sudo /etc/rc.d/init.d/sshd restart
● ssh での接続を LAN 内のみに限定するための設定
$ sudo vi /etc/hosts.allow
sshd : 192.168.3.    自分のネットワークが 192.168.3.1~ である場合
$ sudo vi /etc/hosts.deny
sshd : ALL
● 秘密鍵、公開鍵の作成
クライアントマシン(接続する方)側で鍵を生成します。

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/identity):    空エンターキーを押します
Enter passphrase (empty for no passphrase):     ssh 通信で使うパスフレーズを入れます
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:00:xx:bb:xx:xx:58:98:e0:c5:c7:bc:1d:3e user@localhost.localdomain

作られた公開鍵の名前とパーミションを変更します。

$ cd ~/.ssh
$ cat id_rsa.pub >> authorized_keys
$ chmod 700 ~/.ssh/authorized_keys
元の公開鍵を削除します

$ rm -f id_rsa.pub
    
生成されたクライアント側の公開鍵内容を scp を使って接続先のauthorized_keys ファイルに追加します。

$ scp ~/.ssh/authorized_keys user@server:~/.ssh/authorized_key 
The authenticity of host '192.168.3.1 (192.168.3.1)' can't be established.
RSA key fingerprint is 1c:e0:6e:2d:a6:ea:85:25:8b:b2:ad:ec:b5:0e:63:ba.
Are you sure you want to continue connecting (yes/no)?yes
Warning: Permanently added '192.168.3.1' (RSA) to the list of known hosts.
user@server's password:
Permission denied, please try again.
user@servers password:
id_rsa.pub                                                            100%  409     0.4KB/s   00:00

これで先程 ssh-keygen で作ったパスフレーズの問い合わせのみでログインができるようになります。

% ssh user@server
Enter passphrase for key '/home/user/.ssh/id_rsa':
Last login: Tue Apr 13 05:31:18 2010 from 192.168.3.2
[user@server ~]$
 
authorized_keys ファイルのパーミッションを600に設定しておきます。

$ chmod 600 ~/.ssh/authorized_key2
● 「ssh-agent」と呼ばれるデーモンを利用してパスフレーズを記憶させます。この作業は、接続元(クライアント側)で行います。

● クライアント側の gnome ターミナルからサーバへ ssh 接続をすると、日本語が文字化けを起こします。その場合は、クライアント側のターミナルの 「端末」タブの中の「文字コードの設定」を "Unicode (UTF-8)" へと変更しておきます。

NIC の確認とネットワークの設定

最終更新日 2011年01月23日
● すでにサーバ機には NIC が2枚(或は3枚?)刺さっていると思います。そのうち eth0 を内部向け eth1 をインターネット側に設定します。とりあえずここではネットワークを次のように設定する  こととします。
     ネットワーク     : 192.168.3.0/24
     サーバアドレス    : 192.168.3.1
     クライアントアドレス : 192.168.3.2 〜 192.168.3.254
● Vine5.0 より、ネットワーク周りを NetworkManger が管理するようになっています。このため X Window System を使わない CUI 環境では 従来通りの /etc/rc.d/init.d/network を使っていききます。
$ sudo /sbin/chkconfig network on
$ sudo /etc/rc.d/init.d/network start
● eth0 を内部接続用(LAN)に設定
$ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    BOOTPROTO=static
    HWADDR=xx:xx:xx:xx:xx:xx
    BROADCAST=192.168.3.255
    IPADDR=192.168.3.1
    NETMASK=255.255.255.0
    NETWORK=192.168.3.0
    ONBOOT=yes
    GATEWAY=192.168.3.1        
● eth1 を外部接続用(インターネット側)に設定
$ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth1
    DEVICE=eth1
    BOOTPROTO=static
    HWADDR=xx:xx:xx:xx:xx:xx
    ONBOOT=no
● ネットワークの再起動
$ sudo /etc/rc.d/init.d/network restart
● ネットワークの確認
$ /sbin/ifconfig
eth0      リンク方法:イーサネット  ハードウェアアドレス xx:xx:xx:xx:xx:xx
          inetアドレス:192.168.3.1 ブロードキャスト:192.168.3.255  マスク:255.255.255.0
           ↑         アドレスが表記
          inet6アドレス: ( 以下 略 )

eth1      リンク方法:イーサネット ハードウェアアドレス xx:xx:xx:xx:xx:xx
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
      ↑ UP と出ていればOK
          *注: 一度もインターネットに接続していない時は eth1 は表示されません  
● 上記の /etc/sysconfig/network-scripts/ifcfg-eth* と /sbin/ifconfig で示された eth* とそれぞれのハードウエアアドレスの関係は、
$ cat /etc/udev/rules.d/70-persistent-net.rules
で表示されるものと一緒でなければなりません。そして各々の NIC のドライバは
$ cat /etc/modprobe.d/modprobe.conf

で調べることができます。
● ちなみに私のマシン環境下(HP ML115 G5)では、初期状態だとオンボード NIC が eth1 、PCI スロットに増設した NIC が eth0 と割り振られますが、 この状態で eth1 を外向き( wan )とした場合、何故かうまく出ていくことが出来ません。そこで上記の /etc/sysconfig/network-scripts/ifcfg-eth* /etc/udev/rules.d/70-persistent-net.rules /etc/modprobe.d/modprobe.conf をそれぞれ書き換えて、オンボードを eth0 で内部LAN・PCI の NIC を eth1 で外部向けとすることで うまく接続できるようになりました。

ファイアーウォールのルールを作成します

最終更新日 2011年01月23日
● ファイアーウォールのルールは、パケットフィルタリング機能である iptables を使用します。このルールを /etc/ppp/firewall-masq として書き込みます。参考までに私の iptables をこちらから落とせるようにしておきます。

● 最初にデフォルトの /etc/ppp/firewall-masq と /etc/rc.d/init.d/iptables をリネームしておきます。
$ sudo mv /etc/ppp/firewall-masq /etc/ppp/firewall-masq.org
$ sudo mv /etc/rc.d/init.d/iptables /etc/rc.d/init.d/iptables.org
/etc/ppp/firewall-masq を作成します。
#!/bin/sh
#
# firewall-masq         This script sets up firewall rules for a machine
#                       acting as a masquerading gateway
#
# Copyright (C) 2000 Roaring Penguin Software Inc.  This software may
# be distributed under the terms of the GNU General Public License, version
# 2 or any later version.
## iptablesのパス
IPTABLES="/sbin/iptables"
# Interface to Internet
EXTIF=ppp0
INTIF=eth0

LOCAL="192.168.3.0/24"
ANY="0.0.0.0/0"

LOOPBACK="127.0.0.0/8"
CLASS_A="10.0.0.0/8"
CLASS_B="172.16.0.0/12"
CLASS_C="192.168.0.0/16"
CLASS_D_MULTICAST="224.0.0.0/4"
CLASS_E_RESERVED_NET="240.0.0.0/5"
P_PORTS="0:1023"
UP_PORTS="1024:65535"
TR_SRC_PORTS="32769:65535"
TR_DST_PORTS="33434:33523"

#################################################
# functions
# 外へでるパケット(と関係するパケット)を許す
AcceptInt() {
protocol=$1
ports=$2
srcs=$3
for port in `echo $ports | sed 's/,/ /g'`
do
    if [ "$srcs" = "" ] ; then
        $IPTABLES -A INPUT -i $EXTIF -p $protocol --sport $port \
            -m state --state ESTABLISHED -j ACCEPT
        $IPTABLES -A OUTPUT -o $EXTIF -p $protocol --dport $port \
            -m state --state NEW,ESTABLISHED -j ACCEPT
    else
        for src in `echo $srcs | sed 's/,/ /g'`
        do
            $IPTABLES -A INPUT -i $EXTIF -s $src -p $protocol --sport $port \
                -m state --state ESTABLISHED -j ACCEPT
            $IPTABLES -A OUTPUT -o $EXTIF -d $src -p $protocol --dport $port \
                -m state --state NEW,ESTABLISHED -j ACCEPT
        done
    fi
done
}
# 外からくるパケット(と関係するパケット)を許す
AcceptExt() {
protocol=$1
ports=$2
srcs=$3
for port in `echo $ports | sed 's/,/ /g'`
do
    if [ "$srcs" = "" ] ; then
        $IPTABLES -A INPUT -i $EXTIF -p $protocol --dport $port \
            -m state --state NEW,ESTABLISHED -j ACCEPT
        $IPTABLES -A OUTPUT -o $EXTIF -p $protocol --sport $port \
            -m state --state ESTABLISHED -j ACCEPT
    else
        for src in `echo $srcs | sed 's/,/ /g'`
        do
            $IPTABLES -A INPUT -i $EXTIF -d $src -p $protocol --dport $port \
                -m state --state NEW,ESTABLISHED -j ACCEPT
            $IPTABLES -A OUTPUT -o $EXTIF -s $src -p $protocol --sport $port \
                -m state --state ESTABLISHED -j ACCEPT
        done
    fi
done
}

#################################################

## load modules
modprobe ip_tables
modprobe ip_conntrack

## 全てのチェインを空する。
# 空になったユーザ定義チェインを削除して
# カウンターをリセットする。
$IPTABLES -F
$IPTABLES -X
$IPTABLES -Z

## 全てのポリシーをDROPにする。
# セキュリティー上 DROPの方が強固なものがつくれる。
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

## Loopback
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

$IPTABLES -A INPUT -p udp --dport 1791 -j REJECT
$IPTABLES -A INPUT -p udp --dport 6546 -j REJECT
$IPTABLES -A INPUT -p udp --dport 27168 -j REJECT
$IPTABLES -A INPUT -p udp --dport 10473 -j REJECT
$IPTABLES -A INPUT -p udp --dport 55922 -j REJECT
$IPTABLES -A INPUT -p udp --dport 22020 -j REJECT

## SYN-FLOODING
# SYNパケットの溢れ防御
$IPTABLES -N syn-flood
$IPTABLES -A INPUT -i $EXTIF -p tcp --syn -j syn-flood
$IPTABLES -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPTABLES -A syn-flood -j LOG \
    --log-prefix "IPTABLES SYN-FLOOD:"
$IPTABLES -A syn-flood -j DROP

## Make sure NEW tcp connections are SYN packets
$IPTABLES -A INPUT -i $EXTIF -p tcp ! --syn -m state --state NEW -j LOG  \
    --log-prefix "IPTABLES SYN-FLOOD:"
$IPTABLES -A INPUT -i $EXTIF -p tcp ! --syn -m state --state NEW -j DROP

## ping of death
# 死のpingからの防御
$IPTABLES -N ping-death
$IPTABLES -A INPUT -i $EXTIF -p icmp --icmp-type echo-request -j ping-death
$IPTABLES -A ping-death -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPTABLES -A ping-death -j LOG \
    --log-prefix "IPTABLES PING-DEATH:"
$IPTABLES -A ping-death -j DROP

## port scaner
# こっそり覗きポートスキャナーからの防御
$IPTABLES -N port-scan
$IPTABLES -A INPUT -i $EXTIF -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j port-scan
$IPTABLES -A port-scan -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPTABLES -A port-scan -j LOG \
    --log-prefix "IPTABLES PORT-SCAN:"
$IPTABLES -A port-scan -j DROP

## SPOOFING
# なりすましパケットの防御
# drop i:ppp+ source:local
$IPTABLES -N spoofing
$IPTABLES -A INPUT -i $EXTIF -s $CLASS_A -j spoofing
$IPTABLES -A INPUT -i $EXTIF -s $CLASS_B -j spoofing
$IPTABLES -A INPUT -i $EXTIF -s $CLASS_C -j spoofing
$IPTABLES -A INPUT -i $EXTIF -s $CLASS_D_MULTICAST -j spoofing
$IPTABLES -A INPUT -i $EXTIF -s $CLASS_E_RESERVED_NET -j spoofing
$IPTABLES -A INPUT -i $EXTIF -d $LOOPBACK -j spoofing
$IPTABLES -A spoofing -j LOG --log-prefix "IPTABLES SPOOFING:"
$IPTABLES -A spoofing -j DROP

## local
# ひとまずローカルはすべて通す
$IPTABLES -A INPUT -i $INTIF -s $LOCAL -j ACCEPT
$IPTABLES -A OUTPUT -o $INTIF -s $LOCAL -j ACCEPT

## DHCP
# ローカルから来たDHCP要求を通す
$IPTABLES -A INPUT -i $INTIF -p udp --dport 67 -j ACCEPT

## DNS
# DNSサーバの応答、要求を通す
AcceptInt udp 53

## AUTH
#$IPTABLES -A OUTPUT -o $EXTIF -p tcp --sport 113 -j REJECT \
#    --reject-with tcp-reset
#$IPTABLES -A INPUT -i $EXTIF -p tcp --dport 113 -j REJECT \
    --reject-with tcp-reset
$IPTABLES -A OUTPUT -o $EXTIF -p tcp --sport 113 -j ACCEPT

## NTP
# 123:ntp
AcceptInt udp 123
## Real Player
# Real Player:6970:7170
$IPTABLES -A INPUT -i $EXTIF -p udp --dport 6970:7170 \
    -m state --state NEW -j ACCEPT

## 外に出るTCPパケットを通す
# 80:http 20:ftp-data ,21:ftp ,25:smtp , 23:telnet ,22:ssh ,110:pop3,113:auth,443:https
AcceptInt tcp 80,20,21,25,110,113,443,989,990
## 外からのTCPパケットを許す
# 80:http ,20:ftp-data,21:ftp,25:smtp,22:ssh ,113:auth,6699:winmx,2401:cvspserver
#AcceptExt tcp 80,20,21,25,22,113,6699
AcceptExt tcp 22,989,990
#AsseptExt tcp 80,20,21
## FTP
# ESTABLISHED RELATED for passive mode ftp
# passiveモードでのFTP DATAパケットを通す
$IPTABLES -A INPUT -i $EXTIF -p tcp --sport $UP_PORTS --dport $UP_PORTS \
    -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTIF -p tcp --sport $UP_PORTS --dport $UP_PORTS \
    -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT  -i $EXTIF -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTIF -p tcp --dport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT

# ESTABLISHED RELATED for data connection mode ftp
$IPTABLES -A INPUT  -i $EXTIF -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTIF -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT

## TRACEROUTE
# 外に出るtracerouteを通るようにする
$IPTABLES -A OUTPUT -o $EXTIF -p udp --dport $TR_DST_PORTS \
    -m state --state NEW -j ACCEPT

## ICMP
# ping を通すようにする
$IPTABLES -A INPUT -i $EXTIF -p icmp \
    -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTIF -p icmp \
    -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# 拒否したいIPアドレスからのアクセスはログを記録せずに破棄する
# ※拒否したいIPアドレスは/root/deny_ipに1行ごとに記述しておくこと
if [ -s /root/deny_ip ]; then
        for ip in `cat /root/deny_ip`
        do
            $IPTABLES -I INPUT -s $ip -j DROP
        done
fi

# 指定した国からのアクセスはログを記録せずに破棄する
# ※COUNTRYLISTにスペース区切りでアクセスを拒否したいCountry Codeを指定
COUNTRYLIST='CN BR CZ HK SE MX RU PL AT IN IT DE ZA RO BG MY UA PH IE IL EG AU CA'
#/usr/bin/wget -q http://ftp.apnic.net/stats/apnic/delegated-apnic-latest
$IPTABLES -N OTHERFILTER
$IPTABLES -A OTHERFILTER -j DROP
for country in $COUNTRYLIST
do
    for ip in `cat delegated-apnic-latest | grep "apnic|$country|ipv4|"`
    do
        FILTER_ADDR=`echo $ip |cut -d "|" -f 4`
        TEMP_CIDR=`echo $ip |cut -d "|" -f 5`
        FILTER_CIDR=32
        while [ $TEMP_CIDR -ne 1 ];
        do
                TEMP_CIDR=$((TEMP_CIDR/2))
                FILTER_CIDR=$((FILTER_CIDR-1))
        done
        $IPTABLES -I INPUT -s $FILTER_ADDR/$FILTER_CIDR -j OTHERFILTER
    done
done
#rm -f delegated-apnic-latest

## others LOG
$IPTABLES -A INPUT  -i $EXTIF -p udp -j LOG --log-prefix "IPTABLES UDP-IN:"
$IPTABLES -A INPUT  -i $EXTIF -p udp -j DROP
$IPTABLES -A OUTPUT -o $EXTIF -p udp -j LOG --log-prefix "IPTABLES UDP-OUT:"
$IPTABLES -A OUTPUT -o $EXTIF -p udp -j DROP
$IPTABLES -A INPUT  -i $EXTIF -p icmp -j LOG --log-prefix "IPTABLES ICMP-IN:"
$IPTABLES -A INPUT  -i $EXTIF -p icmp -j DROP
$IPTABLES -A OUTPUT -o $EXTIF -p icmp -j LOG --log-prefix "IPTABLES ICMP-OUT:"
$IPTABLES -A OUTPUT -o $EXTIF -p icmp -j DROP
#$IPTABLES -A INPUT  -i $EXTIF -p tcp -j LOG --log-prefix "IPTABLES TCP-IN:"
$IPTABLES -A INPUT  -i $EXTIF -p tcp -j DROP
$IPTABLES -A OUTPUT -o $EXTIF -p tcp -j LOG --log-prefix "IPTABLES TCP-OUT:"
$IPTABLES -A OUTPUT -o $EXTIF -p tcp -j DROP
$IPTABLES -A INPUT  -i $EXTIF -j LOG --log-prefix "IPTABLES UNKNOWN-IN:"
$IPTABLES -A INPUT  -i $EXTIF -j DROP
$IPTABLES -A OUTPUT -o $EXTIF -j LOG --log-prefix "IPTABLES UNKNOWN-OUT:"
$IPTABLES -A OUTPUT -o $EXTIF -j DROP


## Do masquerading
# LOCALのパケットをマスカレードする
$IPTABLES -A FORWARD -s $LOCAL -j ACCEPT
$IPTABLES -A FORWARD -d $LOCAL -j ACCEPT
$IPTABLES -A FORWARD -j LOG

$IPTABLES -t nat -A POSTROUTING -j MASQUERADE

# マスカレードを許可する
echo 1 > /proc/sys/net/ipv4/ip_forward

# 必要なモジュールを組み込む
modprobe ip_conntrack_ftp

● このスクリプト作成にあたっては、
Linuxルーター構築(rp-pppoe+iptables)を参考にさせていただきました。感謝!  
  

インターネット接続設定

最終更新日 2011年01月23日
● ここでは ADSL や FTTH で PPPoE を使って接続する場合を想定しています。PPPoE を利用するには rp-pppoe と ppp のパッケージが必要になります。インストールされていない場合は
$ sudo apt-get install rp-pppoe ppp
としてインストールしておいてください。次に pppoe-setup を使って設定をしていきます。
$ sudo /usr/sbin/pppoe-setup
    Welcome to the Roaring Penguin PPPoE client setup.  First, I will run
    some checks on your system to make sure the PPPoE client is installed
    properly...

    Looks good!  Now, please enter some information:

    USER NAME

    >>> Enter your PPPoE user name (default root): XXXXXXXX 
↑ プロバイダから通知されているユーザーID を記入
     
    INTERFACE

    >>> Enter the Ethernet interface connected to the DSL modem
    For Solaris, this is likely to be something like /dev/hme0.
    For Linux, it will be ethn, where 'n' is a number.
    (default eth0): eth1   ← 外部接続用の eth1 を記入

    Do you want the link to come up on demand, or stay up continuously?
    If you want it to come up on demand, enter the idle time in seconds
    after which the link should be dropped.  If you want the link to
    stay up permanently, enter 'no' (two letters, lower-case.)
    NOTE: Demand-activated links do not interact well with dynamic IP
    addresses.  You may have some problems with demand-activated links.
    >>> Enter the demand value (default no):   ← そのままエンターキーを打つ

    DNS

    Please enter the IP address of your ISP's primary DNS server.
    If your ISP claims that 'the server will provide DNS addresses',
    enter 'server' (all lower-case) here.
    If you just press enter, I will assume you know what you are
    doing and not modify your DNS setup.
    >>> Enter the DNS information here: 
 ↑ プロバイダから DNS サーバのIP アドレスを指定されている場合は
             プライマリDNS のIPアドレスを入力してください。
 ↑ プロバイダからのアドレス指定が無い場合は、server と記入してください。
    
          DNSの IPアドレスを入力した場合
					
          Please enter the IP address of your ISP's secondary DNS server.
          If you just presss enter, I will assume there is only one DNS server.
          >>> Enter the secondary DNS server address here: 	
	↑ 続けてセカンダリDNS のIPアドレスを入力してください。


    PASSWORD

    >>> Please enter your Password:  ← プロバイダから通知されたパスワードを記入
    >>> Please re-enter your Password:  ← もう一度パスワードを記入

          FIREWALLING

          Please choose the firewall rules to use.  Note that these rules are
          very basic.  You are strongly encouraged to use a more sophisticated
          firewall setup; however, these will provide basic security.  If you
          are running any servers on your machine, you must choose 'NONE' and
          set up firewalling yourself.  Otherwise, the firewall rules will deny
          access to all standard servers like Web, e-mail, ftp, etc.  If you
          are using SSH, the rules will block outgoing SSH connections which
          allocate a privileged source port.

          The firewall choices are:
          0 - NONE: This script will not set any firewall rules.  You are responsible
                    for ensuring the security of your machine.  You are STRONGLY
                    recommended to use some kind of firewall rules.
          1 - STANDALONE: Appropriate for a basic stand-alone web-surfing workstation
          2 - MASQUERADE: Appropriate for a machine acting as an Internet gateway
                          for a LAN
          >>> Choose a type of firewall (0-2): 2   ← 1 は直接ネットに接続する場合
                                                          2 はルーターとして使用する場合

    ** Summary of what you entered **

    Ethernet Interface: eth1
    User name: XXXXXXXX
    Activate-on-demand: No
        Primary DNS:xxx.xxx.xxx.xxx	          ← DNSの IPアドレスを入力した場合
    Secondary DNS: xxx.xxx.xxx.xxx            ← DNSの IPアドレスを入力した場合
    Firewalling: MASQUERADE
    
    Accept these settings and adjust configuration files (y/n)? y 
  ↑  間違いがなければ y を打つ

その他の接続確認

最終更新日 2011年01月23日
● /etc/resolv.conf の確認
$ sudo vi /etc/resolv.conf
    nameserver XXX.XXX.XXX.XXX   ← プロバイダから通知されたプライマリアドレス
    nameserver XXX.XXX.XXX.XXX   ← プロバイダから通知されたセカンダリアドレス
● インターネットへの接続確認
$ sudo /etc/rc.d/init.d/pppoe start
● ファイアーウォールが作動しているか確認
$ sudo /sbin/iptables -L | less
    Chain INPUT (policy DROP)
         :
         :
となっていて、スクリプトで設定した通りのログになっているかチェック

● さらにクライアントマシンから次のサイトにアクセスして、自分の意図している結果になっているか確認する。
Shields UP! - Internet Vulnerability Profiling の中程にある Proceed ボタンをクリック。
   その次のページの "All Service Ports" ボタンをクリックして、下記のように緑色の STEALTH で埋まっていればとりあえず OK です。

     外部からのアクセスを許可しているポート → ■ OPEN
     外部からのアクセスを拒否しているポート → ■ CLOSE
     その他、DROP しているポート       → ■ STEALTH

さらに "Text Summary" のボタンを押して下記のようにテスト結果が表示されていれば OK です。



● 起動時に自動で接続するには下記のコマンドなのですが、これに限っては自動起動させずにシステム立ち上げ後に接続するようにしたほうがベターです。
$ sudo /sbin/chkconfig pppoe on

iptables が出力した syslog の内容を整理して表示する

最終更新日 2011年01月23日
● 「ファイアーウォールのルールを作成します」で設定した /etc/ppp/firewall-masq によるログが、/var/log/messages に出力されています。普段これを定期的にチェックすることはなかなか出来ないため、ログの内容を整理して報告するようにします。

最初にログの状態を見てみます。
$ sudo tail -n 50 /var/log/messages
Mar 21 10:48:05 host kernel: IPTABLES ICMP-IN:IN=ppp0 OUT= MAC= SRC=218.152.38.xxx
DST=xxx.xxx.xxx.xxx LEN=61 TOS=0x00 PREC=0x00 TTL=112 ID=8814 PROTO=ICMP
 TYPE=8 CODE=0 ID=512 SEQ=46264
Mar 21 10:50:58 host kernel: IPTABLES UDP-IN:IN=ppp0 OUT= MAC= SRC=222.216.222.xxx
DST=xxx.xxx.xxx.xxx LEN=404 TOS=0x00 PREC=0x00 TTL=113 ID=2788 PROTO=UDP
 SPT=1308 DPT=1434 LEN=384
Mar 21 11:00:56 host kernel: IPTABLES UDP-IN:IN=ppp0 OUT= MAC= SRC=109.106.118.xxx
DST=xxx.xxx.xxx.xxx LEN=401 TOS=0x00 PREC=0x00 TTL=51 ID=12115 PROTO=UDP
 SPT=30617 DPT=1026 LEN=381
Mar 21 11:07:06 host kernel: IPTABLES ICMP-IN:IN=ppp0 OUT= MAC= SRC=65.60.219.xxx
DST=xxx.xxx.xxx.xxx LEN=92 TOS=0x00 PREC=0x00 TTL=114 ID=12029 PROTO=ICMP
 TYPE=8 CODE=0 ID=512 SEQ=14881
(以下 略)
このように ICMP-IN とか UDP-IN などのログが非常にたくさん記録されている。

● これをタイプ別・相手アドレス別・時間順に整理して報告するスクリプトを書く。
$ cd /usr/local/bin
$ sudo vi iptables_report.sh
#!/bin/bash

# iptables-report

# syslogd.conf
#    kern.=*    /var/log/messages
# iptables LOG target option
#    --log-prefix "IPTABLES XXXXXX"

HOSTNAME="host"   ← 自分のホスト名を入れてください。
IPT_LABEL="IPTABLES"
LOGFILE="/var/log/messages"

TODAY=`date +%c`
MDAY=`LANG=en_US.UTF-8 date '+%b %_d'`

echo
echo "$0: Creating temp files"
TMP1=`/bin/mktemp -q /var/log/tmp/logfile.XXXXXX`
if [ $? -ne 0 ]; then
    echo "$0: Can't create temporary file!"
    exit 1
fi
TMP2=`/bin/mktemp -q /var/log/tmp/logfile.XXXXXX`
if [ $? -ne 0 ]; then
    echo "$0: Can't create temporary file !"
    exit 1
fi

echo "$0: Filtering date-specific data"
cat $LOGFILE | grep "$MDAY" | grep $IPT_LABEL > $TMP1
echo "$0: Cosmetic markdown"
sed -e "s/ $HOSTNAME kernel://g" ¥
    -e "s/ $IPT_LABEL//g" ¥
    -e 's/IN=.* SRC=//g' ¥
    -e 's/ WINDOW=[0-9][0-9]*//g' ¥
    -e 's/ LEN=[0-9][0-9]*//g' ¥
    -e 's/ TTL=[0-9][0-9]*//g' ¥
    -e 's/ ID=[0-9][0-9]*//g' ¥
    -e 's/DST=//g' ¥
    -e 's/ TOS=[0-9]x[0-9][0-9]//g' ¥
    -e 's/ PREC=[0-9]x[0-9][0-9]//g' ¥
    -e 's/ RES=[0-9]x[0-9][0-9]//g' ¥
    -e 's/ URGP=0//g' ¥
    -e 's/ DF//g' ¥
    -e 's/ / /g' ¥
    -e 's/PROTO=//g' ¥
    -e 's/SPT=.*DPT=//g' $TMP1 > $TMP2

echo "$0: Sorting and grouping"
awk -F" " ' { print $4 " " $5 " " $1 " " $2 " " $3 " " $6 " " $7 " " $8 " " $9
} ' $TMP2 |
sort > $TMP1
awk -F" " '
$1 == LastTYPE{
if($2 == LastIP) print "¥t¥t" $3 " " $4 " " $5 " " $6 " " $7 " " $8 " " $9
else if($2 != LastIP) {
LastIP = $2
print "¥t" $2
print "¥t¥t" $3 " " $4 " " $5 " " $6 " " $7 " " $8 " " $9
}
}
$1 != LastTYPE{
LastTYPE = $1
print " "
print $1 " :"
if($2 == LastIP) print "¥t¥t" $3 " " $4 " " $5 " " $6 " " $7 " " $8 " " $9
else if($2 != LastIP) {
LastIP = $2
print "¥t" $2
print "¥t¥t" $3 " " $4 " " $5 " " $6 " " $7 " " $8 " " $9
}
}' $TMP1 > $TMP2

#echo "$0: Notifying via e-mail"                  
       ← メールで受け取る場合は "#" を外す。
#cat $TMP2 | mail -s "iptables report for $TODAY" jibun@adress.jp
       ← メールで受け取る場合は "#" を外す。

#echo "$0: Cleaning up"
mv $TMP2 "$MDAY"
chmod 744 "$MDAY"
cp "$MDAY" /home/user/security/iptables_report  
       ← ファイルに書き込む場合
rm -f $TMP1 $TMP2 $MDAY
● ファイルに書き込む場合は書き込み先のディレクトリを作っておく。
$ sudo mkdir -p /var/log/tmp
$ mkdir -p /home/user/security/iptables_report/
● 上記の mail コマンドで送る場合には、postfix が動いているか確認しておいて下さい。
$ rpm -q postfix
postfix-2.6.3-2vl5
$ sudo /etc/rc.d/init.d/postfix status master (pid 3657) を実行中...
動いていなかったら start してください。
● cron で自動実行する。
$ sudo crontab -e
59 7,11,23 * * * /usr/local/bin/iptables_report.sh
これで毎日、7時59分・11時59分・23時59分に実行され、上記の設定よってメールで報告されるかファイルに書き込まれる。

● 結果はこのように見やすい状態で表示される。
ICMP-IN:89.151.133.xxx :
		Mar 21 07:06:42 ICMP TYPE=8 CODE=0 SEQ=29736
		Mar 21 07:06:45 ICMP TYPE=8 CODE=0 SEQ=63273
 
ICMP-IN:89.156.175.xxx :
		Mar 21 03:44:45 ICMP TYPE=8 CODE=0 SEQ=51023
		Mar 21 03:44:47 ICMP TYPE=8 CODE=0 SEQ=55376
 
SYN-FLOOD:200.239.53.xxx :
		Mar 21 03:33:03 TCP 48688 ACK PSH
		Mar 21 03:33:03 TCP 48688 ACK PSH
		Mar 21 03:33:08 TCP 48688 ACK PSH
		Mar 21 03:33:19 TCP 48688 ACK PSH
		Mar 21 03:33:40 TCP 48688 ACK PSH
		Mar 21 03:34:23 TCP 48688 ACK PSH
		Mar 21 03:35:49 TCP 48688 ACK PSH
 
SYN-FLOOD:220.224.17.xxx :
		Mar 21 09:21:42 TCP 1433 RST 
 
UDP-IN:104.79.253.xxx :
		Mar 21 04:21:46 UDP 1026  
 
UDP-IN:109.106.118.xxx :
		Mar 21 11:00:56 UDP 1026  
 
UDP-IN:12.203.253.xxx :
		Mar 21 01:37:41 UDP 1026 
      

NTP サーバの設定

最終更新日 2011年02月01日
● NTPサーバーを構築して、システム時刻を日本標準時間に自動的に合わせるようにします。
最初に ntp がインストールされていない場合は apt-get で入れておきます。

ntp の設定ファイルを編集します。
$ sudo vi /etc/ntp.conf
#server 127.127.1.0     # local clock
server  ntp.tut.ac.jp        同期をとるサーバーを指定
server  ntp1.jst.mfeed.ad.jp        同期をとるサーバーを指定
fudge   127.127.1.0 stratum 10

* NTP サーバの指定には、福岡大学を指定する人が多いようですが、出来るだけ分散化させるためにも
 御自分の近くを選ぶ等の配慮をしましょう。 サーバ一覧はこちらです

$ sudo /etc/init.d/ntpd start

$ sudo /sbin/chkconfig ntpd on

プロキシサーバの設定

最終更新日 2011年02月01日
● プロクシサーバの設定をします。プロクシサーバは一度アクセスされた Web サイトの情報をサーバ内に キャッシュすることにより、 次回からの同一 Web サイトへのアクセスの効率を向上します。また、プロ クシサーバがクライアントの身元を隠し、 結果的にセキュリティが向上します。 ● Squid のインストール
$ rpm -q squid としてパッケージがインストールされてなければ
$ sudo apt-get install squid
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
以下の追加パッケージがインストールされます:
  perl-Authen-Smb
以下のパッケージが新たにインストールされます:
  perl-Authen-Smb squid
アップグレード: 0 個, 新規インストール: 2 個, 削除: 0 個, 保留: 0 個
1595kB のアーカイブを取得する必要があります。
展開後に 4574kB のディスク容量が追加消費されます。
続行しますか? [Y/n]y
取得:1 http://updates.vinelinux.org 5.2/x86_64/plus perl-Authen-Smb 0.91-2vl5 [32.6kB]
取得:2 http://updates.vinelinux.org 5.2/x86_64/plus squid 7:3.0.STABLE25-2vl5 [1562kB]
1595kB を 0s 秒で取得しました (2052kB/s)
変更を適用しています...
準備中                                ############################## [100%]
更新/インストール中
  perl-Authen-Smb-0.91-2vl5.x86_64       ############################## [100%]
  squid-3.0.STABLE25-2vl5.x86_64         ############################## [100%]
完了
● squid.conf の編集
* squid.conf は非常に大きなファイルのため(ほとんどがコメントアウト文だが)変更箇所及び付加した
箇所のみを抜き出しました。またおおよその見当を付けるためとして行番号を入れておきました。 

$ sudo vi /etc/squid/squid.conf

acl CONNECT method CONNECT         およそ603行目
acl lan src 192.168.3.0/255.255.255.0         ← 追加

# And finally deny all other access to this proxy
http_access allow localhost         およそ650行目
http_access allow lan        ← 追加
http_access deny all

#       although many of those are HTTP reply headers, and so should be
#       controlled with the reply_header_access directive.
#
#       By default, all headers are allowed (no anonymizing is
#       performed).
#
#Default:
# none         およそ2682行目
request_header_access X-Forwarded-For deny all        ← 追加
request_header_access Via deny all        ← 追加
request_header_access Cache-Control deny all        ← 追加
request_header_access User-Agent deny all        ← 追加
request_header_access Referer deny all        ← 追加

#  TAG: visible_hostname
#       If you want to present a special hostname in error messages, etc,
#       define this.  Otherwise, the return value of gethostname()
#       will be used. If you have multiple caches in a cluster and
#       get errors about IP-forwarding you must set them to have individual
#       names with this setting.
#
#Default:
# none         およそ2981行目
visible_hostname unknown        ← 追加

#Default:
# forwarded_for on         およそ4521行目
forwarded_for off        ← 追加

$ sudo /etc/init.d/squid start
init_cache_dir /var/spool/squid... squidを起動中: .             [  OK  ]

プロキシサーバーでウィルスチェック

最終更新日 2011年02月02日
● Squid + SquidClamAV + ClamAV を使ってプロキシサーバでウィルスチェックを行います。ここでもやはりCentOSで自宅サーバー構築 を参考にさせていただいています。感謝!
これらを構築するにあたっては Squid CalmAV Apache がすでにインストールされていることが前提となります。
* SquidClamAV に必要となる curl-devel を予めインストールしておきます。

$ sudo apt-get install curl-devel
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
以下の追加パッケージがインストールされます:
  libidn-devel openssl-devel pkgconfig
以下のパッケージが新たにインストールされます:
  curl-devel libidn-devel openssl-devel pkgconfig
アップグレード: 0 個, 新規インストール: 4 個, 削除: 0 個, 保留: 0 個
1523kB のアーカイブを取得する必要があります。
展開後に 3005kB のディスク容量が追加消費されます。
続行しますか? [Y/n]y
取得:1 http://updates.vinelinux.org 5.2/x86_64/main openssl-devel 0.9.8p-1vl5 [1071kB]
取得:2 http://updates.vinelinux.org 5.2/x86_64/main pkgconfig 1:0.23-5vl5 [91.5kB]
取得:3 http://updates.vinelinux.org 5.2/x86_64/main libidn-devel 1.11-2vl5 [193kB]
取得:4 http://updates.vinelinux.org 5.2/x86_64/main curl-devel 7.19.6-2vl5 [168kB]
1523kB を 0s 秒で取得しました (1648kB/s)
変更を適用しています...
準備中                                ############################## [100%]
更新/インストール中
  pkgconfig-0.23-5vl5.x86_64             ############################## [100%]
  libidn-devel-1.11-2vl5.x86_64          ############################## [100%]
  openssl-devel-0.9.8p-1vl5.x86_64       ############################## [100%]
  curl-devel-7.19.6-2vl5.x86_64          ############################## [100%]
完了

* squidclamav の最新版チェックはこちらから
$ cd rpm/SOURCES/
$ wget http://sourceforge.net/projects/squidclamav/files/squidclamav/5.7/squidclamav-5.7.tar.gz/download
--2011-02-02 12:57:59--  http://sourceforge.net/projects/squidclamav/files/squidclamav/5.7/squidclamav-5.7.tar.gz/download
sourceforge.net をDNSに問いあわせています... 216.34.181.60
sourceforge.net|216.34.181.60|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: http://downloads.sourceforge.net/project/squidclamav/squidclamav/5.7/squidclamav-5.7.tar.gz?r=&ts=1296619079&use_mirror=jaist [続く]
--2011-02-02 12:57:59--  http://downloads.sourceforge.net/project/squidclamav/squidclamav/5.7/squidclamav-5.7.tar.gz?r=&ts=1296619079&use_mirror=jaist
downloads.sourceforge.net をDNSに問いあわせています... 216.34.181.59
downloads.sourceforge.net|216.34.181.59|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: http://jaist.dl.sourceforge.net/project/squidclamav/squidclamav/5.7/squidclamav-5.7.tar.gz [続く]
--2011-02-02 12:58:00--  http://jaist.dl.sourceforge.net/project/squidclamav/squidclamav/5.7/squidclamav-5.7.tar.gz
jaist.dl.sourceforge.net をDNSに問いあわせています... 150.65.7.130, 2001:200:141:feed::feed
jaist.dl.sourceforge.net|150.65.7.130|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 443396 (433K) [application/x-gzip]
`squidclamav-5.7.tar.gz' に保存中

100%[======================================>] 443,396     1.50M/s 時間 0.3s

2011-02-02 12:58:01 (1.50 MB/s) - `squidclamav-5.7.tar.gz' へ保存完了 [443396/443396]

$ cd ../BUILD/
$ tar zxvf ../SOURCES/squidclamav-5.7.tar.gz
$ cd squidclamav-5.7/
$ ./configure
$ make
$ sudo make install

$ sudo mkdir /var/www/cgi-bin
$ sudo cp cgi-bin/clwarn.cgi /var/www/cgi-bin/
$ sudo cp /usr/local/etc/squidclamav.conf /etc/squidclamav.conf
$ cd ..
$ rm -rf squidclamav-5.7/

$ sudo mkdir /var/run/clamav
$ sudo touch /var/run/clamav/clamd.sock

$ sudo vi /etc/squidclamav.conf
# Global configuration
#
proxy http://127.0.0.1:3128/
squid_ip 127.0.0.1
squid_port 3128
logfile /var/log/squid/squidclamav.log
maxsize 5000000
redirect http://localhost/cgi-bin/clwarn.cgi
#squidguard /usr/local/squidGuard/bin/squidGuard
debug 0
stat 0
maxredir 30
clamd_local /var/run/clamav/clamd.sock
#clamd_ip 192.168.1.5,127.0.0.1
#clamd_port 3310
timeout 60
useragent Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
trust_cache 1
logredir 0

#
# Squidclamav behaviour
# (since v5.0 Squidclamav scan all file by default)
#
# Here is the defaut regex pattern pattern I use to bypass virus scan.
#

# Do not scan images
abort ^.*\.gz$
abort ^.*\.bz2$
abort ^.*\.pdf$
abort ^.*\.js$
abort ^.*\.html$
abort ^.*\.css$
abort ^.*\.xml$
abort ^.*\.xsl$
abort ^.*\.js$
abort ^.*\.ico$
aborti ^.*\.gif$
aborti ^.*\.png$
aborti ^.*\.jpg$
aborti ^.*\.swf$
content ^.*application\/.*$
# See also 'trustuser' and 'trustclient' configuration directives

$ sudo touch /var/log/squidclamav.log
$ sudo chown squid:squid /var/log/squidclamav.log

$ sudo vi /etc/logrotate.d/squidclamav
/var/log/squidclamav.log {
    missingok
    notifempty
    sharedscripts
    postrotate
        killall -HUP squidclamav > /dev/null 2>/dev/null || true
    endscript
}

* squid.conf の編集

$ sudo vi /etc/squid/squid.conf
#http_access deny to_localhost         およそ640行目
http_access deny to_localhost         ← # を外す

#  TAG: url_rewrite_program         およそ2159行目

#Default:
# none
url_rewrite_program /usr/local/bin/squidclamav         ← 追加

#Default:
# url_rewrite_children 5        およそ2192行目
url_rewrite_children 15         ← 追加

#  TAG: url_rewrite_access        およそ2213行目
#       If defined, this access list specifies which requests are
#       sent to the redirector processes.  By default all requests
#       are sent.
#
#Default:
# none
url_rewrite_access deny localhost         ← 追加

:wq で終了

* clamd.conf の編集
$ sudo vi /etc/clamd.conf

#LocalSocket /tmp/clamd.socket        ← # でコメントにする
LocalSocket /var/run/clamav/clamd.sock        ← 追加

$ sudo /etc/init.d/clamd restart
ClamAV Daemon 停止中
                                                                [  OK   ]
ClamAV Daemon を起動中: LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***  This version of the ClamAV engine is outdated.     ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***  This version of the ClamAV engine is outdated.     ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***  This version of the ClamAV engine is outdated.     ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
                                                                [  OK  ]
                                                                
$ sudo /etc/init.d/squid restart
squidを停止中: ................                                 [  OK  ]
squidを起動中: .                                                [  OK  ]

無停電電源装置(UPS) の設定

最終更新日 2011年01月23日
● サーバマシンにとって停電(瞬電)による電源ダウンは致命的な影響を与える場合があります。そこでここでは無停電電源装置(UPS) を使って停電時にも しばらくの電源確保が出来ると同時に UPS のバッテリーが少なくなると自動でシャットダウンし、再度電源供給が始まるとこれまた自動で立ち上がるように設定していきます。ここでは APC社製 UPS ES 750 を使って、電源管理ツールには apcupsd を使うことします。
最初に apcupsd をダウンロードしてきます

$ cd rpm/SOURCES
$ wget http://sourceforge.net/projects/apcupsd/files/apcupsd%20-%20Stable/3.14.8/
apcupsd-3.14.8.tar.gz/download
$ cd ../BUILD
$ tar xvzf apcupsd-3.14.8.tar.gz

このまま configure make と進んでも、最後に distribution が解からないといってエラーになるので
ちょいと細工をしておく

$ sudo vi /etc/redhat-release
Red Hat Linux release 6.2 (Zoot)         この行を足しておく

$ cd ~/rpm/BUILD/apcupsd-3.14.8/
$ ./configure --enable-usb --enable-cgi
$ make
$ sudo make install

次に設定ファイルを編集します。

$ sudo vi /etc/apcupsd/apcupsd.conf

UPSCABLE smart          これを次のように usb と変更する
UPSCABLE usb

UPSTYPE apcsmart         これを次のように usb と変更する
UPSTYPE usb
DEVICE         DEVICE の後には何も記入しない

$ sudo vi /etc/rc.d/rc.local
/sbin/apcupsd        最下行にこれを足しておく

UPS とサーバを UPS 同梱のUSBケーブルで接続する。この時に

$ sudo tail -f /var/log/messages

とやっておくと、ちゃんと認識されたかが画面から確認できる。

$ sudo /etc/rc.d/init.d/apcupsd start
Starting UPS monitoring:                       [ OK ]         となれば OK

$ sudo /etc/rc.d/init.d/apcupsd status
apcupsd (pid 3907) を実行中...
APC      : 001,038,0943
DATE     : 2011-01-22 21:49:16 +0900
HOSTNAME : user.host
VERSION  : 3.14.8 (16 January 2010) redhat
UPSNAME  : APC_ES_750
CABLE    : USB Cable
MODEL    : APC ES 750G
UPSMODE  : ShareUPS Master
STARTTIME: 2011-01-22 21:43:11 +0900
SHARE    : ShareUPS
STATUS   : ONLINE
LINEV    : 101.0 Volts
LOADPCT  :  10.0 Percent Load Capacity
BCHARGE  : 100.0 Percent
TIMELEFT :  43.0 Minutes
MBATTCHG : 5 Percent
MINTIMEL : 3 Minutes
MAXTIME  : 0 Seconds
SENSE    : Medium
LOTRANS  : 090.0 Volts
HITRANS  : 110.0 Volts
ALARMDEL : Always
BATTV    : 13.5 Volts
LASTXFER : No transfers since turnon
NUMXFERS : 0
TONBATT  : 0 seconds
CUMONBATT: 0 seconds
XOFFBATT : N/A
SELFTEST : NO
STATFLAG : 0x07000008 Status Flag
MANDATE  : 2010-06-26
SERIALNO : 3B1026X45520
BATTDATE : 2010-06-26
NOMINV   : 100 Volts
NOMBATTV :  12.0 Volts
NOMPOWER : 450 Watts
FIRMWARE : 859.K1 .A USB FW:K1
APCMODEL : APC ES 750G
END APC  : 2011-01-22 21:50:02 +0900

或は

$ /sbin/apcaccess status

$ sudo /sbin/chkconfig apcupsd on
● シャットダウン時に Apcupsd デーモンから UPS 自体の電源を落とす信号を送るようにする。
$ sudo vi /etc/init.d/halt

# Shutdown UPS drivers
if [ "$command" = /sbin/halt -a -f /etc/sysconfig/ups ]; then
	. /etc/sysconfig/ups
	if [ -z $POWERDOWNFLAG ]; then
#		POWERDOWNFLAG=/etc/killpower
		POWERDOWNFLAG=/etc/apcupsd/powerfail
	fi
	if [ "$SERVER" = "yes" -a -f $POWERDOWNFLAG ]; then
#		/sbin/upsdrvctl shutdown
		/etc/apcupsd/apccontrol killpower
	fi
fi

ファイル改竄検知システム(Tripwire) の導入

最終更新日 2011年11月10日
● クラッカーなどからのファイルの改竄をチェックする Tripwire をインストールします。出来るだけ Linux のインストールの初期段階で導入しておくのが望ましいです。また設定が少しややこしいかも知れませんが、落ち着いて理解しながら進めてください。
sourceforge.net から最新のパッケージをダウンロードしてきます。
$ cd rpm/SOURCES/
$ wget http://sourceforge.net/projects/tripwire/files/tripwire-src/
tripwire-2.4.2-src/tripwire-2.4.2-src.tar.bz2/download
--2011-01-23 15:19:08--  http://sourceforge.net/projects/tripwire/files/
tripwire-src/tripwire-2.4.2-src/tripwire-2.4.2-src.tar.bz2/download
sourceforge.net をDNSに問いあわせています... 216.34.181.60
sourceforge.net|216.34.181.60|:80 に接続しています... 接続しました。
                                    :
                                    :
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 708623 (692K) [application/x-bzip2]
`tripwire-2.4.2-src.tar.bz2' に保存中

100%[======================================>] 708,623     2.55M/s 時間 0.3s

2011-01-23 15:19:10 (2.55 MB/s) - `tripwire-2.4.2-src.tar.bz2' へ保存完了 [708623/708623]

● Tripwire のインストール
$ cd ../BUILD/
$ tar jxvf ../SOURCES/tripwire-2.4.2-src.tar.bz2
$ cd tripwire-2.4.2-src/
$ sudo ./configure --prefix=/usr/local/tripwire sysconfdir=/etc/tripwire
$ sudo make
$ sudo make install

 Installer program for:
Tripwire(R) 2.4 Open Source

Copyright (C) 1998-2000 Tripwire (R) Security Systems, Inc.  Tripwire (R)
is a registered trademark of the Purdue Research Foundation and is
licensed exclusively to Tripwire (R) Security Systems, Inc.


LICENSE AGREEMENT for Tripwire(R) 2.4 Open Source

Please read the following license agreement.  You must accept the
agreement to continue installing Tripwire.

Press ENTER to view the License Agreement.         ← 空 ENTER

Please type "accept" to indicate your acceptance of this
license agreement. [do not accept]accept       accept と記入

Continue with installation? [y/n] y       y と記入

Enter the site keyfile passphrase:       ← 任意のサイトパスフレーズ記入
Verify the site keyfile passphrase:       ← 再度記入

Enter the local keyfile passphrase:       ← 任意のローカルパスフレーズ記入
Verify the local keyfile passphrase:      ← 再度記入

Creating signed configuration file...
Please enter your site passphrase:      ← 先程のサイトパスフレーズ記入

Creating signed policy file...
Please enter your site passphrase:      ← 先程のサイトパスフレーズ記入

----------------------------------------------
The installation succeeded.

Please refer to
for release information and to the printed user documentation
for further instructions on using Tripwire 2.4 Open Source.

make[3]: ディレクトリ `/home/user/rpm/BUILD/tripwire-2.4.2-src' から出ます
make[2]: ディレクトリ `/home/user/rpm/BUILD/tripwire-2.4.2-src' から出ます
make[1]: ディレクトリ `/home/user/rpm/BUILD/tripwire-2.4.2-src' から出ます

落としてきたファイルや展開したファイルを削除
$ cd ..
$ rm -rf tripwire-2.4.2-src/
$ rm -f ../SOURCES/tripwire-2.4.2-src.tar.bz2
$ sudo echo PATH=$PATH:/usr/local/tripwire/sbin >> .bashrc ; source .bashrc
      ← tripwire実行ファイル格納ディレクトリへパスを通す

● Tripwire設定
$ sudo vi /etc/tripwire/twcfg.txt

LOOSEDIRECTORYCHECKING =false
LOOSEDIRECTORYCHECKING =true       ← ファイル変更時に所属ディレクトリの変更を
                                                                                     通知しないようにする

REPORTLEVEL   =3
REPORTLEVEL   =4       ← リポートレベルを変更する

$ sudo /usr/local/tripwire/sbin/twadmin -m F -c /etc/tripwire/tw.cfg -S
 /etc/tripwire/site.key /etc/tripwire/twcfg.txt
        ← Tripwire設定ファイル(暗号署名版)作成
Please enter your site passphrase:      ← 先程のサイトパスフレーズ記入
Wrote configuration file: /etc/tripwire/tw.cfg

$ sudo rm -f /etc/tripwire/twcfg.txt       ← Tripwire設定ファイル(テキスト版)削除

※Tripwire設定ファイル(テキスト版)を復元する場合
$ sudo sh -c "/usr/local/tripwire/sbin/twadmin -m f -c /etc/tripwire/tw.cfg > /etc/tripwire/twcfg.txt"
● ポリシーファイル設定
$ sudo vi /etc/tripwire/twpolmake.pl
#!/usr/bin/perl
# Tripwire Policy File customize tool
# ----------------------------------------------------------------
# Copyright (C) 2003 Hiroaki Izumi
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
# ----------------------------------------------------------------
# Usage:
#    perl twpolmake.pl {Pol file}
# ----------------------------------------------------------------
#
$POLFILE=$ARGV[0];

open(POL,"$POLFILE") or die "open error: $POLFILE" ;
my($myhost,$thost) ;
my($sharp,$tpath,$cond) ;
my($INRULE) = 0 ;

while () {
    chomp;
    if (($thost) = /^HOSTNAME\s*=\s*(.*)\s*;/) {
        $myhost = `hostname` ; chomp($myhost) ;
        if ($thost ne $myhost) {
            $_="HOSTNAME=\"$myhost\";" ;
        }
    }
    elsif ( /^{/ ) {
        $INRULE=1 ;
    }
    elsif ( /^}/ ) {
        $INRULE=0 ;
    }
    elsif ($INRULE == 1 and ($sharp,$tpath,$cond) = /^(\s*\#?\s*)(\/\S+)\b(\s+->\s+.+)$/) {
        $ret = ($sharp =~ s/\#//g) ;
        if ($tpath eq '/sbin/e2fsadm' ) {
            $cond =~ s/;\s+(tune2fs.*)$/; \#$1/ ;
        }
        if (! -s $tpath) {
            $_ = "$sharp#$tpath$cond" if ($ret == 0) ;
        }
        else {
            $_ = "$sharp$tpath$cond" ;
        }
    }
    print "$_\n" ;
}
close(POL) ;

$ sudo sh -c 'perl /etc/tripwire/twpolmake.pl /etc/tripwire/twpol.txt >
 /etc/tripwire/twpol.txt.new'        ← ポリシーファイルを最適化、一行で
 
$ sudo /usr/local/tripwire/sbin/twadmin -m P -c /etc/tripwire/tw.cfg -p
 /etc/tripwire/tw.pol -S /etc/tripwire/site.key /etc/tripwire/twpol.txt.new
       ← 最適化済ポリシーファイルを元にポリシーファイル(暗号署名版)作成、一行で
Please enter your site passphrase:
Wrote policy file: /etc/tripwire/tw.pol

$ sudo rm -f /etc/tripwire/twpol.txt*       ← ポリシーファイル(テキスト版)削除

※ポリシーファイル(テキスト版)を復元する場合
$ sudo sh -c "/usr/local/tripwire/sbin/twadmin -m p -c /etc/tripwire/tw.cfg -p
 /etc/tripwire/tw.pol -S /etc/tripwire/site.key > /etc/tripwire/twpol.txt"
      ← 一行で 
     
● データベース作成
$ sudo /usr/local/tripwire/sbin/tripwire -m i -s -c /etc/tripwire/tw.cfg
Please enter your local passphrase:      ← 先程のローカルパスフレーズ記入
      ← 少し時間がかかります
● Tripwire を実行します。
$ sudo /usr/local/tripwire/sbin/tripwire -m c -s -c /etc/tripwire/tw.cfg 
     ← Tripwireチェック実行
Open Source Tripwire(R) 2.4.1 Integrity Check Report

Report generated by:          root
Report created on:            2011年01月23日 20時45分47秒
Database last updated on:     Never

=============================================================
Report Summary:
=============================================================

Host name:                    user.server
Host IP address:              127.0.0.1
Host ID:                      None
Policy file used:             /etc/tripwire/tw.pol
Configuration file used:      /etc/tripwire/tw.cfg
Database file used:           /usr/local/tripwire/lib/tripwire/user.server.twd
Command line used:            /usr/local/tripwire/sbin/tripwire -m c -s -c /etc/tripwire/tw.cfg

==============================================================
Rule Summary:
==============================================================

-------------------------------------------------------------------------------
  Section: Unix File System
-------------------------------------------------------------------------------

  Rule Name                       Severity Level    Added    Removed  Modified
  ---------                       --------------    -----    -------  --------
  Tripwire Data Files             0                 0        0        0
* Monitor Filesystems             0                 0        0        0
* User Binaries and Libraries     0                 0        0        0
  Tripwire Binaries               0                 0        0        0
  OS Binaries and Libraries       0                 0        0        0
  Temporary Directories           0                 0        0        0
* Global Configuration Files      0                 0        0        0
  System Boot Changes             0                 0        0        0
  RPM Checksum Files              0                 0        0        0
  OS Devices and Misc Directories 0                 0        0        0
  OS Boot Files and Mount Points  0                 0        0        0
  Root Directory and Files        0                 0        0        0

Total objects scanned:  63950
Total violations found:  0

=================================================================
Object Summary:
=================================================================

-------------------------------------------------------------------------------
# Section: Unix File System
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Rule Name: User Binaries and Libraries (/usr/local/bin)
Severity Level: 0
-------------------------------------------------------------------------------

Modified:
"/usr/local/bin/tripwire.sh"

-------------------------------------------------------------------------------
Rule Name: Global Configuration Files (/etc)
Severity Level: 0
-------------------------------------------------------------------------------

Modified:
"/etc/ntp/drift"

-------------------------------------------------------------------------------
Rule Name: Monitor Filesystems (/var)
Severity Level: 0
-------------------------------------------------------------------------------

================================================================
Error Report:
================================================================

No Errors

-------------------------------------------------------------------------------
*** End of report ***

Open Source Tripwire 2.4 Portions copyright 2000 Tripwire, Inc. Tripwire is a registered
trademark of Tripwire, Inc. This software comes with ABSOLUTELY NO WARRANTY;
for details use --version. This is free software which may be redistributed
or modified only under certain conditions; see COPYING for details.
All rights reserved.
● ここで動作検証のため、次のようなファイルを作成します。中身は適当に書いておいてください。
$ sudo vi /root/test.txt

再度 Tripwire を走らせます。
$ sudo /usr/local/tripwire/sbin/tripwire -m c -s -c /etc/tripwire/tw.cfg

Open Source Tripwire(R) 2.4.1 Integrity Check Report

Report generated by:          root
Report created on:            2011年01月23日 20時48分22秒
Database last updated on:     Never

================================================================
Report Summary:
================================================================

Host name:                    user.server
Host IP address:              127.0.0.1
Host ID:                      None
Policy file used:             /etc/tripwire/tw.pol
Configuration file used:      /etc/tripwire/tw.cfg
Database file used:           /usr/local/tripwire/lib/tripwire/user.server.twd
Command line used:            /usr/local/tripwire/sbin/tripwire -m c -s -c /etc/tripwire/tw.cfg

================================================================
Rule Summary:
================================================================

-------------------------------------------------------------------------------
  Section: Unix File System
-------------------------------------------------------------------------------

  Rule Name                       Severity Level    Added    Removed  Modified
  ---------                       --------------    -----    -------  --------
  Tripwire Data Files             0                 0        0        0
* Monitor Filesystems             0                 0        0        0
* User Binaries and Libraries     0                 0        0        0
  Tripwire Binaries               0                 0        0        0
  OS Binaries and Libraries       0                 0        0        0
  Temporary Directories           0                 0        0        0
* Global Configuration Files      0                 0        0        0
  System Boot Changes             0                 0        0        0
  RPM Checksum Files              0                 0        0        0
  OS Devices and Misc Directories 0                 0        0        0
  OS Boot Files and Mount Points  0                 0        0        0
* Root Directory and Files        0                 1        0        0

Total objects scanned:  63951
Total violations found:  1     ← 1件の変更を検知した

=================================================================
Object Summary:
=================================================================

-------------------------------------------------------------------------------
# Section: Unix File System
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Rule Name: User Binaries and Libraries (/usr/local/bin)
Severity Level: 0
-------------------------------------------------------------------------------

Modified:
"/usr/local/bin/tripwire.sh"

-------------------------------------------------------------------------------
Rule Name: Global Configuration Files (/etc)
Severity Level: 0
-------------------------------------------------------------------------------

Modified:
"/etc/ntp/drift"

-------------------------------------------------------------------------------
Rule Name: Monitor Filesystems (/var)
Severity Level: 0
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Rule Name: Root Directory and Files (/root)
Severity Level: 0
-------------------------------------------------------------------------------

Added:
"/root/test.txt"     ← /root/test.txtの追加を検知した

===============================================================
Error Report:
===============================================================

No Errors

-------------------------------------------------------------------------------
*** End of report ***

Open Source Tripwire 2.4 Portions copyright 2000 Tripwire, Inc. Tripwire is a registered
trademark of Tripwire, Inc. This software comes with ABSOLUTELY NO WARRANTY;
for details use --version. This is free software which may be redistributed
or modified only under certain conditions; see COPYING for details.
All rights reserved.

先ほど作ったテストファイルを消しておく。

$ sudo rm -f /root/test.txt
● シェルスクリプトを書いて cron で定期的に動かす。下記のスクリプトでは結果をメールで 送るようにしていますが、ファイルに書き出すなり各自でお好きなようにどうぞ。
$ cd /usr/local/bin
$ sudo vi tripwire.sh
#!/bin/bash

PATH=/usr/sbin:/usr/bin:/bin:/usr/local/tripwire/sbin
MDAY=`LANG=en_US.UTF-8 date '+%b %_d'`

# パスフレーズ設定
LOCALPASS=xxxxxxxxx  ←  ローカルパスを入力
SITEPASS=xxxxxxxx  ←  サイトパスを入力

cd /etc/tripwire

# Tripwireチェック実行
tripwire -m c -s -c tw.cfg > /tmp/tripwire

mv /tmp/tripwire /tmp/"$MDAY"
cat /tmp/"$MDAY" | mail -s "Tripwire Integrity Check Report" myname@hoge.com
  ←  メールで送る場合
rm -f /tmp/"$MDAY"

# ポリシーファイル最新化
twadmin -m p -c tw.cfg -p tw.pol -S site.key > twpol.txt
perl twpolmake.pl twpol.txt > twpol.txt.new
twadmin -m P -c tw.cfg -p tw.pol -S site.key -Q $SITEPASS twpol.txt.new > /dev/null
rm -f twpol.txt*
rm -f *.bak

# データベース最新化
rm -f /var/lib/tripwire/*.twd*
tripwire -m i -s -c tw.cfg -P $LOCALPASS
● 実行権限を付与する。
$ sudo chmod 700 /usr/local/bin/tripwire.sh
● このスクリプトを実行すると、上記の mail コマンドで指定したアドレス(myname@hoge.com)
へメールが送られます。 メールではなくファイルに書き込みたい場合には cp /tmp/"$MDAY" /home/pub/security/tripwire/
などとしておけば良いでしょう。
動作を確認したら cron に登録しておく。
$ sudo crontab -e
00 7 * * *      /usr/local/bin/tripwire.sh
● このままでは例えば squid を動かしていたりすると、大量の Filesystems (/var) Added が検知されてしまいます。 そのような場合、対象ディレクトリを除外する方法として次のように指定しておきます。
$ sudo vi /etc/tripwire/twpol.txt

################################################ #
#                                              # #
#  Monitor Filesystems                         # #
#                                              ##
################################################
(
  rulename = "Monitor Filesystems",
)
{
  /                             -> $(ReadOnly) ;
  /home                         -> $(ReadOnly) ;  # Modify as needed
  /usr                          -> $(ReadOnly) ;
  /var                          -> $(ReadOnly) ;
  !/var/spool/squid/;  ←  追加 
}

# ポリシーファイルを変更後、

$ sudo sh -c 'perl /etc/tripwire/twpolmake.pl /etc/tripwire/twpol.txt >
 /etc/tripwire/twpol.txt.new'          ← 再度ポリシーファイルを最適化

$ sudo /usr/local/tripwire/sbin/twadmin -m P -c /etc/tripwire/tw.cfg -p
 /etc/tripwire/tw.pol -S /etc/tripwire/site.key /etc/tripwire/twpol.txt.new
      ← 最適化済ポリシーファイルを元にポリシーファイル(暗号署名版)作成、一行で
Please enter your site passphrase:
Wrote policy file: /etc/tripwire/tw.pol

$ sudo rm -f /etc/tripwire/twpol.txt*       ← ポリシーファイル(テキスト版)削除

$ sudo /usr/local/tripwire/sbin/tripwire -m i -s -c /etc/tripwire/tw.cfg

として、データベースを更新しておきます。

rootkit検知ツール(chkrootkit) の導入

最終更新日 2011年02月14日
● サーバへの侵入を計る rootkit を検知する chkrootkit を導入する。 chkrootkit.org からダウンロード先を辿り、最新ファイルを落とす。
$ cd rpm/SOURCES/
$ wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
                           :
                           :
長さ: 39421 (38K)

100%[=====================================>] 39,421      30.6K/s 時間 1.3s

2011-01-23 21:02:58 (30.6 KB/s) - `chkrootkit.tar.gz' へ保存終了 [39421]

● rpm でインストールしたかったのだが、gnome やら Xorg で依存関係が出たため(サーバには X をインストールしていないため)ソースからのインストールにする。
$ cd ../BUILD/
$ tar zxvf ../SOURCES/chkrootkit.tar.gz
chkrootkit-0.49
chkrootkit-0.49/chkrootkit.lsm
chkrootkit-0.49/README.chkwtmp
chkrootkit-0.49/COPYRIGHT
chkrootkit-0.49/Makefile
chkrootkit-0.49/chkutmp.c
chkrootkit-0.49/ifpromisc.c
chkrootkit-0.49/chkrootkit
chkrootkit-0.49/ACKNOWLEDGMENTS
chkrootkit-0.49/check_wtmpx.c
chkrootkit-0.49/chkdirs.c
chkrootkit-0.49/README.chklastlog
chkrootkit-0.49/chklastlog.c
chkrootkit-0.49/strings.c
chkrootkit-0.49/README
chkrootkit-0.49/chkproc.c
chkrootkit-0.49/chkwtmp.c

$ cd chkrootkit-0.49
$ sudo make sense
Password:
gcc -DHAVE_LASTLOG_H -o chklastlog chklastlog.c
gcc -DHAVE_LASTLOG_H -o chkwtmp chkwtmp.c
chkwtmp.c: In function ‘main’:
chkwtmp.c:95: 警告: incompatible implicit declaration of built-in function ‘exit’
gcc -DHAVE_LASTLOG_H   -D_FILE_OFFSET_BITS=64 -o ifpromisc ifpromisc.c
gcc  -o chkproc chkproc.c
gcc  -o chkdirs chkdirs.c
gcc  -o check_wtmpx check_wtmpx.c
gcc -static  -o strings-static strings.c
gcc  -o chkutmp chkutmp.c

● 早速走らせてみる
$ sudo ./chkrootkit
ROOTDIR is `/'
Checking `amd'... not found
Checking `basename'... not infected
Checking `biff'... not found
Checking `chfn'... not infected
Checking `chsh'... not infected
Checking `cron'... not infected
Checking `crontab'... not infected
Checking `date'... not infected
Checking `du'... not infected
Checking `dirname'... not infected
Checking `echo'... not infected
Checking `egrep'... not infected
Checking `env'... not infected
Checking `find'... not infected

(以下 略)

本体をコピーしておく

$ sudo cp -p chkrootkit /usr/local/bin/
● rootkit が検出されない場合は ”not infected”、された場合は "INFECTED" と表示される。
スクリプトを書いて rootkit が検知された場合メールで送るようにする。

$ sudo vi /usr/local/bin/chkrootkit.sh
#!/bin/bash

/usr/local/bin/chkrootkit > /var/log/chkrootkit.log 2>&1

TMPLOG='mktemp'
grep INFECTED /var/log/chkrootkit.log > $TMPLOG
if [ ! -z "$(grep 465 $TMPLOG)" ]; then
        if [ -z $(/usr/sbin/lsof -i:465 | grep bindshell) ]; then
                sed -i '/465/d' $TMPLOG
        fi
fi

if [ -s $TMPLOG ]; then
        cat $TMPLOG  | mail -s "chkrootkit report" user@jibun ← メールで送る
fi

rm -f $TMPLOG
● 実行権限を付ける。
$ sudo chmod 700 /usr/local/bin/chkrootkit.sh
● cron で自動実行させる。
$ sudo crontab -e
00 06 * * *     /usr/local/bin/chkrootkit.sh
● 運用前の chkrootkit が使用するコマンド群をコピーする
$ sudo mkdir /root/chkrootkitcmd
$ sudo cp `which --skip-alias awk cut echo egrep find head id ls netstat
 ps strings sed uname` /root/chkrootkitcmd/
$ cd /usr/local/bin
$ sudo ./chkrootkit.sh -p /root/chkrootkitcmd|grep INFECTED
$ sudo zip -r chkrootkitcmd.zip /root/chkrootkitcmd/
  adding: root/chkrootkitcmd/ (stored 0%)
  adding: root/chkrootkitcmd/netstat (deflated 60%)
  adding: root/chkrootkitcmd/id (deflated 56%)
  adding: root/chkrootkitcmd/awk (deflated 53%)
  adding: root/chkrootkitcmd/egrep (deflated 52%)
  adding: root/chkrootkitcmd/echo (deflated 56%)
  adding: root/chkrootkitcmd/ps (deflated 58%)
  adding: root/chkrootkitcmd/cut (deflated 55%)
  adding: root/chkrootkitcmd/uname (deflated 58%)
  adding: root/chkrootkitcmd/ls (deflated 57%)
  adding: root/chkrootkitcmd/strings (deflated 58%)
  adding: root/chkrootkitcmd/head (deflated 55%)
  adding: root/chkrootkitcmd/find (deflated 55%)
  adding: root/chkrootkitcmd/sed (deflated 55%)
  
$ sudo rm -rf /root/chkrootkitcmd

* mailコマンドで zip ファイル添付メールを送信するのに必要な uuencode コマンドをインストールします

$ sudo apt-get install sharutils
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
以下のパッケージが新たにインストールされます:
  sharutils
アップグレード: 0 個, 新規インストール: 1 個, 削除: 0 個, 保留: 0 個
102kB のアーカイブを取得する必要があります。
展開後に 248kB のディスク容量が追加消費されます。
取得:1 http://updates.vinelinux.org 5.2/x86_64/plus sharutils 4.2.1_jp-1.6.2vl5 [102kB]
102kB を 0s 秒で取得しました (302kB/s)
変更を適用しています...
準備中                                ############################## [100%]
更新/インストール中
  sharutils-4.2.1_jp-1.6.2vl5.x86_64     ############################## [100%]
完了

$ uuencode chkrootkitcmd.zip chkrootkitcmd.zip|mail -s chkrootkitcmd user@jibun
$ sudo rm -f chkrootkitcmd.zip

不正侵入検知システム(Snort+BASE+Oinkmaster)の導入

最終更新日 2011年02月14日
● Snort のインストールと初期設定。
ここではフリーの「侵入検知システム」である "Snort" を使って不正アクセスを検知するシステム(IDS=Intrusion Detection System)を導入していきます。 またその不正アクセスログを Web ブラウザ上で確認できるように BASE も導入していきます。その後、ルールファイルの自動更新のために Oinkmaster を使うようにしていきます。 このインストールに関しては、CentOSで自宅サーバー構築を参考にさせていただきました。 また当機サーバは x86_64 を使っていますので、i386 をお使いの方は読みかえて進めて行ってください。
* 予め必要となるパッケージを apt-get install しておきます。

flex-2.5.35-2vl5
bison-2.4.1-1vl5
libpcap-1.0.0-3vl5
libcap-devel-2.16-1vl5
pcre-devel-7.9-2vl5
zlib-devel-1.2.3-4vl5
MySQL-shared-5.1.41-1vl5
MySQL-devel-5.1.41-1vl5
apache-1.3.41-3vl5
( 2011年01月30日 現在 )
● Snort+BASE 導入にあたっては Apache・MySQL が必要となってきますので、最初にセッティングしておきます。
$ sudo apt-get install mysql-client mysql-server
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
'mysql-client' として MySQL-client を選択しました
'mysql-server' として MySQL-server を選択しました
以下のパッケージが新たにインストールされます:
  MySQL-client MySQL-server
アップグレード: 0 個, 新規インストール: 2 個, 削除: 0 個, 保留: 0 個
0B/28.4MB のアーカイブを取得する必要があります。
展開後に 64.7MB のディスク容量が追加消費されます。
変更を適用しています...
準備中                                ############################## [100%]
更新/インストール中
  MySQL-server-5.1.41-1vl5.x86_64        ############################## [100%]

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h penguin.violet password 'new-password'

Alternatively you can run:
/usr/bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

Please report any problems with the /usr/bin/mysqlbug script!

The latest information about MySQL is available at http://www.mysql.com/
Support MySQL by buying support/licenses from http://shop.mysql.com/

Starting MySQL. SUCCESS!
  MySQL-client-5.1.41-1vl5.x86_64        ############################## [100%]
完了

$ sudo vi /etc/my.cnf  ← MySQL設定ファイル編集
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
default-character-set = utf8
[mysql]
default-character-set = utf8
● MySQLの初期設定
$ sudo mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!


In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):  ← 空ENTER
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n]  ← 空ENTER
New password:  ← rootパスワード応答
Re-enter new password:  ← rootパスワード応答(確認)
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]  ← 空ENTER
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]  ← 空ENTER
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n]  ← 空ENTER
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n]  ← 空ENTER
 ... Success!

Cleaning up...



All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!
● MySQLの確認
$ sudo mysql -u root -p  ← MySQLへrootでログイン
Enter password:  ← 先程設定した MySQL の root パスワード
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.1.41 VineLinux MySQL RPM

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> grant all privileges on test.* to mysqluser@localhost identified by 'mysqluserpass';
  ← 新規ユーザーを登録(ここでは仮りに mysqluser としています)
Query OK, 0 rows affected (0.00 sec)

mysql> select user from mysql.user where user='mysqluser';  ← mysqluserユーザ登録確認
+---------+
| user    |
+---------+
| mysqluser |
+---------+
1 row in set (0.00 sec)

mysql> exit
Bye

$ sudo /etc/init.d/mysql start
Starting MySQL. SUCCESS!

$ sudo /sbin/chkconfig mysql on
● Snort の本体インストールの前に、必要とされているパッケージをインストールします
* php5 のインストール

$ sudo apt-get install php5
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
以下の追加パッケージがインストールされます:
  gmp php5-pear
以下のパッケージが新たにインストールされます:
  gmp php5 php5-pear
アップグレード: 0 個, 新規インストール: 3 個, 削除: 0 個, 保留: 0 個
0B/8628kB のアーカイブを取得する必要があります。
展開後に 27.7MB のディスク容量が追加消費されます。
続行しますか? [Y/n]y
変更を適用しています...
準備中                                ############################## [100%]
更新/インストール中
  gmp-4.2.2-5vl5.x86_64                  ############################## [100%]
  php5-5.3.3-1vl5.x86_64                 ############################## [100%]
  php5-pear-5.3.3-1vl5.x86_64            ############################## [100%]
完了

* php5-apache のインストール
$ sudo apt-get install php5-apache
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
以下のパッケージが新たにインストールされます:
 php5-apache
アップグレード: 0 個, 新規インストール: 1 個, 削除: 0 個, 保留: 0 個 
続行しますか? [Y/n]y
変更を適用しています...
準備中                                ############################## [100%]
更新/インストール中
  php5-apache-5.3.3-1vl5 .x86_64      ############################## [100%]
完了

* libdnet のインストール

$ wget ftp://ftp.freshrpms.net/pub/freshrpms/pub/dag/fedora/7/en/x86_64/dries/RPMS/
libdnet-1.11-1.2.fc7.rf.x86_64.rpm
                     :
                     :
長さ: 41448 (40K)

100%[========================================>] 41,448      46.0K/s 時間 0.9s

$ sudo rpm -Uvh libdnet-1.11-1.2.fc7.rf.x86_64.rpm

* daq のインストール

$ cd rpm/SOURCES
$ wget http://www.snort.org/downloads/628
                    :
                    :
長さ: 451649 (441K) [text/plain]
`daq-0.5-1.src.rpm?AWSAccessKeyId=AKIAJJSHU7YNPLE5MKOQ&Expires=1296278170&Signature
=E8b1Wjt5MPPqmELls4hNw5UEjNY=' に保存中

100%[=========================================>] 451,649      292K/s 時間 1.5s

2011-01-29 14:15:43 (292 KB/s) - `daq-0.5-1.src.rpm?AWSAccessKeyId=
AKIAJJSHU7YNPLE5MKOQ&Expires=1296278170&Signature=
E8b1Wjt5MPPqmELls4hNw5UEjNY=' へ保存完了 [451649/451649]

$ mv daq-0.5-1.src.rpm* daq-0.5-1.src.rpm

x86_64 環境下ではそのままではインストール出来ないので spec file を編集する。
i386 環境の方は必要ないと思います。

$ rpm -i daq-0.5-1.src.rpm

$ cd ../SPECS/
$ vi daq.spec
下記のように %{_prefix}/lib/* を %{_prefix}/lib64/ に変更する
%files
%defattr(-,root,root)
%{_prefix}/include/daq.h
%{_prefix}/include/daq_common.h
%{_prefix}/include/sfbpf_dlt.h
%{_prefix}/include/daq_api.h
%{_prefix}/include/sfbpf.h
%{_prefix}/lib64/libdaq_static_modules.la
%{_prefix}/lib64/libdaq_static_modules.a
%{_prefix}/lib64/libsfbpf.a
%{_prefix}/lib64/libdaq.so
%{_prefix}/lib64/libsfbpf.la
%{_prefix}/lib64/libdaq.la
%{_prefix}/lib64/daq
%{_prefix}/lib64/daq/daq_dump.so
%{_prefix}/lib64/daq/daq_ipfw.la
%{_prefix}/lib64/daq/daq_dump.la
%{_prefix}/lib64/daq/daq_afpacket.la
%{_prefix}/lib64/daq/daq_pcap.so
%{_prefix}/lib64/daq/daq_pcap.la
%{_prefix}/lib64/daq/daq_ipfw.so
%{_prefix}/lib64/daq/daq_afpacket.so
%{_prefix}/lib64/libsfbpf.so.0.0.1
%{_prefix}/lib64/libsfbpf.so.0
%{_prefix}/lib64/libdaq_static.la
%{_prefix}/lib64/libdaq.so.0.0.1
%{_prefix}/lib64/libsfbpf.so
%{_prefix}/lib64/libdaq.a
%{_prefix}/lib64/libdaq_static.a
%{_prefix}/lib64/libdaq.so.0
%{_prefix}/bin/daq-modules-config

$ rpm -bb daq.spec
           :
           :
パッケージに未収録のファイルを検査中: /usr/lib/rpm/check-files /tmp/daqrpm-0.5
書き込み完了: /home/user/rpm/RPMS/x86_64/daq-0.5-1.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.57262
+ umask 022
+ cd /home/user/rpm/BUILD
+ cd daq-0.5
+ rm -rf /tmp/daqrpm-0.5
+ exit 0

$ sudo rpm -Uvh /home/user/rpm/RPMS/x86_64/daq-0.5-1.x86_64.rpm
準備中...                ########################################### [100%]
   1:daq                    ########################################### [100%]
● Snort 本体のインストール
次に Snort の公式サイトダウンロードページから最新版を落としてきます。

$ cd rpm/SRPMS/
$ wget http://www.snort.org/downloads/635
                     :
                     :
長さ: 5750736 (5.5M) [text/plain]
`snort-2.9.0.3-1.src.rpm?AWSAccessKeyId=AKIAJJSHU7YNPLE5MKOQ&Expires=
1295934635&Signature=OAAAvaG%2F8Uvw0cWVijFJyZOGLvg=' に保存中

100%[======================================>] 5,750,736    362K/s 時間 17s

2011-01-25 14:50:23 (322 KB/s) - `snort-2.9.0.3-1.src.rpm?AWSAccessKeyId=
AKIAJJSHU7YNPLE5MKOQ&Expires=1295934635&Signature=OAAAvaG%2F8Uvw0cWVijFJyZOGLvg='
 へ保存完了 [5750736/5750736]

$ mv snort-2.9.0.3-1.src.rpm* snort-2.9.0.3-1.src.rpm

このままでは rebuild error になりますので spec file を変更します

$ rpm -i snort-2.9.0.3-1.src.rpm

$ vi snort.spec

if [ "$1" = "mysql" ]; then         ←  "mysql" とあるところに
        ./configure $SNORT_BASE_CONFIG \
        --enable-normalizer \          ←  この行を付け加える
        --enable-zlib \                 ←  この行を付け加える
        --with-mysql \
        --with-mysql-libraries=/usr/lib64/mysql \     ←  x86_64 環境の方はこの行を付け加える
        --without-postgresql \
        --without-oracle \
        --without-odbc \
        %{?EnableFlexresp} %{?EnableFlexresp2} \
        %{?EnableInline}
   fi

$ cd
$ rpm -bb  -clean --with mysql rpm/SPECS/snort.spec
                        :
                        :
パッケージに未収録のファイルを検査中: /usr/lib/rpm/check-files /var/tmp/snort-2.9.0.3-1-root-user
書き込み完了: /home/user/rpm/RPMS/x86_64/snort-2.9.0.3-1.x86_64.rpm
書き込み完了: /home/user/rpm/RPMS/x86_64/snort-mysql-2.9.0.3-1.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.89632
+ umask 022
+ cd /home/user/rpm/BUILD
+ cd snort-2.9.0.3
+ /bin/rm -rf /var/tmp/snort-2.9.0.3-1-root-user
+ exit 0
実行中(--clean): /bin/sh -e /var/tmp/rpm-tmp.89632
+ umask 022
+ cd /home/user/rpm/BUILD
+ rm -rf snort-2.9.0.3
+ exit 0

$ sudo rpm -Uvh /home/user/rpm/RPMS/x86_64/{snort,snort-mysql}-2.9.0.3-1.x86_64.rpm
準備中...                ########################################### [100%]
   1:snort                  ########################################### [ 50%]
   2:snort-mysql            ########################################### [100%]
● Snort の設定
$ sudo vi /etc/snort/snort.conf
ipvar HOME_NET any       ← 下記のように修正
var HOME_NET 192.168.3.0/24

ipvar EXTERNAL_NET any       ← 下記のように修正
var EXTERNAL_NET !$HOME_NET

他の
ipvar となっている所も
var   と修正

var RULE_PATH /etc/snort/rules
var SO_RULE_PATH ../so_rules
var PREPROC_RULE_PATH ../preproc_rules

var RULE_PATH /etc/snort/rules
var SO_RULE_PATH /etc/snort/so_rules
var PREPROC_RULE_PATH /etc/snort/preproc_rules

# output unified2: filename merged.log, limit 128, nostamp, mpls_event_types, vlan_event_types

# output database: log, , user= password= test dbname= host=
output database: log, mysql, user=snort password=パスワード dbname=snort_log host=localhost
        ← 「パスワード」 はこの後設定するMySQL設定と同じものにする

#preprocessor normalize_ip6       ← # を付ける
#preprocessor normalize_icmp6       ←  # を付ける

$ sudo vi /etc/sysconfig/snort
#ALERTMODE=fast       ← 行頭に#を追加してコメントアウト(MySQLへログ出力できるようにする)

INTERFACE=eth1      ← 自分の環境に合わせる

#DUMP_APP=1      ← # を付ける

#BINARY_LOG=1      ← # を付ける
● Snort のルールファイルを入手
ルールファイルを入手するためこちらのページでサインアップする。すると URL が書かれたメールが
送られてくるのでそのアドレスにログインする。
Registered User Release から最新のルールファイルをダウンロードする。wget は使えないので、
クライアントマシンでダウンロードして scp を使ってサーバマシンへと送っておく。

% scp snortrules-snapshot-2903.tar.gz user@server:~/rpm/SOURCES   ← クライアントマシンでの操作です

$ cd ../BUILD/                                  ← ここからはサーバでの操作
$ tar zxvf ../SOURCES/snortrules-snapshot-2903.tar.gz
$ sudo cp -r rules/* /etc/snort/rules/
$ rm -rf rules/ so_rules/ etc/ preproc_rules/

Snortログローテーションエラー対処

$ sudo vi /etc/logrotate.d/snort
/var/log/snort/alert /var/log/snort/*log /var/log/snort/*/alert /var/log/snort/*/*log  {
/var/log/snort/alert /var/log/snort/*log {     ← このように修正する
● MySQL の設定
$ sudo apt-get install php-mysql
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
'php-mysql' として php5-mysql を選択しました
以下の追加パッケージがインストールされます:
  php5-mysql php5-pdo
以下のパッケージが新たにインストールされます:
  php5-mysql php5-pdo
アップグレード: 0 個, 新規インストール: 2 個, 削除: 0 個, 保留: 0 個
0B/185kB のアーカイブを取得する必要があります。
展開後に 405kB のディスク容量が追加消費されます。
続行しますか? [Y/n]y
変更を適用しています...
準備中                                ############################## [100%]
更新/インストール中
  php5-pdo-5.3.3-1vl5.x86_64             ############################## [100%]
  php5-mysql-5.3.3-1vl5.x86_64           ############################## [100%]
完了  

$ sudo mysql -u root -p        ← MySQLへrootでログイン
Enter password:        ← MySQLのrootパスワード入力
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.41 VineLinux MySQL RPM

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> grant all privileges on snort_log.* to snort@localhost identified by 'パスワード';
        ← Snort 設定で指定したパスワード
Query OK, 0 rows affected (0.00 sec)

mysql> create database snort_log;        ← snort_logデータベース作成
Query OK, 1 row affected (0.00 sec)

mysql> exit
Bye

$ sudo sh -c 'mysql -u snort -p snort_log <  /usr/share/snort-2.9.0.3/schemas/create_mysql'
        ← snort_logデータベース初期設定
Enter password:        ← snortユーザのパスワード入力
● Snort の起動
最初に次のようなコマンドを入力してエラーが出ないことを確認。
$ sudo /usr/sbin/snort -c /etc/snort/snort.conf -i eth1
          :
          :
        --== Initialization Complete ==--

   ,,_     -*> Snort! <*-
  o"  )~   Version 2.9.0.3 (Build 98)
   ''''    By Martin Roesch & The Snort Team: http://www.snort.org/snort/snort-team
           Copyright (C) 1998-2010 Sourcefire, Inc., et al.
           Using libpcap version 1.0.0
           Using PCRE version: 7.9 2009-04-11
           Using ZLIB version: 1.2.3

           Rules Engine: SF_SNORT_DETECTION_ENGINE  Version 1.13  
           Preprocessor Object: SF_DCERPC2  Version 1.0  
           Preprocessor Object: SF_SSH  Version 1.1  
           Preprocessor Object: SF_DNS  Version 1.1  
           Preprocessor Object: SF_SMTP  Version 1.1  
           Preprocessor Object: SF_SSLPP  Version 1.1  
           Preprocessor Object: SF_FTPTELNET  Version 1.2  
           Preprocessor Object: SF_SDF  Version 1.1  
Commencing packet processing (pid=17385)

このようになればOK! 終了は Ctrl+c 

$ sudo /etc/init.d/snortd start
Starting snort: Spawning daemon child...
My daemon child 3123 lives...
Daemon parent exiting
                                                                [  OK  ]
もしここで立ち上げに失敗するようなら、/var/log/messages を見てみます

(例)
$ sudo tail -f /var/log/messages
Jan 29 15:00:05 penguin snort[22391]: FATAL ERROR: /etc/snort/snort.conf(186)
 Unknown preprocessor: "normalize_ip4".
この場合は、上記 snort.spec で --enable-normalizer を指定しなかった場合 

(例)
$ sudo /etc/init.d/snortd start
Starting snort:
USAGE: database plugin
           :
           :
 FOR EXAMPLE:
 The configuration I am currently using is MySQL with the database
 name of "snort". The user "snortusr@localhost" has INSERT and SELECT
 privileges on the "snort" database and does not require a password.
 The following line enables snort to log to this database.

 output database: log, mysql, dbname=snort user=snortusr host=localhost

                                                                [ 失敗 ]

この時の /var/log/messages には
$ sudo tail -f /var/log/messages
Feb  3 14:39:55 penguin snort[6704]: database: must enter database name in configuration file

この場合は、
$ sudo vi /etc/snort/snort.conf
output database: log, mysql, user=snort password=passward test dbname=snort_log host=localhost

output database: log, mysql, dbname=snort_log user=snort password=passward host=localhost
      ← このように書き込む順番を替えてみます
      
$ sudo /sbin/chkconfig snortd on
● BASE のインストール
$ cd ~/rpm/SOURCES/
$ wget http://sourceforge.net/projects/secureideas/files/BASE/base-1.4.5/base-1.4.5.tar.gz/download
                   :
                   :
長さ: 958567 (936K) [application/x-gzip]
`base-1.4.5.tar.gz' に保存中

100%[========================================>] 958,567      176K/s 時間 5.3s

2011-01-30 19:59:33 (176 KB/s) - `base-1.4.5.tar.gz' へ保存完了 [958567/958567]

$ wget http://sourceforge.net/projects/adodb/files/adodb-php5-only/
adodb-511-for-php5/adodb511.tgz/download
                  :
                  :
長さ: 535678 (523K) [application/x-gzip]
`adodb511.tgz' に保存中

100%[=========================================>] 535,678      701K/s 時間 0.7s

2011-01-30 20:01:32 (701 KB/s) - `adodb511.tgz' へ保存完了 [535678/535678]

$ cd ../BUILD/
$ tar zxvf ../SOURCES/base-1.4.5.tar.gz
$ tar zxvf ../SOURCES/adodb511.tgz
$ sudo mv base-1.4.5/ /var/www/base
$ sudo mv adodb5 /var/www/base/adodb

$ sudo chown -R apache:apache /var/www/base/
● BASE の設定
$ sudo cp /var/www/base/base_conf.php.dist /var/www/base/base_conf.php

$ sudo vi /var/www/base/base_conf.php
$BASE_Language = 'english';
$BASE_Language = 'japanese';       ← 変更

$BASE_urlpath = '';
$BASE_urlpath = '/base';       ← 変更

$DBlib_path = '';
$DBlib_path = '/var/www/base/adodb';       ← 変更

$alert_password = 'mypassword';
$alert_password = 'xxxxxxxxx';       ← MySQLsnortユーザパスワード

$ sudo pear install --alldeps Image_Graph-alpha
       ← グラフ描画に必要なphpのPear::Image_Graphをインストール
downloading Image_Graph-0.8.0.tgz ...
Starting to download Image_Graph-0.8.0.tgz (367,646 bytes)
.................done: 367,646 bytes
downloading Image_Canvas-0.3.3.tgz ...
Starting to download Image_Canvas-0.3.3.tgz (54,470 bytes)
...done: 54,470 bytes
downloading Numbers_Roman-1.0.2.tgz ...
Starting to download Numbers_Roman-1.0.2.tgz (6,210 bytes)
...done: 6,210 bytes
downloading Numbers_Words-0.16.2.tgz ...
Starting to download Numbers_Words-0.16.2.tgz (52,956 bytes)
...done: 52,956 bytes
downloading Image_Color-1.0.4.tgz ...
Starting to download Image_Color-1.0.4.tgz (9,501 bytes)
...done: 9,501 bytes
downloading Math_BigInteger-1.0.0.tgz ...
Starting to download Math_BigInteger-1.0.0.tgz (26,138 bytes)
...done: 26,138 bytes
install ok: channel://pear.php.net/Numbers_Roman-1.0.2
install ok: channel://pear.php.net/Image_Color-1.0.4
install ok: channel://pear.php.net/Math_BigInteger-1.0.0
install ok: channel://pear.php.net/Image_Canvas-0.3.3
install ok: channel://pear.php.net/Numbers_Words-0.16.2
install ok: channel://pear.php.net/Image_Graph-0.8.0
● Aapche の設定
$ sudo vi /etc/httpd/conf.d/base.conf
Alias /base /var/www/base

    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
    Allow from 192.168.3.0/24


$ sudo vi /etc/php5/php.ini
; error_reporting
;   Default Value: E_ALL & ~E_NOTICE
       ← 下記のように変更
; error_reporting
error_reporting = E_ALL & ~E_NOTICE

$ sudo /etc/init.d/httpd start
httpdを起動中: Processing config directory: /etc/httpd/conf.d/*.conf
 Processing config file: /etc/httpd/conf.d/base.conf
                                                                [  OK  ]
      
$ sudo ln -s /usr/bin/perl /usr/local/bin/perl
● BASE の確認

http://サーバアドレス/base/ へアクセス

書かれているように「セットアップページ」をクリック
「Create BASE AG」ボタンをクリック
中程左にある「Main page」をクリック
これでセットアップは完了です
● ルールファイルの自動更新
Oinkmaster をインストールします

$ cd rpm/SOURCES/
$ wget http://sourceforge.net/projects/oinkmaster/files/oinkmaster/2.0/
oinkmaster-2.0.tar.gz/download
                       :
                       :
長さ: 80111 (78K) [application/x-gzip]
`oinkmaster-2.0.tar.gz' に保存中

100%[=================================>] 80,111      --.-K/s 時間 0.1s

2011-01-30 21:36:15 (697 KB/s) - `oinkmaster-2.0.tar.gz' へ保存完了 [80111/80111] 

$ cd ../BUILD/
$ tar zxvf ../SOURCES/oinkmaster-2.0.tar.gz
$ sudo cp oinkmaster-2.0/oinkmaster.pl /usr/local/bin
$ sudo cp oinkmaster-2.0/oinkmaster.conf /etc/
$ sudo cp oinkmaster-2.0/oinkmaster.1 /usr/share/man/man1/

Oinkmaster の設定

「Oink Code」が必要になるので、ユーザー登録した snoer.org にログインする。
下側にある「Snort Links」から「Get an Oinkcode」をクリックして「Oink Code」を取得する

$ sudo vi /etc/oinkmaster.conf
# Example for Snort-current ("current" means cvs snapshots).
# url = http://www.snort.org/pub-bin/oinkmaster.cgi//snortrules-snapshot-CURRENT.tar.gz
      ← この箇所を下のように変更
# Example for Snort-current ("current" means cvs snapshots).
url = http://www.snort.org/pub-bin/oinkmaster.cgi/ここに手に入れたOink Code貼り付け/
snortrules-snapshot-2900.tar.gz

Oinkmaster の確認

$ sudo /usr/local/bin/oinkmaster.pl -o /etc/snort/rules/
Loading /etc/oinkmaster.conf
Downloading file from http://www.snort.org/pub-bin/oinkmaster.cgi/*oinkcode*/
snortrules-snapshot-2900.tar.gz... done.
Archive successfully downloaded, unpacking... done.
Setting up rules structures...
WARNING: duplicate SID in your local rules, SID 3017 exists multiple times, 
you may need to fix this manually!
done.
Processing downloaded rules... disabled 0, enabled 0, modified 0, total=9830
Setting up rules structures...
WARNING: duplicate SID in your local rules, SID 3017 exists multiple times, 
you may need to fix this manually!
done.
Comparing new files to the old ones... done.
Updating local rules files... done.

[***] Results from Oinkmaster started 20110130 21:54:51 [***]

[///]    Modified inactive rules:    [///]

     -> Modified inactive in exploit.rules (1):

        old: #alert tcp $EXTERNAL_NET any -> $HOME_NET 42 (msg:"EXPLOIT WINS 
        overflow attempt"; flow:to_server,established; byte_test:1,&,64,6; byte_test:1,&,32,6;
         byte_test:1,&,16,6; byte_test:1,&,8,6; pcre:!"/^.{8}(\x05\x37(\x1E[\x90-\xFF]|
         [\x1F-\x2F].|\x30[\x00-\x70])|\x00\x00\x00[\x00-\x65]|\x02\x68\x05\xC0)/s";
          reference:bugtraq,11763; reference:cve,2004-1080; reference:url,www.immunitysec.com/
          downloads/instantanea.pdf; reference:url,www.microsoft.com/technet/security/bulletin/
          MS04-045.mspx; classtype:misc-attack; sid:3017; rev:11;)
        new: #alert tcp $EXTERNAL_NET any -> $HOME_NET 42 (msg:"EXPLOIT WINS 
        overflow attempt"; flow:to_server,established; byte_test:4,>,204,0; byte_test:1,&,64,6;
         byte_test:1,&,32,6; byte_test:1,&,16,6; byte_test:1,&,8,6; reference:url,
         www.immunitysec.com/downloads/instantanea.pdf; classtype:misc-attack; sid:3017; rev:2;)

[*] Non-rule line modifications: [*]
    None.

[*] Added files: [*]
    None.
    
Oinkmaster の cron 登録    

$ sudo vi /etc/cron.daily/snort-rule-update
#!/bin/bash

/usr/local/bin/oinkmaster.pl -o /etc/snort/rules/ 2>&1 | logger -t oinkmaster
/etc/rc.d/init.d/snortd restart > /dev/null

$ sudo chmod +x /etc/cron.daily/snort-rule-update
● 上記の設定で snort は動いているのですが、何故か外部からの icmp などを検知してくれません(/etc/snort/snort.conf /etc/sysconfig/snort を変更して内部からの ping は検知します) 。引き続き原因究明を行っていますので、何かお気付きの所がありましたら御連絡いただけると助かります。

アンチウィルスソフトの(ClamAV) の導入

最終更新日 2011年02月01日
● Linux用のフリーのアンチウィルスソフトの Clam AntiVirus を導入する。
$ sudo apt-get install clamav
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
以下のパッケージが新たにインストールされます:
  clamav
アップグレード: 0 個, 新規インストール: 1 個, 削除: 0 個, 保留: 0 個
39.8MB のアーカイブを取得する必要があります。
展開後に 52.8MB のディスク容量が追加消費されます。
取得:1 http://updates.vinelinux.org 5.2/x86_64/plus clamav 0.96-1vl5 [39.8MB]
39.8MB を 12s 秒で取得しました (3187kB/s)
変更を適用しています...
準備中                                ############################## [100%]
更新/インストール中
  clamav-0.96-1vl5.x86_64                ############################## [100%]
完了

$ sudo vi /etc/clamd.conf  ← clamd 設定ファイル編集

#Example  ← # を付けてコメントアウト

#LogFile /tmp/clamd.log
LogFile /var/log/clamd.log  ← この行を足す

$ sudo vi /etc/freshclam.conf

#Example  ← # を付けてコメントアウト

# Uncomment the following line and replace XY with your country
# code. See http://www.iana.org/cctld/cctld-whois.htm for the full list.
#DatabaseMirror db.XY.clamav.net
DatabaseMirror db.jp.clamav.net  ← ウィルスデータベース入手元を日本に変更

$ sudo freshclam  ← ウィルスデータベース更新設定ファイル編集
ClamAV update process started at Tue Feb  1 12:57:52 2011
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Local version: 0.96 Recommended version: 0.96.5
DON'T PANIC! Read http://www.clamav.net/support/faq
Downloading main-53.cdiff [100%]
main.cld updated (version: 53, sigs: 846214, f-level: 53, builder: sven)
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Current functionality level = 51, recommended = 53
DON'T PANIC! Read http://www.clamav.net/support/faq
WARNING: getfile: daily-10678.cdiff not found on remote server (IP: 27.96.54.66)
WARNING: getpatch: Can't download daily-10678.cdiff from db.jp.clamav.net
WARNING: getfile: daily-10678.cdiff not found on remote server (IP: 219.94.128.99)
WARNING: getpatch: Can't download daily-10678.cdiff from db.jp.clamav.net
WARNING: getfile: daily-10678.cdiff not found on remote server (IP: 211.10.155.48)
WARNING: getpatch: Can't download daily-10678.cdiff from db.jp.clamav.net
WARNING: Incremental update failed, trying to download daily.cvd
Downloading daily.cvd [100%]
daily.cvd updated (version: 12599, sigs: 34082, f-level: 58, builder: guitar)
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Current functionality level = 51, recommended = 58
DON'T PANIC! Read http://www.clamav.net/support/faq
Downloading bytecode.cvd [100%]
bytecode.cvd updated (version: 123, sigs: 29, f-level: 58, builder: edwin)
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Current functionality level = 51, recommended = 58
DON'T PANIC! Read http://www.clamav.net/support/faq
Database updated (880325 signatures) from db.jp.clamav.net (IP: 203.178.137.175)

* 何やら WARNING が出ていますが、これはバージョンが最新ではないと怒られているものです。
  とりあえず無視(^^;

$ sudo clamscan --infected --remove --recursive /root/
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***  This version of the ClamAV engine is outdated.     ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***  This version of the ClamAV engine is outdated.     ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***  This version of the ClamAV engine is outdated.     ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************

----------- SCAN SUMMARY -----------
Known viruses: 879073
Engine version: 0.96
Scanned directories: 3
Scanned files: 20
Infected files: 0  ← 検知されたウイルスは 0
Data scanned: 0.18 MB
Data read: 0.10 MB (ratio 1.73:1)
Time: 4.588 sec (0 m 4 s)

***  This version of the ClamAV engine is outdated.     ***

* これも同じくClamAV のバージョンが古いと言われているだけの Warning

* テスト用のウイルスをダウンロード

$ wget http://www.eicar.org/download/eicar.com
$ wget http://www.eicar.org/download/eicar.com.txt
$ wget http://www.eicar.org/download/eicar_com.zip
$ wget http://www.eicar.org/download/eicarcom2.zip

* 再度ウイルススキャンをします

$ sudo clamscan --infected --remove --recursive
[sudo] password for user:
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***  This version of the ClamAV engine is outdated.     ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***  This version of the ClamAV engine is outdated.     ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***  This version of the ClamAV engine is outdated.     ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
/home/user/eicarcom2.zip: Eicar-Test-Signature FOUND
/home/user/eicarcom2.zip: Removed.
/home/user/eicar.com.txt: Eicar-Test-Signature FOUND
/home/user/eicar.com.txt: Removed.
/home/user/eicar_com.zip: Eicar-Test-Signature FOUND
/home/user/eicar_com.zip: Removed.
/home/user/eicar.com: Eicar-Test-Signature FOUND
/home/user/eicar.com: Removed.

----------- SCAN SUMMARY -----------
Known viruses: 879073
Engine version: 0.96
Scanned directories: 27
Scanned files: 48
Infected files: 4  ← テスト用ウイルスが検知されています
Data scanned: 118.09 MB
Data read: 48.39 MB (ratio 2.44:1)
Time: 21.247 sec (0 m 21 s)

* ウィルススキャン自動実行スクリプト設定

$ cd /usr/local/bin
$ sudo vi clamscan.sh
#!/bin/bash

PATH=/usr/bin:/bin

# excludeopt setup
excludelist=/root/clamscan.exclude
if [ -s $excludelist ]; then
    for i in `cat $excludelist`
    do
        if [ $(echo "$i"|grep \/$) ]; then
            i=`echo $i|sed -e 's/^\([^ ]*\)\/$/\1/p' -e d`
            excludeopt="${excludeopt} --exclude-dir=$i"
        else
            excludeopt="${excludeopt} --exclude=$i"
        fi
    done
fi

# signature update
freshclam > /dev/null

# virus scan
CLAMSCANTMP=`mktemp`
clamscan --recursive --remove ${excludeopt} / > $CLAMSCANTMP 2>&1
[ ! -z "$(grep FOUND$ $CLAMSCANTMP)" ] && \

# report mail send
grep FOUND$ $CLAMSCANTMP | mail -s "Virus Found in `hostname`" user@gmail.com
  ← 自分のメールアドレス
rm -f $CLAMSCANTMP

$ sudo chmod +x clamscan.sh

* スキャン対象外のディレクトリを指定する。/sys を対象から外さないとCPUパワー食い
  まくりでハング状態になってしまいます。

$ sudo sh -c 'echo "/sys/" >> /root/clamscan.exclude'

* ここで再度テスト用ウイルスを落としてきて、スクリプトがうまく動くかチェックします。

$ wget http://www.eicar.org/download/eicar.com
$ wget http://www.eicar.org/download/eicar.com.txt

$ sudo /usr/local/bin/clamscan.sh

* これで指定したメールアドレスに
Subject: Virus Found in user.server
/home/user/eicar.com.txt: Eicar-Test-Signature FOUND
/home/user/eicar.com: Eicar-Test-Signature FOUND

のようなメールが送られてきていれば OK!

$ sudo /etc/init.d/clamd start
ClamAV Daemon を起動中: LibClamAV Warning: ************************************
LibClamAV Warning: ***  This version of the ClamAV engine is outdated.     ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***  This version of the ClamAV engine is outdated.     ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***  This version of the ClamAV engine is outdated.     ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
                                                                [  OK  ]
                                                                
$ sudo /sbin/chkconfig clamd on
                                                          
* crontab に登録しておきます

$ sudo crontab -e
0 03 * * 0      /usr/local/bin/clamscan.sh
  ← ここでは毎週日曜日の午前3時を指定していますが、各自お好きなように

不正アクセス防止システム(PortSentry)の導入

● Snort は不正アクセスを検知するのみですが、検知した時には「もう遅い!」ってなこともあるかもしれません。ここで紹介する PortSentry は、不正アクセスを検知した場合直ちに iptables でフィルタリング出来る所が優れものです。

ファイルサーバ(samba)の設定

● Windows を含めた他のマシンからもアクセスできるファイルサーバーを構築する。尚、samba サーバへは内部からのみアクセス出来るようにする。
$ rpm -q samba
パッケージ samba はインストールされていません  ← この場合はインストールしておきます

$ sudo apt-get install samba
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
以下のパッケージが新たにインストールされます:
  samba
アップグレード: 0 個, 新規インストール: 1 個, 削除: 0 個, 保留: 0 個
4363kB のアーカイブを取得する必要があります。
展開後に 11.9MB のディスク容量が追加消費されます。
取得:1 http://updates.vinelinux.org 5.2/x86_64/main samba 3.3.10-14vl5 [4363kB]
4363kB を 1s 秒で取得しました (2548kB/s)
変更を適用しています...
準備中                                ############################## [100%]
更新/インストール中
  samba-3.3.10-14vl5.x86_64              ############################## [100%]
完了


apt を使ったパッケージの更新と自動化・ログファイルの作成

最終更新日 2011年11月10日
● VineLinux ではパッケージを rpm/apt を使って管理することが出来ます。これにより個々のパッケージのインストールや削除等に於いて、依存関係などを気にすることなく(必要なものがあれば教えてくれる) 簡単に行うことが出来ます。詳しくは RPM/APTによるパッケージ管理を読んでください。 手で行う場合は
$ sudo apt-get update
$ sudo apt-get upgrade
で良いのですが、毎日チェックしたりコマンドを入力するのは大変ですので自動化します。自動化そのものは cron に登録すれば済むことですが、更新が行われたのかどうかをチェックするために一緒にログファイルを作成するようにします。 次のような apt-up.sh というシェルスクリプトを書いてそれを /usr/local/bin に保存してください。
#!/bin/sh

ls -l /var/cache/apt/archives/ | cut -c 46- > /tmp/apt-archives

apt-get update
apt-get -y upgrade

date > /home/user/sec/apt-up

ls -l /var/cache/apt/archives/ | cut -c 46- > /tmp/apt-up

diff /tmp/apt-up /tmp/apt-archives >> /home/user/sec/apt-up
cat /home/user/sec/apt-up | mail -s "apt-up" user@server.com
       ← 前回のリストと比較し差分があればファイルに書き出し、
同時にメールでも送るようにする

cp /tmp/apt-up /tmp/apt-archives
● パーミッションの変更をします。
$ sudo chmod 700 /usr/local/bin/apt-up.sh
● 出来たスクリプトを cron に登録します。
$ sudo crontab-e
10 4 * * *      /usr/local/bin/apt-up.sh
● これで毎日4時10分にスクリプトが実行されて、更新されたパッケージがあればアップデートされます。結果はこのようにログとして出力されます。但しスクリプトを見ればわかるように、一度実行させて /tmp/apt-archives を作ってからでないとエラーになるかもしれません。
Fri Feb  9 04:10:04 JST 2007
Sat Feb 10 04:10:05 JST 2007    ← アップデートがない場合は日付だけが記録される
Sun Feb 11 04:10:26 JST 2007    ← アップデートがあった場合はこのように出力される 
38,39c38,39
< samba-common_3.0.14a-0vl0.4_i386.rpm ← 新しくなったパッケージ
< samba_3.0.14a-0vl0.4_i386.rpm
---
> samba-common_3.0.14a-0vl0.3_i386.rpm ← 変更された旧パッケージ
> samba_3.0.14a-0vl0.3_i386.rpm

プリンタサーバの設定 まだ途中です(^^;

最終更新日 2008.02.01
● サーバにプリンタを接続して、全てのクライアントマシンからプリンタを使えるようにする。

最初にプリンタをサーバマシンに接続します。私の環境では USB ポートに接続しています。
サーバマシンで CUPS がインストールされていることを確認します。入っていなければ apt-get install cups しておきます。
/etc/cups/cupsd.conf の設定
# Only listen for connections from the local machine.
Listen localhost:631
Listen 192.168.3.1:631
Listen /var/run/cups/cups.sock

# Restrict access to the server...

  Order allow,deny
  Allow From @LOCAL


# Restrict access to the admin pages...

  Encryption Required
  Order allow,deny
  Allow From 192.168.3.0/24



Generating a 1024 bit RSA private key
.................................++++++
.++++++
writing new private key to '/etc/cups/ssl/server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:jp
State or Province Name (full name) [Some-State]:ken
Locality Name (eg, city) []:machi
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:
Email Address []:
l/server.key -out /etc/cups/ssl/server.crt -days 3650 -x509 -keyout /etc/cups/ssl
Generating a 1024 bit RSA private key
............++++++
.++++++
writing new private key to '/etc/cups/ssl/server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----