Secrets
シークレット管理
📚 情報ソース
このドキュメントは以下の情報源を基に作成されています:
主要ソース
補足ソース
- Instana Community: コミュニティフォーラムでの実装例
- 実運用環境の設定例: 本番環境での実際の設定パターン
HashiCorp Vault統合
📚 公式ドキュメント: HashiCorp Vault統合
機密情報(パスワード、APIキーなど)をVaultから取得できます。
| 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認証:
| com.instana.configuration.integration.vault:
connection_url: 'https://vault.example.com:8200'
github:
github_token: '<personal_access_token>'
auth_mount: 'github'
|
AppRole認証:
| com.instana.configuration.integration.vault:
connection_url: 'https://vault.example.com:8200'
approle:
role_id: '<roleId>'
secret_id: '<secretId>'
auth_mount: 'approle'
|
プラグインでのVault使用例:
| 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統合
| 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: "***"
使用例:
| # 正規表現を使用した高度なフィルタリング
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. 認証方法の選択
推奨度(高→低):
- AppRole認証 ⭐⭐⭐⭐⭐
- 本番環境で推奨
- Role IDとSecret IDを分離管理
-
自動ローテーション可能
-
Kubernetes認証 ⭐⭐⭐⭐
- Kubernetes環境で推奨
- ServiceAccountを使用
-
ポッドレベルの認証
-
Token認証 ⭐⭐⭐
- 開発環境のみ推奨
- 定期的なローテーション必須
-
有効期限を設定
-
GitHub認証 ⭐⭐
- 個人開発環境のみ
- Personal Access Tokenを使用
2. シークレットのローテーション
| # 推奨設定
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. 環境変数の使用
機密情報は環境変数から取得:
| # 環境変数の設定
export VAULT_ROLE_ID="your-role-id"
export VAULT_SECRET_ID="your-secret-id"
export VAULT_ADDR="https://vault.example.com:8200"
|
| # 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
|
原因と解決策:
-
Vaultサーバーが起動していない
| # Vaultの状態確認
vault status
# Vaultの起動
vault server -config=/etc/vault/config.hcl
|
-
ネットワーク接続の問題
| # 接続テスト
curl -k https://vault.example.com:8200/v1/sys/health
# ファイアウォール確認
telnet vault.example.com 8200
|
-
証明書の問題
| # CA証明書の確認
openssl s_client -connect vault.example.com:8200 -CAfile /etc/instana/vault-ca.crt
|
問題2: 認証エラー
症状:
| ERROR: Vault authentication failed: permission denied
|
解決策:
-
トークンの有効期限切れ
| # トークンの確認
vault token lookup
# 新しいトークンの作成
vault token create -policy=instana-read
|
-
AppRole認証の問題
| # Role IDの確認
vault read auth/approle/role/instana-agent/role-id
# Secret IDの生成
vault write -f auth/approle/role/instana-agent/secret-id
|
-
ポリシーの権限不足
| # ポリシーの確認
vault policy read instana-read
# ポリシーの更新
vault policy write instana-read instana-policy.hcl
|
問題3: シークレットが取得できない
症状:
| ERROR: Secret not found at path: secret/database/mysql
|
解決策:
-
パスの確認
| # シークレットの存在確認
vault kv get secret/database/mysql
# パスの一覧表示
vault kv list secret/database/
|
-
KVバージョンの不一致
| # 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
|
-
キー名の間違い
| # シークレットの内容確認
vault kv get -format=json secret/database/mysql | jq .data.data
|
問題4: シークレットの更新が反映されない
症状:
古いパスワードが使用され続ける
解決策:
-
更新間隔の確認
| com.instana.configuration.integration.vault:
secret_refresh_rate: 1 # テスト用に1時間に設定
|
-
Agentの再起動
| # Agentの再起動
sudo systemctl restart instana-agent
# ログの確認
sudo journalctl -u instana-agent -f
|
-
キャッシュのクリア
| # Agentのキャッシュディレクトリをクリア
sudo rm -rf /opt/instana/agent/data/cache/*
sudo systemctl restart instana-agent
|
問題5: シークレットフィルタリングが機能しない
症状:
機密情報がログに表示される
解決策:
-
マッチャーの確認
| # 大文字小文字を区別しない設定
com.instana.secrets:
matcher: 'contains-ignore-case' # 推奨
# matcher: 'contains' # 大文字小文字を区別
|
-
キーワードの追加
| com.instana.secrets:
matcher: 'regex'
list:
- '.*password.*'
- '.*secret.*'
- '.*token.*'
- '.*key.*' # より広範囲にマッチ
|
-
設定の反映確認
| # 設定ファイルの構文チェック
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を使用してください。
| # 開発環境のみ
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. 監査ログを確認して不正アクセスがないか確認
参考リンク