Sdílet prostřednictvím


Podepsání a ověření image kontejneru pomocí notace v Azure Pipeline

Úloha zápisu v Azure DevOps je integrovaná úloha pro podepisování a ověřování imagí kontejnerů a dalších artefaktů Open Container Initiative (OCI) v rámci azure Pipeline. Úloha zápisu používá k provedení těchto operací rozhraní příkazového řádku notace, aby artefakty byly podepsány důvěryhodnou entitou a nebyly manipulovány od jejich vytvoření.

Tento článek vás provede vytvořením kanálu Azure, který sestaví image kontejneru, vloží ji do ACR a přidá podpisy pomocí notace a modulu plug-in Azure Key Vault poskytující vrstvu zabezpečení a integrity artefaktů. Cílem kanálu je:

  1. Sestavte image kontejneru a nasdílíte ji do služby Azure Container Registry (ACR).
  2. Podepište image pomocí modulu plug-in Notation and Notation Azure Key Vault. Podpis se pak automaticky odešle do ACR.

Požadavky

  • Vytvořte ve službě Azure Key Vault službu Key Vault a vygenerujte podpisový klíč a certifikát podepsaný svým držitelem. Tento dokument můžete použít k vytvoření klíče podepsaného svým držitelem a certifikátu pro účely testování. Pokud máte certifikát vydaný certifikační autoritou, projděte si podrobnosti v tomto dokumentu .
  • Vytvořte registr ve službě Azure Container Registry (ACR).
  • Ujistěte se, že máte úložiště Azure DevOps nebo úložiště GitHub.

Vytvoření Připojení služby

Vytvořte připojení služby ve službě Azure Pipelines, které kanálu umožňuje přístup k externím službám, jako je Azure Container Registry (ACR), můžete postupovat takto:

  • Podepište image ve službě Azure Container Registry (ACR) pomocí přihlašovacích údajů ACR.

  • Pomocí úlohy Dockeru ve službě Azure Pipelines se přihlaste k ACR. Úloha Dockeru je integrovaná úloha ve službě Azure Pipelines, která umožňuje mimo jiné vytvářet, odesílat a stahovat image Dockeru.

  • Vytvořte připojení služby Docker Registry ve službě Azure Pipeline pro udělení přístupu k vašemu registru ACR následujícím způsobem:

    1. Přihlaste se ke své organizaci (https://dev.azure.com/{yourorganization}) a vyberte svůj projekt.
    2. V levém dolním rohu vyberte tlačítko Nastavení.
    3. Přejděte na Kanály a pak vyberte Připojení ke službě.
    4. Zvolte Nové připojení služby a vyberte Registr Dockeru.
    5. Pak zvolte Azure Container Registry.
    6. V typu ověřování zvolte instanční objekt a zadejte podrobnosti o instančním objektu, včetně vašeho předplatného Azure a registru ACR.
    7. Zadejte uživatelsky přívětivý název Připojení, který se má použít při odkazování na toto připojení služby.
  • Vytvořte připojení služby Azure Resource Manager ve službě Azure Pipelines pro autorizaci přístupu ke službě Azure Key Vault:

    1. Zvolte instanční objekt (automatický).
    2. V dalším kroku zvolte Předplatné a v rozevíracím seznamu vyhledejte své předplatné Azure.
    3. V rozevíracím seznamu vyberte dostupnou skupinu prostředků.
    4. Zadejte uživatelsky přívětivý název připojení služby, který se má použít při odkazech na toto připojení služby.
    5. Uložte ho a dokončete vytvoření.
  • Pomocí následujícího postupu udělte zásadám přístupu instančnímu objektu:

    1. Otevřete vytvořené připojení služby Azure Resource Manager a kliknutím na Spravovat instanční objekt zadejte portál instančního objektu Azure.
    2. Zkopírujte soubor Application (client) ID. Použije se k udělení oprávnění pro instanční objekt.
    3. Otevřete portál služby Azure Key Vault a zadejte stránku Zásady přístupu.
    4. Vytvořte novou zásadu přístupu s oprávněním a certificate get s oprávněními.key signsecret get
    5. Udělte tuto novou zásadu přístupu k instančnímu objektu Application (client) ID pomocí vložení z předchozího kroku.
    6. Uložte ho a dokončete vytvoření.

Další informace o připojení služby najdete tady.

Vytvoření kanálu a použití úlohy Notation

Následujícím postupem vytvořte pro úložiště Git kanál Azure:

  1. Přejděte na projekt ve vaší organizaci AOD.
  2. V nabídce vlevo přejděte na Kanály a pak vyberte Nový kanál.
  3. Zvolte úložiště Git. K předvedení pohodlí používáme úložiště Azure DevOps.
  4. Pokud s Azure DevOps začínáte, nakonfigurujte kanál s počátečním kanálem. Kanál zkontrolujte a vytvořte kliknutím na Uložit a spustit.

Poznámka:

Příklad předpokládá, že výchozí větev je main. Pokud tomu tak není, aktualizujte výchozí větev podle průvodce .

Úlohy zápisu můžete přidat dvěma způsoby úpravou kanálu Azure:

Použijte panel Azure DevOps (ADO): Panel ADO poskytuje uživatelské rozhraní, ve kterém můžete do kanálu přidávat úkoly. Pomocí tohoto rozhraní můžete vyhledat úlohy notace a přidat je do kanálu.

Zkopírujte z ukázkového souboru kanálu Azure: Pokud máte ukázkový soubor kanálu Azure, který už obsahuje úlohy zápisu, můžete tyto úlohy zkopírovat z ukázkového souboru a vložit je do souboru kanálu.

Možnost 1: Použití panelu pro úpravy Azure DevOps (ADO)

Docker Vyhledejte úlohu z panelu pro úpravy kanálu na pravé straně. K ověření pomocí ACR použijte jeho login příkaz s připojením ke službě Registr Dockeru.

  1. V rozevíracím seznamu Registr kontejneru zvolte připojení služby Docker Registry vytvořené v předchozím kroku.
  2. Vyberte login z rozevíracího seznamu Příkaz .
  3. Kliknutím na Přidat přidáte úlohu Dockeru s příkazem login do souboru kanálu vlevo.

Podobně znovu vyhledejte Docker úlohu z panelu pro úpravy kanálu. Pomocí příkazu buildAndPush automaticky sestavte zdrojový kód do image a nasdílíte ho do cílového úložiště ACR. Vygeneruje se hodnota hash obrázku, která se použije k přihlášení v dalším kroku.

  1. Zadejte název úložiště do úložiště kontejneru.
  2. V rozevíracím seznamu Command zvolte buildAndPush.
  3. Zadejte cestu k souboru souboru Dockerfile. Použijte ./Dockerfile například, pokud je váš soubor Dockerfile uložený v kořenové složce.
  4. Kliknutím na Přidat přidáte úlohu Dockeru s příkazem buildAndPush do souboru kanálu vlevo.

Notation Vyhledejte úlohu z panelu pro úpravy kanálu na pravé straně.

  1. V rozevíracím seznamu zvolte Nainstalovat, který chcete spustit.
  2. Kliknutím na Přidat přidáte notation install úlohu do kanálu.
  3. Podobně znovu vyhledejte Notation úlohu na panelu pro úpravy kanálu a zvolte Podepsat.
  4. Odkazy na artefakty můžete přeskočit, protože podepíšeme image pomocí nejnovějšího přehledu, který je sestavený a vložený do registru úlohou Dockeru. Místo toho můžete ručně zadat hodnotu hash pomocí <registry_host>/<repository>@<digest>.
  5. Vyplňte konfiguraci modulu plug-in ve formuláři. Použijeme výchozí modul plug-in AKV a připojení služby vytvořené v předchozím kroku. Zkopírujte ID klíče z AKV do ID klíče.
  6. Zaškrtněte políčko Certifikát podepsaný svým držitelem, protože pro demonstrační pohodlí používáme certifikát podepsaný svým držitelem. Místo toho můžete cestu k souboru certifikátu zadat do cesty k souboru sady certifikátů, pokud chcete použít certifikát vystavený certifikační autoritou.
  7. Kliknutím na Přidat přidáte notation sign soubor kanálu doleva.

Možnost 2: Úprava ukázkového souboru kanálu Azure

  1. Pokud znáte Službu Azure Pipelines a zápis, je efektivní začít se souborem kanálu šablony.
  2. Zkopírujte šablonu kanálu poskytnutou v dokumentu do vlastního souboru kanálu. Tato šablona je navržená tak, aby používala úlohy notace, které slouží k podepisování a ověřování imagí kontejneru.
  3. Po zkopírování šablony vyplňte požadované hodnoty podle odkazů a komentářů uvedených níže.
Podívejte se na šablonu podpisového úkolu možnosti 1 (klikněte sem).
trigger:
 - main
pool: 
  vmImage: 'ubuntu-latest'

steps:
# log in to registry
- task: Docker@2
  inputs:
    containerRegistry: <your_docker_registry_service_connection>
    command: 'login'
# build and push artifact to registry
- task: Docker@2
  inputs:
    repository: <your_repository_name>
    command: 'buildAndPush'
    Dockerfile: './Dockerfile'
# install notation
- task: Notation@0
  inputs:
    command: 'install'
    version: '1.1.0'
# automatically detect the artifact pushed by Docker task and sign the artifact.
- task: Notation@0
  inputs:
    command: 'sign'
    plugin: 'azureKeyVault'
    akvPluginVersion: <azure_key_vault_plugin_version>
    azurekvServiceConection: <your_akv_service_connection>
    keyid: <your_key_id>
    selfSigned: true

Poznámka:

Kromě použití úlohy Dockeru můžete podepsat zadanou hodnotu hash image ručním zadáním odkazu na artifactRefs artefakt následujícím způsobem.

Podívejte se na příklad (klikněte sem).
# sign the artifact
- task: Notation@0
  inputs:
    artifactRefs: '<registry_host>/<repository>@<digest>'
    command: 'sign'
    plugin: 'azureKeyVault'
    akvPluginVersion: <azure_key_vault_plugin_version>
    azurekvServiceConection: <akv_service_connection>
    keyid: <key_id>
    selfSigned: true

Aktivace kanálu

Podle kroků spusťte kanál v Azure DevOps a ověřte jeho spuštění.

  1. Po vyplnění vstupů v kanálu uložte a spusťte ho, aby se aktivoval kanál.
  2. Přejděte na stránku Úlohy spuštěného kanálu. Tady vidíte provádění jednotlivých kroků. Tento kanál sestaví a podepíše nejnovější build nebo zadanou hodnotu hash a potom odešle podepsanou image spolu s jeho přidruženým podpisem do registru.
  3. Po úspěšném spuštění uvidíte image vloženou do služby Azure Container Registry (ACR) s připojeným podpisem formátu CBOR Object Signing and Encryption (COSE).

Ověření podepsané image

Podobně můžete k ověření podepsané image použít panel pro úpravy nebo upravit soubor kanálu a přidat do kanálu úlohu zápisu verify . Kanál ověří podepsanou image pomocí zásad důvěryhodnosti a úložiště důvěryhodnosti, které jste zadali.

Příprava zásad důvěryhodnosti notace a úložiště důvěryhodnosti

Obecně platí, že ověřovatel se liší od podepisující osoby. Pro demonstrační účely používáme stejný kanál a úložiště ADO v této ukázce. Postupujte podle následujících kroků a vytvořte zásady důvěryhodnosti notace, úložiště důvěryhodnosti a přidejte verify úlohu do kanálu:

  1. V aktuálním úložišti ADO vytvořte ukázkovou složku .pipeline pro uložení zásad .pipeline/trustpolicy/důvěryhodnosti notace . Vytvořte ukázkový soubor trustpolicy.jsonJSON zásad důvěryhodnosti . Vyplňte šablonu zásad důvěryhodnosti vlastními hodnotami a uložte ji do složky.

Poznámka:

Všimněte si, že úložiště důvěryhodnosti notation v současné době podporuje tři druhy identit, včetně kořenových certifikátů certifikační autority (CA), SigningAuthority a TSA (Time Stamping Authority). Pro demonstrační účely používáme certifikační autoritu (CA) x509/ca v zásadách důvěryhodnosti a úložišti důvěryhodnosti níže. Podrobnosti najdete v úložišti důvěryhodnosti.

Podívejte se na šablonu zásad důvěryhodnosti (klikněte sem).
{
    "version": "1.0",
    "trustPolicies": [
        {
            "name": "<yourPolicyName>",
            "registryScopes": [ "<yourRegistry>.azurecr.io/<yourArtifact>" ],
            "signatureVerification": {
                "level" : "strict" 
            },
            "trustStores": [ "ca:<yourTrustStore>"],
            "trustedIdentities": [
                "*"
            ]
        }
    ]
}
  1. V aktuálním úložišti ADO vytvořte novou složku pro úložiště důvěryhodnosti Notation pro uložení /.pipeline/truststore/x509/ca/$<yourTrustStore>/ certifikátu. Pokud jste postupovali podle pokynů pro podepsání image v tomto dokumentu, stáhněte si pomocí následujícího příkazu certifikát podepsaný svým držitelem ze služby Azure Key Vault (AKV):
KEY_NAME=<key_name_you_picked_when_creating_the_key>
AKV_NAME=<akv_name_where_certificate_is_stored>
CERT_ID=$(az keyvault certificate show -n $KEY_NAME --vault-name $AKV_NAME --query 'id' -o tsv)
CERT_PATH=./${KEY_NAME}.pem
az keyvault certificate download --file $CERT_PATH --id $CERT_ID --encoding PEM
  1. Nahrajte certifikát do složky /.pipeline/truststore/x509/ca/$<yourTrustStore>/ úložiště důvěryhodnosti, kterou jsme vytvořili v posledním kroku.

Přidání úlohy ověření zápisu

  1. Znovu na panelu pro úpravy kanálu vyhledejte úlohu Notation a zvolte Ověřit.
  2. Vyplňte odkazy na artefakty hodnotou hash podepsaného obrázku.
  3. Zadejte hodnotu .pipeline/trustpolicy/trustpolicy.json do cesty k souboru zásad důvěryhodnosti.
  4. Zadejte hodnotu .pipeline/truststore/ do cesty ke složce úložiště důvěryhodnosti.
  5. Kliknutím na Přidat přidáte ověření zápisu do souboru kanálu vlevo.

Vaše notation verify bude uložena následujícím způsobem.

Podívejte se na příklad (klikněte sem).
# sign the artifact
- task: Notation@0
  inputs:
    command: 'verify'
    artifactRefs: '<registry_host>/<repository>@<digest>'
    trustPolicy: .pipeline/trustpolicy.json
    trustStore: .pipeline/truststore/

Aktivace kanálu (aktualizováno)

Kanál můžete znovu aktivovat a ověřit podepsanou image. Po úspěšném spuštění se protokoly zobrazí na stránce Úlohy spuštěného kanálu. Kanál ověří podepsanou image pomocí zásad důvěryhodnosti a úložiště důvěryhodnosti, které jste zadali.

Závěr

V tomto článku se dozvíte, jak podepsat a ověřit image kontejneru pomocí notace ve službě Azure Pipeline. K přidání úloh zápisu do kanálu můžete použít panel Azure DevOps nebo upravit soubor kanálu. Kanál vytvoří, odešle, podepíše a ověří image pomocí zásad důvěryhodnosti a úložiště důvěryhodnosti, které jste zadali. Tento proces zajišťuje, že artefakty jsou podepsány důvěryhodnou entitou a nebyly manipulovány od jejich vytvoření.