Chef

Chef Infra自動化プラットフォームでKeeperシークレットマネージャーを利用するためのクックブック集

概要

Chef Infraは、インフラをコードに変換する強力な自動化プラットフォームです。クラウド、オンプレミス、またはハイブリッド環境のいずれで運用していても、Chefはネットワーク全体のインフラの構成、デプロイ、および管理を自動化します。

Keeperシークレットマネージャーのクックブックを使用することで、Chef管理ノードをKeeperシークレットマネージャーと統合でき、Chefインフラ内のシークレット管理をより簡単かつ安全に行うことができます。

機能

  • Chef管理ノードにKeeperシークレットマネージャー用Python SDKをインストールおよび設定

  • Chef実行時にKeeperボルトからKeeper表記法を使用してシークレットを取得

  • 暗号化データバッグを利用した安全な認証

  • クロスプラットフォーム対応 (Linux、macOS、Windows)

要件

  • Keeperシークレットマネージャーへのアクセス (詳細はクイックスタートガイドを参照)

  • Keeperのサブスクリプションでシークレットマネージャーアドオンが有効になっていること

  • シークレットマネージャーポリシーが有効なロールに所属していること

  • シークレットが共有されているKeeperシークレットマネージャーアプリケーション

  • アプリケーションの作成手順はクイックスタートガイドを参照

  • Keeperシークレットマネージャーが初期化されていること

クックブックはBase64形式の構成をサポートしています。

セットアップ

インストール

Berkshelfを使用する場合

Berksfile に次の行を追加します。

cookbook 'keeper_secrets_manager', git: 'https://github.com/your-org/keeper_secrets_manager.git'

Chef Supermarketを使用する場合

knife cookbook site install keeper_secrets_manager

手動インストール

  1. クックブックをダウンロード

  2. cookbooksディレクトリに配置

  3. Chefサーバーにアップロード

knife cookbook upload keeper_secrets_manager

認証

このクックブックは暗号化データバッグを使用して安全な認証を行います。この方法により、Keeper構成をChefサーバー上に安全に保存し、ノードから利用できるようにすることができます。

シークレットキーファイルの作成

暗号化データバッグを作成する前に、Chefが機密データの暗号化および復号に使用する共有シークレットファイルを作成する必要があります。

次のコマンドを実行します。

# Chefのシークレット用ディレクトリが存在しない場合は作成
sudo mkdir -p /etc/chef

# Base64エンコードされたシークレットを生成して安全に保存
openssl rand -base64 512 | sudo tee /etc/chef/encrypted_data_bag_secret > /dev/null

暗号化データバッグの設定

Keeper構成を保存する暗号化データバッグを作成します。

# データバッグを作成
knife data bag create keeper

# 構成アイテムを作成
cat > keeper_config.json << EOF
{
  "id": "keeper_config",
  "config_json": "eyJhcHBLZXkiOiJCaU..."
}
EOF

# 暗号化してChefサーバーにアップロード
knife data bag from file keeper keeper_config.json --secret-file /path/to/secret

暗号化データバッグはKeeperシークレットマネージャーの構成を環境変数として保存し、Chefノードから安全にアクセスできるようにします。

入力構成ファイル

input.json ファイルは必須で、Keeperボルトから取得するシークレットを定義します。このファイルはKeeper表記法を使用して取得対象のシークレットを指定します。

input.jsonの作成

次の構造を持つ input.json ファイルを作成します。

{
  "authentication": [
    "base64"
  ],
  "secrets": [
    "jnPuLYWXt7b6Ym-_9OCvFA/field/password > APP_PASSWORD",
    "jnPuLYWXt7b6Ym-_9OCvFA/field/login > LOGIN",
    "jnPuLYWXt7b6Ym-_9OCvFA/file/dummy.crt > file:/tmp/Certificate.crt"
  ]
}

シークレット表記法の形式

このクックブックは柔軟なシークレットマッピングを可能にするKeeper表記法をサポートしています。詳細はKeeper表記法ドキュメントを参照してください。

表記法フォーマット

表記は "KEEPER_NOTATION > OUTPUT_SPECIFICATION" という形式を取ります。

  • 左側: Keeper表記法 (例: UID/custom_field/Label1)

  • 右側: 出力仕様 (例: Label2env:Label2file:/path/to/file)

出力マッピングオプション

  1. キーの単純マッピング

"UID/custom_field/Label1 > Label2"

結果: 出力JSONに { "Label2": "VALUE_HERE" } が追加される

  1. 環境変数出力

"secret-uid/field/password > env:DB_PASSWORD"

結果: Chefノード上で DB_PASSWORD 環境変数が設定される

env:Label2 は環境変数としてエクスポートされ、Label2 は出力JSONには含まれません。

  1. ファイル出力

"secret-uid/file/ssl_cert.pem > file:/opt/ssl/cert.pem"

結果: ファイルが指定されたパスに保存され、出力JSONには{ "ssl_cert.pem": "/opt/ssl/cert.pem" } が追加される

ファイル名がキーとなり、ファイルパスが値となります。

input.jsonの完全な例

{
  "authentication": [
    "base64"
  ],
  "secrets": [
    "jnPuLYWXt7b6Ym-_9OCvFA/field/password > env:DB_PASSWORD",
    "jnPuLYWXt7b6Ym-_9OCvFA/field/login > DB_USERNAME",
    "jnPuLYWXt7b6Ym-_9OCvFA/custom_field/api_key > API_KEY",
    "jnPuLYWXt7b6Ym-_9OCvFA/file/ssl_cert.pem > file:/opt/ssl/cert.pem",
    "jnPuLYWXt7b6Ym-_9OCvFA/file/ssl_key.pem > file:/opt/ssl/key.pem"
  ]
}

レコードUIDの確認方法

レコードUIDは次の方法で確認できます。

  • Keeperコマンダー: ls -l コマンドで確認

  • Keeperウェブボルト: レコードをクリックし、URLまたは詳細で確認

  • Keeperデスクトップアプリ: レコードを右クリックし [レコードUIDをコピー] を選択

使用方法

基本インストール

# Keeperシークレットマネージャーをインストール
ksm_install 'keeper_setup' do
  python_sdk true
  cli_tool false
  action :install
end

シークレットの取得

# 独自のinput.jsonを使用してKeeperボルトからシークレットを取得
ksm_fetch 'fetch_app_secrets' do
  input_path '/path/to/your/input.json'
  timeout 300
  action :run
end

# デフォルトパス (/opt/keeper_secrets_manager/input.json) を使用
ksm_fetch 'fetch_app_secrets' do
  timeout 300
  action :run
end

完全な例

# Keeperシークレットマネージャーをインストール
ksm_install 'keeper_setup' do
  python_sdk true
  cli_tool true
  base_dir '/opt/keeper_secrets_manager'
  action :install
end

# input.jsonファイルを作成
cookbook_file '/opt/keeper_secrets_manager/input.json' do
  source 'input.json'
  mode '0600'
  action :create
end

# Keeperボルトからシークレットを取得
ksm_fetch 'fetch_app_secrets' do
  input_path '/opt/keeper_secrets_manager/input.json'
  timeout 300
  action :run
end

# Keeperが設定した環境変数 (env: マッピング) を使用
template '/etc/myapp/config.yml' do
  source 'config.yml.erb'
  variables({
    db_password: lazy { ENV['DB_PASSWORD'] },
    api_key: lazy { ENV['API_KEY'] }
  })
end

# Keeperが保存したファイル (file: マッピング) を使用
template '/etc/nginx/ssl.conf' do
  source 'ssl.conf.erb'
  variables({
    ssl_cert_path: '/opt/ssl/cert.pem',
    ssl_key_path: '/opt/ssl/key.pem'
  })
end

リソース

ksm_install

KeeperシークレットマネージャーのPython SDKおよびCLIツールをインストールします。

プロパティ

プロパティ
デフォルト値
説明

python_sdk

ブーリアン

true

Python SDKをインストール

cli_tool

ブーリアン

false

CLIツールをインストール

user_install

ブーリアン

false

現在のユーザーのみを対象にインストール

base_dir

文字列

プラットフォーム依存

基本インストールディレクトリ

アクション

  • :install - Keeperシークレットマネージャーをインストール (デフォルト)

ksm_fetch

input.json 構成ファイルを使用してKeeperボルトからシークレットを取得します。

プロパティ

プロパティ
デフォルト値
説明

input_path

文字列

/opt/keeper_secrets_manager/input.json

input.json構成ファイルのパス

timeout

整数

300

スクリプト実行のタイムアウト値

deploy_path

文字列

/opt/keeper_secrets_manager/ksm.py

スクリプトの配置パス

アクション

  • :run - Keeperボルトからシークレットを取得 (デフォルト)

input_path が指定されていない場合、/opt/keeper_secrets_manager/input.json を参照します。

対応プラットフォーム

  • Linux: Ubuntu 18.04+、CentOS 7+、RHEL 7+、Debian 9+

  • macOS: 10.14+

  • Windows: Server 2016+

要件

Chef

  • Chef Infra Client 16.0+

  • Chef Workstation 21.0+ (開発用)

依存関係

  • Python 3.6+ (存在しない場合は自動インストール)

  • pip (自動インストール)

  • Keeper SDKをダウンロードするためのインターネット接続

最終更新