シークレット管理を使用すると、構成ファイルにプレーン テキストとして機密データ (パスワードなど) を書き込むことなく、機密データ (パスワードなど) を使用するようにエージェントとオンホストの統合を構成できます。現在、Hashicorp Vault、AWS KMS、CyberArk、New Relic CLI の難読化およびカスタム コマンドがサポートされています。
詳しくは、NerdBytesのビデオ(5分12秒)をご覧ください。
秘密の定義
設定用YAMLファイルでシークレットを使用するには
variables
セクションを定義します。各エントリはシークレットオブジェクトの名前です。- 各エントリには、秘密のソースと、それらの秘密を取得するための適切な構成を含めてください。
- 一般的な構成セクションで、シークレットオブジェクトのプロパティによって自動的に置き換えられる
${variable.property}
プレースホルダーを設定します。シークレットオブジェクトは、単純な文字列またはjsonオブジェクトとして定義できます。
重要
秘密の検索に失敗すると、インフラストラクチャ・エージェントが実行に必要なすべてのデータを持っていないため、統合は実行されません。
たとえば、次の構成では、Vaultからcreds
という名前のオブジェクトを取得します(シークレットのオブジェクト名を定義できます)。保存されたオブジェクトが、 user
という名前のプロパティとpassword
という名前の別のプロパティを持つ有効なJSONであると仮定します。それらを使用して、Nginxオンホスト統合からのstatus_url
プロパティの基本HTTPクレデンシャルを設定します。
variables: creds: vault: http: url: http://my.vault.host/v1/newengine/data/secret headers: X-Vault-Token: my-vault-tokenintegrations: - name: nri-nginx env: METRICS: "true" STATUS_URL: http://${creds.user}:${creds.password}@example.com/status STATUS_MODULE: discover REMOTE_MONITORING: true interval: 30s labels: env: production role: load_balancer
ヒント
変数からは、単純な文字列と有効なJSONオブジェクトの両方を取得することができます。
JSONオブジェクトを使用する場合は、キーと値の両方がダブルクオートで囲まれていることを確認してください。
環境変数の使用
環境変数は、 {{MY_ENV_VAR}}
表記でvariables
セクションに使用できます。その際、環境変数が展開され、実行時にその値が置き換えられます。
トークンや難読化キーなどの機密性の高い値が設定ファイルに含まれないようにするには、この方法を使用します。
オンホストの統合設定ファイルで環境変数を使用する場合、 passthrough_environment 設定を定義する必要があります。
秘密の変数
variables
セクションの下の各構成でシークレットを定義します。各エントリは、取得したシークレットのプロパティを格納するユーザー定義のシークレット名です。各変数には、次のプロパティを含めることができます。
YAMLキー | 説明 |
---|---|
タイプ文字列 | シークレットが更新されるまでの時間。これは、数値の後に時間単位( 例: デフォルト: |
| |
| |
| CyberArkのコマンドラインインターフェイスの設定 |
| |
|
AWS KMSの秘密
Amazon KMSからシークレットを取得するには、 aws-kms
セクションで次のプロパティを設定できます。すべてのフィールドが必須というわけではありません。たとえば、エンコードされたKMS文字列を提供するには、 data
、 file
、またはhttp
のいずれかが必要になります。
YAMLキー | 説明 |
---|---|
タイプ文字列 | 復号化するBase64エンコードされたKMS文字列 |
タイプ文字列 | 復号化するBase64エンコードされたKMS文字列を含むファイルへのパス |
タイプYAMLプロパティ | Base64でエンコードされたKMS文字列を復号化するように要求するために使用するHTTP構成。詳細については、 Vault |
タイプ文字列 | AWS認証情報ファイルへのパス |
タイプ文字列 | AWS設定ファイルへのパス |
タイプ文字列 | AWS KMSリージョン |
タイプ:文字列( | 秘密の値のフォーマット。
|
次の例では、AWSKMSからプレーンなパスワード文字列を取得できます。提供されたdata
エンコード文字列から復号化する必要があります。
variables: myPassword: aws-kms: data: T0hBSStGTEVY region: ap-southeast-2 credential_file: "./my-aws-credentials-file" config_file: "./my-aws-config-file" type: plain
ヴォールトの秘密
Vaultは、Vaultへの接続に使用されるHTTP構成を含むhttp
フィールドを有効にする必要があります。httpエントリには、次のエントリを含めることができます。
YAMLキー | 説明 |
---|---|
タイプ文字列 | データを要求するURL |
タイプYAMLプロパティ | |
タイプYAMLマップ | リクエストヘッダー |
tls_configプロパティ
重要
シークレットはドット表記を使用する必要があります(例: ${mysecret.nestedkey}
。
YAMLキー | 説明 |
---|---|
タイプブーリアン | TLSを有効にする デフォルト: |
タイプブーリアン | サーバーの証明書チェーンとホストの検証をスキップする デフォルト: |
型。UInt16 | 受け入れ可能なSSL/TLSの最小バージョン デフォルト: |
型。UInt16 | 許容される最大のSSL/TLSバージョン デフォルト: |
タイプ文字列 | TLS証明書
|
次の例では、セキュリティで保護されたサーバーから Vault トークンを使用してシークレットを取得し、サーバー証明書の検証をスキップします。
variables: mydata: vault: http: url: https://my.vault.host/v1/newengine/data/secret headers: X-Vault-Token: my-vault-token tls_config: insecure_skip_verify: true
CyberArkのコマンドラインインターフェイス
CyberArkのコマンドラインインターフェイス(CLI)からシークレットを取得するには、以下の構成を使用します。すべてのキーが必要です。
YAMLキー | 説明 |
---|---|
タイプ:文字列 | CyberArk CLI実行ファイルのフルパス デフォルト:"" |
タイプ:文字列 | 秘密保持者のアプリケーションID デフォルト:"" |
タイプ:文字列 | 秘密が詰まった金庫 デフォルト:"" |
タイプ:文字列 | 秘伝書の入ったフォルダ デフォルト:"" |
タイプ:文字列 | 秘密が関連付けられているオブジェクト デフォルト:"" |
次の例では、コマンドライン・インターフェースを使ってCyberArkの秘密を取得します。
variables: credentials: cyberark-cli: cli: /full/path/to/clipasswordsdk app-id: my-appid safe: my-safe folder: my-folder object: my-object
CyberArk REST API
CyberArk REST APIを使用してシークレットを取得するには、HTTP構成を含むhttp
キーが必要です。http
キーにはこれらのサブキーが含まれています。必要なのはurl
のみです。
YAMLキー | 説明 |
---|---|
タイプ文字列 | データを要求するURL、このキーが必要です。 デフォルト:なし |
タイプYAMLプロパティ | |
タイプYAMLマップ | リクエストヘッダー |
次の例では、CyberArk REST APIを使用して、サーバー証明書の検証を省略してシークレットを取得しています。
variables: credentials: cyberark-api: http: url: https://hostname/AIMWebService/api/Accounts?AppID=myAppID&Query=Safe=mySafe;Object=myObject tls_config: insecure_skip_verify: true
上記の例を参考にして、ユーザー名とパスワードを次のように呼び出します。
USERNAME: ${credentials.user} PASSWORD: ${credentials.password}
注: Microsoft SQL Server の場合、Windows 認証ユーザー ログインを使用する場合は、 USERNAME
前にドメインを付ける必要があります。 例えば:
USERNAME: <domain>\${credentials.user}
New Relic CLIの難読化
重要
可能であれば、単純な難読化ではなく、サポートされているシークレットプロバイダーを使用することをお勧めします。
下記のガイドラインを参照して、環境変数を定義し、設定ファイルに難読化キーを持たないようにしてください。
Windowsホストでは、コマンドプロンプトウィンドウではなく、Powershellを使用してください。コマンドプロンプトウィンドウでは、引用符が予期せぬ方法で処理されることがあるからです。
ヒント
インフラストラクチャ エージェント 1.14.0 以降が必要です
New Relic CLI の obfuscate コマンドを使用すると、インフラストラクチャ エージェントやオンホストの統合設定ファイル内の機密情報を不明瞭にすることができます。
ステップ
- New Relic CLI を任意のホスト(開発用のホストでも可)にインストールします。
- 難読化された値を生成するために、CLI obfuscateコマンド を実行します。
newrelic agent config obfuscate --value '<plain_text_config_value>' --key '<obfuscation_key>'
- 以下の例に示すように、cliコマンドの結果を
obfuscated
セクションのtext
引数にコピーします。 - 構成YMLファイルで複数の値を参照する必要がある場合は、JSONブロックを難読化できます。Windowsホストでは、引用符
""
を円記号でエスケープする必要がある場合があることに注意してください。例:'{\"attribute\":\"value\"...
。さらに、コマンドプロンプトウィンドウでは予期しない方法で引用符を処理できるため、コマンドプロンプトウィンドウではなく、WindowsホストでPowershellを使用してください。
newrelic agent config obfuscate --value '{"attribute":"value","attribute2":"value2"}' --key '<obfuscation_key>'
YAMLキー | 説明 |
---|---|
キー タイプ文字列 | New Relic CLI を使用してクリアテキスト値を難読化する際に使用する文字列 デフォルト:なし |
タイプ文字列 | newrelic-cliコマンドの出力結果 デフォルト:なし |
Integrations configuration example
次の例では、New Relic CLI を使用して難読化された Nginx のユーザー名とパスワードを取得できます。 この例では、難読化された値が JSON ブロックであるため、資格情報を取得するときにドット表記を使用します。
variables: creds: obfuscated: key: 'random_key_used_in_cli' secret: 'obscured_output_from_cli'integrations: - name: nri-nginx env: METRICS: "true" STATUS_URL: http://${creds.user}:${creds.password}@example.com/status STATUS_MODULE: discover REMOTE_MONITORING: true interval: 30s labels: env: production role: load_balancer
以下の例のように、難読化の引数に環境変数を使用することをお勧めします。
variables: creds: obfuscated: key: {{OBFUSCATION_KEY}} secret: {{OBFUSCATION_TEXT}}integrations: - name: nri-nginx env: METRICS: "true" STATUS_URL: http://${creds.user}:${creds.password}@example.com/status STATUS_MODULE: discover REMOTE_MONITORING: true interval: 30s labels: env: production role: load_balancer
Agent configuration example
この例では、プロキシの詳細 (ユーザー、パスワード、ホスト) を含む文字列を取得できます。
variables: obfuscated_proxy: obfuscated: key: 'random_key_used_in_cli' secret: 'obscured_output_from_cli'
proxy: ${obfuscated_proxy}
カスタムコマンド
重要
command
構成には、インフラストラクチャ エージェント 1.41.0
以降が必要です。環境要件に基づいて、構成された command
を実行するために必要な権限がエージェントにあることを確認してください。
同じホストで使用できるカスタム コマンドからエージェントまたは統合の構成を読み込むことができます。インフラストラクチャ エージェントは、構成を最初に command
出力からロードするタイミングを検出し、 ttl
の更新時間に基づいて値を更新し続けます。
コマンドの予期される出力形式は、JSON または String のいずれかです。
JSON
次の JSON 構造は、定義された command
からのメイン出力 (stdout) として想定されます。
{ "data": { "myKey": "myValue" }, "ttl": "24h"}
- 最上位の
data
フィールドは必須です。 - 最上位の
ttl
フィールドは必須です。
これは、 ${myVariable.key}
表記を使用して任意の構成ファイルで使用できます。次の例では、 my-custom-auth
コマンドが domain
パラメータを指定して実行され、結果の token
エージェント構成としてロードされます。
variables: myToken: command: path: '/path/to/my-custom-auth-json' args: ["--domain", "myDomain", "--other_param", "otherValue"] ttl: 24h # my-custom-auth output example: {"data":{"token":"XXXXYYYYZZZZ"}, "ttl": "24h"}# the `token` result can be included as ${myToken.token} in any configuration. http: headers: "Proxy-Authorization": ${myToken.token}
文字列(テキスト/プレーン)
コマンド出力がプレーン文字列の場合は、構成内で ${myVar}
表記を使用して参照できます。
例:
variables: myToken: command: path: '/path/to/my-custom-auth-string' args: ["arg1", "arg2"] ttl: 24h # my-custom-auth output example: "XXXXYYYYZZZZ"# the `token` result can be included as ${myToken} on any configuration. http: headers: "Proxy-Authorization": ${myToken}