2026年7月18日

2026年7月18日

Linuxカーネルパラメータでセキュリティ強化|sysctlの設定項目と安全な反映手順

Linux のカーネルパラメータは sysctl で確認・変更でき、ネットワークの不正なパケットへの耐性や、カーネル情報の漏えい防止などを強められます。ただし、値によっては Docker やルーターとしての機能が止まったり、再起動するまで元に戻せなかったりするものもあります。この記事では、設定ファイルの置き場所と反映方法、ネットワーク・カーネル・ファイルシステムの各分野で効果のある項目、つまずきやすい注意点、反映後の確認方法を説明します。

sysctlの基本と設定ファイルの置き場所

カーネルパラメータは /proc/sys/ 以下にファイルとして公開されており、sysctl コマンドで読み書きできます。

# 現在の値を確認
sysctl net.ipv4.tcp_syncookies

# すべての値を一覧表示
sudo sysctl -a

# 一時的に変更(再起動で元に戻る)
sudo sysctl -w kernel.dmesg_restrict=1

-w での変更は再起動すると消えます。恒久的に設定するには、/etc/sysctl.d/ に .conf ファイルを作ります。/etc/sysctl.conf に直接書く方法もありますが、独自のファイルに分けておくと、何を変えたかが分かりやすく、OS の更新時にも衝突しにくくなります。

/etc/sysctl.d/ などのファイルはファイル名の順に読み込まれ、同じ項目は後から読まれた値が優先されます。ディストリビューションやクラウドのイメージが独自のファイルを置いていることがあるため、99-security.conf のように後ろに来る名前にしておくと、自分の設定が反映されやすくなります。

# 設定ファイルをすべて読み込み直す(どのファイルを読んだかも表示される)
sudo sysctl --system

以下で紹介する値は、一般的な Web サーバー(WordPress などを動かす単体の VPS やクラウドのサーバー)を想定した目安です。このうちいくつかは、主要なディストリビューションですでに既定値になっています。まず現在の値を確認し、変わっていないものだけを設定してください。本番に入れる前に、ステージングや同じ構成の検証用サーバーで試すのが安全です。

ネットワーク関連のパラメータ

ネットワーク関連は、外部からの不正なパケットへの耐性を高める項目が中心です。

# /etc/sysctl.d/99-security.conf(ネットワーク関連)

# SYN フラッド対策:接続待ちの枠があふれたときに SYN cookie を使う
net.ipv4.tcp_syncookies = 1

# 送信元を偽装したパケットを捨てる(逆経路フィルター。1=厳格、2=緩い)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# ICMP リダイレクトを受け付けない(経路の書き換えを防ぐ)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

# ルーターでなければ ICMP リダイレクトを送らない
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# 送信元ルーティング指定のパケットを受け付けない
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0

# ありえない送信元アドレスのパケットをログに記録する
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1

# ブロードキャスト宛ての ping に応答しない/不正な ICMP エラーを無視する
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1

all と default の違いでつまずく人が多いので補足します。default は「これから作られるインターフェース」の初期値で、すでに存在する eth0 などの値は変わりません。all は項目によって「全インターフェースに優先する」「インターフェースごとの値と組み合わせて判定する」など扱いが異なります。設定後は sysctl net.ipv4.conf.eth0.accept_redirects のように、実際のインターフェース名でも値を確認してください(インターフェース名は ip -br link で確認できます)。

rp_filter = 1(厳格)は、複数のネットワークを持つサーバーや、行きと帰りで経路が違う構成では、正当な通信まで捨ててしまうことがあります。そうした構成では 2(緩い)を選びます。

tcp_syncookies は SYN フラッドへの耐性を上げますが、回線を埋めるほどの大規模な攻撃は防げません。そうした攻撃には、CDN やホスティング事業者の防御が必要です。

IP転送の設定とDockerの関係

サーバーがルーターとして働く必要がなければ、IP 転送(net.ipv4.ip_forward)は 0 が目安です。ただし、Docker、Kubernetes、VPN サーバー(WireGuard や OpenVPN など)を使っている場合は、コンテナや VPN の通信のために 1 が必要です。Docker は起動時に自ら 1 に設定するため、設定ファイルで 0 を強制すると、再読み込みのタイミングによってコンテナが外部と通信できなくなることがあります。こうした用途があるサーバーでは、IP 転送の項目は設定ファイルに書かないでおきます。

カーネル関連のパラメータ

カーネル関連は、攻撃者に手がかりを与えない、権限昇格を難しくする項目です。

# /etc/sysctl.d/99-security.conf(カーネル関連)

# カーネル内部のアドレスを一般ユーザーに見せない(2 は root にも見せない)
kernel.kptr_restrict = 1

# dmesg(カーネルログ)の閲覧を管理者に限る
kernel.dmesg_restrict = 1

# アドレス空間配置のランダム化(ASLR)を最大にする。多くの環境で既定値
kernel.randomize_va_space = 2

# 他のプロセスへの ptrace(デバッガーの接続)を親子関係に限る
kernel.yama.ptrace_scope = 1

# 一般ユーザーによる BPF プログラムの読み込みを禁止する
kernel.unprivileged_bpf_disabled = 1

# BPF の JIT を強化する
net.core.bpf_jit_harden = 2

# SUID プログラムのコアダンプを作らない(メモリ内の秘密情報の流出を防ぐ)
fs.suid_dumpable = 0

いくつかは、一度設定すると再起動するまで緩められない「片道」の動作をします。kernel.unprivileged_bpf_disabled を 1 にした場合や、kernel.yama.ptrace_scope を 3 にした場合がこれにあたります。ptrace_scope を 1 にすると、一般ユーザーが動作中の別プロセスに gdb や strace を接続できなくなるため、開発やトラブル調査で使う場合は sudo を付けて実行します。kernel.yama.ptrace_scope は Yama というセキュリティモジュールが有効な場合にだけ存在します。項目が存在しないと sysctl --system がエラーを表示するので、sysctl kernel.yama.ptrace_scope で存在を確かめてから書きます。

kernel.sysrq(マジック SysRq キー)を 0 にして無効化する考え方もありますが、物理コンソールやクラウドのシリアルコンソールから緊急時の操作に使う場合もあります。既定値はディストリビューションによって違うため、運用で使っているかを確認してから判断してください。

ファイルシステム関連のパラメータ

共有ディレクトリ(/tmp など)を悪用した攻撃を防ぐ項目です。多くの環境で既定で有効になっていますが、確認しておく価値があります。

# /etc/sysctl.d/99-security.conf(ファイルシステム関連)

# 所有者でないファイルへのハードリンク作成を制限する
fs.protected_hardlinks = 1

# スティッキービット付きディレクトリでの他人のシンボリックリンクの追跡を制限する
fs.protected_symlinks = 1

# スティッキービット付きディレクトリでの FIFO・通常ファイルの書き込みを制限する
fs.protected_fifos = 2
fs.protected_regular = 2

fs.protected_fifos と fs.protected_regular は比較的新しいカーネルで加わった項目です。古いカーネルでは存在しないため、エラーが出た場合は対象外として外します。

反映と確認の手順

設定を反映するときは、次の順で進めます。

  1. 現在の値を保存する:sudo sysctl -a > ~/sysctl-before.txt で変更前の状態を控えます。戻すときや差分を確認するときに使います。
  2. 設定ファイルを作り、読み込む:sudo sysctl --system を実行し、エラーが出ていないかを確認します。存在しない項目や書き込めない項目はここで警告が出ます。
  3. サービスの動作を確認する:Web サイトの表示、SSH での接続、データベースやコンテナの通信など、普段の操作が問題なく動くかを確かめます。
  4. 再起動後の値を確認する:メンテナンスの時間に再起動し、sysctl で値が残っているかを確認します。起動時に別のファイルや Docker などが上書きしていないかも、ここで分かります。
# 変更前後の差分を確認
sudo sysctl -a > ~/sysctl-after.txt
diff ~/sysctl-before.txt ~/sysctl-after.txt

なお、コンテナの中では、多くのカーネルパラメータはホスト側の設定が使われ、コンテナから変更できません。コンテナで動くサービスを守る場合は、ホスト側で設定します。

カーネルパラメータは、OS やカーネルの更新で既定値や項目が変わることがあります。この記事の内容は主要ディストリビューションを前提にしています(2026年10月現在)。カーネルの更新後は、主要な値を改めて確認してください。

まとめ

  • 恒久的な設定は /etc/sysctl.d/99-security.conf のように独自のファイルに書き、sysctl --system で反映する
  • ネットワークでは SYN cookie、逆経路フィルター、ICMP リダイレクトと送信元ルーティングの拒否などが基本。default は既存のインターフェースに効かない点に注意する
  • Docker や VPN を使うサーバーでは IP 転送を止めない
  • カーネル関連では情報の非表示(kptr_restrict・dmesg_restrict)と、ptrace・BPF の制限が有効。再起動まで戻せない値がある
  • 変更前の値を保存し、検証環境で試し、再起動後の値まで確認する

お気軽にご相談ください

お見積りへ お問い合わせへ
▲