【入門編】Puppetエージェントのオフライン(エアギャップ)環境における運用ノウハウ!ローカルミラーサーバー構築と証明書運用の裏技 – インフラ構成管理(IaC)活用バイブル

こんにちは!クラウドインフラ・SREの世界へようこそ。
今日は、多くのインフラエンジニアが頭を悩ませる「完全閉域網(エアギャップ環境)におけるPuppetの運用」について、現場の生々しい知見を交えて解説していくよ。

「インターネットにつながっていない環境でも、Puppetでサーバーの構成管理を完全に自動化したい」
「でも、yum/aptリポジトリはないし、証明書の期限切れで突然エージェントが沈黙する恐怖から解放されたい」

そんなあなたのために、今回はローカルミラーの構築から、内部CAの強固な管理、そして誰もがハマる証明書運用の裏技まで、一気通貫でマスターできるように手取り足取りガイドするね。これをマスターすれば、外部ネット遮断のセキュアな環境でも、毎日のインフラ管理が劇的に楽になりますよ。

—

1. そもそもなぜエアギャップ環境でPuppetを使うのか?

インターネットから完全に切り離された閉域網(金融機関、政府系システム、工場などのOT環境)では、セキュリティ要件が極めて厳格です。「手動で設定変更する」なんてのはヒューマンエラーの温床であり、コンプライアンス違反の元。

だからこそ、「コードによる構成管理(IaC)」の力で、どのサーバーも一物一価の正確な状態に保つ必要があります。そのデファクトスタンダードの一つがPuppetです。

しかし、エアギャップ環境には2つの巨大な壁が立ち塞がります。
1. パッケージが取れない(yum/aptが使えない)
2. 証明書(SSL/TLS)の自動発行・更新が外部APに頼れない

この2つをスマートにクリアするのが、今回伝授するプロの技です。

—

2. 閉域網の生命線:ローカルミラーサーバーの構築

まずは、インターネットから隔離された環境へ、Puppetのパッケージ(MasterおよびAgent)を持ち込むための「ローカルミラー」を作ります。

インターネットに接続できる踏み台環境(あるいはビルド環境)でパッケージをダウンロードし、メディアや安全な転送経路経由で閉域網内のリポジトリサーバーへ配置します。

yum(RHEL/CentOS系)の場合のミラーリング戦術

インターネット接続環境で、必要なRPMパッケージをごっそりダウンロードします。

必要なパッケージと依存関係をまるっとダウンロード
repotrack –arch=x86_64 puppet-agent puppetserver

これらをローカルのレポジトリサーバー(社内Yumリポジトリ等)に配置し、閉域網内のノードから参照させます。

閉域網側のAgent用 yumリポジトリ設定 (`/etc/yum.repos.d/puppet.repo`)

外部のPuppet公式リポジトリを見に行かないよう、完全にローカルを向かせます。

[puppet-local]
name=Puppet Local Mirror for Air-Gap
社内のローカルWebサーバー(例: internal-repo.local)を指定
baseurl=http://internal-repo.local/packages/puppet/
enabled=1
gpgcheck=1
GPGキーも内部に配置したものを使う
gpgkey=http://internal-repo.local/packages/puppet/RPM-GPG-KEY-puppet

これで、`yum install -y puppet-agent` を叩けば、インターネットを一歩も出ずにエージェントが手に入ります。最高ですね。

—

3. 内部CA(認証局)の厳格管理と初期セットアップ

Puppetは、MasterとAgentの間で強固なSSL/TLS相互認証(mTLS)を行っています。エアギャップ環境では、パブリックな認証局は使えないため、Puppet Master自身を「内部CA(Root CA)」として機能させます。

Puppet Master(CA)の初期化

Master側で以下のコマンドを実行し、内部CAを立ち上げます。

Puppet Serverの初期化とCA証明書の生成
sudo /opt/puppetlabs/bin/puppetserver ca setup

このコマンドの裏で、`/etc/puppetlabs/puppet/ssl/` 配下に強固なプライベートCAが構築されます。生成されたRoot CA証明書(`ca.pem`)は、すべてのAgentにとっての「絶対正義」となります。

Agent側からの初回接続と証明書署名(CSR)

閉域網内のAgentをインストールしたら、Masterへ接続を試みます。

/etc/puppetlabs/puppet/puppet.conf の設定例
[main]
certname = agent01.airgap.local
server = puppetmaster.airgap.local

エージェントを起動すると、自動的にMasterへ証明書署名リクエスト(CSR)が飛んでいきます。

Agent側でサービス起動(初回は証明書がないため、リクエストを投げて待機状態になる)
sudo systemctl enable –now puppet

Master側で、未承認のCSRを確認し、署名します。

Master側でリクエスト一覧を確認
sudo /opt/puppetlabs/bin/puppetserver ca list

特定のノードの証明書を承認(サイン)する
sudo /opt/puppetlabs/bin/puppetserver ca sign –certname agent01.airgap.local

これで、MasterとAgentの間のセキュアな通信路が確立しました!

—

4. 【極秘の裏技】証明書自動更新のハックと有効期限切れ対策

さて、ここからが本記事のハイライトです。
通常、Puppetの証明書有効期限はデフォルトで5年間などに設定されていますが、セキュリティポリシーが厳しい企業では「1年」や「90日」に短縮したいという要望があります。また、期限切れが近づいた際の自動更新を、人間の手を介さず(エアギャップ環境で安心に)行う仕組みが必要です。

裏技:Auto-Sign(自動署名)の安全な実装

エアギャップ環境において、毎回管理者が `puppetserver ca sign` を手動で叩くのは、スケールしませんし非効率です。かといって、全自動(`autosign.conf = `)にするのはセキュリティ上、自殺行為です。

そこで、「特定の事前承認されたIPレンジまたはプレフィックス、かつ社内DNSで正引きできるノードのみ」を自動承認するカスタムポリシーアナライザを設定します。

(`/etc/puppetlabs/puppetserver/services.d/ca.cfg` または `autosign.conf` の活用)

もっとも柔軟な方法は、RubyスクリプトによるカスタムAutosignです。
`/etc/puppetlabs/puppet/autosign.conf` にスクリプトのパスを指定します。

/etc/puppetlabs/puppet/scripts/validator.rb

`validator.rb` の実装例(セキュリティ担保の心臓部):

!/usr/bin/env ruby
簡易的な証明書自動検証スクリプト
certname = ARGV[0]

命名規則(例: サーバー種別-連番.airgap.local)に一致するか正規表現でチェック
if certname =~ /^(web|db)\d{2}\.airgap\.local$/
# さらに社内IPAMやCMDBのAPIを叩いて実在確認する処理をここに書く
exit(0) # 承認
else
exit(1) # 拒否
end

これで、正規の命名規則に従った新規サーバーが構築された際、エージェントは自動的にMasterから証明書を取得し、誰の手も煩わせずにセキュアな通信を開始できます。

—

5. 精度高い HelloWorld 的な動作確認

環境が整ったら、実際にPuppetが正しく動作するか「Hello World」ならぬ、閉域網環境における構成管理のテストを行いましょう。

マニフェストの作成 (`/etc/puppetlabs/code/environments/production/manifests/site.pp`)

node ‘agent01.airgap.local’ {
# 閉域網内でも確実に動作するテスト用のファイル作成
file { ‘/etc/airgap_greeting.txt’:
ensure => ‘file’,
owner => ‘root’,
group => ‘root’,
mode => ‘0644’,
content => “こんにちは!エアギャップ環境のPuppetが無事に稼働しています。\n”,
}

notify { ‘Puppet Agent is working smoothly in Air-Gap environment!’: }
}

エージェント側での適用(ドライラン&実行)

まずは変更内容を安全に確認(No-opモード)
sudo puppet agent -t –noop

実際に適用
sudo puppet agent -t

コンソールに緑色のログが出力され、`/etc/airgap_greeting.txt` が生成されていれば、完全勝利です!お疲れ様でした。

—

まとめ

今回は、外部インターネットに接続できないエアギャップ環境におけるPuppetの運用ノウハウを、ローカルミラー、内部CA、そして証明書の自動化ハックまで深く掘り下げて解説しました。

  • ローカルミラーでパッケージの依存関係を完全にローカライズする
  • 内部CAを軸にした堅牢なmTLS通信の確立
  • カスタムAutosignによるセキュアかつ完全自動の証明書発行

この3つを抑えれば、どんなにセキュリティが厳格なクローズド環境であっても、モダンで美しいインフラ構成管理を実現できます。「これをマスターすれば、毎日の作業が劇的に楽になりますよ」。

あなたのSREライフが、より自動化され、エレガントなものになることを願っています。それではまた次の深淵でお会いしましょう!

タイトルとURLをコピーしました