توقيع صور الحاوية باستخدام 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.

    # 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 وأسماء موارد الصورة.

    # 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.

تعيين نهج الوصول في AKV (Azure CLI)

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

  • Create أذونات الشهادات
  • Get أذونات الشهادات
  • Sign أذونات المفاتيح

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

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

az account set --subscription <your_subscription_id>

تعيين نهج الوصول في 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.