کد لبه تصویر ظرف امضا شده

۱. مرور کلی

این آزمایشگاه کد بر اساس آزمایشگاه کد فضای محرمانه ساخته شده است. پشتیبانی از تصویر کانتینر امضا شده، گزینه‌ای را برای احراز هویت یک کانتینر با استفاده از یک کلید عمومی تایید شده به جای مشخص کردن خلاصه تصویر در سیاست Workload Identity Pool (WIP) ارائه می‌دهد.

چه چیزی با پشتیبانی از تصویر کانتینر امضا شده در فضای محرمانه تغییر کرد:

بهبود قابلیت استفاده: با معرفی ویژگی تصویر کانتینر امضا شده، اکنون می‌توانیم از رویکرد خلاصه‌سازی تصویر بار کاری به رویکرد امضای کانتینر برای همکاران/ممیزیانی که یک تصویر را تأیید می‌کنند، تغییر جهت دهیم.

  • هنگام استفاده مستقیم از خلاصه‌های تصویر، صاحبان منابع باید هر بار که یک تصویر جدید را مجاز می‌کنند، سیاست‌های خود را با یک خلاصه تصویر به‌روزرسانی کنند. با استفاده از امضاهای تصویر، این سیاست شامل یک اثر انگشت کلید عمومی است که کلید خصوصی مربوطه متعلق به همکار/ممیزی است و برای امضای تصاویر حسابرسی شده استفاده می‌شود.
  • برای برخی از مدل‌های امنیتی، ارجاع به یک کلید امضای تصویر قابل اعتماد، راحت‌تر از به‌روزرسانی فهرستی از مقادیر خلاصه تصویر جدید است.

بدون پسرفت امنیتی: این رویکرد امضای کانتینر هیچ پسرفت امنیتی نسبت به رویکرد خلاصه تصویر قبلی ایجاد نمی‌کند زیرا مرزهای اعتماد ثابت می‌مانند. در رویکرد امضای کانتینر، مالک منبع با مشخص کردن اثر انگشت کلید عمومی مورد اعتماد در سیاست WIP، یک کلید تأیید را مجاز می‌کند و بررسی مجوز توسط سرویس تأییدکننده گواهی و WIP انجام می‌شود. سرویس تأییدکننده گواهی تأیید می‌کند که امضا با بار کاری در حال اجرا مرتبط است و سیاست WIP بررسی می‌کند که کلید عمومی ادعا شده توسط سرویس توسط سیاست مجاز شده است.

امنیت قوی: استفاده از امضاهای تصویر کانتینر به فرد اجازه می‌دهد تا حدی به امضاکننده تصویر اعتماد کند. با مشخص کردن اثر انگشت کلید عمومی یک امضاکننده مورد اعتماد در سیاست گواهی، مالک منبع به آن امضاکننده اجازه می‌دهد تا تاییدیه‌هایی را انجام دهد که در آن‌ها تصاویر کانتینر با یک سیاست مطابقت دارند. سرویس تأییدکننده گواهی، تأیید می‌کند که امضا با حجم کار در حال اجرا مرتبط است و سیاست بررسی می‌کند که کلید عمومی که امضا را ایجاد کرده است، توسط سیاست مجاز باشد. از این طریق، لایه اضافی غیرمستقیمی که امضای تصویر ارائه می‌دهد، تضمین‌های امنیتی قوی فضای محرمانه را حفظ می‌کند.

تنها تفاوت بین این رویکردها این است که رویکرد دوم از یک لایه اضافی غیرمستقیم استفاده می‌کند که در آن تصاویر بار کاری با یک کلید امضا تأیید می‌شوند. این هیچ آسیب‌پذیری امنیتی جدیدی ایجاد نمی‌کند زیرا مرزهای اعتماد یکسان باقی می‌مانند.

آنچه یاد خواهید گرفت

در این آزمایشگاه کد، یاد خواهید گرفت که چگونه از امضای تصویر کانتینر برای تأیید دسترسی به منابع محافظت‌شده استفاده کنید:

  • نحوه امضای تصویر کانتینر حسابرسی شده با استفاده از cosign
  • نحوه آپلود امضاهای تصویر کانتینر در رجیسترهای OCI برای کشف و ذخیره امضا
  • نحوه پیکربندی منابع ابری لازم برای اجرای فضای محرمانه
  • نحوه اجرای بار کاری در یک فضای محرمانه با پشتیبانی از تصویر کانتینر امضا شده

این آزمایشگاه کد به شما نشان می‌دهد که چگونه از Confidential Space برای تأیید از راه دور یک تصویر کانتینر که توسط یک کلید قابل اعتماد در حال اجرا در Google Compute Engine امضا شده است، استفاده کنید.

آنچه نیاز دارید

نقش‌های دخیل در یک فضای محرمانه با تصویر کانتینر امضا شده

در این آزمایشگاه کد، بانک پریموس حسابرس و مالک منابع خواهد بود که مسئولیت موارد زیر را بر عهده خواهد داشت:

  1. تنظیم منابع مورد نیاز با داده‌های نمونه.
  2. حسابرسی کد حجم کار.
  3. استفاده از cosign برای امضای تصویر حجم کار.
  4. آپلود امضا در یک مخزن.
  5. پیکربندی سیاست WIP برای محافظت از داده‌های مشتری.

بانک Secundus نویسنده و مجری بار کاری و مسئول موارد زیر خواهد بود:

  1. تنظیم منابع مورد نیاز برای ذخیره نتیجه.
  2. نوشتن کد حجم کار.
  3. انتشار تصویر حجم کار.
  4. اجرای بار کاری در فضای محرمانه با پشتیبانی از تصویر کانتینر امضا شده.

بانک Secundus یک بار کاری ایجاد و منتشر خواهد کرد که داده‌های مشتری ذخیره شده در یک مخزن ذخیره‌سازی ابری متعلق به بانک Primus را جستجو می‌کند. بانک Primus بار کاری را ممیزی می‌کند، تصویر کانتینر را امضا می‌کند و سیاست‌های WIP را پیکربندی می‌کند تا امکان دسترسی به داده‌های آنها توسط بارهای کاری تأیید شده فراهم شود. نتیجه اجرای این بار کاری در یک مخزن ذخیره‌سازی ابری متعلق به بانک Secundus ذخیره خواهد شد.

منابع درگیر در راه‌اندازی فضای محرمانه

این آزمایشگاه کد به تعدادی متغیر اشاره می‌کند که باید برای پروژه GCP خود مقادیر مناسبی را تعیین کنید. دستورات موجود در این آزمایشگاه کد فرض می‌کنند که این متغیرها تنظیم شده‌اند. (برای مثال، export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket' می‌تواند برای تنظیم نام سطل ذخیره‌سازی ورودی بانک Primus استفاده شود.) اگر متغیرهای resource-names تنظیم نشده باشند، بر اساس شناسه پروژه GCP تولید می‌شوند.

موارد زیر را در پروژه Primus پیکربندی کنید:

  • $PRIMUS_INPUT_STORAGE_BUCKET : باکتی که فایل داده‌های مشتری را ذخیره می‌کند.
  • $PRIMUS_WORKLOAD_IDENTITY_POOL : مجموعه‌ی هویت بار کاری (WIP) که ادعاها را تأیید می‌کند.
  • $PRIMUS_WIP_PROVIDER : ارائه‌دهنده‌ی Workload Identity Pool که شامل شرط مجوز برای استفاده از توکن‌های امضا شده توسط سرویس تأیید گواهی است.
  • $PRIMUS_SERVICEACCOUNT : حساب کاربری سرویسی که $PRIMUS_WORKLOAD_IDENTITY_POOL برای دسترسی به منابع محافظت‌شده از آن استفاده می‌کند. در این مرحله، این حساب کاربری اجازه مشاهده داده‌های مشتری ذخیره‌شده در سطل $PRIMUS_INPUT_STORAGE_BUCKET را دارد.
  • $PRIMUS_ENC_KEY : کلید KMS که برای رمزگذاری داده‌های ذخیره شده در $PRIMUS_INPUT_STORAGE_BUCKET ‎ استفاده می‌شود.

منابع جدید برای این آزمایشگاه کد:

  • $PRIMUS_COSIGN_REPOSITORY : رجیستری مصنوعات برای ذخیره امضاهای تصویر بار کاری.
  • $PRIMUS_SIGNING_KEY : کلید KMS که برای امضای تصویر بار کاری توسط حسابرس/همکاران داده (مثلاً بانک primus در این مورد) استفاده می‌شود.

موارد زیر را در پروژه Secundus پیکربندی کنید:

  • $SECUNDUS_ARTIFACT_REGISTRY : رجیستری مصنوعات که تصویر داکر بار کاری در آن قرار می‌گیرد.
  • $WORKLOAD_IMAGE_NAME : نام ایمیج داکر مربوط به حجم کار.
  • $WORKLOAD_IMAGE_TAG : تگ مربوط به ایمیج داکر مربوط به حجم کار.
  • $WORKLOAD_SERVICEACCOUNT : حساب کاربری سرویس که مجوز دسترسی به ماشین مجازی محرمانه‌ای که بار کاری را اجرا می‌کند، دارد.
  • $SECUNDUS_RESULT_BUCKET : باکتی که نتایج بار کاری را ذخیره می‌کند.

منابع دیگر:

  • primus_customer_list.csv شامل داده‌های مشتری است. ما این داده‌ها را در $PRIMUS_INPUT_STORAGE_BUCKET آپلود خواهیم کرد و یک بار کاری ایجاد می‌کنیم که این داده‌ها را جستجو کند.

گردش کار موجود

وقتی بار کاری را در فضای محرمانه اجرا می‌کنید، فرآیند زیر با استفاده از منابع پیکربندی شده انجام می‌شود:

  1. این بار کاری، یک توکن دسترسی عمومی گوگل برای $PRIMUS_SERVICEACCOUNT از WIP درخواست می‌کند. این توکن، یک توکن سرویس Attestation Verifier به همراه ادعاهای مربوط به بار کاری و محیط ارائه می‌دهد.
  2. اگر ادعاهای اندازه‌گیری بار کاری در توکن سرویس Attestation Verifier با شرط ویژگی در WIP مطابقت داشته باشد، توکن دسترسی را برای $PRIMUS_SERVICEACCOUNT.
  3. این بار کاری از توکن دسترسی حساب سرویس مرتبط با $PRIMUS_SERVICEACCOUNT برای دسترسی به داده‌های مشتری در سطل $PRIMUS_INPUT_STORAGE_BUCKET استفاده می‌کند.
  4. بار کاری عملیاتی را روی آن داده‌ها انجام می‌دهد.
  5. این بار کاری از حساب سرویس $WORKLOAD_SERVICEACCOUNT برای نوشتن نتایج آن عملیات در سطل $SECUNDUS_RESULT_STORAGE_BUCKET استفاده می‌کند.

گردش کار جدید با پشتیبانی از کانتینر امضا شده

پشتیبانی از کانتینر امضا شده، همانطور که در زیر نشان داده شده است، در گردش کار موجود ادغام خواهد شد. هنگامی که بار کاری را در فضای محرمانه با پشتیبانی از تصویر کانتینر امضا شده اجرا می‌کنید، فرآیند زیر با استفاده از منابع پیکربندی شده انجام می‌شود:

  1. فضای محرمانه هرگونه امضای کانتینر مربوط به تصویر بار کاری در حال اجرا را کشف کرده و آنها را به تأییدکننده گواهی ارسال می‌کند. تأییدکننده گواهی، امضا را تأیید می‌کند و هرگونه امضای معتبر را در ادعاهای گواهی لحاظ می‌کند.
  2. این بار کاری، یک توکن دسترسی عمومی گوگل برای $PRIMUS_SERVICEACCOUNT از WIP درخواست می‌کند. این توکن، یک توکن سرویس Attestation Verifier به همراه ادعاهای مربوط به بار کاری و محیط ارائه می‌دهد.
  3. اگر ادعاهای امضای کانتینر در توکن سرویس Attestation Verifier با شرط ویژگی در WIP مطابقت داشته باشد، توکن دسترسی را برای $PRIMUS_SERVICEACCOUNT برمی‌گرداند .
  4. این بار کاری از توکن دسترسی حساب سرویس مرتبط با $PRIMUS_SERVICEACCOUNT برای دسترسی به داده‌های مشتری در سطل $PRIMUS_INPUT_STORAGE_BUCKET استفاده می‌کند.
  5. بار کاری عملیاتی را روی آن داده‌ها انجام می‌دهد.
  6. این بار کاری از $WORKLOAD_SERVICEACCOUNT برای نوشتن نتایج آن عملیات در سطل $SECUNDUS_RESULT_STORAGE_BUCKET استفاده می‌کند.

۲. منابع ابری را تنظیم کنید

به عنوان بخشی از راه‌اندازی فضای محرمانه، ابتدا منابع ابری مورد نیاز را تحت پروژه‌های GCP بانک‌های Primus و Secundus ایجاد خواهید کرد. اینها منابع جدید این آزمایشگاه کد هستند:

در پروژه پریموس:

  • کلید امضای KMS که پس از ممیزی کد، برای امضای بارهای کاری Secundus استفاده می‌شود.
  • مخزن رجیستری مصنوعات برای ذخیره امضاهای Cosign.

هیچ منبع جدیدی در پروژه Secundus وجود ندارد. پس از راه‌اندازی این منابع، یک حساب کاربری سرویس برای بار کاری با نقش‌ها و مجوزهای مورد نیاز ایجاد خواهید کرد. سپس یک تصویر بار کاری ایجاد می‌کنید و حسابرس، بانک Primus، تصویر بار کاری را امضا می‌کند. سپس بار کاری توسط همکاران داده (بانک Primus در این آزمایشگاه کد) تأیید می‌شود و اپراتور بار کاری (بانک Secundus در این مورد) بار کاری را اجرا خواهد کرد.

به عنوان بخشی از راه‌اندازی فضای محرمانه، شما منابع ابری مورد نیاز را در پروژه‌های Primus و Secundus GCP ایجاد خواهید کرد.

قبل از اینکه شروع کنی

  • برای دریافت اسکریپت‌های مورد نیاز که به عنوان بخشی از این آزمایشگاه کد استفاده می‌شوند ، این مخزن را با استفاده از دستور زیر کلون کنید.
git clone https://github.com/GoogleCloudPlatform/confidential-space
  • دایرکتوری مربوط به این codelab را تغییر دهید.
cd confidential-space/codelabs/signed_container_codelab/scripts
  • مطمئن شوید که پروژه‌های مورد نیاز را مطابق شکل زیر تنظیم کرده‌اید.
export PRIMUS_PROJECT_ID=<GCP project id of primus bank>
export SECUNDUS_PROJECT_ID=<GCP project id of secundus bank>
  • با استفاده از این دستور، متغیرهای مربوط به نام منابع ذکر شده در بالا را تنظیم کنید. می‌توانید با استفاده از این متغیرها، نام منابع را تغییر دهید (مثلاً export PRIMUS_INPUT_STORAGE_BUCKET='my-input-bucket' )
  • اسکریپت زیر را اجرا کنید تا نام متغیرهای باقی‌مانده بر اساس شناسه پروژه شما برای نام منابع، به مقادیری تنظیم شوند.
source config_env.sh
  • دستورالعمل‌های مربوط به نصب cosign را از اینجا دنبال کنید.

منابع بانکی Primus را تنظیم کنید

به عنوان بخشی از این مرحله، منابع ابری مورد نیاز برای بانک Primus را تنظیم خواهید کرد. اسکریپت زیر را برای تنظیم منابع بانک Primus اجرا کنید. به عنوان بخشی از این مراحل، منابع ذکر شده در زیر ایجاد خواهند شد:

  • مخزن ذخیره‌سازی ابری ( $PRIMUS_INPUT_STORAGE_BUCKET ) برای ذخیره فایل داده‌های رمزگذاری‌شده مشتریان بانک Primus.
  • کلید رمزگذاری ( $PRIMUS_ENC_KEY ) و حلقه کلید ( $PRIMUS_ENC_KEYRING ) در KMS برای رمزگذاری فایل داده بانک Primus.
  • مخزن هویت بار کاری ( $PRIMUS_WORKLOAD_IDENTITY_POOL ) برای اعتبارسنجی ادعاها بر اساس شرایط ویژگی‌های پیکربندی‌شده تحت ارائه‌دهنده آن.
  • حساب کاربری سرویس ( $PRIMUS_SERVICEACCOUNT ) به مخزن هویت بار کاری فوق‌الذکر ( $PRIMUS_WORKLOAD_IDENTITY_POOL ) با دسترسی IAM زیر متصل شده است:
  • roles/cloudkms.cryptoKeyDecrypter برای رمزگشایی داده‌ها با استفاده از کلید KMS.
  • objectViewer برای خواندن داده‌ها از مخزن ذخیره‌سازی ابری.
  • roles/iam.workloadIdentityUser برای اتصال این حساب سرویس به مخزن هویت بار کاری.
./setup_primus_bank_resources.sh

منابع بانک سکوندوس را تنظیم کنید

به عنوان بخشی از این مرحله، منابع ابری مورد نیاز برای بانک Secundus را تنظیم خواهید کرد. اسکریپت زیر را برای تنظیم منابع بانک Secundus اجرا کنید. به عنوان بخشی از این مراحل، منابع ذکر شده در زیر ایجاد خواهند شد:

  • مخزن ذخیره‌سازی ابری ( $SECUNDUS_RESULT_STORAGE_BUCKET ) برای ذخیره نتایج اجرای بار کاری توسط بانک Secundus.
./setup_secundus_bank_resources.sh

۳. ایجاد و ثبت حجم کار

ایجاد حساب کاربری سرویس حجم کار

اکنون، یک حساب کاربری سرویس برای بار کاری با نقش‌ها و مجوزهای مورد نیاز ایجاد خواهید کرد. اسکریپت زیر را برای ایجاد یک حساب کاربری سرویس بار کاری در پروژه بانک Secundus اجرا کنید. این حساب کاربری سرویس توسط ماشین مجازی که بار کاری را اجرا می‌کند، استفاده خواهد شد.

  • این حساب سرویس حجم کار ( $WORKLOAD_SERVICEACCOUNT ) نقش‌های زیر را خواهد داشت:
  • برای دریافت توکن تایید، confidentialcomputing.workloadUser استفاده کنید.
  • logging.logWriter برای نوشتن گزارش‌ها در Cloud Logging.
  • objectViewer برای خواندن داده‌ها از مخزن ذخیره‌سازی ابری $PRIMUS_INPUT_STORAGE_BUCKET .
  • objectAdmin برای نوشتن نتیجه بار کاری در مخزن ذخیره‌سازی ابری $SECUNDUS_RESULT_STORAGE_BUCKET .
./create_workload_serviceaccount.sh

ایجاد حجم کار

به عنوان بخشی از این مرحله، شما یک ایمیج داکر از بار کاری ایجاد خواهید کرد. بار کاری مورد استفاده در این Codelab یک برنامه Go مبتنی بر CLI ساده است که مشتریان (از داده‌های مشتریان بانک Primus) را از یک موقعیت جغرافیایی ارائه شده در آرگومان شمارش می‌کند. اسکریپت زیر را اجرا کنید تا یک بار کاری ایجاد شود که در آن مراحل زیر انجام می‌شود:

  • یک رجیستری مصنوعات ( $SECUNDUS_ARTIFACT_REGISTRY ) متعلق به بانک Secundus ایجاد کنید.
  • کد بار کاری را با نام منابع مورد نیاز به‌روزرسانی کنید. در اینجا کد بار کاری مورد استفاده برای این آزمایشگاه کد آمده است.
  • فایل باینری Go را بسازید و برای ساخت یک تصویر داکر از کد بار کاری، Dockerfile ایجاد کنید. در اینجا Dockerfile مورد استفاده برای این آزمایشگاه کد آمده است.
  • ایمیج داکر را بسازید و در رجیستری مصنوعات ( $SECUNDUS_ARTIFACT_REGISTRY ‎) که متعلق به بانک Secundus است، منتشر کنید.
  • به $WORKLOAD_SERVICEACCOUNT مجوز خواندن برای $SECUNDUS_ARTIFACT_REGISTRY اعطا کنید. این مجوز برای کانتینر بار کاری لازم است تا بتواند تصویر داکر بار کاری را از رجیستری Artifact دریافت کند.
./create_workload.sh

حجم کار علامت

ما از Cosign برای امضای ایمیج بار کاری استفاده خواهیم کرد. Cosign به طور پیش‌فرض امضاها را در همان مخزن ایمیج که امضا می‌کند ذخیره می‌کند. برای تعیین یک مخزن متفاوت برای امضاها، می‌توانید متغیر محیطی COSIGN_REPOSITORY را تنظیم کنید.

در اینجا ما از Artifact Registry به عنوان مثال استفاده می‌کنیم. شما همچنین می‌توانید بر اساس ترجیح خود، سایر رجیستری‌های مبتنی بر OCI مانند Docker Hub یا AWS CodeArtifact را انتخاب کنید.

  1. یک مخزن داکر Artifact Registry ایجاد کنید.
gcloud config set project $PRIMUS_PROJECT_ID
gcloud artifacts repositories create $PRIMUS_COSIGN_REPOSITORY \
  --repository-format=docker --location=${PRIMUS_PROJECT_REPOSITORY_REGION}
  1. یک جاکلیدی و کلید در زیر KMS برای امضای تصویر بار کاری ایجاد کنید.
gcloud config set project $PRIMUS_PROJECT_ID
gcloud kms keyrings create $PRIMUS_SIGNING_KEYRING \
  --location=${PRIMUS_PROJECT_LOCATION}
gcloud kms keys create $PRIMUS_SIGNING_KEY \
  --keyring=$PRIMUS_SIGNING_KEYRING \
  --purpose=asymmetric-signing \
  --default-algorithm=ec-sign-p256-sha256 \
  --location=${PRIMUS_PROJECT_LOCATION}
  1. برای Artifact Registry، یک نام تصویر کامل مانند $LOCATION/$PROJECT/$REPOSITORY/$IMAGE_NAME مورد انتظار است. می‌توانید هر تصویر کانتینری را برای ذخیره‌سازی امضا در مخزن بارگذاری کنید.
export COSIGN_REPOSITORY=us-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_COSIGN_REPOSITORY}/demo
  1. نقش Viewer را در مخزن $PRIMUS_COSIGN_REPOSITORY به حساب سرویس $WORKLOAD_SERVICEACCOUNT اعطا کنید. این به Confidential Space اجازه می‌دهد تا هرگونه امضای تصویر کانتینر آپلود شده در $PRIMUS_COSIGN_REPOSITORY را کشف کند.
gcloud artifacts repositories add-iam-policy-binding ${PRIMUS_COSIGN_REPOSITORY} \
--project=${PRIMUS_PROJECT_ID} --role='roles/viewer' --location=us \
--member="serviceAccount:${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com"

Cosign ابزاری قدرتمند با ویژگی‌های امضای چندگانه است. در مورد استفاده ما، ما فقط به Cosign نیاز داریم که با یک جفت کلید امضا کند. امضای بدون کلید Cosign برای این ویژگی تصویر کانتینر امضا شده پشتیبانی نمی‌شود.

هنگام امضا با یک جفت کلید، دو گزینه وجود دارد:

  1. با یک جفت کلید محلی تولید شده توسط Cosign امضا کنید.
  2. با یک جفت کلید ذخیره شده در جای دیگر (مثلاً در یک KMS) امضا کنید.
  1. اگر جفت کلید ندارید، آن را در Cosign ایجاد کنید. برای جزئیات بیشتر به امضای با کلیدهای خودمدیریت‌شده مراجعه کنید. در اینجا هر دو روش (به صورت محلی و با استفاده از ارائه‌دهنده KMS) برای تولید جفت کلید و امضای بار کاری را مشخص کرده‌ایم، لطفاً یکی از این روش‌ها را برای امضای کانتینر بار کاری دنبال کنید.
// Set Application Default Credentials.
gcloud auth application-default login 
// Generate keys using a KMS provider.
cosign generate-key-pair --kms <provider>://<key>
// Generate keys using Cosign.
cosign generate-key-pair

در کد بالا، عبارت <provider>://<key> را با gcpkms://projects/$PRIMUS_PROJECT_ID/locations/global/keyRings/$PRIMUS_SIGNING_KEYRING/cryptoKeys/$PRIMUS_SIGNING_KEY/cryptoKeyVersions/$PRIMUS_SIGNING_KEYVERSION جایگزین کنید.

  • <provider>: به راهکار KMS مورد استفاده شما اشاره دارد.
  • <key>: به مسیر کلید در KMS اشاره دارد.
  1. برای تأیید، کلید عمومی را بازیابی کنید.
// For KMS providers.
cosign public-key --key <some provider>://<some key> > pub.pem

// For local key pair signing.
cosign public-key --key cosign.key > pub.pem
  1. حجم کار را با استفاده از Cosign امضا کنید. کدگذاری base64 بدون پد را روی کلید عمومی انجام دهید
PUB=$(cat pub.pem | openssl base64)
// Remove spaces and trailing "=" signs.
PUB=$(echo $PUB | tr -d '[:space:]' | sed 's/[=]*$//')
  1. حجم کار را با استفاده از Cosign به همراه کلید عمومی صادر شده و الگوریتم‌های امضا متصل، امضا کنید.
IMAGE_REFERENCE=us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/$SECUNDUS_ARTIFACT_REPOSITORY/$WORKLOAD_IMAGE_NAME:$WORKLOAD_IMAGE_TAG
// Sign with KMS support.
cosign sign --key <some provider>://<some key> $IMAGE_REFERENCE \
-a dev.cosignproject.cosign/sigalg=ECDSA_P256_SHA256 \
-a dev.cosignproject.cosign/pub=$PUB
// Sign with a local key pair.
cosign sign --key cosign.key $IMAGE_REFERENCE \
-a dev.cosignproject.cosign/sigalg=ECDSA_P256_SHA256 \
-a dev.cosignproject.cosign/pub=$PUB
  • --key [REQUIRED] مشخص می‌کند که از کدام کلید امضا استفاده شود. هنگام اشاره به کلیدی که توسط ارائه‌دهنده KMS مدیریت می‌شود، لطفاً از قالب URI خاص پشتیبانی Sigstore KMS پیروی کنید. هنگام اشاره به کلیدی که توسط Cosign تولید شده است، به جای آن از cosign.key استفاده کنید.
  • $IMAGE_REFERENCE [REQUIRED]‎ مشخص می‌کند که کدام تصویر کانتینر باید امضا شود. قالب IMAGE_REFERENCE را می‌توان با برچسب یا خلاصه تصویر شناسایی کرد. برای مثال: us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/secundus-workloads/workload-container:latest or us-docker.pkg.dev/$SECUNDUS_PROJECT_ID/secundus-workloads/workload-container [IMAGE-digest]
  • ‎-a [REQUIRED] حاشیه‌نویسی‌های متصل به بار داده امضا را مشخص می‌کند. برای تصاویر محفظه امضا شده در فضای محرمانه، الگوریتم‌های کلید عمومی و امضا باید به بار داده امضا متصل شوند.
  • dev.cosignproject.cosign/sigalg فقط سه مقدار می‌پذیرد:
  • RSASSA_PSS_SHA256: الگوریتم RSASSA با لایه‌گذاری PSS با خلاصه SHA256.
  • RSASSA_PKCS1V15_SHA256: الگوریتم RSASSA با لایه‌بندی PKCS#1 نسخه ۱.۵ به همراه خلاصه SHA256.
  • ECDSA_P256_SHA256: ECDSA روی منحنی P-256 با خلاصه SHA256. این الگوریتم امضای پیش‌فرض برای جفت کلیدهای تولید شده توسط Cosign نیز هست.
  1. امضاها را در مخزن docker بارگذاری کنید

علامت Cosign به طور خودکار امضاها را در COSIGN_REPOSITORY.

۴. مجوزدهی و اجرای حجم کار

حجم کار را مجاز کنید

به عنوان بخشی از این مرحله، ما ارائه دهنده هویت بار کاری را تحت مجموعه هویت بار کاری ( $PRIMUS_WORKLOAD_IDENTITY_POOL ) تنظیم خواهیم کرد. شرایط-ویژگی برای هویت بار کاری پیکربندی شده است، همانطور که در زیر نشان داده شده است. یکی از شرایط، اعتبارسنجی اثر انگشت امضای تصویر بار کاری در برابر اثر انگشت امضای کلید عمومی است. با این شرط ویژگی، هنگامی که بانک Secundus یک تصویر بار کاری جدید منتشر می‌کند، بانک Primus کد بار کاری را ممیزی می‌کند و تصویر بار کاری جدید را بدون نیاز به به‌روزرسانی سیاست WIP با خلاصه تصویر، امضا می‌کند.

gcloud config set project $PRIMUS_PROJECT_ID
PUBLIC_KEY_FINGERPRINT=$(openssl pkey -pubin -in pub.pem -outform DER | openssl sha256 | cut -d' ' -f2)
gcloud iam workload-identity-pools providers create-oidc ${PRIMUS_WIP_PROVIDER} \
   --location="global" \
   --workload-identity-pool="${PRIMUS_WORKLOAD_IDENTITY_POOL}" \
   --issuer-uri="https://confidentialcomputing.googleapis.com/" \
   --allowed-audiences="https://sts.googleapis.com" \
   --attribute-mapping="google.subject='assertion.sub'" \
   --attribute-condition="assertion.swname == 'CONFIDENTIAL_SPACE' &&
  'STABLE' in assertion.submods.confidential_space.support_attributes
     && '${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com' in
     assertion.google_service_accounts
     && ['ECDSA_P256_SHA256:${PUBLIC_KEY_FINGERPRINT}']
       .exists(fingerprint, fingerprint in assertion.submods.container.image_signatures.map(sig,sig.signature_algorithm+':'+sig.key_id))"

حجم کار را اجرا کنید

به عنوان بخشی از این مرحله، ما بار کاری را روی ماشین مجازی محرمانه (Confidential VM) اجرا خواهیم کرد. آرگومان‌های مورد نیاز TEE با استفاده از پرچم فراداده (metadata flag) ارسال می‌شوند. آرگومان‌های مربوط به کانتینر بار کاری با استفاده از بخش " tee-cmd " پرچم ارسال می‌شوند. بار کاری به گونه‌ای کدنویسی می‌شود که نتیجه خود را در $SECUNDUS_RESULT_STORAGE_BUCKET منتشر کند.

gcloud compute instances create ${WORKLOAD_VM} \
 --confidential-compute-type=SEV \
 --shielded-secure-boot \
 --maintenance-policy=MIGRATE \
 --scopes=cloud-platform \
 --zone=${SECUNDUS_PROJECT_ZONE} \
 --project=${SECUNDUS_PROJECT_ID} \
 --image-project=confidential-space-images \
 --image-family=confidential-space \
 --service-account=${WORKLOAD_SERVICEACCOUNT}@${SECUNDUS_PROJECT_ID}.iam.gserviceaccount.com \
 --metadata "^~^tee-image-reference=us-docker.pkg.dev/${SECUNDUS_PROJECT_ID}/${SECUNDUS_ARTIFACT_REPOSITORY}/${WORKLOAD_IMAGE_NAME}:${WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-cmd="[\"count-location\",\"Seattle\",\"gs://${SECUNDUS_RESULT_STORAGE_BUCKET}/seattle-result\"]"~tee-signed-image-repos=us-docker.pkg.dev/${PRIMUS_PROJECT_ID}/${PRIMUS_COSIGN_REPOSITORY}/demo"

مشاهده نتایج

در پروژه Secundus، نتایج حجم کار را مشاهده کنید.

gcloud config set project $SECUNDUS_PROJECT_ID
gsutil cat gs://$SECUNDUS_RESULT_STORAGE_BUCKET/seattle-result

نتیجه باید 3 باشد، زیرا این تعداد افراد اهل سیاتل است که در فایل primus_customer_list.csv فهرست شده‌اند!

۵. تمیز کردن

این اسکریپتی است که می‌تواند برای پاکسازی منابعی که به عنوان بخشی از این آزمایشگاه کد ایجاد کرده‌ایم، استفاده شود. به عنوان بخشی از این پاکسازی، منابع زیر حذف خواهند شد:

  • سطل ذخیره‌سازی ورودی بانک Primus ( $PRIMUS_INPUT_STORAGE_BUCKET ).
  • حساب کاربری سرویس بانک پریموس ( $PRIMUS_SERVICEACCOUNT ).
  • دفتر ثبت مصنوعات بانک پریموس که امضاهای تصویری ( $PRIMUS_COSIGN_REPOSITORY ) را در خود جای داده است.
  • مخزن هویت حجم کار بانک پریموس ( $PRIMUS_WORKLOAD_IDENTITY_POOL ).
  • حساب سرویس حجم کار بانک Secundus ( $WORKLOAD_SERVICEACCOUNT ).
  • نمونه محاسبه حجم کار.
  • مخزن ذخیره‌سازی نتایج بانک Secundus ( $SECUNDUS_RESULT_STORAGE_BUCKET ).
  • دفتر ثبت آثار باستانی بانک سکندوس ( $SECUNDUS_ARTIFACT_REGISTRY ).
  • ماشین مجازی بار کاری بانک Secundus ( $WORKLOAD_VM ).
./cleanup.sh

اگر کاوش شما تمام شد، لطفاً حذف پروژه خود را در نظر بگیرید.

  • به کنسول پلتفرم ابری بروید
  • پروژه‌ای را که می‌خواهید خاموش کنید انتخاب کنید، سپس روی «حذف» در بالا کلیک کنید: این کار پروژه را برای حذف زمان‌بندی می‌کند.

تبریک می‌گویم

تبریک می‌گویم، شما با موفقیت آزمایشگاه کد را به پایان رساندید!

شما یاد گرفتید که چگونه از ویژگی تصویر کانتینر امضا شده برای بهبود قابلیت استفاده از Confidential Space استفاده کنید.

بعدش چی؟

برخی از این آزمایشگاه‌های کد مشابه را بررسی کنید...

مطالعه بیشتر