操り人形Azureキー・ヴォールト統合


操り人形Azureキー・ヴォールト統合
今日の風景は自動化が必要だが、大きな力で大きな責任が生まれる.自動化されたソリューションを開発するときに、マシンの資格情報、APIキーおよびパスワードなどの機密データを適切に扱うことは必ずしも容易ではありません.つの一般的な課題は、アプリケーションによって使用するアプリケーションの構成ファイルに安全なストレージから秘密を取得しています.
Azureは、AzureキーVaultとAzureマネージアイデンティティを使用して、Azure仮想マシンのこのプロセスを簡素化するのに役立ちます.AzureキーVaultは、キー、秘密、および証明書を管理するために使用されるクラウドサービスです.Azure Managed Identityは、この場合、仮想マシンがAbureキーVaultに割り当てられたアイデンティティを使用する許可を与えられるのを可能にします.
このブログ記事は、どのように操り人形がAzure Virtual Machineの上でアプリケーション構成ファイルにAzureキーVaultに格納される秘密を書くのを単純化するためにネイティブのAzureサービスと融和することができるかについて見ます.

AzureキーVault人形モジュール


The azure_key_vault Forgeモジュールは、Hieraとエージェント側の検索を使用してサーバ側の秘密の検索をサポートしています.モジュールは、AzureキーVaultに格納された秘密にアクセスするためにAzureキーVaultと相互作用するためのアクセス資格情報を取得するAzureメタデータサービスを利用します.
サーバ側検索
モジュールは、カスタムhieraバックエンドのサポートを含みます.これは、人形コードがHIRAルックアップの間、AzureキーVaultから敏感なデータを取り出すのを可能にします.操り主マスタは、AzureキーVaultから機密データをフェッチして、暗号化されていないデータを安全なエージェント通信チャネルの上のエージェントに送ります.このポストの焦点はエージェント側検索にあります、そして、サーバー側検索に関する追加情報はモジュールのドキュメンテーションで見つかります.
エージェント側検索(遅延関数)
人形6は、既知のものを含むdeferred functions , これらの機能は、パペット実行の一部としてエージェントノードで実行するように機能します.遅延機能を利用することは、Hieraによるサーバー側検索の上で多くの利点を持ちます.最も大きな利点の1つは、機密データがマスター上で復号化される必要はなく、次にエージェントノードに配送される必要がないことである.

Azureキーボールト統合


私たちがどのように延期された関数がどのように機能しているか、そしてAzureRenkeyKeyultモジュールがどのようにサポートしているかを理解しているので、その統合の例を見ていきます.
この例では、エージェントノードによってAzureキーVaultからフェッチされるパスワードを持つPuppetを使用して動的に設定されたアプリケーション構成ファイルです.

紺色認証


エージェントノードの仮想マシンはAzure上で動作し、AllureキーVaultにアクセスするための適切なアクセス許可を持つマネージシステムIDまたはユーザー割り当てのIDを使用します.

アプリケーションモジュール


デモアプリケーションのPuppetモジュールでは、initを作成する必要があります.PPマニフェストと設定.山口大モジュールのファイルディレクトリのEPPテンプレートファイル.
次の例では、設定ファイルにパスワードを設定するAzureキーVaultの統合を強調表示します.この例では、パペットのEPPテンプレートを使用してファイルの内容を動的に作成して設定します.
--------
host: <%= $host %>
password: <%= $admin_password_secret.unwrap %>

The template file is placed in the module’s files directory instead of the templates directory since the template file must be present on the agent node for the deferred rendering. https://puppet.com/docs/puppet/6.17/template_with_deferred_values.html


次のマニフェストは、AzureキーVaultから取得した値によってパスワードが設定されているかを示します.
class demoapp (
  String $key_vault_name = 'grtdevvault',
  String $key_vault_secret_name = 'app-password',
  String $host = 'grtapp01.grt.local',
) {

$password = Deferred('azure_key_vault::secret',
                ["$key_vault_name","$key_vault_secret_name",{"metadata_api_version"=>"2018-04-02","vault_api_version"=>"2016-10-01"}])

$hash_variables = {
    'admin_password_secret' => $password,
    'host' => $host,
  }

file { '/opt/demoapp':
    ensure => directory,
  }

file { '/opt/demoapp/config.yaml':
    ensure => file,
    content => Deferred('inline_epp',
                [file('demoapp/config.yaml.epp'), $hash_variables]),
  }
}
今私たちのパペットコードが追加されている、次の傀儡エージェントの実行は、設定ファイル内のパスワードの暗号化されていないバージョンでは、エージェントのノードのファイルシステムにファイルを書き込みます.以下のようなアプリケーションで使用するYAMLファイル.
--------
host: grtapp01.grt.local
password: Secret12345
このブログのポストは、パスワードのような機密データが確実に保存され、処理されていることを保証するためのシンプルで強力なユースケースをカバーしました.

参考文献


後続関数を持つ人形EPPテンプレート
https://puppet.com/docs/puppet/6.17/template_with_deferred_values.html
仮想マシン管理アイデンティティ
https://docs.microsoft.com/en-us/azure/key-vault/general/tutorial-python-virtual-machine