次のページ 前のページ 目次へ

6. カーネルのセキュリティ

ここではセキュリティに関連するカーネル設定オプションの説明と, それらの動作や使い方に関する説明を行います.

カーネルはコンピュータのネットワークを制御するので, カーネルをこの上な く安全にしておくことと, カーネルそのものが破られないようにすることは重 要です. 最近出現したネットワーク攻撃のいくつかを防ぐために, カーネルの バージョンは最新に保つようにすべきです. 新しいカーネルは ftp://ftp.kernel.org またはお使いのディストリビューション のベンダから入手できます.

本家の Linux カーネル用にひとつに統合された 暗号化パッチを提供している国際的なグループもあります. このパッチは, 各種暗号サブシステムや輸出制限のために本家のカーネルに 含まれていない機能を提供します. 詳しい情報については グループの WWW ページ http://www.kerneli.org をご覧ください.

6.1 バージョン 2.0 のカーネルのコンパイルオプション

2.0.x カーネルでは以下のオプションが該当します. カーネルを設定する際にこれらのオプションを確認することになるでしょう. ここに挙げたコメントの多くは ./linux/Documentation/Configure.help から取っています. このコメントは, カーネルのコンパイル時にmake config の Help 機能で参照できるドキュメントと同じものです.

  • Network Firewalls (CONFIG_FIREWALL)

    このオプションは Linux マシンでファイアウォールを構築する際や IP マスカレードを行う際に有効にすべきです. 単に普通のクライアントマシンにするつもりならば no と設定するのが安全でしょう.

  • IP: forwarding/gatewaying (CONFIG_IP_FORWARD)

    IP forwarding を有効にすると, Linux マシンは本質的にルータになります. このマシンがネットワークに繋がっていると, あるネットワークから別のネットワークにデータを転送しているかもしれず, これを起さないために設置されている防火壁をたぶん壊しています. 通常のダイアルアップユーザはこれを無効にしたいと思うでしょうし, 他のユーザはこれを行うことのセキュリティ的な意味を良く考えるべきです. 防火壁のマシンはこれを有効にし, 防火壁のソフトウェアと組み合わせて使おうと考えるでしょう.

    IP forwarding は以下のコマンドで動的に有効にすることができます:

            root#  echo 1 > /proc/sys/net/ipv4/ip_forward
    
    また次のコマンドで無効にすることができます:
            root#  echo 0 > /proc/sys/net/ipv4/ip_forward
    
    /proc にあるファイルは「仮想的」なファイルであり, 表示されるファイルの大きさは, そこから出てくるデータの量を反映していないことは覚えておいてください.

  • IP: syn cookies (CONFIG_SYN_COOKIES)

    「SYN 攻撃」はサービス妨害(DoS)攻撃のひとつです. マシンのリソースを全て喰い潰してしまい, リブートするはめに追い込みます. このオプションを有効にしておかない理由は普通は考えられません. 2.2.x 系のカーネルでは, この設定オプションは単に syn cookie を許可するだけで, 有効にはしません. これを有効にするには以下のコマンドを実行する必要があります:

                    root# echo 1 > /proc/sys/net/ipv4/tcp_syncookies <P>
    

  • IP: Firewalling (CONFIG_IP_FIREWALL)

    このオプションが必要になるのは, マシンを防火壁として設定する時や, IP マスカレードを行う時に PPP のダイアルアップインタフェース経由で 何者かがダイアルアップマシンに入ってくるのを防ぎたい時です.

  • IP: firewall packet logging (CONFIG_IP_FIREWALL_VERBOSE)

    このオプションを使うと, 送信者, 受信者, ポート等の防火壁が受け取ったパケットに関する情報が記録されます.

  • IP: Drop source routed frames (CONFIG_IP_NOSR)

    このオプションは有効にすべきです. 始点で経路設定されたフレーム (source routed frames) は, 終点までの全体のパスをパケット内に持っています. つまり, パケットが通るルータはパケットを検査する必要がなく, 単に転送すればよいということです. これは危険であるかもしれないデータをシステムに入れる可能性を持ちます.

  • IP: masquerading (CONFIG_IP_MASQUERADE)

    Linux マシンが防火壁として動作している場合, そのローカルネットワークのコンピュータのひとつが外部に接続しようとすると, Linux マシンはそのホストの「仮面を被る」ことができます. つまり, Linux マシンはローカルネットワーク内のマシンが想定している 終点アドレスへトラフィックを転送しますが, このトラフィックが防火壁のマシンから来たように見せかけます. 詳しい情報については http://www.indyramp.com/masq をご覧ください.

  • IP: ICMP masquerading (CONFIG_IP_MASQUERADE_ICMP)

    前のオプションは TCP トラフィックと UDP トラフィックのマスカレーディングしか行いませんが, このオプションは ICMP のマスカレーディングも行うようにします.

  • IP: transparent proxy support (CONFIG_IP_TRANSPARENT_PROXY)

    このオプションは, Linux マシンの防火壁の透過的リダイレクト機能を有効にします. つまり, ローカルネットワークが始点であり, かつ終点がリモートホストであるような任意のネットワークトラフィックが ローカルのサーバ (いわゆる「透過的プロキシサーバ」) にリダイレクトされます. これにより, ローカルのコンピュータにリモート側と通信していると思わせながら, 実際にはローカルのプロキシと接続した状態にします. 詳しくは IP-Masquerading HOWTO と http://www.indyramp.com/masq をご覧ください.

  • IP: always defragment (CONFIG_IP_ALWAYS_DEFRAG)

    普通はこのオプションは無効になっていますが, 防火壁や IP マスカレードを行うホストを構築する場合には, このオプションを有効にしたくなるはずです. あるホストから別のホストまでデータが送られる時, データは必ずしも単独のデータパケットだけで送られるわけではなく, 複数個のパケットに分割されます. このやり方の問題点は, ポート番号は最初のパケットにしか格納されていないことです. つまり, 何者かが入っていないはずの情報を その接続の残りのパケットに入れることが可能なのです. このオプションは, teardrop 攻撃に対するパッチを当てていない内部ホストに対する teardrop 攻撃も防ぐことができるはずです.

  • Packet Signatures (CONFIG_NCPFS_PACKET_SIGNING)

    このオプションは 2.2.x 系列のカーネルで利用可能なオプションで, セキュリティを強固にするために NCP パケットに署名をするようにします. 通常は無効にしておいて構いませんが, 必要ならばどうぞ.

  • IP: Firewall packet netlink device (CONFIG_IP_FIREWALL_NETLINK)

    これは実に便利なオプションで, ユーザ空間プログラムのパケットの先頭の 128 バイトを解析し, 正当さに基づいてそのパケットを許すか拒否するかを決めるようにできます.

6.2 バージョン 2.2 のカーネルのコンパイルオプション

2.2.x カーネルでも多くのオプションは同じですが, 新しいオプションもいくつか開発されています. ここに挙げたコメントの多くは ./linux/Documentation/Configure.help から取っています. このコメントは, カーネルのコンパイル時に make config の Help 機能で参照できるドキュメントと同じものです. 以下では新しく追加されたオプションだけを示します. 必要な他のオプションについては, 2.0 用の説明を参照してください. 2.2 カーネルにおける最大の変更点は, IP firewalling のコードです. 2.2 カーネルからは, IP firewalling を行うには, ipchains を使うようになりました. 2.0 カーネルで使われていた ipfwadm は使いません.

  • Socket Filtering (CONFIG_FILTER)

    大抵の人にとっては, このオプションに no を設定しておくのが安全です. このオプションを使うと, ユーザ空間のフィルタを任意のソケットに接続して, パケットを受け取るか拒否するかを決めることができます. どうしても必要, かつフィルタのようなプログラムを組めないのなら, このオプションには no を設定すべきです. 本 HOWTO の執筆時点では, TCP を除く全てのプロトコルがサポートされています.

  • Port Forwarding ポート転送 (Port Forwarding) は IP マスカレードへの追加機能であり, 指定されたポートにおける一部のパケットについて, 防火壁の外部から内部への転送を許可します. このオプションが役立つのは, 例えば WWW サーバを防火壁の中や IP マスカレードを行うホストの後ろで実行し, これを外の世界からアクセスできるようにしたい場合です. 外部のクライアントが防火壁の 80 番ポートにリクエストを送ると, 防火壁はこのリクエストを WWW サーバに転送します. WWW サーバはリクエストを処理し, その結果を防火壁経由で元のクライアントに送ります. クライアントにとっては, 防火壁のマシンで WWW サーバが動いているように見えます. この機能は, 防火壁の後ろに全く同じ構成の WWW サーバが複数ある場合に 負荷調整 (load balancing) を行うためにも使えます. この機能に関する情報は http://www.monmouth.demon.co.uk/ipsubs/portforwarding.html にあります (WWW を見るには, インターネットに接続しており, かつ lynx や Netscape のようなプログラムが使えるマシンが必要です). 一般的な情報については ftp://ftp.compsoc.net/users/steve/ipportfw/linux21/ をご覧ください.
  • Socket Filtering (CONFIG_FILTER) このオプションを使うと, ユーザ空間プログラムは任意のソケットにフィルタを付けることができ, 特定の種類のデータをソケット経由で取得する際に許可するか拒否するかを カーネルに指示することができます. Linux のソケットフィルタリングは, 現在 TCP を除く全ての種類のソケットで動作します. 詳しくはテキストファイル ./linux/Documentation/networking/filter.txt をご覧ください. 訳注: カーネルのソースに含まれているテキストファイルのことです.
  • IP: Masquerading カーネル 2.2 の IP マスカレードは改良されています. 特殊なプロトコルのマスカレーディング等のサポートが追加されています. 詳しくは IP Chains HOWTO をご覧ください.

6.3 カーネルデバイス

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 つのランダムな文字を出力します. パスワード生成などによいでしょう. mimeencodemetamail パッケージに入っています.

アルゴリズムの説明については, /usr/src/linux/drivers/char/random.c を参照してください.

これについて筆者(Dave)に教えてくださった, Theodore Y. Ts'o さん, Jon Lewis さん他の Linux-kernel ML の皆さんに感謝します.


次のページ 前のページ 目次へ

[