Azureパイプラインのセキュリティホール?

Aug 16 2020

私はAzureDevOpsを調査していて、Azureパイプラインの非常に明白なセキュリティホールのように見えるものに出くわしました。

そのため、パイプラインをYAMLとして作成し、ビルドステージとデプロイステージの2つのステージを定義しています。展開段階は次のようになります。

- stage: deployApiProdStage
  displayName: 'Deploy API to PROD'
  dependsOn: buildTestApiStage
  jobs:
  - deployment: deployApiProdJob
    displayName: 'Deploy API to PROD'
    timeoutInMinutes: 10
    condition: and(succeeded(), eq(variables.isRelease, true))
    environment: PROD
    strategy:
      runOnce:
        deploy:
          steps:
          - task: AzureWebApp@1
            displayName: 'Deploy Azure web app'
            inputs:
              azureSubscription: '(service connection to production web app)'
              appType: 'webAppLinux'
              appName: 'my-web-app'
              package: '$(Pipeline.Workspace)/$(artifactName)/**/*.zip'
              runtimeStack: 'DOTNETCORE|3.1'
              startUpCommand: 'dotnet My.Api.dll'

Microsoftのドキュメントでは、環境に承認とチェックを追加することでこれを保護する方法について説明しています。上記の場合、PROD環境。これは、私のPROD Webアプリへの公開を許可する保護されたリソース(azureSubscriptionのサービス接続)がPROD環境から取得された場合に問題ありません。残念ながら、私が知る限り、そうではありません。代わりに、パイプライン自体に関連付けられています。

これは、パイプラインが最初に実行されるときに、Azure DevOps UIが、サービス接続へのパイプラインアクセスを許可するように要求することを意味します。これは、デプロイを行うために必要です。アクセスが許可されると、そのパイプラインはそのサービス接続にいつまでもアクセスできます。これは、それ以降、ジョブに指定されている環境に関係なく、そのサービス接続を使用できることを意味します。さらに悪いことに、認識されない指定された環境名はエラーを引き起こしませんが、デフォルトで空白の環境が作成されます!

したがって、PROD環境の手動承認を設定した場合でも、組織内の誰かがコードレビュー(定期的な大規模なコードレビューで可能)を介して変更をスリップし、紺碧の環境名を「NewPROD」に変更した場合-pipelines.ymlファイルの場合、CI / CDはその新しい環境を作成し、新しい環境にはチェックや承認がないため、すぐにPRODにデプロイします。

確かに、代わりにサービス接続を環境に関連付けることは理にかなっています。また、新しい環境の自動作成を禁止するオプションがあることも理にかなっています。とにかく、それがどのように特に役立つかはわかりません。今のところ、私が知る限り、これは巨大なセキュリティホールであり、リポジトリへのアクセスをコミットしたり、承認プロセスを通じてazure-pipelines.ymlファイルへの変更をスリップさせたりした人が重要な環境にデプロイできる可能性があります。 、主要な単一障害点/弱点を導入します。パイプラインを保護するための高く評価されているインクリメンタルアプローチはどうなりましたか?私はここで何かが足りないのでしょうか、それともこのセキュリティホールは私が思っているほど悪いのでしょうか?

回答

1 CeceDong-MSFT Aug 17 2020 at 16:04

あなたの例では、空の環境を作成/使用したようで、デプロイメントターゲットはありません。現在、環境ではKubernetesリソース仮想マシンのリソースタイプのみがサポートされています。

https://docs.microsoft.com/en-us/azure/devops/pipelines/process/environments?view=azure-devops

この例のリソースはサービス接続であるため、サービス接続に移動して、このサービス接続のチェックを定義する必要があります。

https://docs.microsoft.com/en-us/azure/devops/pipelines/process/approvals?view=azure-devops&tabs=check-pass