Azure Pipelines でシークレットを保護する

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

この記事では、Azure Pipelines でのシークレットの保護に関するベスト プラクティスについて説明します。 シークレットは、API キー、パスワード、証明書、暗号化キーなど、アクセスを厳密に制御する必要がある任意のものです。

Azure Pipelines ではシークレット値は生成されません。 ただし、API キーなどの機密データを格納するために、パイプラインにシークレットを追加することが必要になる場合があります。 シークレット変数の設定の詳細については、「シークレット変数設定する」を参照してください。

別のメソッドが使用可能な場合はシークレットを使用しない

シークレットを保護する最善の方法は、最初にシークレットを持つことではありません。 パイプラインで、シークレットを使用してタスクを実行する方法と異なる方法を使用できるかどうかを確認します。

  • サービス接続を使用する:
    • Azure またはその他のサービスを対象としている場合は、変数内のシークレットを管理する代わりにサービス接続を使用します。
    • サービス接続を使用すると、パイプライン構成で機密情報を直接公開することなく、外部サービスに安全に接続できます。
    • 詳細については、「サービス接続の管理および Azure Resource Manager サービス接続を使用した Microsoft Azure への接続を参照してください。
  • マネージド ID を使用する:

    • シークレットを直接処理するのではなく、マネージド ID を使用することを検討してください。
    • マネージド ID を使用すると、アプリケーションとサービスは、明示的な資格情報を必要とせずに、Azure サービスでセキュリティを認証できます。
    • マネージド ID を使用して他の Azure サービスにアクセス
  • Azure CLI タスク:

    • Azure CLI タスクを使用している場合パイプラインで、addSpnToEnvironment設定を使用して、シークレットを明示的に渡さずにスクリプトのサービス プリンシパルの詳細にアクセスすることを検討してください。

詳細については、「 サービス プリンシパルとマネージド ID の使用」を参照してください。

シークレット変数を使用する

機密値をプレーンテキストとして Azure Pipelines .yml ファイルに格納しないでください。

シークレット変数は、パイプラインで公開したくなかった、パスワード、ID、その他の識別データなどの個人情報用に使用できます。 Azure Key Vault を使用してシークレット変数を設定することをお勧めします。 UI または変数グループでシークレット変数を設定することもできます。 ログ コマンドを使用してシークレット変数を設定することはお勧めしません。 ログ コマンドを使用してシークレットを設定すると、パイプラインにアクセスできるすべてのユーザーがシークレットを表示することもできます。

シークレット変数は暗号化され、値を公開せずにパイプラインで使用できます。 値は公開されませんが、シークレットを出力としてエコーしたり、コマンド ラインでシークレットを渡したりすることはありません。 代わりに、シークレットを環境変数にマップすることをお勧めします。

シークレットを作成するときは、 可変の名前付けガイドラインに従い シークレット名が機密情報を開示していないことを確認します。

シークレット変数へのアクセスを制限する

Azure DevOps のシークレットへのアクセスを制限するには、次のベスト プラクティスに従います。

  • シークレットを Azure Key Vault に格納します。 Azure Key Vault を使用すると、Azure のロールベースのアクセス制御モデルを使用して、シークレットまたはシークレットのグループへのアクセスを制限できます。
  • パイプラインの UI でシークレット変数を設定します。 パイプラインのパイプライン設定 UI で設定されたシークレット変数は、設定されたパイプラインにスコープが設定されます。 そのため、そのパイプラインにアクセスできるユーザーにのみ表示されるシークレットを持つことができます。
  • 変数グループにシークレットを設定します。 変数グループはライブラリ セキュリティ モデルに従います。 ライブラリ内の新しい項目を定義できるユーザーと、既存の項目を使用できるユーザーを制御することができます。

ログにシークレットを書き込まない

Azure Pipelines は、可能な限りログからシークレットをスクラブしようとしますが、確実ではありません。 シークレットをコンソールにエコーしたり、コマンド ライン パラメーターで使用したり、ファイルにログしたりしないでください。 機密情報を出力する Azure CLI コマンドを使用する場合は注意してください。 None output formatを使用し、Azure CLI 呼び出しからシークレットを取得する必要がある場合は、Use none output format and retrieve security information to a secret variable

構造化データをシークレットとして使用しない

JSON、XML、YAML などの構造化データ形式を使用して、復帰、 \r、改行、\nなどの制御文字を含むシークレット値をカプセル化しないようにします。 代わりに、機密値ごとに個別のシークレットを作成します。 この方法により、編集精度が向上し、機密データが誤って公開されるリスクが最小限に抑えられます。

シークレットの処理方法を監査する

Azure Pipelines でのシークレットの使用方法を監査するには、次のベスト プラクティスに従います。

  • ソース コードを確認する: パイプラインをホストしているリポジトリのソース コードを確認します。 シークレットが正しく処理されるようにするには、パイプラインで使用されるすべてのタスクを確認します。 たとえば、意図しないホストにシークレットが誤って送信されたり、ログ出力に明示的に出力されたりしていないことを確認します。
  • 実行ログを検査する: 有効な入力と無効な入力をテストした後、パイプラインの実行ログを表示します。 シークレットが適切に編集され、公開されていないことを確認します。 コマンドやツールのエラーによって、シークレットが誤ってエラー ログに漏えいする場合があります。 Azure Pipelines はログからシークレットをスクラブしようとしますが、手動レビューは依然として不可欠です。

シークレットの監査とローテーション

シークレットを監査してローテーションするには、次のベスト プラクティスに従います。

  • 登録済みのシークレットを確認する: パイプラインに登録されているシークレットを定期的に評価します。 それらが引き続き必要であることを確認し、不要になったデータを削除します。これにより、煩雑さと潜在的なセキュリティ リスクを軽減できます。
  • シークレットをローテーションする: 定期的にシークレットをローテーションして、侵害されたシークレットが悪用される期間を最小限に抑えます。 シークレットを定期的に変更することで、セキュリティが強化されます。
  • 適切な認証方法を選択する
    • 使用されるシークレットの種類:
      • 個人用アクセス トークン (AT): これらのトークンは認証に使用されます。 適切な認証方法を選択するときは、セキュリティのベスト プラクティスに従ってください。 REST API を使用して、管理できます
      • シークレット変数: シークレット変数を使用して、API キー、パスワード、その他の資格情報などの機密情報をパイプライン内に安全に格納します。
      • Azure Key Vault シークレット: Azure Key Vault を使用してシークレットを安全に格納および管理します。
      • サービス接続: これらのサービス接続により、パイプラインは外部サービス (Azure、GitHub、Docker Hub など) に接続できます。 サービス接続シークレットの適切な構成と安全な処理を確認します。

YAML テンプレートを使用する

パイプライン YAML にシークレット パラメーターを含むインライン スクリプトを直接含める代わりに、 templatesを使用します。 このアプローチでは、メイン パイプラインから機密情報を抽象化することで、セキュリティが強化されます。

この方法を実装するには、スクリプト用に個別の YAML ファイルを作成し、そのスクリプトを別の安全なリポジトリに格納します。 その後、テンプレートを参照し、パラメーターとして YAML にシークレット変数を渡すことができます。 セキュリティで保護された変数は、Azure Key Vault、変数グループ、またはパイプライン UI から取得する必要があります。 テンプレートの使用方法の詳細については、 Template 使用法リファレンスを参照してください。

ブランチ ポリシーと変数グループのアクセス許可を使用してシークレットを制限する

シークレットが main ブランチに関連付けられ、ランダム ブランチにアクセスできないようにするには、変数グループのアクセス許可、条件付きジョブの挿入、ブランチ ポリシーの組み合わせを使用できます。

ブランチ ポリシーを使用すると、メイン ブランチからのビルドのみを許可ビルド検証ポリシーを適用できます。 その後、 可変グループのアクセス許可を使用して 承認されたパイプラインのみが変数グループに格納されているシークレットにアクセスできることを確認できます。 最後に、パイプラインで条件を使用して、変数グループが main ブランチへのプッシュによってのみ参照できることを確認できます。

jobs:
- job: ExampleJob
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - script: echo "This runs only for the main branch"
    displayName: 'Conditional Step'
  variables:
  - group: your-variable-group-name

次のステップ