Puppetで実現する「自律型セキュリティ」:CISベンチマークをコードで強制せよ
「設定を変更したら、いつの間にかセキュリティポリシーが崩壊していた」。そんな悪夢のようなインフラ運用から卒業する時が来た。
我々SREにとって、コンプライアンスは「後からチェックするもの」ではない。「コードとして最初から組み込むもの」だ。Puppetを使えば、インフラは単なる設定の集合体から、「あるべき状態を自律的に維持するインテリジェントな生命体」へと進化する。
本稿では、Puppet Compliance Engine(Puppet Comply)を駆使し、CISベンチマークを強制適用してドリフトを撲滅する、現場直結の極意を伝授する。
—
1. なぜ「コンプライアンスの自動化」が生存戦略なのか
手動の監査や、定期的な脆弱性スキャナの実行はもはや「負債」だ。DevOpsのスピードを維持しつつ、堅牢なセキュリティを担保するには、「定義されたポリシー=インフラの正解」とするしかない。Puppetの宣言的モデルは、まさにこのためにある。
2. CISベンチマークをPuppetで即座に適用する
CISベンチマークの適用は、車輪の再発明を避けるのが鉄則だ。`puppetlabs-cis_benchmark` モジュールを導入せよ。
実践:ベストプラクティス構成例(Hieraによる階層管理)
Hieraで設定を分離し、環境や役割ごとに適用レベルを微調整するのがプロの流儀だ。
data/nodes/web-server.yaml
CISベンチマークの適用レベルをHieraで定義
cis_benchmark::profile: ‘level_1’
cis_benchmark::include_unmanaged: false # Puppet管理外の変更を許さない
特定の設定のみオーバーライドする
cis_benchmark::rules::sshd_config:
permit_root_login: ‘no’
max_auth_tries: 3
3. ドリフト(設定乖離)との決別:自動修復の仕組み
Puppetの真骨頂は、「誰かが勝手にいじった設定を、次のカタログ適用サイクル(通常30分)で即座に上書きする」点にある。
ドリフト検知を加速するTips
- `puppet agent –noop` のCIパイプライン統合: 変更を適用する前に、必ずDry-runをCIで回せ。ドリフトが発生している場合は、ビルド自体を失敗させるのがチームの鉄則だ。
- PuppetDBの活用: 全ノードのドリフト状況をPuppetDBで集約し、Grafanaで可視化せよ。どのサーバーが「最も頻繁にポリシーを破るか」を特定し、その根本原因を叩く。
—
4. 現場で震えるほど役立つ「Puppet職人」の小技
効率を極限まで高めるための、現場で使えるテクニックを共有する。
A. 開発を加速させる VS Code 神プラグイン
- `Puppet` (by Puppet, Inc.): 言語サポート、Lintチェック、シンタックスハイライト。これなしでPuppetを書くのは裸で戦場に出るようなものだ。
- `YAML` (by Red Hat): Hieraファイルを記述する際、スキーマバリデーションが効く。インデントミスによる惨劇を防ぐ。
B. 知る人ぞ知るキーボードショートカット
- `Ctrl + Shift + P` (VS Code) -> `Puppet: Lint current file`: 書き終える前に叩け。Puppetのスタイルガイドに準拠していないコードは、ビルドが通っても恥だと思え。
C. チーム開発の「絶対ルール」:Hieraの構造化
設定ファイルは「環境」「ロール」「OS」の階層で徹底的に分割せよ。
data/
├── common.yaml # 全ノード共通設定
├── os/
│ └── redhat-8.yaml # OS固有のカーネルパラメータ等
└── roles/
└── webserver.yaml # CISプロファイルなどの役割設定
- ルール: `common.yaml` に全てを詰め込むな。ノード特有の設定は `nodes/` ではなく `roles/` を使え。これにより、新しいサーバーが増えても設定の再利用性が劇的に向上する。
—
5. 監査のための「自動レポーティング」
監査対応に追われる時間はゼロにできる。Puppet Complyは、設定の適用状況を自動的にJSON形式で出力する。これをSIEM(SplunkやDatadog)に流し込み、ダッシュボード化するのが現代のSREだ。
// 出力されたレポートの一部
{
“node”: “web-01.prod.local”,
“status”: “compliant”,
“violations”: [],
“last_check”: “2023-10-27T10:00:00Z”
}
このJSONを監視ツールで拾い、`status: “non-compliant”` が発生した瞬間にSlackへアラートを飛ばせ。「監査が来るから準備する」のではなく、「常に監査に通る状態を維持する」。これがコンプライアンス自動化の究極形だ。
最後に:インフラを「コード」として愛せ
Puppetを単なるツールとして使うな。インフラの「あるべき姿」を記述する言語として愛せ。設定ファイルの一つ一つに魂を込め、ドリフトを許さない堅牢なシステムを構築した時、初めて我々は「運用」から解放される。
次回のデプロイから、この構成を取り入れてみてほしい。驚くほど静かな、トラブルのない運用が待っているはずだ。
さあ、コードを書いて、インフラに規律を吹き込もう。