【入門編】Puppetコードの難読化と機密情報保護!暗号化Hieraバックエンドの実装と鍵管理のベストプラクティス – インフラ構成管理(IaC)活用バイブル

こんにちは!インフラエンジニアの先輩です。

日々のインフラ運用、本当にお疲れ様です。サーバーが増えるたびに手作業で設定を変えたり、「この設定ファイル、パスワードが平文で書いてあるけど大丈夫……?」と夜も眠れなくなったりしていませんか?

今回は、そんなインフラの悩みを鮮やかに解決する「Puppet」と、そのコード管理における最大の難所である「機密情報の保護」について、現場の生きた知見を交えて徹底解説します。

これをマスターすれば、シークレット(秘密情報)の漏洩におびえる日々から解放され、インフラコードの安全性が劇的に向上しますよ。さあ、一緒に扉を開けましょう!

—

1. Puppetってそもそも何をするツールなの?

初心者の方に向けて、まずPuppetの役割を直感的に説明しますね。

Puppetは、一言で言うと「サーバーのあるべき姿(Desired State)をコードで定義し、自動でその通りに保ち続けるツール」です。

例えば、「Nginxをインストールして、設定ファイルを置いて、サービスを起動する」という作業を、手動でやる代わりにPuppetのコード(マニフェスト)として書きます。Puppetエージェントをサーバー上で動かすと、現在のサーバーの状態をスキャンし、「おや、Nginxが起動していないぞ」と検知して、勝手に起動状態(あるべき姿)に戻してくれます。

この「何度実行しても結果が同じになる(=冪等性:へきとうせい)」という性質が、インフラ管理を圧倒的に楽にしてくれる秘密です。

—

2. サーバー構成管理の心臓部「Hiera」とは?

Puppetのコードを書くうえで絶対に欠かせないのが「Hiera(ハイエラ)」です。

Hieraは、コード(ロジック)とデータ(環境ごとの設定値)を綺麗に分離するための仕組みです。
例えば、「Webサーバーのポート番号」や「データベースの接続先」といった環境ごとに変わる値を、YAML形式のファイルで一元管理します。

common.yaml のイメージ
apache::port: 80
db::host: “db.internal.net”

コード側から「`apache::port`の値をちょうだい」と呼び出すだけで、Hieraが環境に応じた適切な値を自動で返してくれます。これが最高にスマートなんです。

—

3. 【最大の罠】Hieraでの平文管理という爆弾

さて、ここからが本題です。非常に便利なHieraですが、大きな落とし穴があります。

それは、「パスワードやAPIキー、秘密鍵などのシークレット情報も、うっかり平文のYAMLで書いてしまいがち」という点です。

危険な例(絶対にやめましょう!)
db::password: “SuperSecretPassword123!” # <-- Gitにプッシュしたら世界中に公開されます これをやってしまうと、Gitのリポジトリの履歴にパスワードが刻まれ、チームメンバー全員、あるいはパブリックリポジトリなら世界中の人が機密情報を閲覧できてしまいます。これはインフラエンジニアとしての悪夢です。 では、どうすればいいのでしょうか? 答えは、「Hieraのデータを暗号化するバックエンド(`hiera-eyaml`)」を使うことです。

—

4. 救世主「eyaml」による暗号化Hieraの実装

`hiera-eyaml`を使うと、YAMLファイルの中の機密情報だけを暗号化し、安全にGitで管理できるようになります。暗号化された値は、Puppetサーバーだけが持つ秘密鍵で復号されます。

ここから、実際にその環境をセットアップする手順を優しく丁寧に解説しますね。

Step 1: 必要なツールのインストール

Puppetマスターサーバー上で、`hiera-eyaml`のGemをインストールします。

Puppetが提供するRuby環境にeyamlをインストールします
/opt/puppetlabs/puppet/bin/gem install hiera-eyaml

Step 2: 暗号化の鍵(公開鍵・秘密鍵)の生成

データを暗号化・復号するための鍵ペアを生成します。

keysディレクトリを作成して鍵を生成
eyaml createkeys

これで、`/etc/puppetlabs/code/environments/production/keys/` の下に、`private_key.pkcs7.pem`(秘密鍵)と `public_key.pkcs7.pem`(公開鍵)が生成されます。
※注意:秘密鍵は絶対にGitにコミットしないでください!

Step 3: 機密情報の暗号化

パスワードなどの文字列を、コマンド一つで暗号化してみましょう。

eyaml encrypt -s “SuperSecretPassword123!”

実行すると、以下のような暗号化文字列(PKCS7形式)が出力されます。

ENC[PKCS7,MIIEiAYJKoZIhvcNAQcDoIIEeTCCBHUCAQAxggUhMIIEIQIBADAFMAACAQEw…(中略)…]

Step 4: Hieraファイルへの組み込み

暗号化された文字列を、そのままHieraのYAMLファイルに貼り付けます。

data/common.yaml
平文はそのまま書いてOK
apache::port: 80

機密情報はENC[…]で包む!
db::password: >
ENC[PKCS7,MIIEiAYJKoZIhvcNAQcDoIIEeTCCBHUCAQAxggUhMIIEIQIBADAFMAACAQEw…]

これなら、この `common.yaml` をそのままGitHub等のリモートリポジトリにプッシュしても安全です!Gitの履歴にも暗号化された文字列しか残りません。

—

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

設定が正しく動いているか、実際にPuppetのデータ検索コマンド(`puppet lookup`)を使って確認してみましょう。

puppet lookup db::password –node=my-web-server.local –render-as yml

【期待される出力結果】

— “SuperSecretPassword123!”

見事に、Puppetサーバー上で自動的に復号され、元のパスワードとして取得できました!
Puppetのエージェントが動作するときも、この仕組みの裏側で安全に復号が行われ、サーバーの構成ファイルに安全にパスワードが書き込まれます。

—

6. さらに先へ:HashiCorp Vaultなど外部シークレットマネージャーとの統合

`hiera-eyaml`は非常に手軽で強力ですが、大規模な組織や、より厳格なコンプライアンス(シークレットの自動ローテーション、アクセス監査など)が求められる現場では、HashiCorp Vaultなどの専用シークレットマネージャーとの統合が選ばれます。

Puppetには、Vaultから動的に機密情報を取得するためのプラグイン(`puppet-vault`など)が用意されています。これを利用すると、PuppetのコードやHieraファイルすら持たず、実行時にVaultへ安全にアクセスしてパスワードをインジェクションすることが可能です。

「まずは `hiera-eyaml` でファイルベースの暗号化から始め、組織の成長に合わせてVaultへ移行する」――これが、現代のSREがたどる最も美しく堅牢なステップアップのロードマップです。

—

まとめ

いかがでしたでしょうか?
今回は、Puppetにおける機密情報の保護と、暗号化Hiera(`hiera-eyaml`)の実装方法について解説しました。

  • Hieraは便利だが、平文管理はインフラのセキュリティ上の爆弾になる
  • `hiera-eyaml`を使えば、機密情報だけを暗号化して安全にGit管理できる
  • Puppetの自動復号により、コードの安全性と運用性を両立できる

これをマスターしたあなたなら、明日からのインフラコードのレビューで「ここ、平文になってますよ!」と自信を持って指摘し、チームを救うことができるはずです。

インフラの自動化は、安全性の土台があってこそ初めて真価を発揮します。
あなたの手で作るインフラが、より堅牢で美しいものになることを応援しています!

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