# Chef

<figure><img src="/files/NKd1vMBIGt0VntT82zvM" alt=""><figcaption></figcaption></figure>

## 概要

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

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

## 機能

* Chef管理ノードにKeeperシークレットマネージャー用Python SDKをインストールおよび設定
* Chef実行時にKeeperボルトからKeeper表記法を使用してシークレットを取得
* 暗号化データバッグを利用した安全な認証
* クロスプラットフォーム対応 (Linux、macOS、Windows)

## 要件

* Keeperシークレットマネージャーへのアクセス (詳細はクイックスタートガイドを参照)
* Keeperのサブスクリプションでシークレットマネージャーアドオンが有効になっていること
* シークレットマネージャーポリシーが有効なロールに所属していること
* シークレットが共有されているKeeperシークレットマネージャーアプリケーション
* アプリケーションの作成手順はクイックスタートガイドを参照
* Keeperシークレットマネージャーが初期化されていること

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

## セットアップ

### インストール

#### Berkshelfを使用する場合

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

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

#### Chef Supermarketを使用する場合

```bash
knife cookbook site install keeper_secrets_manager
```

#### 手動インストール

1. クックブックをダウンロード
2. cookbooksディレクトリに配置
3. Chefサーバーにアップロード

```bash
knife cookbook upload keeper_secrets_manager
```

### 認証

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

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

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

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

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

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

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

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

```bash
# データバッグを作成
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` ファイルを作成します。

```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`)
* **右側**: 出力仕様 (例: `Label2`、`env:Label2`、`file:/path/to/file`)

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

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

```
"UID/custom_field/Label1 > Label2"
```

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

2. **環境変数出力**

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

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

{% hint style="info" %}
`env:Label2` は環境変数としてエクスポートされ、`Label2` は出力JSONには含まれません。
{% endhint %}

3. **ファイル出力**

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

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

{% hint style="info" %}
ファイル名がキーとなり、ファイルパスが値となります。
{% endhint %}

#### input.jsonの完全な例

```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をコピー]** を選択

## 使用方法

### 基本インストール

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

### シークレットの取得

```ruby
# 独自の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
```

## 完全な例

```ruby
# 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をダウンロードするためのインターネット接続


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.keeper.io/keeperpam/jp/secrets-manager/integrations/chef.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
