Sno 「 t 、 ACID 、 MySQL 、 F 「 eeBSD で侵入検知 動かすために設定しなければならない。 Apache と PHP を設定 ー 291 HACK # 59 Apache の設定ファイル /usr/local/etc/apache/httpd.conf に、 2 つの変更を加える必要があ る。最初に、 #ServerName を探して先頭の # を削除し、 www.example.com を自分の実際のサーバ 名に置き換える。次に、セキュリティの理由から、 ServerSignature 0n を ServerSignature 0 幵 に変更する。そうすれば、サーバが H"ITP サーバのタイプとバージョンなどの情報を公開す ることを防止できる。ほとんどの管理者は、ネットワーク上で IDS を実行するとき、その存 在を秘密にしたがるものだ。 IDS の検知を回避するツールや攻撃手段があるからだ。 PHP を設定 PHP をインストールすると、 / usr / 10 ( al / etc に 2 つのサンプルの設定ファイル php. ini-dist と php. ini-recommended が入っている。ファイル名から想像がつくように、後者は PHP4 形式 の推奨の設定ファイルだ。このサンプルには、 PHP を「より効率的に、より安全にし、さら にクリーンなコーディングを『推奨』する」設定が入っている。 こではセキュリティに的 を絞っているので、このファイルを使用することを勧める。 PHP を設定するには、サンプルの設定ファイルを単に / usr / 10 〔 al / et ( / php. ini にコピーす るだけでよい。 # cd / us て / 10 ( al / et ( # cp php ・ ini-recomended php. ini MySQL を設定 MySQL は、いくつかの設定を用意している。メモリが 64MB 未満なら my - small. cnf また は my-medium. cnf を、 512MB なら my-large. cnf を、 1 —2GB なら my-huge. cnf を使えばよい。 後でシステムのスワップ空間が足りなくなったら、問題を修正するために mysql を停止して、 # /usr/local/etc/rc. d/mysql-server. sh start # /usr/local/bin/mysql_install db 次に、初期データベースをセットアップして、サーバをインストールする。 # cp /usr/local/share/mysql/my-large. cnf /etc/my. cnf をコピーする。 メモリ消費量の小さな *. ( nf ファイルをコピーすればよい。こでは、 例として my-large. cnf 3306 で MySQL が待機しているはすだ。 MySQL サーバが動いていることを確認するには、 sockstat コマンドを使用できる。ポート
リモートからログインしてコンソールメッセージを見る リモートのコンソールメッセージを見る ー 201 HACK # 42 CAIt) + CFI) を押しても無理だとしたら、どうすれば、リモートのコンソールメッセー ジを見ることができるのだろうか。現在のセッションからすばやくハッキングする方法は、 次のコマンドを実行することだ。 % tail -f /var/log/messages & tail コマンドはファイルの末尾を表示する ( head コマンドがファイルの先頭を表示するよう に ) 。今回の場合は /var/log/messages ファイルを見ればよい。このログファイルには、シス テムコンソールに現れたメッセージのコピーが入っている。 - f スイッチを付けて実行すると、 tail はファイルを開いたままにし、新しいエントリがログファイルに追加されるたびに内容 を表示する。コマンドの最後にアンパサンド ( & ) を付けると、コマンドがバックグラウンドで 動くので、 CEnter] キーまたは別のコマンドを入力するとプロンプトが戻ってくる。 システムがこのファイルにコンソールメッセージを書き込むたびに、 tail はそれを現在の 擬似ターミナルに表示する。何かを入力している途中でログメッセージが現れたら、 CCtrl] + Cr] を押してコマンドプロンプト行をリフレッシュすれば、入力したところまでの行が再 び現れる。 別の手段 何にでも複数の解決手段があるものだ。ログファイルを扱うのは syslog なので、 syslog の 設定ファイルを変更する方法もある。ます、メッセージがコンソールに送られる理由を見て みる。 % grep ( 0n501e / et ( / 5Y510g ・ conf . err;kern. debug;auth. notice;mail. crit /dev/console # /dev/console への出力をすべて / va て / 10g / console. 10g に # 書き込むには、次のコメントを外すこと #console. inf0 /var/log/console. 10g この設定ファイルを見れば、デフォルトでメッセージが / dev / ( onsole に送られることがわ かるだろう。この設定ファイルは、メッセージを別の場所 ( ( onsole. 10g という名前のファイ ル ) に送るためのヒントも示している。 ( onsole. info の行のコメントを外せば、メッセージを / va ツ 10g / ( onsole. 10g に送ることができる。 この # を取り除いたら、指定の名前で空のログファイルを作成し、その変更を syslogd に知 らせるためにシグナル 1 を送る必要がある。
HACK # 22 4 ー 2 章ファイルとファイルシステム かなり良くなったように見えるが、安心してため息をつくのは、まだ早い。さらに、ログ ファイルもすべて再現しなければならない。いまだに / var / 10g が空つほだからだ。覚えてお いてほしいのは、 mtree はディレクトリ構造を作成するが、ディレクトリ構造の中のファイル をすべて作成するわけではないということである。ディレクトリ構造の中に何千ものファイ ルが入っているとしたら、バックアップテープを取り出してくるほうがよい。 ただし、 / var / 10g については望みがある。自分の記憶から、すべてのログファイルの名前 # $FreeBSD: src/etc/newsyslog. conf,v 1.42 2002 / 09 / 21 12 : 07 : 35 markm Exp $ # newsyslog の設定ファイル % more /etc/newsyslog. (0n十 を絞り出さなくても、次のように実行することができる。 # 将来には、これらのテフォルトが、もっと保守的な設定に # messages 、 lpd-errs の内容を秘密にしたいサイトもあるだろう。 # 640 または 600 に変更することが望ましい。例えば、 maillog 、 # 設定するほうがよい。特に、 644 のエントリの多くを、 # 注記 : サイトによっては、テフォルトよりも厳格な保護を # 変わるかもしれない。 # logfilename [owner: group] mode count Size when [ZJB] [/pid_file] [sig_num] /var/log/cron /var/log/amd. 10g /var/log/auth. 10g /var/log/kerberos. 10g /var/log/lpd-errs /var/log/xferlog /var/log/maillog /var/log/sendmail. st /var/log/messages /var/log/all. 10g /var/log/slip. 10g /var/log/ppp ・ 10g /var/log/security /var/log/wtmp /var/log/daily. 10g /var/log/weekly. 10g /var/log/monthly. 10g / va ツ 10g な onsole. 10g ・ network ・ network root. root. 600 644 600 600 644 600 640 640 644 600 640 640 600 644 640 640 640 600 3 7 7 7 7 7 7 10 5 7 3 3 10 3 7 5 12 5 100 100 100 100 100 100 100 100 100 100 1 100 @T00 168 @T00 @01T05 B @T00 $W6D0 $MIDO ごらんのとおり、デフォルトのログファイルの名前とパー、ツションがわかる。必要な ファイルを tou ( h で作成し、 chmod でパーミッションを調節すればよい。
ユーザの設定をカスタマイズー さらに独自のファイルを追加することもできるだろう。 33 HACK # 9 マイズを行うこともできるし、 デフォルトファイル drwxr-xr X デフォルトではどんなファイルがあるかを眺めてみよう。 % 15 -1 /usr/share/skel total 24 2 root drwxr-xr-x 27 root 1 root 1 て 00t 1 root 1 て 00t 1 て 00t 1 root 1 root 1 root wh eel wh eel wheel wheel wheel wheel wheel wheel wheel wheel 512 JuI 28 16 : 09 . / 512 JuI 28 16 : 06 921 JuI 28 16 : 09 dot. cshrc 248 Ju1 28 16 : 09 dot. login 158 JuI 28 16 : 09 dot. login conf 371 Ju1 28 16 : 09 dot. mail aliases 331 Jul 28 16 : 09 d0t. mailrc JuI 28 16 : 09 dot. profile 276 JuI 28 16 : 09 dot. rhosts 975 Jul 28 16 : 09 d0t. shrc どのファイルも dot で始まることに注意してほしい。しかし、システムがユーザのホーム 797 ディレクトリにコピーするときには、 dot が文字どおりの " . " に置き換わる。また、このディ レクトリのファイルの所有者は root になっているが、新しいユーザを作成してホームディレ 分でハックしたバージョンの . cshrc に置き換えればよい。コピーするとき、ファイルの名前 でカスタマイズした . cshrc を新しいユーザに与えたければ、 /usr/share/skel/dot. cshrc を、自 # 2 ] tcsh シェルの便利な設定ファイルオプション」で、 . cshrc のハックを紹介した ) 。自分 それでは、デフォルトファイルを 1 っすっ説明する。ますは dot. cshrc から始める ( 「 [ Hack dOt. cshrc クトリにコピーするときには、所有者がそのユーザに置き換わる。 るが、カスタマイズしたコピーを別の場所に格納しておくほうが便利だろう。 . cshrc のコピーで上書きしている。直接に /usr/share/skel/dot. cshrc を編集することもでき この例では、デフォルトの dot. cshrc を、スーパーユーザがカスタマイズしたバージョンの # cp / て 00t /. ( sh /usr/share/skel/dot. cshrc を変更することを忘れないでほしい。 トリを持っているかどうかを調べる。手つ取り早く探すには、次のようにすればよい。 その方法がないわけではない。まず、どんなユーザが存在し、そのユーザがホームディレク すでにユーザが存在し、それらのユーザにカスタマイズしたファイルを与えたいとしたら、
HACK # 4 16 ] 章 % kbdcontrol -f 64 "lynx ww ・ google ・ ca" ユーザ環境のカスタマイズ kbdcontrol: function key string t00 long ( 18 〉 16 ) 独自のマッピングを設定するとき、コマンドと引数が 16 文字を越えないように注意しなけ ればならない。 16 文字以内なら、どんなコマンドでもマップできる。 シェルのバインディング対ターミナルのバインディング 先に進む前に こで少し立ち止まって、 F[Hack#31 シェルのバインディングを作成」で 解説したシェル固有のバインディングと、 こで解説しているターミナル固有のバインディ ングとを比較してみたい。 kbd ( ont て 01 を使用する 1 つの利点は、どのシェルを使用しているかに関係なく、独自のバ インディングがすべてのターミナルで動作することだ。もう 1 つの利点は、キーポード上の 任意のキーに簡単にマップできることだ。ただし、「 ctrl 文字」以外にマップしたい場合には、 シェルのマッピングは複雑になることがある。 一方、ターミナルのマッピングには、 tcsh のマッピングには存在しない制限がいくつかあ る。例えば、シェルのマッピングでは 16 文字の制限がないし、絶対パス名も使用できる。ま た、シェルに CEnter] キーを押してコマンドを直ちに起動させることも、割合に簡単だ。 ターミナルバインディングは、ユーザが現在使用しているターミナルだけに作用する。別 のターミナルでログインしている他のユーザには、まったく影響を与えない。ただし、マッ ピングを rc. conf に追加すれば ( スーパーユーザだけが追加できる ) 、すべてのターミナルに影 響が及ぶ。バインディングはターミナル固有であるため、 su を実行したとしても、ユーザは 同じターミナル上にいるかぎり動作は変わらない。 マッビングの注意 どのキーにマップすべきかを選択するとき、さらに注意すべき点がいくつかある。 t c s h シェルを使用してヒストリを眺めた後で ([Hack # 1 】を参照 ) 、上下の矢印キー ( [ ↑ ] と [ い ) のマップを変更しようとすると、きっと失望するだろう。また、例えばテキストエデイタで、 左右の矢印キー ( [ ← ] と [ → ] ) を使って移動しようとした場合にも問題が生じる。そして、 FreeBSD システムの前に座っているとしたら、 CFI] CF8] はすでに仮想ターミナルに割 り当てられており、 CF9] は GUI ターミナルに割り当てられている。デフォルトでは、 [ F10 ] [ F12 ] のマップは存在しない。 マッピングを実験しているときに好ましくないマッピングで混乱したら、以下のコマンド を実行すれば、すばやくデフォルトのマッピングに戻ることができる。 % kbdcontrol -F
各種のアプリケーション向けに F 「 eeBSD をチュー #ifndef COMPILING LINT #include "opt lint. h" #ifdef SMP メールサーバを最適化 #endif #endif #error DEVICE POLLING is not compatible with SMP 二ング ー 345 HACK # 69 一般にメールサーバでは、ネットワーク接続の数は非常に多いが、短時間で少量のデータ を転送するとすぐに接続を閉じる。このような場合、多数の小さなネットワークバッフアを 用意すると便利だ。 ネットワーク接続には、送信用と受信用の 2 つのバッフアが必要になる。バッフアのサイ ズは、どれくらいすばやくデータを転送できるかを左右する。また、ネットワークが遅延し た場合には、問題になる前にどれくらいのデータのバックアップをとっておくことができる かを左右する。ネットワークバッフアが小さすぎると、 CPU がネットワークをクリアするた めに待機してデータを処理する回数が増えるので、 CPU のオーバーヘッドが増大する。ネッ トワークバッフアが大きすぎると、バッフアの効率が悪くなりメモリを浪費してしまう。う まくバランスをとることがチューニングの鍵となる。 経験から言うと、確立される接続の数に 32 をかけた数を用意すれば、トラフィックが異常 に急増した場合でも余裕がある。筆者は、試行錯誤を繰り返してこの値を見つけた。例えば、 最大で 128 のサーバが同時にメールを送信すると予想するなら、それぞれ送信用と受信用の 2 つのバッフアを用意し、さらに 32 をかけて、ネットワークバッファクラスタの数を 8 , 192 にするとよい ( 128 x 送受信で 2 x 32 = 8 , 192 ) 。また、接続が完全に閉じるまでに 2 分以上 かかるかもしれないことも覚えておいてほしい。特定の 2 分の間に 128 通以上の電子メール を扱うことがあると予想するなら、それに応じて数を増やさなければならない。 もう 1 つ、調節すべき重要な値がある。ソケットの最大数である。ネットワークバッファ と同じ数のソケットで始め、そこから適切な数にチューニングすればよい。 ネットワークバッファクラスタの数を調べるには、 netstat -m コマンドを実行すればよい。 そして、これらの値を /boot/loader. conf で指定することができる。 kern. ipc. nmbclusters=8192 kern. ipc. maxsockets=8192 どんな性能をチューニングする場合でもそうだが、変更した後でシステムを観察する必要 がある。必要な項目を過大評価、あるいは過小評価していないだろうか。調査結果に基づい て、必ず調整を行わねばならない。
HACK # 49 な€sendmail が必要なのか ・「 Read EmaiI Headers 」 (http ://鼎w.stopspam.org/email/headers.html) なぜ sendmail が必要なのか ・一一早まって sendmail を完全に停止してはいけない。きっと今でも sendmail が必要だ H A C K ー 235 あなたはエンドユーザとして、きっと次のように疑問に思うだろう。「個人で FreeBSD マ シンを使用するだけなのに、なぜ sendmail のような重い MTA デーモンを実行する必要があ るのだろうか。」 sendmail は、 FreeBSD をはじめ、ほとんどの Unix システムで標準の MTA (MailTransport Agent : メール転送工ージェント ) となっている。実際、インターネットを経由する電子メー ルの大半は、どこかで sendmail サーバを通過することが多い。しかし、 sendmail は、管理が 最も簡単なソフトウェアパッケージではない。また、その設定ファイルの構文は、ほとんど の人にとって頭痛の種となっている。他にも代替となる MTA パッケージがあり、過酷な要 求に耐えるソフトウェアもある。 現代的なグラフィカルな電子メールクライアントの多くは ( 例えば Netsc 叩 eMa ⅱや EvoIu - ⅱ on など ) 、ネットワークを越えて電子メールを直接メールサーバマシンに送信することがで きる。したがって、電子メールを送信するには、ローカルマシンに MTA がなくてもよい ( し かし、 mail 、 mutt 、 pine など、典型的な Un ⅸメールクライアントを使用する場合には、 MTA が必要だ ) 。 どの電子メールクライアントを使用する場合でも、システムから ( たいていは定期的に実行 するスクリプトから ) 自動的に電子メールを送信したければ、 MTA が必要になる。もっと正 確に言うと、 Un ⅸプログラムは、パイプを通してテキストを /usr/sbin/sendmail の標準入力 に送ることによって、電子メールを送信できると期待する。残りの作業はシステムが処理し てくれる。 sendmail は尊敬に値するが、数多くの MTA の 1 つにすきない。別の MTA を選 んだとしても、 sendmail を使用していたときのメール操作の習慣を、必ずしも変 更しなければならないわけではない。主要な 3 つの BSD システムには変換ファ イル / etc / maile て . ( onf があり、ユーサまたはプロセスが sendmail 、 mailq 、 newaliases を実行するときに、どのコマンドを実行すべきかを指定できるように なっている。 例えば、 postfix をインストールした場合、 sendmail コマンドを使用すれば、 postfix)k ッケージのコマンドが実際の処理を実行する。 /etc/mailer.conf があれ ば、メールサプシステム全体をひっくり返さなくても、 MTA を簡単に置き換える ことができる。
HACK # 29 136 ー 3 章ブートとログイン環境 # cap mkdb /etc/login. conf 既存のバスワードを変換 すでにユーザがいる場合、パスワードを MD5 から Blow ⅱ sh に変換する必要がある。これ があるから、パスワードアルゴリズムはユーザを作成する前に変更するのがよいのだ。 すでにユーザを作成している場合、パスワードデータベースから使用中のアカウントをす べて探す。使用していないアカウント ( ログインを許可していないアカウント ) には、暗号化 パスワードの代わりにアスタリスク ( * ) 文字が入っている。パスワードデータベースからアス タリスクが「入っていない」行をすべて見つけたいので、 grep の反転オプションを使用する。 # grep -v ・ * ・ /etc/master. passwd r00t:$1$ywXbyPT/$GC8tXN91c.1sKRpLZori61:0:0: :0:0:CharIie &:/root:/bin/csh dru:$1$GFmInh61$jh3v41. QNf450ARgItZU5. : 1008 : 0 : :0:0:User &:/home/dru:/bin/csh うまくいった。しかし、次のようにすれば、出力がもっと見やすくなる。 # grep -v ・ * ・ /etc/master. passwd ー cut -d root dru 上記のコマンドを順に見ていこう。 grep -v は、逆のフィルタとして作用する。つまり、 「 /etc/master. passwd から、 * が入っていない行を表示せよ」という意味だ。これらの行は長く、 ユーザ名以外の情報がたくさん入っているので、パイプ (l ) を通して ( ut ユーティリティに送 り、文字どおり不要な部分をカットする。ユーザ名は各行の先頭にあり、その後にフィール ドの区切り文字としてコロン ( : ) が付く。 -d で区切り文字がタブでなくコロンだということ を、 -f 1 で行の先頭のフィールドだけに関心があることを ( ut に伝える。 このシステムには使用中のアカウントとして、 root と dru の 2 つがあるようだ。元の出力 の中に、 $ 1 で始まり : で終わる長い文字列があったことに注目してほしい。ユーザの実際の パスワードはこんなに複雑ではない。これはパスワードを MD5 アルゴリズムで暗号化した ものだ。 $ 1 が MD5 を意味する。 BIow ⅱ sh 暗号に切り替えると $ 2 になる。 ( パスワード全体 を変更しなければならないので注意してほしい。このファイルを直に編集してはいけない。 ) こで、これら 2 つのパスワードを変更してみる。 # passwd dru Changing 10Ca1 password f0 て dru New Password: Retype New Password : # passwd Changing 10Ca1 password for root
HACK # 11 1 章ユーサ環境のカスタマイズ このように不格好なのは、 sc ⅱ pt のせいでなく以下のような理由がある。最初の理由とし % echo # linux enab1e="YES" に変更し、 % echo # linux enab1e="N0" を % echo # /etc/rc. conf を開いたら、 自分自身に少しだけコメントを送りたいとき、筆者は echo コマンドを使用している。 したときの入力を正確に記録したくても、あまり良い案が浮かばない。このような理由から、 なる。前述の C01 - b コマンドは、不要な文字をほとんど整理してくれるが、エデイタを使用 スクリプトセッションの間にエデイタを使用すると、スクリプトファイルが非常に乱雑に configure. firewall. nov. 11.2003. clean: ASCII EngIish text % file configure. firewall. nov. 11.2 3. clean 1md1avigne6Cm: cd /usr/ports/security/snort その結果は、すっと読みやすくなる。 C01 はバックスペースも削除する。 シーケンスを理解しないが、これらがまさに取り除きたい文字なのである。 - b を付けると、 筆者のスクリプトファイルは、まさに ( 01 を活用できる例だ。 ( 01 は制御文字とエスケープ C01 は、興味深い小さなユーティリテイだ。理解できない文字を静かに取り除いてくれる。 ( 01 -b 〉 configure. firewall. nov. 11.2003. clean % more configure. firewall. nov. 11.2003 ー、 除くことができる。 しかし、まったく方法がないわけではない。次のコマンドで、不要な文字をほとんど取り terminators, with escape sequences configure. firewall. nov. 11.2003: ASCII Eng1ish text, with CRLF, CR, LF line % file configure. firewall. nov. 11.2003 作について警戒できただろう。 事前に、このスクリプトファイルに file ユーティリティを実行していれば、このような動 完できた。 押して補完を試みたが、ビープ音が鳴った。 sno まで入力してからタブを押すと、 sno て t と補 した。 3 番目の理由として、筆者はタブの補完を使用した。 sn まで入力したところでタブを 去しなければならなかった。さらに / ysr と入力したので、 [ バックスペース ] で 3 文字を消 [ バックスペース ] キーで文字を消 することが多かった。 /usr なのに /s と入力してしまい、 左右に [lm および [m となって現れている。 2 番目の理由として、筆者はその日、入力ミスを て、筆者のカスタマイズしたプロンプトに制御文字が入っている。制御文字は、ユーザ名の
別の MAC アドレスを使用ー 205 いでほしい。それぞれの文の最後にセミコロン ( ; ) を付ける必要がある。この例では ISP の期 待に沿うように、 host-name と dhcp-client-identifier の両方のオプションを設定した。 これらの変更が実際に働くかどうかをテストしてみる。 / et ( / rc. conf の工イリアスをテスト 、で、 IP # dhclient - て ed0 アドレスを解放して更新すると、 DHCP サーバがどのように応答するかを調べてみる。 すばらしい。新しい NIC で、古い MAC アドレスになりすますことができた Routing daemons:. drop SYN + FIN packets=YESsysctl: unknown 0id 'net. inet. tcp. drop synfin' Additional routing options : ignore ICMP redirect=YES 10g ICMP redirect=YES inet 127.0.0.1 netmask 0x 幵 000000 100 : f1agS=8049 く UP, LOOPBACK,RUNNING,MULTICAST> mtu 16384 ether 00 : 05 : 5d : d2 : 19 : b7 inet 192.168.2.95 netmask 0x 幵幵幵 00 broadcast 192.168.2.255 ed0 : f1agS=8843 く UP, BROADCAST, RUNNING, SIMPLEX,MULTICAST> mtu 1500 D0ing initial network setup: D0ing stage one network startup : # /etc/netstart するには、システムを再起動する必要はない。以下のコマンドを実行するだけでよい。 # patch く ifconfig. patch を ifconfig. patch とすると、次のようにする。 ifconfig に移る。次にパッチをダウンロードして適用する。差分情報を含むパッチファイル 要がある。ますはシステムのソースをダウンロードして展開し、ディレクトリ s rc/s b in / このパッチを NetBSD のソースに適用して、 if ( onfig の新しいバージョンをビルドする必 のパッチは http://mail-index.netbsd.0rg/teCh-net/2003/08/08/0001.html から入手できる。 アドレスを変更したければ、 DheerajReddy 氏による ifconfig のパッチを利用すればよい。 現在の NetBSD に入っているバージョンの ifconfig では、この機能を使用できない。 MAC NetBSD でなりすましを設定 バがインタフェースに公開の IP アドレスを与えたことがわかるだろう。 出ないで、プロンプトが戻ってくる。その後で ifconfig ed0 と実行すれば、 ISP の DHCP サー サーバから新しい IP アドレスを要求する。このコマンドが成功すると、エラーメッセージが dhclient に - r を付けて実行すると、 DHCP クライアントは古い IP アドレスを捨てて、 DHCP HACK # 43