Skip to content

Secrets

シークレット管理


📚 情報ソース

このドキュメントは以下の情報源を基に作成されています:

主要ソース

補足ソース

  • Instana Community: コミュニティフォーラムでの実装例
  • 実運用環境の設定例: 本番環境での実際の設定パターン

HashiCorp Vault統合

📚 公式ドキュメント: HashiCorp Vault統合

機密情報(パスワード、APIキーなど)をVaultから取得できます。

1
2
3
4
5
6
com.instana.configuration.integration.vault:
  connection_url: 'http://127.0.0.1:8200'  # VaultサーバーのURL
  token: '<vault_access_token>'             # Vaultアクセストークン
  kv_version: 2                             # Key/Valueエンジンのバージョン
  secret_refresh_rate: 24                   # シークレット更新間隔(時間)
  path_to_pem_file: '/path/to/ca.crt'     # HTTPS用CA証明書

設定値の取得方法:

項目 取得方法
connection_url Vault管理者に確認、またはecho $VAULT_ADDRで確認
token vault token create -policy=instana-readで作成
kv_version Vault管理者に確認、またはvault secrets list -detailedで確認
path_to_pem_file Vault管理者からCA証明書を取得

設定項目の詳細:

項目 説明 必須 デフォルト
connection_url VaultサーバーのベースURL なし
token 読み取り権限を持つVaultトークン ❌* なし
kv_version Key/Valueエンジンのバージョン 2
secret_refresh_rate 更新頻度(時間) 24

*他の認証方法(GitHub、AppRole)を使用する場合は不要

GitHub認証:

1
2
3
4
5
com.instana.configuration.integration.vault:
  connection_url: 'https://vault.example.com:8200'
  github:
    github_token: '<personal_access_token>'
    auth_mount: 'github'

AppRole認証:

1
2
3
4
5
6
com.instana.configuration.integration.vault:
  connection_url: 'https://vault.example.com:8200'
  approle:
    role_id: '<roleId>'
    secret_id: '<secretId>'
    auth_mount: 'approle'

プラグインでのVault使用例:

1
2
3
4
5
6
7
8
com.instana.plugin.mysql:
  user: 'dbuser'
  password:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/mysql'
        key: 'password'

IBM Cloud Secrets Manager統合

📚 公式ドキュメント: IBM Cloud Secrets Manager統合

1
2
3
4
com.instana.configuration.integration.vault:
  connection_url: 'https://<instance-id>.us-south.secrets-manager.appdomain.cloud'
  ibm_secrets_manager: '<iam_key>'
  secret_refresh_rate: 24

設定値の取得方法:

項目 取得方法
connection_url IBM Cloud コンソール > Secrets Manager > エンドポイント
ibm_secrets_manager IBM Cloud コンソール > アクセス(IAM) > APIキー > 作成

シークレットフィルタリング (com.instana.secrets)

📚 公式ドキュメント: シークレットフィルタリング (com.instana.secrets)

センサーが収集するデータから機密情報を自動的にフィルタリング(マスキング)します。

com.instana.secrets:
  matcher: 'contains-ignore-case'  # マッチング方法
  list:
    - 'key'
    - 'password'
    - 'secret'
    - 'token'
    - 'apikey'
    - 'credential'
    - 'auth'

設定項目の説明:

項目 説明 取得方法
matcher マッチング方法 下記の3つから選択
list フィルタリング対象のキーワード 機密情報を含む可能性のあるキー名

マッチング方法: - contains-ignore-case: 大文字小文字を区別せず部分一致(推奨) - contains: 大文字小文字を区別して部分一致 - regex: 正規表現でマッチング

動作: - リストに含まれるキーワードに一致するキー名の値が *** でマスキングされます - 例: password: "secret123"password: "***"

使用例:

1
2
3
4
5
6
7
8
# 正規表現を使用した高度なフィルタリング
com.instana.secrets:
  matcher: 'regex'
  list:
    - '.*password.*'
    - '.*secret.*'
    - '.*token.*'
    - 'api[_-]?key'


実践的な使用例

シナリオ1: 本番環境でのVault統合

本番環境では、AppRole認証を使用してセキュリティを強化します。

# Vault統合設定
com.instana.configuration.integration.vault:
  connection_url: 'https://vault.prod.example.com:8200'
  approle:
    role_id: '${VAULT_ROLE_ID}'  # 環境変数から取得
    secret_id: '${VAULT_SECRET_ID}'
    auth_mount: 'approle'
  kv_version: 2
  secret_refresh_rate: 12  # 12時間ごとに更新
  path_to_pem_file: '/etc/instana/vault-ca.crt'

# シークレットフィルタリング
com.instana.secrets:
  matcher: 'contains-ignore-case'
  list:
    - 'password'
    - 'passwd'
    - 'pwd'
    - 'secret'
    - 'token'
    - 'apikey'
    - 'api_key'
    - 'access_key'
    - 'private_key'
    - 'credential'
    - 'auth'
    - 'bearer'

# データベース接続でVaultを使用
com.instana.plugin.postgresql:
  host: 'db.prod.example.com'
  port: 5432
  database: 'production'
  user:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/database/postgresql'
        key: 'username'
  password:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/database/postgresql'
        key: 'password'

シナリオ2: マルチクラウド環境でのシークレット管理

AWS、Azure、GCPが混在する環境での設定例:

# AWS Secrets Managerとの統合(Vault経由)
com.instana.plugin.aws:
  access_key:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/aws/monitoring'
        key: 'access_key_id'
  secret_key:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/aws/monitoring'
        key: 'secret_access_key'

# Azure Key Vaultとの統合(Vault経由)
com.instana.plugin.azure:
  client_id:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/azure/monitoring'
        key: 'client_id'
  client_secret:
    configuration_from:
      type: vault
      secret_key:
        path: 'secret/azure/monitoring'
        key: 'client_secret'

シナリオ3: Kubernetes環境でのシークレット管理

Kubernetes Secretsを使用した設定:

# ConfigMapとSecretの組み合わせ
# ConfigMap: 非機密情報
apiVersion: v1
kind: ConfigMap
metadata:
  name: instana-agent-config
data:
  configuration.yaml: |
    com.instana.plugin.mysql:
      host: 'mysql.default.svc.cluster.local'
      port: 3306
      database: 'app_db'
      user:
        configuration_from:
          type: vault
          secret_key:
            path: 'secret/k8s/mysql'
            key: 'username'
      password:
        configuration_from:
          type: vault
          secret_key:
            path: 'secret/k8s/mysql'
            key: 'password'

---
# Secret: Vault認証情報
apiVersion: v1
kind: Secret
metadata:
  name: instana-vault-auth
type: Opaque
stringData:
  VAULT_ROLE_ID: "your-role-id"
  VAULT_SECRET_ID: "your-secret-id"

セキュリティベストプラクティス

1. 認証方法の選択

推奨度(高→低):

  1. AppRole認証 ⭐⭐⭐⭐⭐
  2. 本番環境で推奨
  3. Role IDとSecret IDを分離管理
  4. 自動ローテーション可能

  5. Kubernetes認証 ⭐⭐⭐⭐

  6. Kubernetes環境で推奨
  7. ServiceAccountを使用
  8. ポッドレベルの認証

  9. Token認証 ⭐⭐⭐

  10. 開発環境のみ推奨
  11. 定期的なローテーション必須
  12. 有効期限を設定

  13. GitHub認証 ⭐⭐

  14. 個人開発環境のみ
  15. Personal Access Tokenを使用

2. シークレットのローテーション

1
2
3
4
5
# 推奨設定
com.instana.configuration.integration.vault:
  secret_refresh_rate: 12  # 12時間ごと(本番環境)
  # secret_refresh_rate: 6   # 6時間ごと(高セキュリティ環境)
  # secret_refresh_rate: 24  # 24時間ごと(開発環境)

ローテーション戦略: - 本番環境: 12時間ごと - 高セキュリティ環境: 6時間ごと - 開発環境: 24時間ごと - 緊急時: 即座にローテーション

3. アクセス制御

Vaultポリシーの例:

# Instana Agent用の最小権限ポリシー
path "secret/data/database/*" {
  capabilities = ["read"]
}

path "secret/data/aws/*" {
  capabilities = ["read"]
}

path "secret/data/azure/*" {
  capabilities = ["read"]
}

# 書き込み権限は付与しない

4. 監査とロギング

# Vault監査ログの有効化(Vault側の設定)
# vault audit enable file file_path=/var/log/vault/audit.log

# Instana Agentのログレベル設定

### 5. ネットワークセキュリティ

```yaml
# TLS/SSL必須
com.instana.configuration.integration.vault:
  connection_url: 'https://vault.example.com:8200'  # HTTPSを使用
  path_to_pem_file: '/etc/instana/vault-ca.crt'    # CA証明書を指定

# 証明書検証の設定
# 本番環境では証明書検証を無効にしない

6. 環境変数の使用

機密情報は環境変数から取得:

1
2
3
4
# 環境変数の設定
export VAULT_ROLE_ID="your-role-id"
export VAULT_SECRET_ID="your-secret-id"
export VAULT_ADDR="https://vault.example.com:8200"
1
2
3
4
5
6
# configuration.yamlで環境変数を参照
com.instana.configuration.integration.vault:
  connection_url: '${VAULT_ADDR}'
  approle:
    role_id: '${VAULT_ROLE_ID}'
    secret_id: '${VAULT_SECRET_ID}'

7. シークレットフィルタリングの強化

# 包括的なフィルタリング設定
com.instana.secrets:
  matcher: 'regex'
  list:
    # パスワード関連
    - '.*password.*'
    - '.*passwd.*'
    - '.*pwd.*'
    # トークン関連
    - '.*token.*'
    - '.*bearer.*'
    - '.*jwt.*'
    # APIキー関連
    - '.*api[_-]?key.*'
    - '.*access[_-]?key.*'
    - '.*secret[_-]?key.*'
    # 認証情報
    - '.*credential.*'
    - '.*auth.*'
    - '.*private[_-]?key.*'
    # クラウドプロバイダー固有
    - '.*aws[_-]?secret.*'
    - '.*azure[_-]?secret.*'
    - '.*gcp[_-]?key.*'

トラブルシューティング

問題1: Vaultへの接続エラー

症状:

ERROR: Failed to connect to Vault: connection refused

原因と解決策:

  1. Vaultサーバーが起動していない

    1
    2
    3
    4
    5
    # Vaultの状態確認
    vault status
    
    # Vaultの起動
    vault server -config=/etc/vault/config.hcl
    

  2. ネットワーク接続の問題

    1
    2
    3
    4
    5
    # 接続テスト
    curl -k https://vault.example.com:8200/v1/sys/health
    
    # ファイアウォール確認
    telnet vault.example.com 8200
    

  3. 証明書の問題

    # CA証明書の確認
    openssl s_client -connect vault.example.com:8200 -CAfile /etc/instana/vault-ca.crt
    

問題2: 認証エラー

症状:

ERROR: Vault authentication failed: permission denied

解決策:

  1. トークンの有効期限切れ

    1
    2
    3
    4
    5
    # トークンの確認
    vault token lookup
    
    # 新しいトークンの作成
    vault token create -policy=instana-read
    

  2. AppRole認証の問題

    1
    2
    3
    4
    5
    # Role IDの確認
    vault read auth/approle/role/instana-agent/role-id
    
    # Secret IDの生成
    vault write -f auth/approle/role/instana-agent/secret-id
    

  3. ポリシーの権限不足

    1
    2
    3
    4
    5
    # ポリシーの確認
    vault policy read instana-read
    
    # ポリシーの更新
    vault policy write instana-read instana-policy.hcl
    

問題3: シークレットが取得できない

症状:

ERROR: Secret not found at path: secret/database/mysql

解決策:

  1. パスの確認

    1
    2
    3
    4
    5
    # シークレットの存在確認
    vault kv get secret/database/mysql
    
    # パスの一覧表示
    vault kv list secret/database/
    

  2. KVバージョンの不一致

    1
    2
    3
    4
    5
    6
    7
    8
    # KV v2の場合
    com.instana.configuration.integration.vault:
      kv_version: 2
    
    # パスに "data" を含める必要がある場合
    secret_key:
      path: 'secret/data/database/mysql'  # KV v2
      # path: 'secret/database/mysql'     # KV v1
    

  3. キー名の間違い

    # シークレットの内容確認
    vault kv get -format=json secret/database/mysql | jq .data.data
    

問題4: シークレットの更新が反映されない

症状: 古いパスワードが使用され続ける

解決策:

  1. 更新間隔の確認

    com.instana.configuration.integration.vault:
      secret_refresh_rate: 1  # テスト用に1時間に設定
    

  2. Agentの再起動

    1
    2
    3
    4
    5
    # Agentの再起動
    sudo systemctl restart instana-agent
    
    # ログの確認
    sudo journalctl -u instana-agent -f
    

  3. キャッシュのクリア

    1
    2
    3
    # Agentのキャッシュディレクトリをクリア
    sudo rm -rf /opt/instana/agent/data/cache/*
    sudo systemctl restart instana-agent
    

問題5: シークレットフィルタリングが機能しない

症状: 機密情報がログに表示される

解決策:

  1. マッチャーの確認

    1
    2
    3
    4
    # 大文字小文字を区別しない設定
    com.instana.secrets:
      matcher: 'contains-ignore-case'  # 推奨
      # matcher: 'contains'  # 大文字小文字を区別
    

  2. キーワードの追加

    1
    2
    3
    4
    5
    6
    7
    com.instana.secrets:
      matcher: 'regex'
      list:
        - '.*password.*'
        - '.*secret.*'
        - '.*token.*'
        - '.*key.*'  # より広範囲にマッチ
    

  3. 設定の反映確認

    1
    2
    3
    4
    5
    # 設定ファイルの構文チェック
    yamllint /opt/instana/agent/etc/instana/configuration.yaml
    
    # Agentの再起動
    sudo systemctl restart instana-agent
    


よくある質問(FAQ)

Q1: VaultとIBM Cloud Secrets Managerの違いは?

A: - HashiCorp Vault: オンプレミス・マルチクラウド対応、高度なカスタマイズ可能 - IBM Cloud Secrets Manager: IBM Cloud専用、簡単なセットアップ、IBM Cloudサービスとの統合が容易

Q2: 開発環境でVaultなしで動作確認できますか?

A: はい、開発環境では直接パスワードを記述できますが、本番環境では必ずVaultを使用してください。

1
2
3
4
# 開発環境のみ
com.instana.plugin.mysql:
  user: 'devuser'
  password: 'devpassword'  # 本番環境では使用しない

Q3: 複数のVaultサーバーを使用できますか?

A: 現在、Instana Agentは1つのVaultサーバーのみサポートしています。高可用性が必要な場合は、Vault側でHAクラスタを構成してください。

Q4: シークレットのローテーション中にダウンタイムは発生しますか?

A: いいえ、Instana Agentは新しいシークレットを取得してから古い接続を切断するため、ダウンタイムは発生しません。

Q5: Vaultのトークンが漏洩した場合の対処法は?

A: 1. 即座にトークンを無効化: vault token revoke <token> 2. 新しいトークンを生成 3. Agentの設定を更新 4. Agentを再起動 5. 監査ログを確認して不正アクセスがないか確認


参考リンク