次の方法で共有


Azure Pipelines のシークレット

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

この記事では、Azure Pipelines でシークレットを保護するためのベスト プラクティスについて説明します。 シークレットは、API キー、パスワード、証明書、暗号化キーなど、アクセスを厳密に制御する必要がある任意のものです。 Azure Pipelines ではシークレット値は生成されませんが、API キーなどの機密データを格納するために、パイプラインにシークレットを追加することが必要になる場合があります。

この記事は、Azure Pipelines のセキュリティ対策を実装するのに役立つシリーズの一部です。 詳細については、「 Azure Pipelines のセキュリティ保護」を参照してください。

[前提条件]

カテゴリ 必要条件
Azure DevOps - Azure DevOps をセキュリティで保護し、Azure Pipelinesセキュリティで保護する方法に関するページの推奨事項を実装します。
- YAML と Azure Pipelines に関する基本的な知識。 詳細については、「最初の パイプラインを作成する」を参照してください
権限 - パイプラインのアクセス許可を変更するには: プロジェクト管理者グループのメンバー
- 組織のアクセス許可を変更するには: プロジェクト コレクション管理者グループのメンバー。

別のメソッドを使用する

シークレットは固有のセキュリティ リスクを提示するため、まったく使用しないことをお勧めします。 変数でシークレットを管理したり、パイプライン構成で公開したりする代わりに、パイプラインでこれらの他の方法のいずれかを使用してタスクを実行できるかどうかを確認します。

  • Azure または GitHub や Docker などの他のサービスに安全に接続するようにサービス 接続 を設定します。 詳細については、「 Azure Resource Manager サービス接続を使用して Azure に接続する」を参照してください。
  • マネージド ID を使用して、アプリケーションとサービスが明示的な資格情報を使用せずに Azure サービスで認証できるようにします。
  • シークレットを明示的に渡さずにサービス プリンシパルの詳細にアクセスするには、パイプラインの オプションで addSpnToEnvironmentを使用します。

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

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

機密値をプレーン テキストとして azure-pipelines.yml ファイルに格納しないでください。 パスワード、ID、公開したくないその他の識別データなどの個人情報には、シークレット変数を使用できます。 シークレット変数は暗号化されるため、値を公開せずにパイプラインで使用できます。

  • Azure Key Vault でシークレット変数を安全に管理することをお勧めします。 パイプライン定義 UI または変数グループでシークレット変数を設定することもできます。
  • パイプラインにアクセスできるユーザーはだれでもシークレットを表示できるため、ログ コマンドを使用してシークレット変数を設定しないでください。
  • シークレットを出力としてエコーしたり、コマンド ラインでシークレットを渡したりしないでください。 代わりに、シークレットを環境変数にマップすることをお勧めします。
  • シークレットを作成するときは、 変数の名前付けガイドラインに従い、シークレット名が機密情報を開示していないことを確認します。

変数でのシークレットの設定の詳細については、「シークレット変数の 設定」を参照してください。

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

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

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

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

Azure Pipelines は、可能な限りログからシークレットをスクラブしようとしますが、確実ではありません。 シークレットをコンソールにエコーしたり、コマンド ライン パラメーターで使用したり、ファイルにログしたりしないでください。

機密情報を出力する Azure CLI コマンドを使用する場合は注意してください。 None 出力形式を使用し、Azure CLI 呼び出しからシークレットを取得する必要がある場合は、シークレット変数からセキュリティ情報を取得します

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

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

シークレットの使用を監査する

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

  • パイプラインをホストするリポジトリのソース コードを調べます。 シークレットが正しく処理されるようにするには、パイプラインで使用されるすべてのタスクを確認します。 意図しないホストにシークレットが誤って送信されたり、ログ出力に明示的に出力されたりしていないことを確認します。

  • 有効な入力と無効な入力をテストした後、パイプラインの実行ログを表示します。 シークレットが適切に編集され、公開されていないことを確認します。 コマンドやツールのエラーによって、シークレットが誤ってエラー ログに漏えいする場合があります。 Azure Pipelines はログからシークレットをスクラブしようとしますが、手動レビューは依然として不可欠です。

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

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

  • パイプラインに登録されているシークレットを定期的に確認します。 引き続き必要であることを確認し、不要になったものをすべて削除します。 この方法は、低優先メールや潜在的なセキュリティ リスクを軽減するのに役立ちます。
  • サービス接続シークレットの適切な構成と安全な処理を確認します。
  • 個人用アクセス トークン (PAT) の期間を短くし、必要最小限のアクセス許可を選択します。
  • 侵害されたシークレットが悪用される可能性のある時間を最小限に抑えるために、シークレットを定期的にローテーションします。 シークレットを定期的に変更すると、セキュリティが強化されます。

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

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

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

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

シークレットが特定のリポジトリ ブランチにのみアクセスできるようにするには、ブランチ ポリシー、変数グループのアクセス許可、条件付きジョブの挿入を組み合わせて使用できます。

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

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