ここではセキュリティに関連するカーネル設定オプションの説明と, それらの動作や使い方に関する説明を行います.
カーネルはコンピュータのネットワークを制御するので, カーネルをこの上な く安全にしておくことと, カーネルそのものが破られないようにすることは重 要です. 最近出現したネットワーク攻撃のいくつかを防ぐために, カーネルの バージョンは最新に保つようにすべきです. 新しいカーネルは ftp://ftp.kernel.org またはお使いのディストリビューション のベンダから入手できます.
本家の Linux カーネル用にひとつに統合された 暗号化パッチを提供している国際的なグループもあります. このパッチは, 各種暗号サブシステムや輸出制限のために本家のカーネルに 含まれていない機能を提供します. 詳しい情報については グループの WWW ページ http://www.kerneli.org をご覧ください.
2.0.x カーネルでは以下のオプションが該当します.
カーネルを設定する際にこれらのオプションを確認することになるでしょう.
ここに挙げたコメントの多くは
./linux/Documentation/Configure.help
から取っています.
このコメントは, カーネルのコンパイル時にmake config
の
Help 機能で参照できるドキュメントと同じものです.
このオプションは Linux マシンでファイアウォールを構築する際や IP マスカレードを行う際に有効にすべきです. 単に普通のクライアントマシンにするつもりならば no と設定するのが安全でしょう.
IP forwarding を有効にすると, Linux マシンは本質的にルータになります. このマシンがネットワークに繋がっていると, あるネットワークから別のネットワークにデータを転送しているかもしれず, これを起さないために設置されている防火壁をたぶん壊しています. 通常のダイアルアップユーザはこれを無効にしたいと思うでしょうし, 他のユーザはこれを行うことのセキュリティ的な意味を良く考えるべきです. 防火壁のマシンはこれを有効にし, 防火壁のソフトウェアと組み合わせて使おうと考えるでしょう.
IP forwarding は以下のコマンドで動的に有効にすることができます:
root# echo 1 > /proc/sys/net/ipv4/ip_forward
また次のコマンドで無効にすることができます:
root# echo 0 > /proc/sys/net/ipv4/ip_forward
/proc にあるファイルは「仮想的」なファイルであり,
表示されるファイルの大きさは,
そこから出てくるデータの量を反映していないことは覚えておいてください.
「SYN 攻撃」はサービス妨害(DoS)攻撃のひとつです. マシンのリソースを全て喰い潰してしまい, リブートするはめに追い込みます. このオプションを有効にしておかない理由は普通は考えられません. 2.2.x 系のカーネルでは, この設定オプションは単に syn cookie を許可するだけで, 有効にはしません. これを有効にするには以下のコマンドを実行する必要があります:
root# echo 1 > /proc/sys/net/ipv4/tcp_syncookies <P>
このオプションが必要になるのは, マシンを防火壁として設定する時や, IP マスカレードを行う時に PPP のダイアルアップインタフェース経由で 何者かがダイアルアップマシンに入ってくるのを防ぎたい時です.
このオプションを使うと, 送信者, 受信者, ポート等の防火壁が受け取ったパケットに関する情報が記録されます.
このオプションは有効にすべきです. 始点で経路設定されたフレーム (source routed frames) は, 終点までの全体のパスをパケット内に持っています. つまり, パケットが通るルータはパケットを検査する必要がなく, 単に転送すればよいということです. これは危険であるかもしれないデータをシステムに入れる可能性を持ちます.
Linux マシンが防火壁として動作している場合, そのローカルネットワークのコンピュータのひとつが外部に接続しようとすると, Linux マシンはそのホストの「仮面を被る」ことができます. つまり, Linux マシンはローカルネットワーク内のマシンが想定している 終点アドレスへトラフィックを転送しますが, このトラフィックが防火壁のマシンから来たように見せかけます. 詳しい情報については http://www.indyramp.com/masq をご覧ください.
前のオプションは TCP トラフィックと UDP トラフィックのマスカレーディングしか行いませんが, このオプションは ICMP のマスカレーディングも行うようにします.
このオプションは, Linux マシンの防火壁の透過的リダイレクト機能を有効にします. つまり, ローカルネットワークが始点であり, かつ終点がリモートホストであるような任意のネットワークトラフィックが ローカルのサーバ (いわゆる「透過的プロキシサーバ」) にリダイレクトされます. これにより, ローカルのコンピュータにリモート側と通信していると思わせながら, 実際にはローカルのプロキシと接続した状態にします. 詳しくは IP-Masquerading HOWTO と http://www.indyramp.com/masq をご覧ください.
普通はこのオプションは無効になっていますが, 防火壁や IP マスカレードを行うホストを構築する場合には, このオプションを有効にしたくなるはずです. あるホストから別のホストまでデータが送られる時, データは必ずしも単独のデータパケットだけで送られるわけではなく, 複数個のパケットに分割されます. このやり方の問題点は, ポート番号は最初のパケットにしか格納されていないことです. つまり, 何者かが入っていないはずの情報を その接続の残りのパケットに入れることが可能なのです. このオプションは, teardrop 攻撃に対するパッチを当てていない内部ホストに対する teardrop 攻撃も防ぐことができるはずです.
このオプションは 2.2.x 系列のカーネルで利用可能なオプションで, セキュリティを強固にするために NCP パケットに署名をするようにします. 通常は無効にしておいて構いませんが, 必要ならばどうぞ.
これは実に便利なオプションで, ユーザ空間プログラムのパケットの先頭の 128 バイトを解析し, 正当さに基づいてそのパケットを許すか拒否するかを決めるようにできます.
2.2.x カーネルでも多くのオプションは同じですが,
新しいオプションもいくつか開発されています. ここに挙げたコメントの多くは
./linux/Documentation/Configure.help
から取っています.
このコメントは, カーネルのコンパイル時に make config
の
Help 機能で参照できるドキュメントと同じものです.
以下では新しく追加されたオプションだけを示します.
必要な他のオプションについては, 2.0 用の説明を参照してください.
2.2 カーネルにおける最大の変更点は, IP firewalling のコードです.
2.2 カーネルからは, IP firewalling を行うには,
ipchains
を使うようになりました.
2.0 カーネルで使われていた ipfwadm
は使いません.
大抵の人にとっては, このオプションに no を設定しておくのが安全です. このオプションを使うと, ユーザ空間のフィルタを任意のソケットに接続して, パケットを受け取るか拒否するかを決めることができます. どうしても必要, かつフィルタのようなプログラムを組めないのなら, このオプションには no を設定すべきです. 本 HOWTO の執筆時点では, TCP を除く全てのプロトコルがサポートされています.
./linux/Documentation/networking/filter.txt
をご覧ください.
訳注: カーネルのソースに含まれているテキストファイルのことです.
Linux には, セキュリティの向上にも使えるブロックデバイスや キャラクタデバイスがいくつかあります.
/dev/random
と /dev/urandom
という,
いつでもランダムなデータを取り出せる
2 つのデバイスがカーネルに用意されています.
/dev/random
と /dev/urandom
はどちらも安全であり,
PGP の鍵や ssh
のチャレンジ文字列の生成や,
ランダムな数字を必要とする他のアプリケーションで利用できるはずです.
これらを入力として数の初期シーケンスを与えても,
攻撃者が次の数を予測することは不可能なはずです.
これらの入力から得た数字があらゆる意味において言葉通りランダムで
あることを保証するため, 大変な努力が行われてきました.
2 つのデバイスの唯一の違いは,
/dev/random
はランダムなバイト列を全て使う点と,
計算を行うためのユーザの待ち時間がより長い点です.
一部のシステムでは, ユーザが生成したエントロピーが
システムに入るのを待つ長い間, ブロックされてしまうことに注意してください.
したがって, /dev/random
を使う前には気を付ける必要があります.
(これの利用の最良の場面はおそらく,
機密キー入力情報を生成する時で, ユーザに「はい, もう十分です」
と表示するまでキーボードを繰り返し叩いてもらう場合です)
/dev/random
は非常に高品質のエントロピーを持ち, 割り込み間の
時間等の測定値から生成しています. このデバイスは十分なビット数のランダ
ムデータが利用可能になるまでブロックします.
/dev/urandom
も同様ですが, エントロピーの保持量が少なくなると,
現在保持している値の暗号学的に強いハッシュ値を返します.
これは /dev/random
ほど安全ではありませんが, ほとんどの目的に
対してはこれで十分です.
このデバイスは以下のようにして読み出すことができます:
root# head -c 6 /dev/urandom | mmencode
root# head -c 6 /dev/urandom | mimencode
これはコンソールに 8 つのランダムな文字を出力します.
パスワード生成などによいでしょう.
mimeencode
は metamail
パッケージに入っています.
アルゴリズムの説明については,
/usr/src/linux/drivers/char/random.c
を参照してください.
これについて筆者(Dave)に教えてくださった, Theodore Y. Ts'o さん, Jon Lewis さん他の Linux-kernel ML の皆さんに感謝します.