ここではセキュリティに関連するカーネル設定オプションの説明と,それらの 動作や使い方に関する説明を行います.
カーネルはコンピュータのネットワークを制御するので,カーネルをこの上な く安全にしておくことと,カーネルそのものが破られないようにすることは重 要です.最近出現したネットワーク攻撃のいくつかを防ぐために,カーネルの バージョンは最新に保つようにすべきです.新しいカーネルは ftp://ftp.kernel.org またはお使いのディストリビューション のベンダから入手できます.
本家の Linux カーネル用に 1 つに統合された暗号化パッチを提供している国 際的なグループもあります.このパッチは,各種暗号サブシステムや輸出制限 のために本家のカーネルに含まれていない機能を提供します.詳しい情報につ いてはグループの 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
このファイルとその大きさ(0 かもしれませんし,そうでないかもしれません
が)は実際のサイズを反映していないことは覚えておいてください.
「SYN 攻撃」はサービス妨害(DoS)攻撃の 1 つであり,マシンのリソースを全て喰 い潰してしまい,リブートするはめに追い込みます.通常はこのオプションを 有効にしない理由は考えられません.2.1 系のカーネルでは,この設定オプショ ンは単に sync cookie を許可するだけで,有効にはしません.これを有効に するには以下のコマンドを実行する必要があります:
root# echo 1 > /proc/sys/net/ipv4/tcp_syncookies <P>
このオプションが必要になるのは,マシンを防火壁として設定する時や,IP マスカレードを行う時に PPP のダイアルアップインタフェース経由で何者か がダイアルアップマシンに入ってくるのを防ぎたい時です.
このオプションを使うと,送信者,受信者,ポート等の防火壁が受け取ったパ ケットに関する情報が記録されます.
このオプションは有効にすべきです.始点で経路設定されたフレーム(source routed frames)は,終点までの全体のパスをパケット内に持っています.つま り,パケットが通るルータはパケットを検査する必要がなく,単に転送すれば よいということです.これは危険であるかもしれないデータをシステムに入れ る可能性を持ちます.
Linux マシンが防火壁として動作している場合,そのローカルネットワークの コンピュータの 1 つが外部に接続しようとすると,Linux マシンはそのホス トの「仮面を被る」ことができます.つまり,Linux マシンはローカルネット ワーク内のマシンが想定している終点アドレスへトラフィックを転送しますが, このトラフィックが防火壁のマシンから来たように見せかけます.詳しい情報 については http://www.indyramp.com/masq をご覧ください.
前のオプションは TCP トラフィックと UDP トラフィックのマスカレーディン グしか行いませんが,このオプションは ICMP のマスカレーディングも行うよ うにします.
このオプションは,Linux マシンの防火壁の透過的リダイレクト機能を有効に します.つまり,ローカルネットワークが始点であり,かつ終点がリモートホ ストであるような任意のネットワークトラフィックがローカルのサーバ(い わゆる「透過的プロキシサーバ」)にリダイレクトされます.これにより,ロー カルのコンピュータにリモート側と通信していると思わせながら,実際にはロー カルのプロキシと接続した状態にします.詳しくは IP-Masquerading HOWTO と http://www.indyramp.com/masq をご覧ください.
普通はこのオプションは無効になっていますが,防火壁や IP マスカレードを 行うホストを構築する場合には,このオプションを有効にしたくなるはずです. あるホストから別のホストまでデータが送られる時,データは必ずしも単独の データパケットだけで送られるわけではなく,複数個のパケットに分割されま す.このやり方の問題点は,ポート番号は最初のパケットにしか格納されてい ないことです.つまり,何者かが入っていないはずの情報をその接続の残りの パケットに入れることが可能なのです. このオプションは,teardrop 攻撃に対するパッチを当てていない内部ホスト に対する teardrop 攻撃も防ぐことができるはずです.
このオプションは 2.1 系列のカーネルで利用可能なオプションで,セキュリ ティを強固にするために 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
これはコンソールに 6 つのランダムな文字を出力します.これはパスワード
生成などによいでしょう.mmencode
は metamail
パッケー
ジに入っています.
アルゴリズムの説明については,
/usr/src/linux/drivers/char/random.c
を参照してください.
これについて筆者(Dave)に教えてくださった,Theodore Y. Ts'o さん, Jon Lewis さん他の Linux-kernel ML の皆さんに感謝します.