Menandatangani gambar kontainer dengan Notasi dan Azure Key Vault menggunakan sertifikat yang ditandatangani sendiri

Menandatangani gambar kontainer adalah proses yang memastikan keaslian dan integritasnya. Ini dicapai dengan menambahkan tanda tangan digital ke gambar kontainer, yang dapat divalidasi selama penyebaran. Tanda tangan membantu memverifikasi bahwa gambar berasal dari penerbit tepercaya dan belum dimodifikasi. Notasi adalah alat rantai pasokan sumber terbuka yang dikembangkan oleh Proyek Notaris, yang mendukung penandatanganan dan verifikasi gambar kontainer dan artefak lainnya. Azure Key Vault (AKV) digunakan untuk menyimpan sertifikat dengan kunci penandatanganan yang dapat digunakan oleh Notasi dengan plugin Notasi AKV (azure-kv) untuk menandatangani dan memverifikasi gambar kontainer dan artefak lainnya. Azure Container Registry (ACR) memungkinkan Anda melampirkan tanda tangan ke gambar kontainer dan artefak lainnya serta melihat tanda tangan tersebut.

Dalam tutorial ini:

  • Instal CLI Notasi dan plugin AKV
  • Membuat sertifikat yang ditandatangani sendiri di AKV
  • Membangun dan mendorong gambar kontainer dengan Tugas ACR
  • Menandatangani gambar kontainer dengan Notation CLI dan plugin AKV
  • Memvalidasi gambar kontainer terhadap tanda tangan dengan Notasi CLI

Prasyarat

Instal CLI Notasi dan plugin AKV

  1. Instal Notasi v1.1.0 pada lingkungan Linux amd64. Ikuti panduan penginstalan Notasi untuk mengunduh paket untuk lingkungan lain.

    # Download, extract and install
    curl -Lo notation.tar.gz https://github.com/notaryproject/notation/releases/download/v1.1.0/notation_1.1.0_linux_amd64.tar.gz
    tar xvzf notation.tar.gz
    
    # Copy the Notation binary to the desired bin directory in your $PATH, for example
    cp ./notation /usr/local/bin
    
  2. Instal plugin azure-kv Notasi Azure Key Vault v1.1.0 pada lingkungan Linux amd64.

    Catatan

    URL dan checksum SHA256 untuk plugin Notasi Azure Key Vault dapat ditemukan di halaman rilis plugin.

    notation plugin install --url https://github.com/Azure/notation-azure-kv/releases/download/v1.1.0/notation-azure-kv_1.1.0_linux_amd64.tar.gz --sha256sum 2fc959bf850275246b044203609202329d015005574fabbf3e6393345e49b884
    
  3. Cantumkan plugin yang tersedia dan konfirmasikan bahwa azure-kv plugin dengan versi 1.1.0 disertakan dalam daftar.

    notation plugin ls
    

Mengonfigurasi variabel lingkungan

Catatan

Untuk memudahkan eksekusi perintah dalam tutorial, berikan nilai bagi sumber daya Azure agar sesuai dengan sumber daya ACR dan AKV yang ada.

  1. Mengonfigurasi nama sumber daya AKV.

    # Name of the existing AKV used to store the signing keys
    AKV_NAME=myakv
    # Name of the certificate created in AKV
    CERT_NAME=wabbit-networks-io
    CERT_SUBJECT="CN=wabbit-networks.io,O=Notation,L=Seattle,ST=WA,C=US"
    CERT_PATH=./${CERT_NAME}.pem
    
  2. Mengonfigurasi ACR dan nama sumber daya gambar.

    # Name of the existing registry example: myregistry.azurecr.io
    ACR_NAME=myregistry
    # Existing full domain of the ACR
    REGISTRY=$ACR_NAME.azurecr.io
    # Container name inside ACR where image will be stored
    REPO=net-monitor
    TAG=v1
    IMAGE=$REGISTRY/${REPO}:$TAG
    # Source code directory containing Dockerfile to build
    IMAGE_SOURCE=https://github.com/wabbit-networks/net-monitor.git#main
    

Masuk dengan Azure CLI

az login

Untuk mempelajari selengkapnya tentang Azure CLI dan cara masuk dengannya, lihat Masuk dengan Azure CLI.

Menetapkan kebijakan akses di AKV (Azure CLI)

Prinsipal pengguna dengan izin kebijakan akses yang benar diperlukan untuk membuat sertifikat yang ditandatangani sendiri dan menandatangani artefak. Prinsipal ini dapat menjadi prinsipal pengguna, perwakilan layanan, atau identitas terkelola. Minimal, prinsip ini memerlukan izin berikut:

  • Create izin untuk sertifikat
  • Get izin untuk sertifikat
  • Sign izin untuk kunci

Dalam tutorial ini, kebijakan akses ditetapkan ke pengguna Azure yang masuk. Untuk mempelajari selengkapnya tentang menetapkan kebijakan ke prinsipal, lihat Menetapkan Kebijakan Akses.

Mengatur langganan yang berisi sumber daya AKV

az account set --subscription <your_subscription_id>

Mengatur kebijakan akses di AKV

USER_ID=$(az ad signed-in-user show --query id -o tsv)
az keyvault set-policy -n $AKV_NAME --certificate-permissions create get --key-permissions sign --object-id $USER_ID

Penting

Contoh ini menunjukkan izin minimum yang diperlukan untuk membuat sertifikat dan menandatangani gambar kontainer. Tergantung pada kebutuhan Anda, Anda mungkin perlu memberikan izin tambahan.

Membuat sertifikat yang ditandatangani sendiri di AKV (Azure CLI)

Langkah-langkah berikut menunjukkan cara membuat sertifikat yang ditandatangani sendiri untuk tujuan pengujian.

  1. Buat file kebijakan sertifikat.

    Setelah file kebijakan sertifikat dijalankan seperti di bawah ini, file tersebut membuat sertifikat yang valid yang kompatibel dengan persyaratan sertifikat Proyek Notaris di AKV. Nilai untuk adalah untuk ekus penandatanganan kode, tetapi tidak diperlukan untuk notasi untuk menandatangani artefak. Subjek digunakan nanti sebagai identitas kepercayaan yang dipercaya pengguna selama verifikasi.

    cat <<EOF > ./my_policy.json
    {
        "issuerParameters": {
        "certificateTransparency": null,
        "name": "Self"
        },
        "keyProperties": {
          "exportable": false,
          "keySize": 2048,
          "keyType": "RSA",
          "reuseKey": true
        },
        "secretProperties": {
          "contentType": "application/x-pem-file"
        },
        "x509CertificateProperties": {
        "ekus": [
            "1.3.6.1.5.5.7.3.3"
        ],
        "keyUsage": [
            "digitalSignature"
        ],
        "subject": "$CERT_SUBJECT",
        "validityInMonths": 12
        }
    }
    EOF
    
  2. Buat sertifikat.

    az keyvault certificate create -n $CERT_NAME --vault-name $AKV_NAME -p @my_policy.json
    

Menandatangani gambar kontainer dengan Notation CLI dan plugin AKV

  1. Autentikasi ke ACR Anda dengan menggunakan identitas Azure individual Anda.

    az acr login --name $ACR_NAME
    

Penting

Jika Anda telah menginstal Docker pada sistem Anda dan menggunakan az acr login atau docker login untuk mengautentikasi ke ACR Anda, kredensial Anda sudah disimpan dan tersedia untuk notasi. Dalam hal ini, Anda tidak perlu menjalankan notation login lagi untuk mengautentikasi ke ACR Anda. Untuk mempelajari selengkapnya tentang opsi autentikasi untuk notasi, lihat Mengautentikasi dengan registri yang mematuhi OCI.

  1. Buat dan dorong gambar baru dengan Tugas ACR. Selalu gunakan nilai hash untuk mengidentifikasi gambar untuk penandatanganan karena tag dapat diubah dan dapat ditimpa.

    DIGEST=$(az acr build -r $ACR_NAME -t $REGISTRY/${REPO}:$TAG $IMAGE_SOURCE --no-logs --query "outputImages[0].digest" -o tsv)
    IMAGE=$REGISTRY/${REPO}@$DIGEST
    

    Dalam tutorial ini, jika gambar telah dibuat dan disimpan dalam registri, tag berfungsi sebagai pengidentifikasi untuk gambar tersebut untuk kenyamanan.

    IMAGE=$REGISTRY/${REPO}:$TAG
    
  2. Dapatkan ID Kunci kunci penandatanganan. Sertifikat di AKV dapat memiliki beberapa versi, perintah berikut mendapatkan ID Kunci dari versi terbaru.

    KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv)
    
  3. Tanda tangani gambar kontainer dengan format tanda tangan COSE menggunakan ID kunci penandatanganan. Untuk menandatangani dengan sertifikat yang ditandatangani sendiri, Anda perlu mengatur nilai self_signed=truekonfigurasi plugin .

    notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config self_signed=true $IMAGE
    

    Untuk mengautentikasi dengan AKV, secara default, jenis kredensial berikut jika diaktifkan akan dicoba secara berurutan:

    Jika Anda ingin menentukan jenis kredensial, gunakan konfigurasi plugin tambahan yang disebut credential_type. Misalnya, Anda dapat secara eksplisit mengatur credential_type ke azurecli untuk menggunakan kredensial Azure CLI, seperti yang ditunjukkan di bawah ini:

    notation sign --signature-format cose --id $KEY_ID --plugin azure-kv --plugin-config self_signed=true --plugin-config credential_type=azurecli $IMAGE
    

    Lihat tabel di bawah ini untuk nilai credential_type untuk berbagai jenis kredensial.

    Jenis Informasi masuk Nilai untuk credential_type
    Kredensial lingkungan environment
    Kredensial identitas beban kerja workloadid
    Kredensial identitas terkelola managedid
    Info masuk Azure CLI azurecli
  4. Lihat grafik gambar yang ditandatangani dan tanda tangan terkait.

    notation ls $IMAGE
    

Memverifikasi gambar kontainer dengan Notation CLI

Untuk memverifikasi gambar kontainer, tambahkan sertifikat akar yang menandatangani sertifikat daun ke penyimpanan kepercayaan dan buat kebijakan kepercayaan untuk verifikasi. Untuk sertifikat yang ditandatangani sendiri yang digunakan dalam tutorial ini, sertifikat akar adalah sertifikat yang ditandatangani sendiri.

  1. Unduh sertifikat publik.

    az keyvault certificate download --name $CERT_NAME --vault-name $AKV_NAME --file $CERT_PATH
    
  2. Tambahkan sertifikat publik yang diunduh ke penyimpanan kepercayaan bernama untuk verifikasi tanda tangan.

    STORE_TYPE="ca"
    STORE_NAME="wabbit-networks.io"
    notation cert add --type $STORE_TYPE --store $STORE_NAME $CERT_PATH
    
  3. Cantumkan sertifikat untuk dikonfirmasi.

    notation cert ls
    
  4. Konfigurasikan kebijakan kepercayaan sebelum verifikasi.

    Kebijakan kepercayaan memungkinkan pengguna menentukan kebijakan verifikasi yang disempurnakan. Contoh berikut mengonfigurasi kebijakan kepercayaan bernama wabbit-networks-images, yang berlaku untuk semua artefak di $REGISTRY/$REPO dan menggunakan penyimpanan kepercayaan $STORE_NAME bernama jenis $STORE_TYPE. Ini juga mengasumsikan bahwa pengguna mempercayai identitas tertentu dengan subjek $CERT_SUBJECTX.509 . Untuk detail selengkapnya, lihat Spesifikasi kebijakan penyimpanan kepercayaan dan kepercayaan.

    cat <<EOF > ./trustpolicy.json
    {
        "version": "1.0",
        "trustPolicies": [
            {
                "name": "wabbit-networks-images",
                "registryScopes": [ "$REGISTRY/$REPO" ],
                "signatureVerification": {
                    "level" : "strict" 
                },
                "trustStores": [ "$STORE_TYPE:$STORE_NAME" ],
                "trustedIdentities": [
                    "x509.subject: $CERT_SUBJECT"
                ]
            }
        ]
    }
    EOF
    
  5. Gunakan notation policy untuk mengimpor konfigurasi kebijakan kepercayaan dari file JSON yang kami buat sebelumnya.

    notation policy import ./trustpolicy.json
    notation policy show
    
  6. Gunakan notation verify untuk memverifikasi gambar kontainer belum diubah sejak waktu build.

    notation verify $IMAGE
    

    Setelah verifikasi gambar berhasil menggunakan kebijakan kepercayaan, hash sha256 dari gambar terverifikasi dikembalikan dalam pesan output yang berhasil.

Langkah berikutnya

Lihat Menggunakan Integritas Gambar untuk memvalidasi gambar yang ditandatangani sebelum menyebarkannya ke kluster Azure Kubernetes Service (AKS) (Pratinjau) dan Ratify di Azure untuk mulai memverifikasi dan mengaudit gambar yang ditandatangani sebelum menyebarkannya di AKS.