LynisによるLinuxセキュリティ監査:本番サーバーの自動堅牢化ガイド

Security tutorial - IT technology blog
Security tutorial - IT technology blog

現実の課題:サーバーの「初期セキュリティ」という幻想

AWSやDigitalOcean上でクリーンなUbuntu 24.04やRocky Linux 9のインスタンスを立ち上げた直後は、すべてが整っているように見えます。SSH公開鍵を登録し、UFWを有効化してポート443を開放し、アプリケーションのコンテナを起動する――外から見れば、サーバーは十分に保護されているように思えるでしょう。

しかし、実際はそうではありません。標準のLinuxディストリビューションは、敵対的な環境からの防御よりも、ソフトウェアを導入してすぐに動く互換性を優先しています。標準イメージは全体的に緩い設定で提供されており、緩慢なファイル作成umask、廃止予定のレガシーなネットワークプロトコル、詳細すぎるOSログインバナー、誰でも読み取れる設定ファイルなどが有効なまま残っています。パッチ未適用のWebアプリ経由で低権限のシェルを奪われた場合、攻撃者はこれらデフォルト設定を突いて数分でローカル権限昇格を果たせてしまいます。

サーバーを手作業で監査するのは極めて困難です。一般的なLinuxホストには、/etc/、/proc/sys/、/var/log/にまたがる1,800項目以上の設定ディレクティブが存在します。自動化ツールがなければ、どの値がCISベンチマークに違反しているかを正確に見分けることは不可能です。

根本原因の分析:初期設定のLinuxがセキュリティ要件を満たせない理由

OSメンテナは常に難しいバランスを求められています。データベースやレガシーなエンタープライズデーモン、開発ツールチェーンが初回起動時にエラーなく動作することを最優先しなければならないため、アップストリームのデフォルト設定はどうしてもセキュリティより互換性を重視せざるを得ません。

新規サーバーが基本的なセキュリティ評価を通過できない原因は、主に以下の3点にあります。

  • 緩いカーネルのデフォルト設定:Linuxカーネルは初期状態で、ICMPリダイレクトの受け入れや送信元ルーティングなど、ルーター向けの機能を有効にしています。これらの設定により、独立したWebホストやAPIホストがパケットスプーフィングやルートリダイレクションの脅威に晒されます。
  • 分散したポリシー適用管理:Linuxには単一の設定レジストリが存在しません。セキュリティポリシーはOpenSSH、PAM、systemd、auditdなど複数の設定に分散・断片化しています。自動チェックを行わなければ、設定のドリフト(乖離)に何ヶ月も気づけないまま放置されることになります。
  • ローカルマウントとパッケージの死角:エンジニアリングチームは外部境界のファイアウォールには細心の注意を払いますが、/tmpや/var/tmpがnoexec,nosuid,nodevオプション付きの専用パーティションにマウントされているかまで確認することは稀です。また、本番環境のイメージにgccなどの未使用コンパイラが残っていることも多く、攻撃者に格好のエクスプロイトビルド環境を提供してしまいます。

解決策の比較:最適な監査アプローチの選定

エンジニアリングチームが選択する監査手法は、通常以下の3つに分かれます。

1. 手動によるCISベンチマークチェックリスト

Center for Internet Security(CIS)は包括的な堅牢化ガイドを発行しています。そのLinuxベンチマークは、手動チェック項目、シェルコマンド、検証スクリプトを含めて800ページ以上に及びます。

  • メリット:網羅的なカバレッジであり、OSの低レイヤーな内部構造への理解が深まる。
  • デメリット:サーバー1台あたり10〜15エンジニア時間を要する。数十台の規模にはスケールせず、人的疲労によるチェック漏れが頻発する。

2. 重量級のエンタープライズネットワークスキャナ(Nessus、OpenVAS、Qualys)

リモートポートをスキャンし、インストールされたパッケージリストを公開CVEレジストリと照合するエンタープライズ向けプラットフォームです。

  • メリット:外部境界の脆弱性、古いバージョンのライブラリ、ネットワーク検出に強みを持つ。
  • デメリット:年間のライセンス費用が高額で、リソースオーバーヘッドが重く、内部のsysctlフラグ、shadowファイルの整合性、PAMスタック構成などの深部までは踏み込めない。

3. Lynis:軽量なホスト監査ツール

Lynisは、POSIX準拠のシェルスクリプトで記述されたオープンソースの監査ツールです。ホスト上でローカルに実行され、CISやISO 27001のベースラインに沿った300項目以上の自動チェックを90秒足らずで完了します。バックグラウンドデーモンを常駐させる必要がなく、重い依存関係も一切ありません。

  • メリット:高速かつポータブルで、ほぼすべてのUnixシェル上で動作。実践的な堅牢化指数(0〜100のHardening Index)を算出し、具体的な修正用IDを出力する。
  • デメリット:問題の検出のみを行い、自動修復(自動パッチ適用)は行わない。ただしこれは設計上の意図であり、本番環境における無計画な自動修正によるサービス停止を防ぐための安全策です。

最適なアプローチ:Lynisを使った段階的なLinux監査と堅牢化

確実なセキュリティ運用を実現するには、Lynisによる自動検査と、対象を絞った手動での改善作業を組み合わせることが最善です。このアプローチにより、本番ワークロードの稼働を維持しながら防御力を着実に引き上げることができます。

ステップ1:公式CisofyリポジトリからLynisをインストールする

ディストリビューションの標準パッケージミラーは最新のコンプライアンスルールから数ヶ月遅れていることが多いため、Cisofyの公式アップストリームリポジトリを使用します。

DebianおよびUbuntuの場合:

# コア通信パッケージのインストール
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg

# 署名済みCisofyリポジトリキーのインポート
curl -fsSL https://packages.cisofy.com/keys/cisofy-software-public.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/cisofy.gpg

# アップストリームリポジトリのエントリを追加
echo "deb https://packages.cisofy.com/community/lynis/deb/ stable main" | sudo tee /etc/apt/sources.list.d/cisofy-lynis.list

# Lynisのインストール
sudo apt-get update
sudo apt-get install -y lynis

RHEL、Rocky Linux、またはAlmaLinux 9の場合:

sudo dnf install -y epel-release
sudo dnf install -y lynis

ステップ2:完全なシステムスキャンを実行する

shadowファイルのハッシュ値、制限されたsysctlツリー、ファイアウォール設定などを正しく評価するため、Lynisはroot権限で実行します。

sudo lynis audit system

Lynisはメモリ保護、認証サブシステム、ストレージ層、およびアクティブなネットワークポートを解析します。スキャンはおよそ60〜90秒で完了します。

スキャン完了時、LynisはサマリーボックスにHardening Index(堅牢化指数)を表示します。セットアップ直後のUbuntuやRockyのクラウドインスタンスでは、通常100点満点中58〜64点前後に落ち着きます。

スキャン結果は分析用に以下の2つのローカルファイルに保存されます。

  • /var/log/lynis.log:詳細なデバッグメッセージを含む完全な実行ログ。
  • /var/log/lynis-report.dat:自動化処理やカスタムレポート作成に適したキー・バリュー形式の構造化データ。

ステップ3:優先度の高い警告と提案を抽出する

ターミナルの出力は簡単に3,000行を超えてしまいます。ログファイルを直接フィルタリングして、重大な検出事項に集中しましょう。

# セキュリティ違反の直接検出リスト
sudo grep -E "Warning:" /var/log/lynis.log

# テストID順にソートされた堅牢化の改善提案リスト
sudo grep -E "Suggestion:" /var/log/lynis.log

各提案には、KRNL-5820(カーネルのsysctl設定)やAUTH-9288(パスワード有効期限ポリシー)のような固有のテストIDが付与されています。CisofyのポータルサイトでこのIDを検索することで、各推奨事項の背景にあるセキュリティコンテキストを確認できます。

ステップ4:本番環境でよくある脆弱性を修正する

以下の4つの代表的なカテゴリに対応することで、重要度の高いLynis警告の大半を解消できます。

1. カーネルネットワークスタックのパラメータを堅牢化する

初期のネットワーク設定では、安全でないルーティング動作が許容されています。/etc/sysctl.d/99-security-hardening.confに個別設定ファイルを作成して上書きします。

# サーバーがアクティブなVPNやNATゲートウェイでない限りルーティングを無効化
net.ipv4.ip_forward = 0

# Smurf攻撃を防ぐためブロードキャストping要求を無視
net.ipv4.icmp_echo_ignore_broadcasts = 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

# ICMPリダイレクトの送信を禁止
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# SYNフラッド攻撃に耐えられるようTCP SYN cookiesを有効化
net.ipv4.tcp_syncookies = 1

# あり得ない送信元アドレス(火星人パケット/martians)を持つパケットを記録
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1

再起動を行わずに更新した設定を即時反映します。

sudo sysctl --system

2. ファイル作成umaskとアカウントセキュリティを強化する

標準的なLinuxアカウントのumaskはデフォルトで022となっています。この設定では、新規作成されたファイルが他のすべてのローカルユーザーから読み取り可能になってしまいます。/etc/login.defsでシステムデフォルトのumaskを027に変更し、アクセス権を制限します。

UMASK 027

サービスアカウントや運用管理用のアカウントには強力なエントロピーが求められます。初期管理者やデータベースユーザーを作成する際は、安易なパスフレーズを避けましょう。私はtoolcraft.app/ja/tools/security/password-generatorのクライアントサイド生成ツールを使用し、特殊文字を含む24文字のランダムパスワードを生成しています。外部APIへの通信を行わずブラウザのランタイム上で直接キーが生成されるため、認証情報がネットワーク上に漏洩したりコマンド履歴に残ったりする心配がありません。

3. ログイン前の警告バナーを設置する

各種コンプライアンス基準では、シェルアクセス前の法的警告バナーの設置が義務付けられています。このバナーは運用の明確な境界を定め、不正アクセスに対する法的根拠を確立します。/etc/issue.netに警告メッセージを追加します。

sudo tee /etc/issue.net << 'EOF'
********************************************************************
* 許可された関係者専用。すべての操作は監視および記録されています。 *
* 正当な権限を持たない場合は、直ちに接続を切断してください。       *
********************************************************************
EOF

/etc/ssh/sshd_configを開き、Banner /etc/issue.netディレクティブが指定されていることを確認した上で構文テストを行い、OpenSSHを再読み込みします。

sudo sshd -t && sudo systemctl reload sshd

4. プロセスおよびシステムコールの監査を有効化する

カーネルイベントのリアルタイム監査が動作していない場合、Lynisは警告を発します。Linux Audit Daemon(auditd)を導入することで、ファイル変更、権限昇格、不正なシステムコールの可視化が可能になります。

# DebianまたはUbuntuの場合
sudo apt-get install -y auditd audispd-plugins
sudo systemctl enable --now auditd

# RHELまたはRocky Linux 9の場合
sudo dnf install -y audit
sudo systemctl enable --now auditd

ステップ5:堅牢化の効果を検証する

変更の効果を確認するため、Lynisをクイックモードで再実行します。

sudo lynis audit system --quick

カーネルパラメータの調整、デフォルトumaskの制限、auditdの稼働、法的バナーの設定を行うことで、Hardening Indexは通常60前後から82〜88の範囲へと大幅に向上します。何よりも重要なのは、現実に悪用可能な設定上の弱点を確実に排除できた点です。

ステップ6:cronによる定期監査の自動化

セキュリティの堅牢性は時間の経過とともに低下します。日常的なパッケージの導入、設定の変更、一時的なデバッグ作業などによって設定のドリフトが生じるためです。サイレントスキャンを実行してセキュリティの後退(リグレッション)を検知できるよう、cronジョブをスケジュール登録します。

sudo crontab -e

毎週月曜日の午前3時に監査を実行するよう、次の行を追加します。

0 3 * * 1 /usr/sbin/lynis audit system --cronjob --log-file /var/log/lynis-cron.log

/var/log/lynis-cron.logの内容をDatadogやGrafana Loki、またはシンプルなSlack通知スクリプトに連携します。このようなアラート基盤を整えることで、攻撃者に悪用される前に偶発的なセキュリティ低下を迅速に検知できるようになります。

Share: