diff --git a/ja_JP.eucJP/books/handbook/security/chapter.sgml b/ja_JP.eucJP/books/handbook/security/chapter.sgml index 76208a2674..995c01df53 100644 --- a/ja_JP.eucJP/books/handbook/security/chapter.sgml +++ b/ja_JP.eucJP/books/handbook/security/chapter.sgml @@ -1,2013 +1,2013 @@ セキュリティ DES, MD5, と Crypt 原作: &a.wollman; 24 September 1995. 訳: &a.hanai; 12 September 1996. UN*X システムにおいてパスワードを保護し, 簡単に覗かれるのを防 ぐために, 従来パスワードはある方法によりスクランブルされてきました. ベル研の Unix 第7版に始まって以来, パスワードはセキュリティの専門家がい うところの “一方向ハッシュ関数” というものを用いることにより暗号化されるようになりました. つまり, 可能な限りのパスワード空間を検索するという強引な 方法以外にそのオリジナルを得ることができない, といった方法でパスワードは変換 されるのです. 不幸なことに, その当時 AT&T の研究者たちが手に入れることができ た唯一の暗号化方法は DES(Data Encryption Standard) に基づいたものでし た. これは営利企業にとっては大して問題ではありませんが, FreeBSD のよ うにすべてのソースコードが自由に手に入る オペレーティングシステムにとっ ては重大な問題となります. なぜなら, 多くの政府は DES やその他の暗号化ソフ トウェアが国境を越えることに 制限をつけようとしているからです. ここで, FreeBSD チームは一つのジレンマに直面しました. つまり, どうす れば法に触れることなく国外にあるそれらの UNIX システムのすべてに互換性を持 たせることができるか, ということです. 私たちは ``dual track approach'' を 取ることに決めました. 規制されていないパスワードスクランブラのみを含む 配布用物件を作り, DES に基づいたパスワードハッシュを付加ライブラリ として分けて供給するのです. パスワードをスクランブルさせる関数は, C ライブラリから libcrypt と呼ばれる(それを実行する C 関数が crypt と いう名前だからです)別のライブラリへ移されました. FreeBSD 1.x 及び 2.0 のリリース前のスナップショットでは, その規制されていないスクランブラは Nate Williams によって書かれた安全でない関数を使っていますが, 次の リリースでは RSA Data Security 社の一方向ハッシュ関数の MD5 を使う方法 に置き換えられました. これらの関数はどれも暗号化を含んでいないため, 合衆国から持ち出し, 他の多くの国へ持ち込めるものであるとされています. 一方, DES に基づいたパスワードハッシュ関数に関する作業もまた進行中 でした, まず, 合衆国及び他の国で書かれたコードの同期をとりながら, 合衆国の外で書かれた crypt のあるバージョンが持ち込まれました. そしてライブラリは修正され, 二つにわけられました. すなわち DES libcrypt は一方向パスワードハッシュをおこなうのに必要なコード のみを含み, それとは別の libcipher は実際に暗号化をおこなう ためのエントリポイントとして生成されました. コンパイルされたライブラリに対 して国外に持ち出す許可を得るのを簡単にするために, コードはこのように分け られたのです. <command>crypt</command> メカニズムを理解する あるパスワード文字列を作るのに, DES に基づいたハッシュ関数を使っ たのか, MD5に基づいたハッシュ関数を使ったのかは非常に簡単にわかります. MD5 を使ったパスワード文字列は必ず $1$ という文字 で始まります. DESを使ったパスワード文字列はどんな特定の文字も持っていま せんが, MD5を使ったパスワードよりも短く, $ という文字 を持たない64文字のアルファベットで構成されています. したがって, ドル記号で 始まっていない比較的短い文字列は DES を使ったパスワードである可能性が非常 に高いです. あなたのシステムで, どちらのライブラリが使われているかを決めるの は, スタティックにリンクされている init のようなもの(その ようなプログラムに対する唯一の方法は わかっているパスワードを試してみ て動くかどうかを確認することです.) を除いたほとんどのプログラムについ ては非常に簡単なことです. crypt を使うようなプログラムは libcrypt にリンクされています. そしてそれぞれのライブラリに 対する libcrypt は適切な実装へのシンボリックリンクとなってい ます. 例えば, DES 版を使っているようなシステムにおいては次のようになって います: &prompt.user; ls -l /usr/lib/libcrypt* lrwxr-xr-x 1 root wheel 13 Mar 19 06:56 libcrypt.a -> libdescrypt.a lrwxr-xr-x 1 root wheel 18 Mar 19 06:56 libcrypt.so.2.0 -> libdescrypt.so.2.0 lrwxr-xr-x 1 root wheel 15 Mar 19 06:56 libcrypt_p.a -> libdescrypt_p.a MD5 に基づいたライブラリを使っているシステムにおいては, 同じようなリンクが 見られるでしょうが, そのターゲットは libdescrypt ではなく libscrypt になっているでしょう. S/KEY 原作: &a.wollman; 25 September 1995. 訳: &a.jp.hino;. 24 September 1996. S/KEY は一方向ハッシュ関数 (ここで述べているバージョンでは, 過去と の互換性を保つために MD4 を用いています. S/KEY の他のバージョンでは MD5 や DES-MAC を用いているものもあります) を基にしたワンタイムパスワー ド方式です. S/KEY は, バージョン 1.1.5 以降のすべての FreeBSD に標準的 に含まれています. S/KEY は FreeBSD 以外の数多くのシステムの上でも利用 可能であり, その実装の数も増えています. S/KEY ば Bell Communications Research, Inc. の登録商標です. 以下の説明では, 三種類の異なる「パスワード」が使われます. まず一つ 目は, あなたが普段使っている普通の UNIX スタイルの, もしくは Kerberos でのパスワードです. ここではこれを “UNIX パスワード” と呼ぶことにし ます. 二つ目は, S/KEY の key プログラムによって生成され, keyinit プログラムとログインプロンプトが受け付ける, 一回限りの パスワードです. ここではこれを “ワンタイムパスワード” と呼ぶことにし ます. 三つ目のパスワードは, key (と場合により keyinit) プログラムに対してユーザが入力する秘密のパスワードで, ワンタイムパスワー ドを生成するのに使われます. ここではこれを “秘密のパスフレーズ” もし くは単に “パスフレーズ” と呼ぶことにします. (訳注: ユーザが頭の中だ けにしまっておくべきものが, この秘密のパスフレーズです. なお, 原文では これをパスワードと表記していますが, 混乱を避けるために訳文ではすべて “ 秘密のパスフレーズ” に統一しています.) 秘密のパスフレーズは, UNIX パスワードと同じである必要はありませんし, また UNIX パスワードと何らかの関連性を持たなければならないということも ありません (両者を同一に設定することは可能ですが, お奨めしません). UNIX パスワードは長さが 8 文字に制限されています (訳注: FreeBSD で DES を導入していない場合はもっと長いパスワードも認識されます). これに対し, S/KEY では秘密のパスフレーズを好きなだけ長くすることができます (訳注: 実装上, `key' コマンドなどのバッファ長で制限されてしまう可能性が あります. 200文字程度に押えておいた方がよいでしょう :-). 筆者は 7 語か らなる文を使っています. 通常の設定では, S/KEY システムは UNIX のパスワー ドシステムと完全に独立して動作するようになっています. S/KEY システムでは他に二種類のデータを使用します. 一つは “シード (種)” または (混乱を招きますが) “キー” と呼ばれるもので, (訳注: デ フォルトでは) 二つの文字と五つの数字で構成されます. もう一つは “シー ケンス番号 で, 1 以上の整数です. シーケンス番号は特に指定しなければ 100以下です (訳注: ``keyinit' プログラムでは 9999 まで指定できま す). S/KEY はここまでに述べたデータを利用してワンタイムパスワードを生 成します. その方法は, まずシードと秘密のパスフレーズを連結し, それに対 してシーケンス番号の回数だけ一方向ハッシュ (RSA Data Security, Inc. に よる MD4 セキュアハッシュ関数) を繰り返し計算します. そしてその結果を 六つの英単語に変換します (訳注: ハッシュ計算の後, 64ビットに収まるよう にデータを処理したものが厳密な意味でのワンタイムパスワードです. 通常は ユーザの便宜のために, この 64ビットデータと六つの英単語との間で変換処 理をおこなっています) . login プログラムと su プログラム は, 前回最後に受け付けられたワンタイムパスワードを記録しています. そし て, その前回のワンタイムパスワードと, ユーザが入力したワンタイムパスワー ドを一回ハッシュ関数にかけた結果とが一致した場合に, このユーザは認証さ れます. 一方向ハッシュ関数を使うことにより, もし (ログイン等に成功した) ワンタイムパスワードが一回盗聴されたとしても, 次回以降に使われる複数の ワンタイムパスワードを生成することは不可能です. シーケンス番号はログイ ン (等) が成功するたびに一つずつ減らされて, ユーザとログインプログラム の間で同期が取られます. (シーケンス番号が 1 になったら, S/KEY を再度初 期化する必要があります.) 次に, S/KEY 関連の四つのプログラムについて説明します. key プ ログラムは, シーケンス番号と, シードと, 秘密のパスフレーズを受け付けて, ワンタイムパスワードを生成します. keyinit プログラムは, S/KEY を初期化するのに使用され, また秘密のパスフレーズやシーケンス番号やシー ドを変更するためにも使用されます. このプログラムを実行するには, 秘密の パスフレーズか, または, シーケンス番号とシードとワンタイムパスワードの 一組かの, どちらかが必要になります. keyinfo プログラムは, /etc/skeykeys というファイルを調べて, このプログラムを起動し たユーザの現在のシーケンス番号とシードを表示します. 最後に, loginsu プログラムについてですが, これらは S/KEY の ワンタイムパスワードを, (訳注:システムが) ユーザを認証するものとして受 理する処理をおこないます. login プログラムは, 指定された特定の アドレスからの接続に対して, UNIX パスワードの使用を認めなくする機能, 逆に言えば S/KEY の利用を強制する機能も持っています. このドキュメントでは, 四種類の異なる操作について説明します. 一つ目 は, keyinit プログラムを信頼できる通信路上で利用する場合で, 一 番始めに S/KEY を設定する操作や, 使い始めたあとで秘密のパスフレーズや シードを変更する操作です. 二つ目は, keyinit プログラムを信頼で きない通信路上で利用する場合で, 操作の目的は一つ目と同じです. この場合 には key プログラムを併用する必要があります. 三つ目は, key プログラムを使い, 信頼できない通信路を通じてログインする操 作です. 四番目は, key プログラムを使って, 複数のワンタイムパス ワードを一気に生成する操作です. ここで生成した複数のワンタイムパスワー ドは, メモしたり印刷したりして携帯し, 信頼できる通信路が一切ないところ (例えば展示会場など) で利用することができます. (訳注: ワンタイムパスワー ドを記録した紙をなくさないこと! 電話番号やIPアドレス, ユーザ名を一緒に メモしていたら最悪です!!) 信頼できる通信路での初期化 信頼できる通信路 (例えばあるマシンのコンソール画面など) を利用して いるときに, S/KEY の初期化, S/KEY の秘密のパスフレーズの変更, またはシー ドの変更をおこなうことができます. そのためには, まずあなた自身がログイ ンし, keyinit コマンドを以下のようにパラメタなしで実行します: &prompt.user; keyinit Updating wollman: ) この部分は始めて S/KEY を使 Old key: ha73895 ) うときには表示されません. Reminder - Only use this method if you are directly connected. If you are using telnet or rlogin exit with no password and use keyinit -s. ) `keyinit' コマンドが出力する注意です. 訳すと, ) 注意 - この動作モードはマシンに直接入力しているときのみ利用 ) すること. もし今 telnet や rlogin を使っているなら, 秘密のパ ) スフレーズを入力せずにこのままコマンドを終了し, かわりに ) keyinit -s を実行すること. Enter secret password: ) ここで秘密のパスフレーズを入力します. Again secret password: ) もう一回入力します. ID wollman s/key is 99 ha73896 ) あとで説明します. SAG HAS FONT GOUT FATE BOOM ) 上の例で出てきた事柄について説明しましょう. Enter secret password: というプロンプトに対してあなたが考えた秘密のパスフレーズを 入力します (筆者は 7 単語以上の文を秘密のパスフレーズにしています). こ の秘密のパスフレーズは後でログインするために 必要になるものです. `ID' から始まる行は, S/KEY における一回分のパラメタであり, あなたのログイ ン名とシーケンス番号とシードです. (訳注: `keyinit' コマンドは次回 にログインするときに使われるパラメタを参考のために ここで表示しま す. ) S/KEY を使ってログインするときには, システム側が自動的にこれらの パラメタを表示してくれますから, これらのパラメタを覚えておく必要は ありません. 最後の行が, 今述べたパラメタと入力された秘密のパスフレー ズから計算されたワンタイムパスワードです. この例を実行した後, 次にログ インするときに打ち込むべきワンタイムパスワードが これです. 信頼できない通信路での初期化 信頼できない通信路を使って S/KEY を初期化, または秘密のパスフレーズ やシードを変更するためには, 信頼できる通信路として, その信頼できない通 信路とは別のものを用意する必要があります. その信頼できる通信路は key プログラムを実行するために必要となるもので, 例えばそれは, あなたが信頼できる Macintosh のデスクアクセサリや信頼できるマシンのシェ ルプロンプトだったりするでしょう (そこでの操作に関しては後述します). (訳注: ここでの通信路とはマシンそのものになります. 信頼できるマシンと は, 信頼できる人がしっかり管理しているマシンということです.) 他に準備 しておくものとして, シーケンス番号 (100は適切な値といえるでしょう) と, 場合によっては自分で考えた, またはランダムに生成されたシードがあります. あなたが S/KEY を初期化しようとしているマシンへの通信路が, 信頼できな いものである場合には keyinit -s コマンドを以下のように使用しま す: &prompt.user; keyinit -s Updating wollman: Old key: kh94741 Reminder you need the 6 English words from the skey command. ) `keyinit' コマンドが出力する注意です. 訳すと, ) 注意 - skey コマンドの出力する 6 英単語が必要になります. Enter sequence count from 1 to 9999: 100 ) ここを入力. Enter new key [default kh94742]: ) リターンのみ入力. s/key 100 kh94742 デフォルトのシード (keyinit プログラムは困ったことにこれを key と 読んでいるのですが, 混乱しないよう注意してください) で構わなければ, リ ターンキーを押してください. 次に, あらかじめ用意しておいた信頼できる通 信路 (信頼できるマシンや信頼できる S/KEY デスクアクセサリなど) へ移っ て, 先ほどと同じパラメタを入力します. $prompt.user; key 100 kh94742 Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: ) ここで秘密のパスフレーズを入力します. HULL NAY YANG TREE TOUT VETO ここで信頼できない通信路の方に戻って, key コマンドが出力したワ ンタイムパスワードをコピーして keyinit プログラムに入力します. s/key access password: HULL NAY YANG TREE TOUT VETO ID wollman s/key is 100 kh94742 HULL NAY YANG TREE TOUT VETO 後は, 前章で説明したことと同様です. ちょっと寄り道: ログインプロンプトについて どうやってワンタイムパスワードを生成するかを説明する前に, S/KEY を 使う場合のログインプロンプトを 見ておいた方がよいでしょう. &prompt.user; telnet himalia Trying 18.26.0.186... Connected to himalia.lcs.mit.edu. Escape character is '^]'. s/key 92 hi52030 Password: パスワードを要求する前に, ログインプログラムがシーケンス番号とシードを 表示していることがわかります. この二つのパラメタを使ってワンタイムパ スワードを計算することになります. ここではまだ使っていませんが, 便利な 機能がログインプログラムに備わっています: パスワードプロンプトに対して, 何も入力せずにリターンを押すとエコーモードに切り替わります. つまりタイ プした文字がそのまま見えるようになるのです. これは S/KEY のワンタイム パスワードを紙に印刷していた場合など, ワンタイムパスワードを手で入力し なければならない場合に特に役立つ機能です. このログインしようとしてるマシンが, あなたが今使っているマシンから UNIX パスワードを使ってログインすることができないように 設定されている 場合があります. その場合には, ログインプロンプトには S/KEY のワンタイ ムパスワードの利用が必要であることを示す (s/key required) という注釈が表示されます. ワンタイムパスワードを生成する 次に前章のログインプロンプトに対して入力するための ワンタイムパスワー ドを生成しましょう. そのために, 信頼できるマシンと key プログラ ムを使用します. (key プログラムには DOS や Windows の上で動くも の, Macintoshのデスクアクセサリとして動くものなどもあります.) コマンド ラインで key プログラムを起動するときには, シーケンス番号とシー ドを引数として指定します. 入力が面倒な人は, ログインプロンプトに表示さ れたもののうちで key からその行の最後までを, そのままカットア ンドペーストすることもできます. key プログラムの実行は以下のよ うになります: &prompt.user; key 92 hi52030 ) 前章の例からペースト. Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: ) 秘密のパスフレーズを入力. ADEN BED WOLF HAW HOT STUN そして別のウィンドウで: s/key 92 hi52030 ) 前章の例の続き. Password: ) ここでリターンキーを押した. (turning echo on) Password:ADEN BED WOLF HAW HOT STUN Last login: Wed Jun 28 15:31:00 from halloran-eldar.l [以下略.] 以上の手順は, 信頼できるマシンが利用できる場合 のみに 使えるもっ とも簡単な方法です. Java S/Key の key applet もあり, The Java OTP Calculator からダウンロードして Java をサポートするブラウザ上でローカルに 実行することができます. 複数のワンタイムパスワードを生成する 都合によっては, 信頼できるマシンや信頼できる通信路が一切確保できな いようなところで S/KEY を使う必要があるでしょう. このような場合には, key コマンドを使って複数のワンタイムパスワードを一気に生成する ことが可能です. そして結果を紙に印刷して携帯していくことができます. 例 えば: &prompt.user; key -n 25 57 zz99999 Reminder - Do not use this program while logged in via telnet or rlogin. Enter secret password: 33: WALT THY MALI DARN NIT HEAD 34: ASK RICE BEAU GINA DOUR STAG [...] 56: AMOS BOWL LUG FAT CAIN INCH 57: GROW HAYS TUN DISH CAR BALM という引数によって 25 個のワンタイムパスワードの生成を要 求します. ここで は, 最後に表示されている (もっとも大き い) シーケンス番号です. 残りのパラメタは前出の例と同様です. 出力は普 通に使う順番とは に出力されていることに注意してください (訳注: 一番最初に使うワンタイムパスワードは 一番最後に出力されたものです). こ の結果をカットアンドペーストして lpr コマンドを使って印刷すると よいでしょう. もしあなたがセキュリティに偏執するなら, この結果を紙と鉛 筆を使って手で書き移した方がよいかもしれません. ここで, 出力の各行はシー ケンス番号とそれに対応する一回分のワンタイムパスワードです. 消費済みの ワンタイムパスワードの行をペンで消していくと 便利でしょう. UNIX パスワードの利用を制限する 設定ファイル /etc/skey.access を使って UNIX パスワードの利 用を制限することができます. この場合の判断基準として, ログインを受け付 ける際のホスト名, ユーザ名, 端末のポート, IP アドレスなどが利用できま す. この設定ファイルの詳細に関してはマニュアル &man.skey.access.5; を ご覧ください. マニュアルにはこの機能に関わるセキュリティに ついて, いく つかの警告が記述してあります. この機能を使って セキュリティを高めようと するのならば絶対にこのマニュアルを読んでください. もし /etc/skey.access ファイルが存在しないならば (FreeBSD をインストールした直後の状態では存在しません), すべてのユーザが UNIX パスワードを利用することができます. 逆に, もしファイルが存在するならば, /etc/skey.access ファイルに明示的に記述されていない限り, すべ てのユーザは S/KEY の利用を要求されます. どちらの場合においても, その マシンのコンソールからはいつでも UNIX パスワードを使ってログインするこ とが可能です. 以下によく使われるであろう 三種類の設定を含む設定ファイルの例を示し ます: permit internet 18.26.0.0 255.255.0.0 permit user jrl permit port ttyd0 はじめの行 (permit internet) で, telnet などで接続するときの IP のソースアドレス (注意: これは偽造されるおそれがあります) が特定の値と マスクに一致している場合に, UNIX パスワードの利用を許可することを指定 しています. この設定自体はセキュリティを高めるための機能ではありません. そうではなく, ログインの権利を持つ許可されたユーザに対して, 現在そのユー ザが使っているネットワークが信頼できないと考えられるので S/KEY を使う べきである, ということを気づかせるための機能であると考えてください. 二行目 (permit user) によって, ある特定のユーザに対して, い つでも UNIX パスワードの利用を許可するように指定しています. 一般的には この設定をおこなうべきではありません. key プログラムがどうして も使えない環境にいる人や, ダム端末しかない環境にいる人, または何度教え ても聞く耳を持たないような人を サポートする必要がある場合にのみ設定をお こなってください. 三行目 (permit port) によって, ある特定の端末ポートからログ インしようとするすべてのユーザに対して UNIX パスワードの利用を許可する ように指定しています. この設定はダイヤルアップ回線に対する設定として利 用できるでしょう. Kerberos 原作: &a.markm; (&a.md; からの寄稿に基づいています). 訳: &a.jp.arimura;. Kerberosは, サーバのサービスによってユーザが安全に認証を受けられる ようにするための, ネットワークの付加システム及びプロトコルです. リモートログイン, リモートコピー, システム間での安全なファイルのコピ ーやその他のリスクの高い仕事がかなり安全に, そしてこれまでより制御 できるようになります. 以下の文章は, FreeBSD用として配布されているKerberosをセットアップ する際のガイドとして読むことができます. しかし, 完全な説明が必要な場合には, マニュアルページを読んだ方がよい でしょう. FreeBSDのKerberosは, オリジナルの4.4BSD-Liteの配布に含まれている ものではなく, FreeBSD 1.1.5.1のときに移植されたeBonesです. これはアメリカ/カナダの外で作成されており, これら以外の国の人々にも 手に入れられるものです. このソフトウェアを合法的な配布物として得るために, アメリカも しくはカナダのサイトから 持ってこないでください. でないと, そのサイトが大変な問題に巻き込まれます. 合法的な配布は, 南アフリカのftp.internat.FreeBSD.orgや, FreeBSD の公式ミラーサイトから入手することができます. 初期データベースの作成 この作業はKerberosサーバだけでおこないます. まず, 古いKerberosの データベースが存在しないことを確認してください. ディレクトリ/etc/kerberosIVに移って, 次のファイルだけが 存在することをチェックします: &prompt.root; cd /etc/kerberosIV &prompt.root; ls README krb.conf krb.realms もし他のファイル (principal.*master_key) が 存在する場合には, kdb_destroyというコマンドで古い Kerberosデータベースを消してください. Kerberosが走っていなければ, 単に余計なファイルを消せばよいです. まず, krb.confkrb.realmsを編集してKerberosの 管理領域 (realm) を定義してください. ここでは管理領域がGRONDAR.ZA で, サーバ名がgrunt.grondar.zaであるとします. krb.conf というファイルを次のように編集してください: &prompt.root; cat krb.conf GRONDAR.ZA GRONDAR.ZA grunt.grondar.za admin server CS.BERKELEY.EDU okeeffe.berkeley.edu ATHENA.MIT.EDU kerberos.mit.edu ATHENA.MIT.EDU kerberos-1.mit.edu ATHENA.MIT.EDU kerberos-2.mit.edu ATHENA.MIT.EDU kerberos-3.mit.edu LCS.MIT.EDU kerberos.lcs.mit.edu TELECOM.MIT.EDU bitsy.mit.edu ARC.NASA.GOV trident.arc.nasa.gov この例にあるような他の管理領域は, 実際には必要ありません. この例は複数の管理領域を認識する方法を示したものですので, これらの行は含めなくても結構です. 1行目はこのシステムが動いている管理領域の名前です. 他の行は管理領域とホスト名のエントリです. 行の1つめの単語が管理領域で, 2つめがその管理領域の中で “鍵配布センター”(Key Distribution Center) として働くホスト名です. ホスト名の次に admin server と書いてある場合には, そのホストが ``管理データベースサーバ''(Administrative Database Server) も提供 することを意味します. これらの単語について詳しく知りたい場合にはKerberosのマニュアル ページをご覧ください. ここで, GRONDAR.ZAという管理領域にgrunt.grondar.za およびその他の.grondar.za ドメインのすべてのホストを追加し なければなりません. krb.realmsは次のようになります: &prompt.root; cat krb.realms grunt.grondar.za GRONDAR.ZA .grondar.za GRONDAR.ZA .berkeley.edu CS.BERKELEY.EDU .MIT.EDU ATHENA.MIT.EDU .mit.edu ATHENA.MIT.EDU もう一度注意しますが, 他の管理領域を書く必要はありません. これらは複数の管理領域を認識できるようにマシンを設定する方法を 示した例ですので, これらの行は消して構いません. 1行目は名前をつけた管理領域に 特定の システムを含めるための ものです. 残りの行は名前をつけた管理領域にサブドメインのデフォルトの システムを含めるためのものです. これでデータベースを作成する準備ができました. この操作はKerberos サーバ (鍵配布センター) を起動するだけです. kdb_initコ マンドを次のように実行してください: &prompt.root; kdb_init Realm name [default ATHENA.MIT.EDU ]: GRONDAR.ZA You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter Kerberos master key: ここで鍵を保存して, ローカルのマシンにあるサーバが取り出せるように します. それにはkstashコマンドを使用します. &prompt.root; kstash Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! これで暗号化されたマスタパスワードが /etc/kerberosIV/master_key に保存されました. すべてが動くようにするための設定 Kerberosを導入する それぞれの システムのデータベースに, 2つ のprincipal (主体名) を追加する必要があります. その名前は kpasswdrcmdです. これら2つのprincipalは, 個々 のシステムにおいて, システム名と同じ名前のインスタンスと組にして作成 されます. これらの kpasswdrcmd というデーモンによって, 他の システムからKerberosのパスワードを変更したり, rcprlogin, rshといったコマンドを実行したりできるよ うになります. それでは実際にこれらのエントリを追加しましょう: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: passwd Instance: grunt <Not found>, Create [y] ? y Principal: passwd, Instance: grunt, kdc_key_ver: 1 New Password: <---- ここは「RANDOM」と入力してください Verifying password New Password: <---- ここは「RANDOM」と入力してください Random password [y] ? y Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: rcmd Instance: grunt <Not found>, Create [y] ? Principal: rcmd, Instance: grunt, kdc_key_ver: 1 New Password: <---- ここは「RANDOM」と入力してください Verifying password New Password: <---- ここは「RANDOM」と入力してください Random password [y] ? Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- 何も入力しないと終了します サーバファイルの作成 次に, 各マシンにおけるサービスを定義している, すべてのインスタンス を展開します. これにはext_srvtabというコマンドを使用しま す. このコマンドで作成されるファイルは, Kerberosの各クライアン トの/etc/kerberosIVディレクトリに 安全な方法でコピーまたは 移動する必要があります. このファイルはそれぞれのサーバとクラ イアントに存在しなければならず, またKerberosの運用において重要なも のです. &prompt.root; ext_srvtab grunt Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Generating 'grunt-new-srvtab'.... このコマンドは一時的なファイルを作成するだけです. ファイル名をすべ てのサーバが読めるような srvtab という名前に変更しな ければなりません. mvコマンドを用いてシステムの場所に移動 してください. &prompt.root; mv grunt-new-srvtab srvtab そのファイルがクライアントに配るためのもので, ネットワークが安全で はないと思われる場合には, client-new-srvtab を移動 可能なメディアにコピーして物理的に安全な方法で運んでください. クラ イアントの/etc/kerberosIVディレクトリで, 名前を srvtabに変更し, modeを600にするのを忘れないでください: &prompt.root; mv grumble-new-srvtab srvtab &prompt.root; chmod 600 srvtab データベースへのユーザの追加 ここで, ユーザのエントリをデータベースに追加する必要があります. 始めに, ユーザjaneのエントリを作成してみましょう. kdb_edit を用いて次のように作成してください: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jane Instance: <Not found>, Create [y] ? y Principal: jane, Instance: , kdc_key_ver: 1 New Password: <---- 安全なパスワードを入れてください Verifying password New Password: <---- もう一度パスワードを入れてください Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- 何も入力しないと終了します すべてのテスト まず始めにKerberosデーモンを起動する必要があります. /etc/rc.conf ファイルを正しく編集してあれば, マシンを再 起動することでに自動的にデーモンが起動します. これはKerberosサー バでのみ必要です. Kerberosクライアントは/etc/kerberosIVか ら必要なものを自動的に入手します. &prompt.root; kerberos & Kerberos server starting Sleep forever on error Log file is /var/log/kerberos.log Current Kerberos master key version is 1. Master key entered. BEWARE! Current Kerberos master key version is 1 Local realm: GRONDAR.ZA &prompt.root; kadmind -n & KADM Server KADM0.0A initializing Please do not use 'kill -9' to kill this job, use a regular kill instead Current Kerberos master key version is 1. Master key entered. BEWARE! さあ, これで上で作成した jane というIDのチケットを kinitコマンドで得ることができます: &prompt.user; kinit jane MIT Project Athena (grunt.grondar.za) Kerberos Initialization for "jane" Password: klist コマンドを用いてトークンを見て, きちんとチケットを持って いるかどうか確認してください: &prompt.user; klist Ticket file: /tmp/tkt245 Principal: jane@GRONDAR.ZA Issued Expires Principal Apr 30 11:23:22 Apr 30 19:23:22 krbtgt.GRONDAR.ZA@GRONDAR.ZA passwd コマンドを用いてパスワードを変更して, kpasswdデーモ ンがKerberos データベースに対して認証されるかどうかチェックして ください: &prompt.user; passwd realm GRONDAR.ZA Old password for jane: New Password for jane: Verifying password New Password for jane: Password changed. <command>su</command>特権の追加 root権限が必要なユーザは誰でも, suコマンドのパス ワードをユーザ毎に別のもの として持つことができます. rootsu できる権利を与えられたidを追加します. これは, principalに付いているroot というインスタンスに よって制御されています. kdb_editを用いて jane.rootというエントリを Kerberosデータベースに作成します: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jane Instance: root <Not found>, Create [y] ? y Principal: jane, Instance: root, kdc_key_ver: 1 New Password: <---- 安全なパスワードを入れます Verifying password New Password: <---- もう一回パスワードを入れます Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? 12 <--- ここは短くしてください Attributes [ 0 ] ? Edit O.K. Principal name: <---- 何も入力しないと終了します 実際にトークンをもらって, ちゃんと働いているかどうか確認しましょう: &prompt.root; kinit jane.root MIT Project Athena (grunt.grondar.za) Kerberos Initialization for "jane.root" Password: ここでrootユーザの .klogin ファイルにユーザを追加する必要が あります. &prompt.root; cat /root/.klogin jane.root@GRONDAR.ZA suしてみましょう: &prompt.user; su Password: どのトークンを持っているか見てみましょう: &prompt.root; klist Ticket file: /tmp/tkt_root_245 Principal: jane.root@GRONDAR.ZA Issued Expires Principal May 2 20:43:12 May 3 04:43:12 krbtgt.GRONDAR.ZA@GRONDAR.ZA 他のコマンドの使用 ここまでの例では, jane という principal を root とい うインスタンス付きで作成しました. これはユーザと同じ名前をprincipalと しており, Kerberosのデフォルトの値です; <username>.root という形式の <principal>.<instance>で, 必要なエント リがrootのホームディレクトリの .kloginファイルに あれば, <username>がrootに suすることができま す. &prompt.root; cat /root/.klogin jane.root@GRONDAR.ZA 同様に, ユーザのホームディレクトリの .kloginファイルに次の ような行がある場合には: &prompt.user; cat ~/.klogin jane@GRONDAR.ZA jack@GRONDAR.ZA jane または jack という名前で (前述のkinit によって) 認証されている GRONDAR.ZA という管理領域のユーザ なら誰でもrloginrsh, rcp等によってこ のシステム (grunt) のjaneのアカウントまたはファ イルにアクセスできます. 例えば, Janeが他のシステムにKerberos を用いてloginします: &prompt.user; kinit MIT Project Athena (grunt.grondar.za) Password: &prompt.user; rlogin grunt Last login: Mon May 1 21:14:47 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995 次の例では, Jackが同じマシンの Jane のアカウントにloginします. Janeは .klogin ファイルを前述のように設定しており, Kerberosではjackというprincipal をインスタンスなしで設定してあ ります. &prompt.user; kinit &prompt.user; rlogin grunt -l jane MIT Project Athena (grunt.grondar.za) Password: Last login: Mon May 1 21:16:55 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995 ファイアウォール 原作: &a.gpalmer;, &a.alex;. 訳: &a.jp.saeki;. 11 November 1996. ファイアウォールは, インターネットに参加している人はもちろんのこと, プライベートネットワークのセキュリティ向上のための アプリケーションを 探している人にとっても, ますます興味深くなりつつある分野です. このセクションではファイアウォールとは何か, ファイアウォールの使用法, そしてファイアウォールを構築するために FreeBSD のカーネルで 提供されているファシリティ (機能) の使用法について説明したいと思います. 社内のネットワークと “巨大かつ信頼のおけない インターネット” との間にファイアウォールを構築することで セキュリティ上のすべての問題が解決できると考える人がいます. ファイアウォールはセキュリティ上の問題を 解決する助けになる場合もありますが, 充分な設定がなされていないファイアウォールは, まったくファイアウォールを 持たない場合よりもセキュリティ上の危険を増大させてしまいます. ファイアウォールにできることは, あなたのシステムにもう一つのセキュリティ層を 追加することだけで, 本気でアタックをしかけてくるクラッカーが内部ネットワークに 侵入するのを妨げることはできません. ファイアウォールを侵入不可能と過信して 内部のセキュリティをおろそかにすることは, 単にクラッカーの仕事を少し簡単にするだけでしか ありません. ファイアウォールとは何か ? 現在インターネットで普通に使用されている ファイアウォールには 二つの異なるタイプがあります. 一つは, 厳密には パケットフィルタリングルータ と 呼ばれるタイプのものです. これはマルチホームのホストマシン (複数の ネットワークに接続されているマシン) のカーネルが, ある規則にしたがって パケットを転送したりブロックしたりするものです. もう一つは, proxy (代理) サーバ として知られているタイプのものです. これは, おそらくはマルチホームのホストマシン上で, カーネルによるパケット転送を 禁止して, デーモンにより認証の提供とパケットの転送とを おこなうものです. 二つのタイプのファイアウォールを組み合わせて使用して, 特定のマシン ( 要塞ホスト と呼ばれる) だけが パケットフィルタリングルータを通して内部ネットワークへ パケットを送ることができるよう設定している サイトがしばしば存在します. proxy (代理) サービスは通常の認証メカニズムよりもセキュリティを 強化してある 要塞ホストで動作させます. FreeBSD は (IPFW として知られる) カーネルパケットフィルタ込みで 提供されています. このセクションの後の方では, このフィルタについての 説明を集中しておこないます. サードパーティから提供されるソフトウェアを使用することにより, Proxy サーバを FreeBSD 上に構築することができます. しかし, 現在入手可能な proxy サーバは たいへんバラエティに富んでいるので, このドキュメントでそれらすべてを カバーすることは不可能です. パケットフィルタリングルータ ルータとは, 二つまたはそれ以上のネットワークの間で パケットの転送をおこなう マシンのことです. パケットフィルタリングルータは, そのカーネルの内部に, 一つ一つのパケットをルールリストと比較して 転送するかしないかを決める 特別なコードを持っています. 最近の IP ルーティングソフトウェアのほとんどは, 内部に パケットのフィルタリングをおこなうためのコードを持っていて, デフォルトでは すべてのパケットを転送するようになっています. このフィルタを有効にするためには, パケットの通過を許すべきかどうかを決める ルールを自分で定義する必要があります. パケットを通すべきか通すべきでないかを決めるために, パケットヘッダの内容にマッチするものが ルールリストから探されます. マッチするルールが見つかると, ルールアクションが実行されます. ルールアクションには, パケットを捨てる, パケットを転送する, またはパケットの発信元に ICMP メッセージを送り返すというものがあります. ルールの検索は先頭から順番におこなわれ, 通常は最初にマッチしたものだけが 適用されます. そのため, このルールリストは “ルールチェーン” と呼ばれることもあります. パケットマッチングの基準は使用するソフトウェアに よって異なりますが, 通常はパケットの発信元 IP アドレス, 宛先 IP アドレス, 発信元ポート番号, 宛先ポート番号 (ポート番号はポートをサポートするプロトコルの場合のみ), パケットタイプ (UDP, TCP, ICMP など) に基づくルールを指定することができます. Proxy サーバ Proxy サーバとは通常のシステムデーモン (telnetd, ftpd など) を 特別なサーバで置き換えたマシンのことです. これらのサーバは, 通常は中継をおこなって特定方向への接続だけを許すため, proxy サーバ と呼ばれます. (例えば) proxy telnet サーバをファイアウォールホストで走らせておきます. 外部からユーザがファイアウォールに対して telnet を実行すると, proxy telnet サーバが応答して, 何らかの認証メカニズムを実行します. これを通過した後で, 内部ネットワークへのアクセスがおこなえるように なるのです. (内部ネットワークからの信号は proxy サーバがかわりに受け取り, 外へ向けて送り出します.) Proxy サーバは通常, 普通のサーバより堅固に構築されていて, しばしば “使い捨て” パスワードシステムなどを含む, 多様な認証メカニズムを持っています. “使い捨て”パスワードシステムとは, どういうものなのでしょうか. 仮に誰かが何らかの方法で, あなたが使用したパスワードを手に入れたとします. しかし, 一度使用したことで, そのパスワードは既に無効になっているのです. ですから, そのパスワードをもう一度使用したとしても, あなたのシステムへ アクセスすることはできないというわけです. これらのサーバは中継をおこなうだけで, 実際のところサーバホスト自身への アクセスをユーザに許してはいません. そのため, 何者かがセキュリティシステムに 侵入用の裏口を取り付けることは, より困難になっています. proxy サーバはアクセス制限の方法をいくつも持っていて, 特定のホスト だけがサーバへのアクセス権を得ることができるように なっていることがあり ます. そして目的のマシンと通信できるユーザを制限するように 設定することもできます. もう一度言いますが, どんなファシリティ (機能) が使えるかは, どんな proxy サービスをおこなうソフトウェアを選ぶかに大きく 依存します. IPFW で何ができるか FreeBSD とともに配布されている IPFW は, カーネル内部にあって パケットのフィルタリングとアカウンティングを おこなうシステムであり, ユーザ側のコントロールユーティリティである &man.ipfw.8; を 含んでいます. ルーティングの決定をおこなう際に, これらは互いに協力して, カーネルで使用されるルールを定義したり, 現在使用されているルールを 問い合わせたりすることができます. IPFW は互いに関連する二つの部分からなっています. ファイアウォールセクションは パケットフィルタリングをおこないます. また, IP アカウンティングセクションはファイアウォールセクションのものと 似たルールに基づいてルータの使用を追跡します. これにより, (例えば) 特定のマシンからルータへのトラフィックがどのくらい 発生しているか調べたり, どれだけの WWW (World Wide Web) トラフィックが フォワードされているかを知ることができます. IPFW は, ルータではないマシンにおいても入出力コネクションの パケットフィルタリングのために 使用することができるように設計されています. これは一般的な IPFW の使用法とは異なる特別な使い方ですが, こういった状況でも同じコマンドと テクニックが使用されます. FreeBSD で IPFW を有効にする IPFW システムの中心となる部分はカーネル内部にあります. そのため, どのファシリティ (機能) を必要とするかによって, 一つまたは それ以上のオプションをカーネルコンフィグレーション ファイルに追加し, カーネルを再コンパイルする必要があるでしょう. カーネルの再コンパイル方法の詳細については, カーネルコンフィグレーション を参照してください. 現在, IPFW に関係するカーネルコンフィグレーションオプションは 三つあります: options IPFIREWALL パケットフィルタリングのためのコードを カーネルに組み込みます. options IPFIREWALL_VERBOSE &man.syslogd.8; を通じて パケットのログを取るためのコードを有効にします. フィルタルールでパケットのログを取るように指定しても, このオプションが指定されていなければ, ログを取ることはできません. options IPFIREWALL_VERBOSE_LIMIT=10 &man.syslogd.8; を通じて ログを取るパケットの数をエントリ毎に制限します. 敵対的な環境においてファイアウォールの 動作のログを取りたいけれど, syslog の洪水によるサービス拒絶攻撃に対し 無防備でありたくないという場合に, このオプションを使用したいと思うことが あるかもしれません. チェーンエントリのログが指定された制限数に達すると, そのエントリに関するログ取りは停止されます. ログ取りを再開するには, &man.ipfw.8; ユーティリティを使用して 関連するカウンタをリセットする必要があります: &prompt.root; ipfw zero 4500 4500 とは, ログ取りを続行したいチェーンエントリの番号です. 以前のバージョンの FreeBSD は IPFIREWALL_ACCT というオプションを 持っていました. しかし, ファイアウォールコードがアカウンティングファシリティ (機能) を 自動的に含むようになったため, 現在では使用されることはなくなっています. IPFW の設定 IPFW ソフトウェアの設定は &man.ipfw.8; ユーティリティを 通じておこないます. このコマンドの構文は非常に 複雑に見えますが, 一旦その構造を理解すれば比較的単純です. このユーティリティでは今のところ四つの異なる コマンドカテゴリが 使用されています: それは追加 / 削除, 表示, フラッシュ, およびクリアです. 追加 / 削除はパケットの受け入れ, 拒絶, ログ取りをどのようにおこなうか というルールを構築するのに使用します. 表示はルールリスト (またはチェーン) と (アカウンティング用) パケットカウンタの 内容を調べるのに使用します. フラッシュはチェーンからすべてのエントリを 取り除くのに使用します. クリアは一つまたはそれ以上のアカウンティングエントリを ゼロにするのに 使用します. IPFW ルールの変更 この形式での使用法は: ipfw -N コマンド index アクション log プロトコル アドレス オプション この形式で使用する際に有効なフラグは一つだけです: -N アドレスやサービス名を 文字列に変換して表示します. コマンド は一意である限り短縮可能です. 有効な コマンド は: add ファイアウォール / アカウンティングルールリストに エントリを追加します. delete ファイアウォール / アカウンティングルールリストから エントリを削除します. 以前のバージョンの IPFW では, ファイアウォールエントリと パケットアカウンティングエントリが別々に利用されていました. 現在のバージョンでは, それぞれのファイアウォールエントリ毎に パケットアカウンティングエントリが備えられています. index が指定されていると, エントリはチェーン中の index で示される位置に置かれます. index が指定されて いなければ, エントリは (65535 番のデフォルトルールである パケット拒絶を別にして) 最後のチェーンエントリの index に 100 を足した 位置 (チェーンの最後) に置かれます. カーネルが IPFIREWALL_VERBOSE つきでコンパイルされている場合, log オプションはマッチしたルールを システムコンソールに出力させます. 有効な アクション は: reject パケットを捨てます, ICMP ホスト / ポート到達不能パケットを (適切な方を) 発信元へ送ります. allow 通常通りパケットを通過させます. (別名: pass および accept) deny パケットを捨てます. 発信元は ICMP メッセージによる 通知を受けません (そのためパケットが 宛先に到達しなかったように見えます). count このルールはパケットカウンタを更新するだけで, パケットを 通過させたり拒絶したりしません. 検索は次のチェーンエントリから続けられます. それぞれの アクション は一意な先頭部分だけでも認識されます. 指定可能な プロトコル は以下の通り: all 任意の IP パケットにマッチします. icmp ICMP パケットにマッチします. tcp TCP パケットにマッチします. udp UDP パケットにマッチします. アドレス の指定は: from address/mask port to address/mask port via interface port はポートをサポートする プロトコル (UDP と TCP) の 場合にだけ指定可能です. は必須ではなく, 特定のインターフェースを通ってきたパケット だけにマッチするように, IP アドレスまたはローカル IP インターフェースの ドメイン名, またはインターフェース名 (例えば ed0) を 指定することができます. インターフェースユニット番号はオプションで, ワイルドカードで指定することが できます. 例えば, ppp* はすべてのカーネル PPP インターフェースに マッチします. address/mask の指定は: address または address/mask-bits または address:mask-pattern IP アドレスのかわりに有効なホスト名を指定することも可能です. はアドレスマスクで上位何ビットを1にするべきかを 示す十進数値です. 例えば次の指定, 192.216.222.1/24 はクラス C のサブネット (この場合 192.216.222) の任意のアドレスにマッチする マスクを作成します. は与えられたアドレスと 論理 AND される IP アドレスです. キーワード any は“任意の IP アドレス”を指定するために 使用することができます. ブロックするポート番号は以下のように指定します: port, port, port のように単独のポートまたはポートのリストを指定します. または port- port のようにポートの範囲を指定します. 単独のポートとポートのリストを 組み合わせて指定することも可能ですが, その場合は常に範囲の方を 最初に指定しなければなりません. 使用可能な オプション は: frag データグラムの最初の フラグメントでなければマッチします. in 入力途中のパケットであればマッチします. out 出力途中のパケットであればマッチします. ipoptions spec IP ヘッダが spec に指定された カンマで区切られた オプションのリストを含んでいればマッチします. サポートされている IP オプションのリストは: ssrr (ストリクトソースルート), lsrr (ルーズソースルート), rr (レコードパケットルート), そして ts (タイムスタンプ) です. 特定のオプションを含まないことを指定するには ! を先頭につけます. established パケットが既に確立されている TCP コネクションの一部であれば (つまり RST または ACK ビットがセットされていれば) マッチします. established ルールをチェーンの最初の方に置くことで, ファイアウォールのパフォーマンスを向上させることが できます. setup パケットが TCP コネクションを確立しようとするものであれば (SYN ビットがセットされ ACK ビットはセットされていなければ) マッチします. tcpflags flags TCP ヘッダが flags に指定された カンマで区切られたフラグの リストを含んでいればマッチします. サポートされているフラグは, fin, syn, rst, psh, ackurg です. 特定のフラグを含まないことを指定するには ! を先頭につけます. icmptypes types ICMP タイプが types リストに 存在していればマッチします. リストはタイプの範囲または個々のタイプを カンマで区切った任意の組合せで指定できます. 一般的に使用されている ICMP タイプは: 0 エコーリプライ (ping リプライ), 3 相手先到達不可能, 5 リダイレクト, 8 エコーリクエスト (ping リクエスト), そして 11 時間超過 (&man.traceroute.8; で使用されているように, TTL 満了を示すのに使用されます) です. IPFW ルールリストの表示 この形式での使用法は: ipfw -a -t -N l この形式で使用する際に有効なフラグは三つあります: -a リスト表示の際にカウンタの値も表示します. このオプションは アカウンティングカウンタの 内容を見る唯一の手段です. -t 各チェーンエントリが最後に マッチした時刻を表示します. この時刻表示は &man.ipfw.8; ユーティリティで使用される入力形式と 互換性がありません. -N (可能であれば) アドレスやサービス名を文字列に変換して表示します. IPFW ルールのフラッシュ チェーンをフラッシュするには: ipfw flush カーネルに固定されているデフォルトルール (インデックス 65535 番) 以外の, ファイアウォールチェーンの中のすべてのエントリを削除します. デフォルトではすべてのパケットが拒絶されるので, 一旦これを実行すると, パケットを許可するエントリがチェーンに追加されるまで, あなたのシステムがネットワークから切り放されてしまいます. そのため, ルールのフラッシュをおこなうときは注意が必要です. IPFW パケットカウンタのクリア 一つまたはそれ以上のパケットカウンタをクリアするためには: ipfw zero index index が指定されていなければ, すべてのパケットカウンタが クリアされます. index が指定されていれば, 特定のチェーンエントリだけが クリアされます. ipfw に対するコマンドの例 このコマンドはルータを介して転送される, ホスト evil.crackers.org から ホスト nice.people.org の telnet ポートへの すべてのパケットを拒絶します: &prompt.root; ipfw add deny tcp from evil.crackers.org to nice.people.org 23 次の例は, ネットワーク crackers.org (クラス C) 全体から マシン nice.people.org (の任意のポート) への 任意の TCP トラフィックを拒絶し, ログを取ります. &prompt.root; ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org あなたの内部ネットワーク (クラス C のサブネット) に対する X セッションを 張れないようにする場合, 以下のコマンドで必要なフィルタリングがおこなえます: &prompt.root; ipfw add deny tcp from any to my.org/28 6000 setup アカウンティングレコードを見るには: &prompt.root; ipfw -a list または短縮形式で &prompt.root; ipfw -a l 最後にチェーンエントリがマッチした 時刻を見ることもできます. &prompt.root; ipfw -at l パケットフィルタリングファイアウォールの構築 以下の提案は, ただの提案にすぎません: 必要な処理はそれぞれのファイアウォールで異なるため, あなた独自の要求にあったファイアウォールを構築する方法を ここで述べることはできないのです. 最初にファイアウォールをセットアップするとき, コントロールされた環境でファイアウォールホストの 設定がおこなえるような テストベンチセットアップが用意できない場合には, カーネルのログ取りを 有効にしてログ取り版のコマンドを使用することを 強くおすすめします. そうすることで, 大した混乱や中断なしに問題となる範囲の特定と処置を 素早くおこなうことができます. 初期セットアップフェーズが完了してからであっても, アタックの可能性のあるアクセスをトレースしたり, 要求の変化に応じてファイアウォールルールを 変更したりできるので, `deny' に対するログ取りをおこなうことをおすすめします. accept コマンドのログ取りをおこなっていると, ファイアウォールをパケットが一つ通過する毎に 1 行のログが生成されるため 大量の ログデータが発生します. そのため, 大規模な ftp/http 転送などをおこなうと, システムが非常に 遅くなってしまいます. また, パケットが通過するまでにカーネルにより 多くの仕事を要求するため, パケットのレイテンシ (latency) を増加させてしまいます. syslogd もログをディスクに記録するなど, より多くの CPU タイムを 使用し始め, 実に容易に /var/log が置かれているパーティションを パンクさせてしまう可能性があります. ファイアウォールは, /etc/rc.conf.local か, もしくは /etc/rc.conf によって有効化されるべきです. 関連マニュアルページには, どのドアノブ(訳注: ポートや IP アドレスなど, ネットワークからの入口を示すもののこと)に手をつければ良いのかに ついての説明と, ファイアウォール設定の既定値のリストがあります. もし, 設定の既定値を使わない場合には, ipfw list とすることで, 現在のルールセットを rc.conf から読み込める形で ファイルに出力することができます. また, /etc/rc.conf.local/etc/rc.conf によってファイアウォールを 有効化しない場合には, ファイアウォールの有効化が全ての IP インターフェイス設定より先に行なわれるように確認することが重要です. 次の問題は, ファイアウォールが実際には何を する べきかです ! これは外部からそのネットワークへのどんなアクセスを許したいか, また内部から外界へのアクセスを どのくらい許したいかに大きく依存します. いくつか一般的なルールを挙げると: 1024 番以下のポートへのすべての TCP 入力アクセスをブロックします. ここは finger, SMTP (mail) そして telnet など, 最もセキュリティに敏感な サービスが存在する場所だからです. すべての 入力 UDP トラフィックをブロックします. これは UDP を使用しているサービスで有用なものは極めて少ないうえ, 有用なトラフィック (例えば Sun の RPC と NFS プロトコル) は, 通常セキュリティに対する脅威となるためです. UDP はコネクションレスプロトコルであるため, 入力 UDP トラフィックを拒絶することは すなわち出力 UDP トラフィックに対する返答をも ブロックすることになるので, このことはそれなりの不利益をもたらします. たとえば外部の archie (prospero) サーバを使用している (内部の) ユーザに とって問題となる可能性があります. もし archie へのアクセスを許したければ, 191 番と 1525 番のポートから 任意の UDP ポートへ来るパケットがファイアウォールを通過することを 許可しなければなりません. 123 番のポートから来るパケットは ntp パケットで, これも通過の許可を考慮する必要がある もう一つのサービスです. 外部から 6000 番のポートへのトラフィックをブロックします. 6000 番のポートは X11 サーバへのアクセスに使用されるポートで, セキュリティに対する脅威となりえます. (特に自分のワークステーションで xhost + をおこなう癖を持っている人がいればなおさらです). X11 は実際に 6000 番以降のポートを使用する可能性があるため, 通過許可に 上限を定めると, そのマシンで走らせることのできる X ディスプレイの 個数が制限されます. RFC 1700 (Assigned Numbers) で定義されているように, 上限は 6063 です. 内部のサーバ (例えば SQL サーバなど) がどのポートを使用するかを チェックします. それらのポートは通常, 上で指定した 1-1024 番の範囲から外れていますので, これらも同様にブロックしておくことは おそらく良い考えです. これとは別のファイアウォール設定に 関するチェックリストが CERT から 入手可能です. ftp://ftp.cert.org/pub/tech_tips/packet_filtering 前にも述べたように, これはただの ガイドライン にすぎません. ファイアウォールでどのようなフィルタルールを使用するかは, あなた自身が 決めなければなりません. これまでのアドバイスにしたがったにも関わらず, 誰かがあなたのネットワークに 侵入してきたとしても, 私は「いかなる」責任もとることはできません. OpenSSL FreeBSD 4.0 では, OpenSSL ツールキットが基本構成の一部に 含まれています. OpenSSL は, Secure Sockets Layer v2/v3 (SSLv2/SSLv3) や Transport Layer Security v1 (TLSv1) ネットワークセキュリティプロトコルと同様の 多目的な暗号化ライブラリを提供します. しかしながら, OpenSSL に含まれるアルゴリズムのいくつか (特に RSA や IDEA) は, 合衆国内, その他の地域において, 特許により保護されています. そのため, 無制約な利用は許されません(特に IDEA は FreeBSD の OpenSSL 配布すべてにおいて利用不可能です). このような理由から FreeBSD では利用される地域(合衆国/非合衆国)に対応した異なる 2 種類のバージョンの OpenSSL RSA ライブラリが利用できるようになっています. ソースコードのインストール OpenSSL は src-cryptosrc-secure cvsup コレクションの一部です. FreeBSD のソースコードの取得と更新の詳細は, FreeBSD の入手の項を参照して下さい. 合衆国外に在住のユーザ 合衆国外に住んでいて, 暗号コードを internat.FreeBSD.org (合衆国外向けの国際版 Crypto リポジトリ)か, もしくはそのミラーサイトから取得した場合には, “本来の RSA を含んだ” OpenSSL を構築することになります. これは, IDEA の利用が一部地域を除き, 世界中で制限されているためです. よりフレキシブルな地域識別システムを利用することにより, 将来的には利用の制限を受けない国での IDEA の構築が 可能になるかも知れません. あなたの国にあると思われる, 暗号の輸入, 使用, 再配布を制限する国内法に注意して下さい. 合衆国内に在住のユーザ 今までに述べられたように, 合衆国内では RSA が特許登録されているため, その使用許諾ライセンスがない限り, 一般的な利用は制限されています. したがって標準的な OpenSSL の RSA コードの合衆国内における使用は許されておらず, RSA コードを含む OpenSSL は, 合衆国内のミラーサイトに移されている OpenSSL から除かれています. RSA の特許は 2000 年 9 月 20 日に期限切れとなりますので, そのとき, 合衆国内向け OpenSSL に “完全な” RSA のコードを戻すことが予定されています. しかしながら(幸運にも), RSA の特許所持者(RSA Security)は, - “RSA リファレンス実装”ツールキット(RASREF) + “RSA リファレンス実装”ツールキット(RSAREF) を提供しています. これは非商用利用を含むいくつかの形態での - 利用が可能となっています(非商用利用の定義については RASREF の + 利用が可能となっています(非商用利用の定義については RSAREF の ライセンスを参照して下さい). - もしあなたが RASREF ライセンスの条件に合意し, + もしあなたが RSAREF ライセンスの条件に合意し, OpenSSL に RSA をサポートを追加するためにそれを利用したいと考えるなら, - /usr/ports/security/rsaref にある rasref の port か, + /usr/ports/security/rsaref にある rsaref の port か, rsaref-2.0 という package をインストールすることができます. もし, あなたがライセンス条件の承諾について確信が持てないなら, 専門家から法的な助言を得てください. RSAREF 実装は, OpenSSL にある“本来の&rdquo実装よりもの低機能(速度が遅く, 1024-bit を超える暗号鍵を扱うことができない)です. 合衆国に在住していないなら, RSAREF は利用しない方が良いでしょう. RSA security から RSA のソースコードの適正なライセンスを購入しているユーザは, RSA のネイティブサポートを得るために 先に述べた合衆国外向けの国際版 OpenSSL を使用できます. また, IDEA のコードも特許による制限のため, 合衆国内向けの OpenSSL には含まれていません. バイナリインストール FreeBSD を(Walnut Creek CDROM 社から購入した CD-ROM や, それでインストールされたマシンからのコピー, あるいは ftp.FreeBSD.org から ダウンロードしたスナップショットなどから)バイナリインストールで インストールしていたとすると, crypto(暗号) コレクションのインストールを選択したとき, sysinstall ユーティリティは自動的に適切なバージョンのインストールを行ないます. 国際版が選択されていたにも関わらず, インストールがきちんと完了できない(たとえばネットワークの設定をしていなかったり, FTP サイトからファイルを持ってこなければならなかった)場合には, インストールの後に package の形で国際版 RSA ライブラリを追加することができます. librsaintl という package には, 国際版(合衆国外向け)の RSA コードが含まれています. 合衆国内でこれを利用することは違法ですが, この RSA 実装は高速で柔軟性のありますので, 合衆国外のユーザはこのバージョンを使うべきです. この package は ftp.internat.FreeBSD.org から入手可能です. 利用の際に RSAREF は必要ありません.