توقيع صور الحاوية باستخدام Notation وAzure Key Vault باستخدام شهادة موقعة ذاتيا

توقيع صور الحاوية هو عملية تضمن أصالتها وسلامتها. يتم تحقيق ذلك عن طريق إضافة توقيع رقمي إلى صورة الحاوية، والتي يمكن التحقق من صحتها أثناء النشر. يساعد التوقيع على التحقق من أن الصورة من ناشر موثوق به ولم يتم تعديلها. تدوين هو أداة سلسلة توريد مصدر مفتوح تم تطويرها من قبل مشروع كاتب العدل، والذي يدعم توقيع صور الحاوية وغيرها من البيانات الاصطناعية والتحقق منها. يتم استخدام Azure Key Vault (AKV) لتخزين الشهادات بمفاتيح التوقيع التي يمكن استخدامها بواسطة Notation مع المكون الإضافي Notation AKV (azure-kv) لتوقيع صور الحاوية والبيانات الاصطناعية الأخرى والتحقق منها. يسمح لك Azure Container Registry (ACR) بإرفاق التواقيع بصور الحاوية والبيانات الاصطناعية الأخرى بالإضافة إلى عرض تلك التواقيع.

في هذا البرنامج التعليمي:

  • تثبيت Notation CLI والمكون الإضافي AKV
  • إنشاء شهادة موقعة ذاتيا في AKV
  • إنشاء صورة حاوية ودفعها باستخدام مهام ACR
  • توقيع صورة حاوية باستخدام Notation CLI والمكون الإضافي AKV
  • التحقق من صحة صورة حاوية مقابل التوقيع باستخدام Notation CLI

المتطلبات الأساسية

تثبيت Notation CLI والمكون الإضافي AKV

  1. تثبيت Notation v1.1.0 على بيئة Linux amd64. اتبع دليل تثبيت Notation لتنزيل الحزمة للبيئات الأخرى.

    # 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. تثبيت المكون الإضافي azure-kv Notation Azure Key Vault v1.1.0 على بيئة Linux amd64.

    إشعار

    يمكن العثور على عنوان URL والرسوم الاختبارية SHA256 للمكون الإضافي Notation Azure Key Vault في صفحة إصدار المكون الإضافي.

    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. اسرد المكونات الإضافية المتوفرة وتأكد من azure-kv تضمين المكون الإضافي مع الإصدار 1.1.0 في القائمة.

    notation plugin ls
    

تكوين متغيرات البيئة

إشعار

لسهولة تنفيذ الأوامر في البرنامج التعليمي، قم بتوفير قيم لموارد Azure لمطابقة موارد ACR و AKV الحالية.

  1. تكوين أسماء موارد AKV.

    AKV_SUB_ID=myAkvSubscriptionId
    AKV_RG=myAkvResourceGroup
    # 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. تكوين ACR وأسماء موارد الصورة.

    ACR_SUB_ID=myAcrSubscriptionId
    ACR_RG=myAcrResourceGroup
    # 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
    

سجّل الدخول باستخدام Azure CLI

az login

لمعرفة المزيد حول Azure CLI وكيفية تسجيل الدخول باستخدامه، راجع تسجيل الدخول باستخدام Azure CLI.

تأمين أذونات الوصول إلى ACR وAKV

عند العمل مع ACR وAKV، من الضروري منح الأذونات المناسبة لضمان الوصول الآمن والمتحكم فيه. يمكنك تخويل الوصول لكيانات مختلفة، مثل أساسيات المستخدم أو كيانات الخدمة أو الهويات المدارة، اعتمادا على السيناريوهات المحددة. في هذا البرنامج التعليمي، يتم تفويض الوصول إلى مستخدم Azure الذي سجل الدخول.

تخويل الوصول إلى ACR

AcrPull الأدوار و AcrPush مطلوبة لتوقيع صور الحاوية في ACR.

  1. تعيين الاشتراك الذي يحتوي على مورد ACR

    az account set --subscription $ACR_SUB_ID
    
  2. تعيين الأدوار

    USER_ID=$(az ad signed-in-user show --query id -o tsv)
    az role assignment create --role "AcrPull" --role "AcrPush" --assignee $USER_ID --scope "/subscriptions/$ACR_SUB_ID/resourceGroups/$ACR_RG/providers/Microsoft.ContainerRegistry/registries/$ACR_NAME"
    

تخويل الوصول إلى AKV

في هذا القسم، سنستكشف خيارين لتخويل الوصول إلى AKV.

الأدوار التالية مطلوبة للتوزيع باستخدام الشهادات الموقعة ذاتيا:

  • Key Vault Certificates Officer لإنشاء الشهادات وقراءتها
  • Key Vault Certificates Userلقراءة الشهادات الموجودة
  • Key Vault Crypto User لعمليات التوقيع

لمعرفة المزيد حول الوصول إلى Key Vault باستخدام Azure RBAC، راجع استخدام Azure RBAC لإدارة الوصول.

  1. تعيين الاشتراك الذي يحتوي على مورد AKV

    az account set --subscription $AKV_SUB_ID
    
  2. تعيين الأدوار

    USER_ID=$(az ad signed-in-user show --query id -o tsv)
    az role assignment create --role "Key Vault Certificates Officer" --role "Key Vault Crypto User" --assignee $USER_ID --scope "/subscriptions/$AKV_SUB_ID/resourceGroups/$AKV_RG/providers/Microsoft.KeyVault/vaults/$AKV_NAME"
    

تعيين نهج الوصول في AKV (قديم)

الأذونات التالية مطلوبة لهوية:

  • Create أذونات لإنشاء شهادة
  • Get أذونات لقراءة الشهادات الموجودة
  • Sign أذونات لعمليات التوقيع

لمعرفة المزيد حول تعيين نهج إلى أساس، راجع تعيين نهج الوصول.

  1. تعيين الاشتراك الذي يحتوي على مورد AKV:

    az account set --subscription $AKV_SUB_ID
    
  2. تعيين نهج الوصول في 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
    

هام

يوضح هذا المثال الحد الأدنى من الأذونات اللازمة لإنشاء شهادة وتوقيع صورة حاوية. اعتمادا على متطلباتك، قد تحتاج إلى منح أذونات إضافية.

إنشاء شهادة موقعة ذاتيا في AKV (Azure CLI)

توضح الخطوات التالية كيفية إنشاء شهادة موقعة ذاتيا لغرض الاختبار.

  1. إنشاء ملف نهج الشهادة.

    بمجرد تنفيذ ملف نهج الشهادة كما هو موضح أدناه، فإنه ينشئ شهادة صالحة متوافقة مع متطلبات شهادة Notary Project في AKV. قيمة ekus هي لتوقيع التعليمات البرمجية، ولكنها غير مطلوبة للتدوين لتوقيع البيانات الاصطناعية. يتم استخدام الموضوع لاحقا كهوية ثقة يثق بها المستخدم أثناء التحقق.

    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. إنشاء الشهادة.

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

توقيع صورة حاوية باستخدام Notation CLI والمكون الإضافي AKV

  1. المصادقة على ACR الخاص بك باستخدام هوية Azure الفردية الخاصة بك.

    az acr login --name $ACR_NAME
    

هام

إذا كان لديك Docker مثبت على النظام الخاص بك وتستخدم az acr login أو docker login للمصادقة على ACR الخاص بك، يتم تخزين بيانات الاعتماد الخاصة بك بالفعل ومتاحة للتصنيب. في هذه الحالة، لا تحتاج إلى تشغيل notation login مرة أخرى للمصادقة على ACR الخاص بك. لمعرفة المزيد حول خيارات المصادقة للنص، راجع المصادقة باستخدام السجلات المتوافقة مع OCI.

  1. إنشاء صورة جديدة ودفعها باستخدام مهام ACR. استخدم دائما قيمة الملخص لتحديد الصورة للتوقيع نظرا لأن العلامات قابلة للتغيير ويمكن الكتابة فوقها.

    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
    

    في هذا البرنامج التعليمي، إذا تم إنشاء الصورة بالفعل وتخزينها في السجل، فإن العلامة تعمل كمعرف لتلك الصورة للراحة.

    IMAGE=$REGISTRY/${REPO}:$TAG
    
  2. احصل على معرف المفتاح لمفتاح التوقيع. يمكن أن تحتوي الشهادة في AKV على إصدارات متعددة، يحصل الأمر التالي على معرف المفتاح للإصدار الأخير.

    KEY_ID=$(az keyvault certificate show -n $CERT_NAME --vault-name $AKV_NAME --query 'kid' -o tsv)
    
  3. قم بتوقيع صورة الحاوية بتنسيق توقيع COSE باستخدام معرف مفتاح التوقيع. لتسجيل الدخول باستخدام شهادة موقعة ذاتيا، تحتاج إلى تعيين قيمة self_signed=trueتكوين المكون الإضافي .

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

    للمصادقة باستخدام AKV، بشكل افتراضي، ستتم تجربة أنواع بيانات الاعتماد التالية إذا تم تمكينها بالترتيب:

    إذا كنت تريد تحديد نوع بيانات اعتماد، فاستخدم تكوين مكون إضافي يسمى credential_type. على سبيل المثال، يمكنك التعيين credential_type صراحة إلى azurecli لاستخدام بيانات اعتماد Azure CLI، كما هو موضح أدناه:

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

    راجع الجدول أدناه للحصول على قيم credential_type أنواع بيانات الاعتماد المختلفة.

    نوع بيانات الاعتماد قيمة ل credential_type
    بيانات اعتماد البيئة environment
    بيانات اعتماد هوية حمل العمل workloadid
    بيانات اعتماد الهوية المدارة managedid
    بيانات اعتماد Azure CLI azurecli
  4. عرض الرسم البياني للصور الموقعة والتوقيعات المقترنة.

    notation ls $IMAGE
    

التحقق من صورة حاوية باستخدام Notation CLI

للتحقق من صورة الحاوية، أضف الشهادة الجذر التي توقع الشهادة الطرفية إلى مخزن الثقة وأنشئ نهج الثقة للتحقق. بالنسبة للشهادة الموقعة ذاتيا المستخدمة في هذا البرنامج التعليمي، فإن الشهادة الجذر هي الشهادة الموقعة ذاتيا نفسها.

  1. قم بتنزيل الشهادة العامة.

    az keyvault certificate download --name $CERT_NAME --vault-name $AKV_NAME --file $CERT_PATH
    
  2. أضف الشهادة العامة التي تم تنزيلها إلى مخزن الثقة المسمى للتحقق من التوقيع.

    STORE_TYPE="ca"
    STORE_NAME="wabbit-networks.io"
    notation cert add --type $STORE_TYPE --store $STORE_NAME $CERT_PATH
    
  3. سرد الشهادة للتأكيد.

    notation cert ls
    
  4. تكوين نهج الثقة قبل التحقق.

    تسمح نهج الثقة للمستخدمين بتحديد نهج التحقق الدقيقة. يقوم المثال التالي بتكوين نهج ثقة يسمى wabbit-networks-images، والذي ينطبق على جميع البيانات الاصطناعية في $REGISTRY/$REPO ويستخدم مخزن $STORE_NAME الثقة المسمى من النوع $STORE_TYPE. كما يفترض أن المستخدم يثق بهوية معينة مع موضوع $CERT_SUBJECTX.509 . لمزيد من التفاصيل، راجع مخزن الثقة ومواصفات نهج الثقة.

    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. استخدم notation policy لاستيراد تكوين نهج الثقة من ملف JSON الذي أنشأناه مسبقا.

    notation policy import ./trustpolicy.json
    notation policy show
    
  6. استخدم notation verify للتحقق من عدم تغيير صورة الحاوية منذ وقت الإنشاء.

    notation verify $IMAGE
    

    عند التحقق الناجح من الصورة باستخدام نهج الثقة، يتم إرجاع ملخص sha256 للصورة التي تم التحقق منها في رسالة إخراج ناجحة.

الخطوات التالية

راجع استخدام تكامل الصور للتحقق من صحة الصور الموقعة قبل نشرها في مجموعات Azure Kubernetes Service (AKS) (معاينة) والتصديق على Azure للبدء في التحقق من الصور الموقعة وتدقيقها قبل نشرها على AKS.