sysctl
変数によるネットワークセキュリティの改善 #Edit sourcesysctl (system control; システム制御) 変数はカーネルのパラメータを制御するための変数で、オペレーティングシステム内の様々な箇所の動作に影響する変数です。これらのパラメータは、 proc
ファイルシステム内の /proc/sys
経由でアクセスすることができます。多くのカーネルパラメータは、このディレクトリ内の擬似ファイルに直接書き込むことで値を直接変更することができますが、指定した値は保存されませんので、システムを再起動してしまうと元の値に戻ってしまいます。このような構造から、システムの起動時に値を変更するよう、変更点を sysctl の設定ファイルに書き込んでおくことをお勧めします。
本章では、 Linux のセキュリティ機能を改善するのに役立つ様々なネットワーク関連変数を設定しています。ファイアウオールの有効化やその設定内容によっては、ここに書かれている値のいくつかが自動的に設定されている場合があります。現在の値を確認したい場合は、 sysctl
ユーティリティを利用して下記のように入力して実行します:
>
/sbin/sysctl net.ipv4.conf.all.rp_filter
net.ipv4.conf.all.rp_filter = 2
下記の設定を適用したい場合は、 /etc/sysctl.d/
ディレクトリ内に設定ファイルを作成してください。設定ファイルは .conf
という接尾辞で終わっていなければならないことに注意してください (例: /etc/sysctl.d/network.conf
) 。詳しくは man 5 sysctl.d
で表示されるマニュアルページをお読みください。
なお、下記の値は環境に合わせて変更してください。
# これらの値の既定値: 2 (loose mode) net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.rp_filter = 1
上記の設定を適用すると、 IPv4 における逆方向パスフィルタを厳格モードに設定します。これにより、 IP パケットに対する応答を送信する際、必ず受信したインターフェイスから送信するように強制されます。なお、システム側で応答パケットを生成する際、ルーティングテーブルに従って受信パケットとは異なるインターフェイスを選択してしまうと、これらのパケットは廃棄されるようになります。この設定は、 IP スプーフィング攻撃と呼ばれる分散型サービス拒否攻撃 (DDoS) 等を防ぐのに役立ちます。
# これらの値の既定値: 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.conf.all.accept_source_route = 0
上記の設定を適用すると、 IPv4 のヘッダ内に SSR
オプションが設定されているパケットの受信を無効化します。 つまり、 ソースルーティング を使用するパケットが拒否されることになります。これにより IP パケットの転送を防止することができるため、ファイアウオールの配下に存在するホストにパケットが届かないようになります。
# この値の既定値: 1 net.ipv4.tcp_syncookies = 1
IPv4 と IPv6 の 両方 に対して、 TCP SYN Cookie 保護の機能を有効化します。これは TCP プロトコルレベルでの特定のサービス拒否 (Denial Of Service; DoS) 攻撃を防ぐための機能で、少しだけ CPU の負荷が上がるものの、不正攻撃によって発生しうるメモリ浪費を防ぐことができます。この保護機構はフォールバック型のアルゴリズムとして作られていて、通常の TCP 接続を受け付けられないほど負荷が高い場合にのみ動作します。また、この仕組みは TCP プロトコルとの完全な互換性は無いため、相手側の TCP 実装によっては問題が発生する可能性があります。過負荷状態では新しい接続を全く受け付けなくする手法もありますが、この仕組みを利用することで、正当な TCP 接続と TCP によるサービス拒否攻撃を正しく分けて扱うことができるようになります。なお、お使いのシステムで TCP 接続の負荷が高いことが予想される場合、この設定によって逆効果となる場合もあります。
# 既定値: 128 net.ipv4.tcp_max_syn_backlog = 4096
TCP SYN backlog 設定は、処理待ちの SYN パケットの数を設定するためのものです。指定した値よりも多くの SYN パケットが届いた場合、 SYN パケットは廃棄され、新しい TCP 接続はできなくなります (もしくは、 SYN Cookie 保護が動作するようになります) 。この値を増やすことで、 TCP SYN 攻撃に対する保護を強化することができます。
# 既定値: 1 net.ipv4.icmp_echo_ignore_broadcasts = 1
IPv4 ブロードキャストアドレスに対する ICMP エコー要求 (ping) は特定のネットワーク内に存在するホストや IP アドレスを検出するための仕組みですが、ネットワークセグメントに対する過負荷攻撃としても使用することができます。この設定を適用することで、ブロードキャストアドレスに送信される ICMP エコー要求を無視するようになります。
# 既定値: 1 net.ipv4.icmp_ignore_bogus_error_responses = 1
この設定は、ブロードキャストフレームに対する不正な応答によって、不要なエラーメッセージを生成しないようにするためのもので、ログファイルが埋め尽くされることを防ぐ効果があるものです。詳しくは RFC 1122 インターネットホストの要件: 通信レイヤー のセクション 3.2.2 をお読みください。
# 既定値: 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0
ICMP redirect (転送) メッセージの受け付けを無効化します。これらのメッセージはゲートウエイから発信されるもので、宛先のホストに辿り着くためのより適切なルートを指し示すためのものです。転送メッセージを悪用することで、中間者攻撃が成立してしまうことから、無効化しておくべき値となります。
net.ipv4.conf.default.secure_redirects = 0 net.ipv4.conf.all.secure_redirects = 0
ごく稀な用途ですが、 '安全な' ICMP redirect (転送) を受け付けるための設定です。どうしても必要な場合を除いて、無効化しておくべきものです。
net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.all.send_redirects = 0
IPv4 ICMP redirect (転送) 要求を送信しないようにする設定です。ルータとして動作させる場合を除いて、不要であるためです。
# 既定値: 0 net.ipv4.ip_forward = 0 net.ipv6.conf.all.forwarding = 0 net.ipv6.conf.default.forwarding = 0
ルータとして動作させる場合を除いて、 IP 転送機能は無効化しておくべきものです。