ツナ缶雑記

ぐうたらSEのブログです。主にマイクロソフト系技術を中心に扱います。

Azure Pipelines の YAML から Azure Key Valut のシークレットにアクセスする

f:id:masatsuna:20200414150838p:plain

シークレットとは、秘匿しておきたいデータのことを言います。 例えば、本番データベースへの接続文字列などがこれに当たります。 Azure にはシークレットを管理するサービスとして、 Azure Key Vault があります。 今回はこれを Azure Pipelines の YAML から利用できるようにする手順を解説しようと思います。

Service Connection を追加する

[Project settings] から実施します。

f:id:masatsuna:20200410154647p:plain
Service Connection メニュー

[Azure Resource Manager] を選択して画面下部の [Next] を押下します。

f:id:masatsuna:20200410154858p:plain
Azure Resource Manager を選択

[Service Principal (automatic)] を選択します。

f:id:masatsuna:20200410155010p:plain
Service Principal を選択

接続先の Azure サブスクリプション、リソースグループをドロップダウンから選択します。

f:id:masatsuna:20200410161243p:plain
接続先を設定

操作途中でログイン画面が出てくるので、 Azure サブスクリプションに紐づいているユーザーでログインしましょう。

f:id:masatsuna:20200410155532p:plain
ログイン

ログイン後、引き続き任意の設定をいくつか行い、画面下部の [Save] ボタンを押下します。 これで Service Connection が貼られました。

続いてうまく設定ができたかどうか、 Azure Portal から確認してみます。 Azure Portal にログインして、先ほど設定したサブスクリプションディレクトリに移動します。 そして、 [Azure Active Directory] を検索して選択します。

f:id:masatsuna:20200410162113p:plain
Azure Active Directory の選択

続いて [アプリの登録] メニューを選択します。

f:id:masatsuna:20200410162552p:plain
アプリの登録を選択

右側ペインの上部にある [すべてのアプリケーション] タブを選択します。

f:id:masatsuna:20200410162709p:plain
すべてのアプリケーションを選択

そうすると、先ほど登録した Service Connection が参照できると思います。 [表示名] の列が「Azure DevOps の組織名 - Azure DevOpsのプロジェクト名 - Azure サブスクリプションの ID 」となっているレコードがそれになります。

これで Service Connection が作成できました。

Azure Key Vault を作成する

続いてシークレットを管理する Azure Key Vault を作成していきます。 Azure Portal で [キー コンテナー] または {Key Vault] で検索しましょう。 表示されたサービスの中から 「キー コンテナー 」を選択します。

f:id:masatsuna:20200413163101p:plain
Key Vault の検索

そのまま [追加] ボタンを押下し、 [基本] のタブ内でKey Vault のリソース名、配置するリソースグループ、リージョンを設定します。

f:id:masatsuna:20200413170750p:plain
Key Vault の基本設定

設定が完了したら [アクセスポリシー] のタブに移動します。 中段あたりにある [アクセスポリシーの追加] を押下します。

f:id:masatsuna:20200413171248p:plain
アクセスポリシーの追加

先ほど作成した Azure AD 上のアプリケーションから、この Key Vault に対するアクセス権を設定してきます。 今回は Key Vault のシークレットを利用できれば良いので、 [シークレットのアクセス許可] を開いて、 [取得] と [一覧] の権限を追加します。

f:id:masatsuna:20200413171648p:plain
シークレットの取得と一覧権限を設定

そして [プリンシパルの選択] を押下して、登録した Azure AD 上のアプリケーション名を検索して設定します。 「Azure DevOps の組織名 - Azure DevOpsのプロジェクト名 - Azure サブスクリプションの ID 」を検索して設定してください。

f:id:masatsuna:20200413171847p:plain
プリンシパルの選択

この設定が完了したら [作成] ボタンを押下します。 細かな設定については、要件に合わせて行ってください。

シークレットの登録

続いて作成した Key Vault に、シークレットを登録します。 [シークレット] のメニューを選択します。

f:id:masatsuna:20200413172603p:plain
[シークレット] メニューを選択

上部の [生成/インポート] ボタンを押下します。

f:id:masatsuna:20200413173033p:plain
[生成/インポート] を押下

シークレットはキー(名前)と値で構成します。 キー名、値を入力しましょう。 入力が完了したら [作成] を押下します。

f:id:masatsuna:20200413173218p:plain
キーと値の設定

これでシークレットが登録され、利用できるようになりました。

f:id:masatsuna:20200413173401p:plain
シークレット登録完了

Azure Pipelines に YAML を追加する

まずは YAML を保存するリポジトリを作成します。 手軽にやるなら、 Azure DevOps でプロジェクトのページに入り、 [Repos] → [Files] メニューを選択し、下部の [Initialize] ボタンを押下します。 今回は KeyValutTest0410 という名前のプロジェクトに、同名の Git リポジトリを作成しておきました。

続いて Azure Pipelines の YAML ファイルを作成していきます。 [Pipelines] → [Pipelines] メニューを選択し、[Create Pipeline] ボタンを押下します。

f:id:masatsuna:20200414093703p:plain
パイプラインの追加

YAML の保存先を選択します。 今回は作成した Azure Repos の Git リポジトリをそのまま使うようにします。

f:id:masatsuna:20200414093759p:plain
[Azure Repos Git] を選択

f:id:masatsuna:20200414093945p:plain
リポジトリを選択

新し YAML ファイルを作成するので、 [Starter pipeline] を選択します。

f:id:masatsuna:20200414094106p:plain
[Starter pipeline] を選択

これで YAML を作成するための画面になります。 ここに、 Azure Key Vault と接続するための設定を書いていきます。

f:id:masatsuna:20200414094224p:plain
YAML の作成画面

YAML から Azure Key Vault にアクセスする

YAML を編集していきましょう。 今回はトリガーなし(手動起動のみ)、 Microsoft-Hosted のビルドエージェントを利用するようにします。 テンプレートのコードを全部削除して、以下のように変更しておきます。

trigger: none

pool:
  vmImage: 'windows-latest'

steps:

続いて Azure Key Vault にアクセスする処理を追加していきます。 まずは画面右上にある [Show assistant] ボタンを押下しておきます。 これを利用すると、いきなり素の YAML を書かなくてもよくなるので便利です。

f:id:masatsuna:20200414110014p:plain
アシスタントの表示

Task の一覧が出てくるので、 [Azure Key Valut] のタスクを検索して選択します。

f:id:masatsuna:20200414110749p:plain
Key Vault のタスクを選択

[Azure subscription] のドロップダウンを開くと、最初に登録した Service Connection が表示されるので選択します。

f:id:masatsuna:20200414131214p:plain
Service Connection の選択

そして取得する Key Vault を [Key vault] のドロップダウンに設定します。 [Secrets filter] にはこのパイプライン内で使用するシークレットの名前をカンマ区切りで指定できます。 全部取得したい場合は「*」を入力しておきます。

f:id:masatsuna:20200414134316p:plain
取得する Key Vault の設定

そして左側の YAML 定義部分で、 steps: の次の行にカーソルを合わせて [Add] ボタンを押下します。 すると先ほど編集した結果が YAML として反映されます。

f:id:masatsuna:20200414140909p:plain
YAML に追加

ここまで実施することで、 YAML 内で Azure Key Vault の値を使用できるようになります。

YAML 内で Azure Key Vault に定義した値を取得する

Azure Key Vault には Secret1 という名前で Sample Value という値のシークレットを登録しておきました。 これを PowerShell のタスク内で取得して、値が設定されている確認してみます。

シークレットの値は、 YAML 内でシークレットの名前を変数にして取得できます。 今回の例では Secret1 という名前のシークレットを Azure Key Vault に登録しているので、 YAML 内では $(Secret1) と書くことでその値を取得できます。 ただし、普通の変数とは異なり、コンソールにその値を出力することは制限されています。 以下のようにして、設定した値(Sample Value)が取得できているか、コンソールにシークレットの値が流出しないか確認してみます。

trigger: none

pool:
  vmImage: 'windows-latest'

steps:
- task: AzureKeyVault@1
  inputs:
    azureSubscription: 'Connect to VmEnvironmentSampleRG'
    KeyVaultName: 'SampleSecrets'
    SecretsFilter: '*'
- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      Write-Host '$(Secret1)'
      If ('$(Secret1)' -eq 'Sample Value') {
        Write-Host 'Match'
      } Else {
        Write-Host 'Unmatch'
      }

これを実行すると以下のようになります。

f:id:masatsuna:20200414143454p:plain
実行結果

単純にシークレットの値をコンソールに出力するよう記載した箇所は、シークレットの値が *** に置き換えられていることがわかります。 しかし、その後に続く処理で、実際の値が Azure Key Vault に登録した Sample Value であったことが確認できました。

まとめ

今回は Azure Pipelines の YAML から Azure Key Vault にアクセスするまでの手順をかなり詳細に解説しました。 今回解説した方法と、以下の記事で解説した内容を YAML で書き直して組み合わせることで、 VM やコンテナー環境にリリースするアプリケーションの設定を Azure Pipelines から設定できるようになります。 セキュアな開発環境の構築が可能になるのではないでしょうか。

tsuna-can.hateblo.jp

tsuna-can.hateblo.jp