1. সংক্ষিপ্ত বিবরণ
কনফিডেনশিয়াল স্পেস নিরাপদ বহু-পক্ষীয় ডেটা ভাগাভাগি এবং সহযোগিতা প্রদান করে, একই সাথে সংস্থাগুলিকে তাদের ডেটার গোপনীয়তা রক্ষা করার সুযোগ দেয়। এর অর্থ হল সংস্থাগুলি একে অপরের সাথে সহযোগিতা করতে পারে, একই সাথে তাদের ডেটার উপর নিয়ন্ত্রণ বজায় রাখতে এবং অননুমোদিত অ্যাক্সেস থেকে রক্ষা করতে পারে।
কনফিডেনশিয়াল স্পেস এমন পরিস্থিতি উন্মোচন করে যেখানে আপনি সংবেদনশীল, প্রায়শই নিয়ন্ত্রিত, ডেটা একত্রিত এবং বিশ্লেষণ করে পারস্পরিক মূল্য অর্জন করতে চান, একই সাথে এর উপর সম্পূর্ণ নিয়ন্ত্রণ বজায় রেখে। কনফিডেনশিয়াল স্পেসের মাধ্যমে, সংস্থাগুলি ব্যক্তিগতভাবে সনাক্তযোগ্য তথ্য (PII), সুরক্ষিত স্বাস্থ্য তথ্য (PHI), বৌদ্ধিক সম্পত্তি এবং ক্রিপ্টোগ্রাফিক গোপনীয়তার মতো সংবেদনশীল ডেটা একত্রিত এবং বিশ্লেষণ করে পারস্পরিক মূল্য অর্জন করতে পারে - একই সাথে এর উপর সম্পূর্ণ নিয়ন্ত্রণ বজায় রেখে।
তোমার যা লাগবে
- দুটি পৃথক গুগল ক্লাউড প্ল্যাটফর্ম প্রকল্প
- একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স
- গুগল কম্পিউট ইঞ্জিন , গোপনীয় ভিএম , কন্টেইনার এবং রিমোট রিপোজিটরি, সার্টিফিকেট এবং সার্টিফিকেট চেইন সম্পর্কে প্রাথমিক জ্ঞান।
- সার্ভিস অ্যাকাউন্টস , ওপেন পলিসি এজেন্ট , রেগো এবং পাবলিক কী অবকাঠামো সম্পর্কে প্রাথমিক জ্ঞান।
তুমি কি শিখবে
- গোপন স্থান চালানোর জন্য প্রয়োজনীয় ক্লাউড রিসোর্সগুলি কীভাবে কনফিগার করবেন
- কনফিডেনশিয়াল স্পেস ইমেজ চালানোর জন্য একটি কনফিডেনশিয়াল ভিএম-এ কীভাবে ওয়ার্কলোড চালানো যায়
- ওয়ার্কলোড কোড ( কি ), কনফিডেনশিয়াল স্পেস এনভায়রনমেন্ট ( কোথায় ) এবং ওয়ার্কলোড পরিচালনাকারী অ্যাকাউন্ট ( কে ) এর বৈশিষ্ট্যের উপর ভিত্তি করে সুরক্ষিত সম্পদগুলিতে অ্যাক্সেস কীভাবে অনুমোদন করবেন।
এই কোডল্যাবটি গুগল ক্লাউড ছাড়া অন্য কোথাও হোস্ট করা সুরক্ষিত রিসোর্সগুলির সাথে গোপনীয় স্থান কীভাবে ব্যবহার করতে হয় তার উপর আলোকপাত করে। আপনি একটি নন্স, শ্রোতা এবং PKI টোকেন প্রকার প্রদান করে গুগল অ্যাটেস্টেশন পরিষেবা থেকে একটি কাস্টম, স্বয়ংসম্পূর্ণ টোকেন কীভাবে অনুরোধ করবেন তা শিখবেন।
এই কোডল্যাবে, আপনি আপনার ঘুমের মান গণনা করার জন্য একটি কাল্পনিক পণ্য - USleep, একটি কন্টেইনারাইজড অ্যাপ্লিকেশন এবং একটি কাল্পনিক পণ্য - UWear, একটি সংযুক্ত পরিধেয় ডিভাইসের মধ্যে একটি গোপনীয় স্থান স্থাপন করবেন। UWear একটি নিরাপদ, সুরক্ষিত এবং বিচ্ছিন্ন পরিবেশে (যাকে বিশ্বস্ত এক্সিকিউশন এনভায়রনমেন্ট বা TEE বলা হয়) USleep-এর সাথে সুরক্ষিত স্বাস্থ্য তথ্য (PHI) ভাগ করবে যাতে ডেটার মালিকরা সম্পূর্ণ গোপনীয়তা বজায় রাখে।
UWear হল ওয়ার্কলোড অডিটর এবং ডেটা মালিক উভয়ই। ওয়ার্কলোড অডিটর হিসেবে, এটি যে ওয়ার্কলোডটি চালানো হচ্ছে তাতে কোড পর্যালোচনা করে এবং ইমেজ ডাইজেস্ট নোট করে। ডেটা মালিক হিসেবে, UWear টোকেনের বৈধতা এবং এর স্বাক্ষর পরীক্ষা করার জন্য যাচাইকরণ যুক্তি লেখে। এটি অডিটেড ওয়ার্কলোড ইমেজ ডাইজেস্ট ব্যবহার করে একটি বৈধতা নীতি লেখে, যা শুধুমাত্র নির্দিষ্ট পরিবেশে নির্দিষ্ট ইমেজ ডাইজেস্টকে সংবেদনশীল ডেটাতে অ্যাক্সেস পেতে দেয়।
এই কোডল্যাবে, USleep, কন্টেইনারাইজড অ্যাপ্লিকেশনটি স্থাপন করছে। USleep-এর সংবেদনশীল ডেটাতে অ্যাক্সেস নেই তবে অনুমোদিত ওয়ার্কলোড পরিচালনা করে যা সংবেদনশীল ডেটাতে অ্যাক্সেসের অনুমতি দেয়।
কোডল্যাবে নিম্নলিখিত ধাপগুলি অন্তর্ভুক্ত থাকে:
- ধাপ ১: কোডল্যাবের জন্য প্রয়োজনীয় ক্লাউড রিসোর্স সেট আপ করুন। প্রকল্প, বিলিং এবং অনুমতি সেট আপ করুন। কোডল্যাবের সোর্স কোড ডাউনলোড করুন এবং পরিবেশগত ভেরিয়েবল সেট করুন।
- ধাপ ২: রুট সার্টিফিকেট ডাউনলোড করুন এবং আপনার UWear সোর্স কোড দিয়ে সংরক্ষণ করুন।
- ধাপ ৩: USleep এবং UWear-এর জন্য ওয়ার্কলোড VM দ্বারা ব্যবহৃত পৃথক ওয়ার্কলোড পরিষেবা অ্যাকাউন্ট তৈরি করুন।
- ধাপ ৪: USleep ওয়ার্কলোড তৈরি করুন যা একটি প্রত্যয়ন টোকেন প্রদান করে।
- ধাপ ৫: UWear ওয়ার্কলোড তৈরি করুন যা প্রত্যয়ন টোকেন যাচাই করে এবং টোকেন অনুমোদিত হলে সংবেদনশীল ডেটা পাঠায়।
- ধাপ ৬: USleep এবং UWear ওয়ার্কলোড চালান। UWear সংবেদনশীল ডেটা সরবরাহ করবে এবং USleep ডেটার উপর একটি স্লিপ অ্যালগরিদম চালাবে এবং একটি ফলাফল আউটপুট করবে।
- ধাপ ৭: (ঐচ্ছিক) একটি অননুমোদিত USleep ওয়ার্কলোড চালান এবং নিশ্চিত করুন যে UWear থেকে সংবেদনশীল ডেটা পাওয়া যায়নি।
- ধাপ ৮: সমস্ত সম্পদ পরিষ্কার করুন।
কর্মপ্রণালী বোঝা
USleep Confidential Space-এ ওয়ার্কলোড চালাবে। ওয়ার্কলোড চালানোর জন্য UWear-এর PHI-তে অ্যাক্সেস প্রয়োজন। অ্যাক্সেস পেতে, USleep ওয়ার্কলোড প্রথমে একটি নিরাপদ TLS সেশন তৈরি করে। এরপর USleep একটি পেলোড সহ Google Attestation Service থেকে একটি অ্যাটেস্টেশন টোকেনের অনুরোধ করবে।
USleep একটি JSON পেলোড সহ একটি প্রত্যয়ন টোকেনের অনুরোধ করবে যাতে তিনটি জিনিস থাকবে:
- একটি প্রত্যয়ন টোকেন যা TLS সেশনের সাথে আবদ্ধ । প্রত্যয়ন টোকেনকে TLS সেশনের সাথে আবদ্ধ করার জন্য, nonce মান হবে TLS Exported Keying Material এর হ্যাশ। TLS সেশনের সাথে টোকেনটি আবদ্ধ করার ফলে নিশ্চিত হয় যে কোনও মেশিন-ইন-দ্য-মিডল আক্রমণ ঘটছে না কারণ TLS সেশনে জড়িত দুটি পক্ষই nonce মান তৈরি করতে সক্ষম হবে।
- "uwear" এর একটি শ্রোতা প্রদান করা হবে। UWear যাচাই করবে যে এটিই প্রত্যয়ন টোকেনের জন্য উদ্দিষ্ট শ্রোতা।
- "PKI" এর একটি টোকেন টাইপ। "PKI" এর একটি টোকেন টাইপ মানে USleep একটি স্বয়ংসম্পূর্ণ টোকেনের অনুরোধ করতে চায়। স্বয়ংসম্পূর্ণ টোকেনটি Confidential Space এর সুপরিচিত PKI এন্ডপয়েন্ট থেকে ডাউনলোড করা রুট ব্যবহার করে যাচাই করা যেতে পারে যে এটি Google দ্বারা স্বাক্ষরিত। এটি ডিফল্ট OIDC টোকেন টাইপের বিপরীতে, যার স্বাক্ষর নিয়মিতভাবে ঘোরানো একটি পাবলিক কী ব্যবহার করে যাচাই করা হয়।

USleep ওয়ার্কলোড অ্যাটেস্টেশন টোকেন গ্রহণ করে। এরপর UWear USleep এর সাথে TLS সংযোগে যোগ দেয় এবং USleep এর অ্যাটেস্টেশন টোকেন পুনরুদ্ধার করে। UWear রুট সার্টিফিকেটের বিপরীতে x5c দাবি পরীক্ষা করে টোকেনটি যাচাই করবে।
UWear USleep ওয়ার্কলোড অনুমোদন করবে যদি:
- টোকেনটি PKI যাচাইকরণ যুক্তি পাস করে।
- UWear রুট সার্টিফিকেটের বিপরীতে x5c দাবি পরীক্ষা করে, লিফ সার্টিফিকেট দ্বারা টোকেন স্বাক্ষরিত কিনা তা পরীক্ষা করে এবং সবশেষে ডাউনলোড করা রুট সার্টিফিকেটটি x5c দাবির মতো একই রুট কিনা তা পরীক্ষা করে টোকেনটি যাচাই করবে।
- টোকেনে থাকা ওয়ার্কলোড পরিমাপের দাবিগুলি OPA নীতিতে উল্লেখিত বৈশিষ্ট্যের শর্তগুলির সাথে মেলে। OPA হল একটি ওপেন সোর্স, সাধারণ উদ্দেশ্য নীতি ইঞ্জিন যা স্ট্যাক জুড়ে নীতি প্রয়োগকে একীভূত করে। OPA JSON-এর মতো সিনট্যাক্স সহ নথি ব্যবহার করে, নীতিটি যে বেসলাইন মানগুলির বিরুদ্ধে বৈধতা পেয়েছে তা সেট করতে। নীতিটি কোন মানগুলির জন্য পরীক্ষা করে তার উদাহরণের জন্য OPA বেসলাইন মানগুলি দেখুন।
- ননসটি প্রত্যাশিত ননসের (TLS এক্সপোর্টেড কীয়িং মেটেরিয়াল ) সাথে মিলে যায়। এটি উপরের OPA নীতিতে যাচাই করা হয়েছে।
একবার এই সমস্ত পরীক্ষা সম্পন্ন হয়ে গেলে এবং পাস হয়ে গেলে, UWear নিশ্চিত করতে পারে যে ডেটা নিরাপদে পাঠানো এবং প্রক্রিয়াজাত করা হবে। UWear একই TLS সেশনে সংবেদনশীল PHI দিয়ে প্রতিক্রিয়া জানাবে এবং USleep গ্রাহকের ঘুমের মান গণনা করতে সেই ডেটা ব্যবহার করতে সক্ষম হবে।
2. ক্লাউড রিসোর্স সেট আপ করুন
শুরু করার আগে
- দুটি গুগল ক্লাউড প্রকল্প সেট আপ করুন, একটি USleep এর জন্য এবং একটি UWear এর জন্য। গুগল ক্লাউড প্রকল্প তৈরি সম্পর্কে আরও তথ্যের জন্য, অনুগ্রহ করে "আপনার প্রথম গুগল প্রকল্প সেট আপ করুন এবং নেভিগেট করুন" কোডল্যাবটি দেখুন। প্রকল্প আইডি কীভাবে পুনরুদ্ধার করবেন এবং এটি কীভাবে প্রকল্পের নাম এবং প্রকল্প নম্বর থেকে আলাদা সে সম্পর্কে বিশদ জানতে আপনি প্রকল্প তৈরি এবং পরিচালনা করতে পারেন।
- আপনার প্রকল্পের জন্য বিলিং সক্ষম করুন ।
- আপনার গুগল প্রোজেক্টের ক্লাউড শেল এর একটিতে, নীচে দেখানো প্রয়োজনীয় প্রোজেক্ট এনভায়রনমেন্ট ভেরিয়েবল সেট করুন।
export UWEAR_PROJECT_ID=<Google Cloud project id of UWear>
export USLEEP_PROJECT_ID=<Google Cloud project id of USleep>
- উভয় প্রকল্পের জন্য গোপনীয় কম্পিউটিং API এবং নিম্নলিখিত API গুলি সক্ষম করুন।
gcloud config set project $UWEAR_PROJECT_ID
gcloud services enable \
cloudapis.googleapis.com \
cloudshell.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
confidentialcomputing.googleapis.com
gcloud config set project $USLEEP_PROJECT_ID
gcloud services enable \
cloudapis.googleapis.com \
cloudshell.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com \
confidentialcomputing.googleapis.com
- ব্যবহার করে আপনার প্রধান শনাক্তকারী পুনরুদ্ধার করুন
gcloud auth list
# Output should contain
# ACCOUNT: <Principal Identifier>
# Set your member variable
export MEMBER='user:<Principal Identifier>'
- এই দুটি প্রকল্পের জন্য অনুমতি যোগ করুন। গ্রান্ট অ্যান আইএএম রোল ওয়েবপেজে বিস্তারিত অনুসরণ করে অনুমতি যোগ করা যেতে পারে।
-
$UWEAR_PROJECT_IDএর জন্য, আপনার আর্টিফ্যাক্ট রেজিস্ট্রি অ্যাডমিনিস্ট্রেটর এবং সার্ভিস অ্যাকাউন্ট অ্যাডমিনের প্রয়োজন হবে।
gcloud config set project $UWEAR_PROJECT_ID
# Add Artifact Registry Administrator role
gcloud projects add-iam-policy-binding $UWEAR_PROJECT_ID --member=$MEMBER --role='roles/iam.serviceAccountAdmin'
# Add Service Account Administrator role
gcloud projects add-iam-policy-binding $UWEAR_PROJECT_ID --member=$MEMBER --role='roles/artifactregistry.admin'
-
$USLEEP_PROJECT_IDএর জন্য, আপনার Compute Admin , Storage Admin , Artifact Registry Administrator এবং Service Account Admin প্রয়োজন হবে।
gcloud config set project $USLEEP_PROJECT_ID
# Add Service Account Administrator role
gcloud projects add-iam-policy-binding $USLEEP_PROJECT_ID --member=$MEMBER --role='roles/iam.serviceAccountAdmin'
# Add Artifact Registry Administrator role
gcloud projects add-iam-policy-binding $USLEEP_PROJECT_ID --member=$MEMBER --role='roles/artifactregistry.admin'
# Add Compute Administrator role
gcloud projects add-iam-policy-binding $USLEEP_PROJECT_ID --member=$MEMBER --role='roles/compute.admin'
# Add Storage Administrator role
gcloud projects add-iam-policy-binding $USLEEP_PROJECT_ID --member=$MEMBER --role='roles/compute.storageAdmin'
- আপনার গুগল ক্লাউড প্রজেক্ট ক্লাউড শেল-এর একটিতে, এই কোডল্যাবের অংশ হিসেবে ব্যবহৃত প্রয়োজনীয় স্ক্রিপ্টগুলি পেতে নীচের কমান্ডটি ব্যবহার করে কনফিডেনশিয়াল স্পেস কোডল্যাব গিথুব রিপোজিটরি ক্লোন করুন।
git clone https://github.com/GoogleCloudPlatform/confidential-space.git
- হেলথ ডেটা কোডল্যাবের জন্য ডিরেক্টরিটি স্ক্রিপ্ট ডিরেক্টরিতে পরিবর্তন করুন।
cd confidential-space/codelabs/health_data_analysis_codelab/scripts
- codelabs/health_data_analysis_codelab/scripts ডিরেক্টরিতে অবস্থিত config_env.sh স্ক্রিপ্টে এই দুটি লাইন আপডেট করুন। USleep এবং UWear এর জন্য আপনার প্রোজেক্ট আইডি দিয়ে প্রোজেক্ট আইডি আপডেট করুন। লাইনের শুরুতে "#" মন্তব্য প্রতীকটি সরিয়ে ফেলতে ভুলবেন না।
# TODO: Populate UWear and USleep Project IDs
export UWEAR_PROJECT_ID=your-uwear-project-id
export USLEEP_PROJECT_ID=your-usleep-project-id
- ঐচ্ছিক: যেকোনো পূর্বে বিদ্যমান ভেরিয়েবল সেট করুন। আপনি এই ভেরিয়েবলগুলি ব্যবহার করে রিসোর্সের নামগুলি ওভাররাইড করতে পারেন (যেমন
export UWEAR_ARTIFACT_REPOSITORY='my-artifact-repository')
- আপনি বিদ্যমান ক্লাউড রিসোর্স নাম দিয়ে নিম্নলিখিত ভেরিয়েবলগুলি সেট করতে পারেন। যদি ভেরিয়েবলটি সেট করা থাকে, তাহলে প্রকল্প থেকে সংশ্লিষ্ট বিদ্যমান ক্লাউড রিসোর্স ব্যবহার করা হবে। যদি ভেরিয়েবলটি সেট না করা থাকে, তাহলে config_env.sh স্ক্রিপ্টের মান থেকে ক্লাউড রিসোর্স নাম তৈরি করা হবে।
- আপনার প্রোজেক্ট আইডির উপর ভিত্তি করে রিসোর্স নামের জন্য অবশিষ্ট ভেরিয়েবলের নামগুলি মানগুলিতে সেট করতে config_env.sh স্ক্রিপ্টটি চালান।
# Navigate to the scripts folder
cd ~/confidential-space/codelabs/health_data_analysis_codelab/scripts
# Run the config_env script
source config_env.sh
# Verify the variables were set
# Expected output for default variable should be `workload-sa`
echo $USLEEP_WORKLOAD_SERVICE_ACCOUNT
৩. রুট সার্টিফিকেট ডাউনলোড করুন
- প্রত্যয়ন পরিষেবা থেকে ফিরে আসা স্বয়ংসম্পূর্ণ টোকেনটি যাচাই করার জন্য, UWear কে Confidential Space রুট সার্টিফিকেটের সাথে স্বাক্ষরটি যাচাই করতে হবে। UWear কে রুট সার্টিফিকেটটি ডাউনলোড করে স্থানীয়ভাবে সংরক্ষণ করতে হবে। আপনার Google ক্লাউড প্রোজেক্টের যেকোনো একটি কনসোলে, নিম্নলিখিত কমান্ডগুলি চালান:
cd ~/confidential-space/codelabs/health_data_analysis_codelab/src/uwear
wget https://confidentialcomputing.googleapis.com/.well-known/confidential_space_root.crt -O confidential_space_root.pem
- ডাউনলোড করা রুট সার্টিফিকেটের ফিঙ্গারপ্রিন্ট তৈরি করুন
openssl x509 -fingerprint -in confidential_space_root.pem -noout
- আঙুলের ছাপটি নিম্নলিখিত SHA-1 ডাইজেস্টের সাথে মেলে কিনা তা যাচাই করুন:
B9:51:20:74:2C:24:E3:AA:34:04:2E:1C:3B:A3:AA:D2:8B:21:23:21
৪. ওয়ার্কলোড সার্ভিস অ্যাকাউন্ট তৈরি করুন
এখন, আপনি দুটি পরিষেবা অ্যাকাউন্ট তৈরি করবেন; একটি USleep এর জন্য এবং একটি UWear ওয়ার্কলোডের জন্য। USleep এবং UWear প্রকল্পগুলিতে ওয়ার্কলোড পরিষেবা অ্যাকাউন্ট তৈরি করতে create_service_accounts.sh স্ক্রিপ্টটি চালান। যে VM গুলি ওয়ার্কলোড চালায় তারা এই পরিষেবা অ্যাকাউন্টগুলি ব্যবহার করবে।
# Navigate to the scripts folder
cd ~/confidential-space/codelabs/health_data_analysis_codelab/scripts
# Run the create_service_accounts script
./create_service_accounts.sh
স্ক্রিপ্ট:
-
iam.serviceAccountUserভূমিকা প্রদান করে যা পরিষেবা অ্যাকাউন্টকে কাজের চাপের সাথে সংযুক্ত করে। - ওয়ার্কলোড সার্ভিস অ্যাকাউন্টকে
confidentialcomputing.workloadUserভূমিকা প্রদান করে। এটি ব্যবহারকারী অ্যাকাউন্টকে একটি প্রত্যয়ন টোকেন তৈরি করতে অনুমতি দেবে। - ওয়ার্কলোড সার্ভিস অ্যাকাউন্টের অনুমতিতে
logging.logWriterভূমিকা প্রদান করে। এটি কনফিডেনশিয়াল স্পেস এনভায়রনমেন্টকে সিরিয়াল কনসোলের পাশাপাশি ক্লাউড লগিংয়ে লগ লেখার অনুমতি দেয়, যাতে VM বন্ধ হয়ে যাওয়ার পরে লগগুলি উপলব্ধ থাকে। ওয়ার্কলোড তৈরি করুন
৫. ইউএসলিপ ওয়ার্কলোড তৈরি করুন
এই ধাপের অংশ হিসেবে, আপনি এই কোডল্যাবে ব্যবহৃত ওয়ার্কলোডের জন্য ডকার ইমেজ তৈরি করবেন। USleep ওয়ার্কলোড হল একটি সহজ গোল্যাং অ্যাপ্লিকেশন যা একটি পরিধেয় ডিভাইসে ব্যক্তিগত স্বাস্থ্য তথ্য ব্যবহার করে গ্রাহকের ঘুমের মান নির্ধারণ করে।
ইউএসলিপ কাজের চাপ সম্পর্কে
USleep ওয়ার্কলোড হল একটি সহজ গোল্যাং অ্যাপ্লিকেশন যা গ্রাহকের ঘুমের মান নির্ধারণ করে, একটি পরিধেয় ডিভাইসে ব্যক্তিগত স্বাস্থ্য তথ্য ব্যবহার করে। USleep ওয়ার্কলোডের তিনটি প্রধান অংশ রয়েছে:
- একটি TLS সেশন সেট আপ করা এবং রপ্তানি করা কীিং উপাদান বের করা
func handleConnectionRequest(w http.ResponseWriter, r *http.Request) {
// Upgrade HTTP Connection to a websocket.
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
fmt.Printf("failed to upgrade connection to a websocket with err: %v\n", err)
return
}
defer conn.Close()
// Get EKM
hash, err := getEKMHashFromRequest(r)
if err != nil {
fmt.Printf("Failed to get EKM: %v", err)
}
...
}
func getEKMHashFromRequest(r *http.Request) (string, error) {
ekm, err := r.TLS.ExportKeyingMaterial("testing_nonce", nil, 32)
if err != nil {
err := fmt.Errorf("failed to get EKM from inbound http request: %w", err)
return "", err
}
sha := sha256.New()
sha.Write(ekm)
hash := base64.StdEncoding.EncodeToString(sha.Sum(nil))
fmt.Printf("EKM: %v\nSHA hash: %v", ekm, hash)
return hash, nil
}
- শ্রোতা, ননস এবং PKI টোকেন ধরণের সাথে অ্যাটেস্টেশন সার্ভিস থেকে একটি টোকেনের অনুরোধ করা।
func handleConnectionRequest(w http.ResponseWriter, r *http.Request) {
...
// Request token with TLS Exported Keying Material (EKM) hashed.
token, err := getCustomToken(hash)
if err != nil {
fmt.Printf("failed to get custom token from token endpoint: %v", err)
return
}
// Respond to the client with the token.
conn.WriteMessage(websocket.TextMessage, token)
...
}
var (
socketPath = "/run/container_launcher/teeserver.sock"
tokenEndpoint = "http://localhost/v1/token"
contentType = "application/json"
)
func getCustomToken(nonce string) ([]byte, error) {
httpClient := http.Client{
Transport: &http.Transport{
// Set the DialContext field to a function that creates
// a new network connection to a Unix domain socket
DialContext: func(_ context.Context, _, _ string) (net.Conn, error) {
return net.Dial("unix", socketPath)
},
},
}
body := fmt.Sprintf(`{
"audience": "uwear",
"nonces": ["%s"],
"token_type": "PKI"
}`, nonce)
resp, err := httpClient.Post(tokenEndpoint, contentType, strings.NewReader(body))
if err != nil {
return nil, err
}
fmt.Printf("Response from launcher: %v\n", resp)
text, err := io.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("Failed to read resp.Body: %w", err)
}
fmt.Printf("Token from the attestation service: %s\n", text)
return text, nil
}
- সংবেদনশীল তথ্য গ্রহণ এবং ব্যবহারকারীর ঘুমের মান গণনা করা
func handleConnectionRequest(w http.ResponseWriter, r *http.Request) {
...
// Read the sensitive data
_, content, err := conn.ReadMessage()
if err != nil {
fmt.Printf("failed to read message from the connection: %v\n", err)
}
fmt.Printf("Received content from other side, %v\n", string(content))
// TODO: Handle sensitive data
...
}
USleep ওয়ার্কলোড তৈরির ধাপ
- USleep ওয়ার্কলোড তৈরি করতে create_usleep_workload.sh স্ক্রিপ্টটি চালান। এই স্ক্রিপ্টটি:
- UWear এর মালিকানাধীন আর্টিফ্যাক্ট রেজিস্ট্রি (
$USLEEP_ARTIFACT_REPOSITORY) তৈরি করে যেখানে কাজের চাপ প্রকাশ করা হবে। - usleep/workload.go কোড তৈরি করে এবং এটিকে একটি ডকার ছবিতে প্যাকেজ করে। USleep এর জন্য Dockerfile কনফিগারেশন দেখুন।
- UWear এর মালিকানাধীন আর্টিফ্যাক্ট রেজিস্ট্রিতে (
$USLEEP_ARTIFACT_REPOSITORY) ডকার ছবিটি প্রকাশ করে। - আর্টিফ্যাক্ট রেজিস্ট্রি (
$USLEEP_ARTIFACT_REPOSITORY) এর জন্য পরিষেবা অ্যাকাউন্ট$USLEEP_WORKLOAD_SERVICE_ACCOUNTপড়ার অনুমতি দেয়।
./create_usleep_workload.sh
- গুরুত্বপূর্ণ: আউটপুট লগ থেকে, USleep-এর জন্য ইমেজ ডাইজেস্ট বের করুন।
latest: digest: sha256:<USLEEP_IMAGE_DIGEST> size: 945
- UWear ডিরেক্টরিতে নেভিগেট করুন।
cd ~/confidential-space/codelabs/health_data_analysis_codelab/src/uwear
- opa_validation_values.json- এ "allowed_submods_container_image_digest" এর অধীনে থাকা মানটি USLEEP_IMAGE_DIGEST দিয়ে প্রতিস্থাপন করুন।
# Replace the image digest
sed -i 's/sha256:bc4c32cb2ca046ba07dcd964b07a320b7d0ca88a5cf8e979da15cae68a2103ee/sha256:<USLEEP_IMAGE_DIGEST>/' ~/confidential-space/codelabs/health_data_analysis_codelab/src/uwear/opa_validation_values.json
৬. UWear কাজের চাপ তৈরি করুন
UWear কাজের চাপ সম্পর্কে
UWear ওয়ার্কলোডের ৪টি প্রধান অংশ রয়েছে:
- USleep-এর ওয়ার্কলোডে তৈরি করা একই TLS সেশনে যোগদান করা এবং নিরাপদ TLS সেশনের মাধ্যমে USleep থেকে প্রত্যয়ন টোকেন পুনরুদ্ধার করা।
func main() {
fmt.Println("Initializing client...")
tlsconfig := &tls.Config{
// Skipping client verification of the server's certificate chain and host name since we are
// doing custom verification using the attestation token.
InsecureSkipVerify: true,
}
dialer := websocket.Dialer{
TLSClientConfig: tlsconfig,
HandshakeTimeout: 5 * time.Second,
}
ipAddress := os.Getenv(ipAddrEnvVar)
url := fmt.Sprintf("wss://%s:8081/connection", ipAddress)
fmt.Printf("Attempting to dial to url %v...\n", url)
conn, _, err := dialer.Dial(url, nil)
if err != nil {
fmt.Printf("Failed to dial to url %s, err %v\n", url, err)
return
}
defer conn.Close()
tokenString, ekm, err := retrieveTokenAndEKMFromConn(conn)
if err != nil {
fmt.Printf("Failed to retrieve token and EKM from connection: %v\n", err)
return
}
fmt.Printf("token: %v\n", tokenString)
...
}
- স্বয়ংসম্পূর্ণ টোকেন যাচাই করে:
- x5c দাবি পরীক্ষা করার সময় একটি সার্টিফিকেট চেইন রয়েছে যা লিফ সার্টিফিকেট থেকে ইন্টারমিডিয়েট এবং অবশেষে রুট সার্টিফিকেটের সাথে সঠিকভাবে সংযুক্ত করে।
- x5c দাবিতে থাকা পাতার শংসাপত্র দ্বারা টোকেনটি স্বাক্ষরিত কিনা তা পরীক্ষা করা হচ্ছে।
- ডাউনলোড করা/সঞ্চিত রুট সার্টিফিকেটটি পরীক্ষা করা হচ্ছে যে x5c দাবির মতো একই রুট।
func main() {
...
token, err := validatePKIToken(tokenString)
if err != nil {
fmt.Printf("Failed to validate PKI token, err: %v\n.", err)
return
}
fmt.Println("PKI token validated successfully")
...
}
// validatePKIToken validates the PKI token returned from the attestation service.
// It verifies the token the certificate chain and that the token is signed by Google
// Returns a jwt.Token or returns an error if invalid.
func validatePKIToken(attestationToken string) (jwt.Token, error) {
// IMPORTANT: The attestation token should be considered untrusted until the certificate chain and
// the signature is verified.
rawRootCertificate, err := readFile(rootCertificateFile)
if err != nil {
return jwt.Token{}, fmt.Errorf("readFile(%v) - failed to read root certificate: %w", rootCertificateFile, err)
}
storedRootCert, err := decodeAndParsePEMCertificate(string(rawRootCertificate))
if err != nil {
return jwt.Token{}, fmt.Errorf("DecodeAndParsePEMCertificate(string) - failed to decode and parse root certificate: %w", err)
}
jwtHeaders, err := extractJWTHeaders(attestationToken)
if err != nil {
return jwt.Token{}, fmt.Errorf("ExtractJWTHeaders(token) - failed to extract JWT headers: %w", err)
}
if jwtHeaders["alg"] != "RS256" {
return jwt.Token{}, fmt.Errorf("ValidatePKIToken(attestationToken, ekm) - got Alg: %v, want: %v", jwtHeaders["alg"], "RS256")
}
// Additional Check: Validate the ALG in the header matches the certificate SPKI.
// https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.7
// This is included in Golang's jwt.Parse function
x5cHeaders := jwtHeaders["x5c"].([]any)
certificates, err := extractCertificatesFromX5CHeader(x5cHeaders)
if err != nil {
return jwt.Token{}, fmt.Errorf("ExtractCertificatesFromX5CHeader(x5cHeaders) returned error: %w", err)
}
// Verify the leaf certificate signature algorithm is an RSA key
if certificates.LeafCert.SignatureAlgorithm != x509.SHA256WithRSA {
return jwt.Token{}, fmt.Errorf("leaf certificate signature algorithm is not SHA256WithRSA")
}
// Verify the leaf certificate public key algorithm is RSA
if certificates.LeafCert.PublicKeyAlgorithm != x509.RSA {
return jwt.Token{}, fmt.Errorf("leaf certificate public key algorithm is not RSA")
}
// Verify the storedRootCertificate is the same as the root certificate returned in the token
// storedRootCertificate is downloaded from the confidential computing well known endpoint
// https://confidentialcomputing.googleapis.com/.well-known/attestation-pki-root
err = compareCertificates(*storedRootCert, *certificates.RootCert)
if err != nil {
return jwt.Token{}, fmt.Errorf("failed to verify certificate chain: %w", err)
}
err = verifyCertificateChain(certificates)
if err != nil {
return jwt.Token{}, fmt.Errorf("VerifyCertificateChain(CertificateChain) - error verifying x5c chain: %v", err)
}
keyFunc := func(token *jwt.Token) (any, error) {
return certificates.LeafCert.PublicKey, nil
}
verifiedJWT, err := jwt.Parse(attestationToken, keyFunc)
return *verifiedJWT, err
}
// verifyCertificateChain verifies the certificate chain from leaf to root.
// It also checks that all certificate lifetimes are valid.
func verifyCertificateChain(certificates CertificateChain) error {
// Additional check: Verify that all certificates in the cert chain are valid.
// Note: The *x509.Certificate Verify method in Golang already validates this but for other coding
// languages it is important to make sure the certificate lifetimes are checked.
if isCertificateLifetimeValid(certificates.LeafCert) {
return fmt.Errorf("leaf certificate is not valid")
}
if isCertificateLifetimeValid(certificates.IntermediateCert) {
return fmt.Errorf("intermediate certificate is not valid")
}
interPool := x509.NewCertPool()
interPool.AddCert(certificates.IntermediateCert)
if isCertificateLifetimeValid(certificates.RootCert) {
return fmt.Errorf("root certificate is not valid")
}
rootPool := x509.NewCertPool()
rootPool.AddCert(certificates.RootCert)
_, err := certificates.LeafCert.Verify(x509.VerifyOptions{
Intermediates: interPool,
Roots: rootPool,
KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageAny},
})
if err != nil {
return fmt.Errorf("failed to verify certificate chain: %v", err)
}
return nil
}
- UWear ওয়ার্কলোড তারপর পরীক্ষা করবে যে টোকেনে থাকা ওয়ার্কলোড পরিমাপের দাবিগুলি OPA নীতিতে উল্লেখিত বৈশিষ্ট্যের শর্তগুলির সাথে মেলে কিনা। OPA হল একটি ওপেন সোর্স, সাধারণ উদ্দেশ্য নীতি ইঞ্জিন যা স্ট্যাক জুড়ে নীতি প্রয়োগকে একীভূত করে। OPA JSON-এর মতো সিনট্যাক্স সহ নথি ব্যবহার করে, নীতিটি যে বেসলাইন মানগুলির বিরুদ্ধে বৈধতা পেয়েছে তা সেট করতে।
func main() {
...
err = validateClaimsAgainstOPAPolicy(token, ekm)
if err != nil {
fmt.Printf("Failed to validate claims against OPA policy: %v\n", err)
return
}
fmt.Println("Validated token and claims. Sending sensitive data")
...
}
// validateClaimsAgainstOPAPolicy validates the claims in the JWT token against the OPA policy.
func validateClaimsAgainstOPAPolicy(token jwt.Token, ekm string) error {
data, err := os.ReadFile("opa_validation_values.json")
authorized, err := evaluateOPAPolicy(context.Background(), token, ekm, string(data))
if err != nil {
fmt.Println("Error evaluating OPA policy:", err)
return fmt.Errorf("failed to evaluate OPA policy: %w", err)
}
if !authorized {
fmt.Println("Remote TEE's JWT failed policy check.")
return fmt.Errorf("remote TEE's JWT failed policy check")
}
fmt.Println("JWT is authorized.")
return nil
}
// evaluateOPAPolicy returns boolean indicating if OPA policy is satisfied or not, or error if occurred
func evaluateOPAPolicy(ctx context.Context, token jwt.Token, ekm string, policyData string) (bool, error) {
var claims jwt.MapClaims
var ok bool
if claims, ok = token.Claims.(jwt.MapClaims); !ok {
return false, fmt.Errorf("failed to get the claims from the JWT")
}
module := fmt.Sprintf(opaPolicy, ekm)
var json map[string]any
err := util.UnmarshalJSON([]byte(policyData), &json)
store := inmem.NewFromObject(json)
// Bind 'allow' to the value of the policy decision
// Bind 'hw_verified', 'image_verified', 'audience_verified, 'nonce_verified' to their respective policy evaluations
query, err := rego.New(
rego.Query(regoQuery), // Argument 1 (Query string)
rego.Store(store), // Argument 2 (Data store)
rego.Module("confidential_space.rego", module), // Argument 3 (Policy module)
).PrepareForEval(ctx)
if err != nil {
fmt.Printf("Error creating query: %v\n", err)
return false, err
}
fmt.Println("Performing OPA query evaluation...")
results, err := query.Eval(ctx, rego.EvalInput(claims))
if err != nil {
fmt.Printf("Error evaluating OPA policy: %v\n", err)
return false, err
} else if len(results) == 0 {
fmt.Println("Undefined result from evaluating OPA policy")
return false, err
} else if result, ok := results[0].Bindings["allow"].(bool); !ok {
fmt.Printf("Unexpected result type: %v\n", ok)
fmt.Printf("Result: %+v\n", result)
return false, err
}
fmt.Println("OPA policy evaluation completed.")
fmt.Println("OPA policy result values:")
for key, value := range results[0].Bindings {
fmt.Printf("[ %s ]: %v\n", key, value)
}
result := results[0].Bindings["allow"]
if result == true {
fmt.Println("Policy check PASSED")
return true, nil
}
fmt.Println("Policy check FAILED")
return false, nil
}
- উদাহরণ OPA বেসলাইন মান :
{
"allowed_submods_container_image_digest": [
"sha256:<USLEEP_IMAGE_DIGEST>"
],
"allowed_hwmodel": [
"GCP_INTEL_TDX",
"GCP_SHIELDED_VM",
"GCP_AMD_SEV_ES",
"GCP_AMD_SEV"
],
"allowed_aud": [
"uwear"
],
"allowed_issuer": [
"https://confidentialcomputing.googleapis.com"
],
"allowed_secboot": [
true
],
"allowed_sw_name": [
"CONFIDENTIAL_SPACE"
]
}
- রেগোতে লেখা OPA নীতির উদাহরণ।
package confidential_space
import rego.v1
default allow := false
default hw_verified := false
default image_digest_verified := false
default audience_verified := false
default nonce_verified := false
default issuer_verified := false
default secboot_verified := false
default sw_name_verified := false
allow if {
hw_verified
image_digest_verified
audience_verified
nonce_verified
issuer_verified
secboot_verified
sw_name_verified
}
hw_verified if input.hwmodel in data.allowed_hwmodel
image_digest_verified if input.submods.container.image_digest in data.allowed_submods_container_image_digest
audience_verified if input.aud in data.allowed_aud
issuer_verified if input.iss in data.allowed_issuer
secboot_verified if input.secboot in data.allowed_secboot
sw_name_verified if input.swname in data.allowed_sw_name
nonce_verified if {
input.eat_nonce == "%s"
}
- রেগো কোয়েরির উদাহরণ।
regoQuery = "
allow = data.confidential_space.allow;
hw_verified = data.confidential_space.hw_verified;
image__digest_verified = data.confidential_space.image_digest_verified;
audience_verified = data.confidential_space.audience_verified;
nonce_verified = data.confidential_space.nonce_verified;
issuer_verified = data.confidential_space.issuer_verified;
secboot_verified = data.confidential_space.secboot_verified;
sw_name_verified = data.confidential_space.sw_name_verified
"
- OPA যাচাইকরণের সময়, UWear ওয়ার্কলোড এটিও যাচাই করে যে nonce প্রত্যাশিত nonce (TLS Exported Keying Material - EKM) এর সাথে মিলে যায়। nonceটি OPA নীতিতে EVALUAYER-তে পাস করা EKM ব্যবহার করে যাচাই করা হয়।
EKM হ্যাশ পাওয়ার জন্য উদাহরণ কোড :
func getEKMHashFromConn(c *websocket.Conn) (string, error) {
conn, ok := c.NetConn().(*tls.Conn)
if !ok {
return "", fmt.Errorf("failed to cast NetConn to *tls.Conn")
}
state := conn.ConnectionState()
ekm, err := state.ExportKeyingMaterial("testing_nonce", nil, 32)
if err != nil {
return "", fmt.Errorf("failed to get EKM from TLS connection: %w", err)
}
sha := sha256.New()
sha.Write(ekm)
hash := base64.StdEncoding.EncodeToString(sha.Sum(nil))
return hash, nil
}
- একবার এই সমস্ত পরীক্ষা সম্পন্ন হয়ে গেলে এবং পাস হয়ে গেলে, UWear নিশ্চিত করতে পারে যে ডেটা নিরাপদে পাঠানো এবং প্রক্রিয়াজাত করা হবে। UWear একই TLS সেশনে সংবেদনশীল PHI দিয়ে প্রতিক্রিয়া জানাবে এবং USleep গ্রাহকের ঘুমের মান গণনা করতে সেই ডেটা ব্যবহার করতে সক্ষম হবে।
func main() {
...
fmt.Println("Validated token and claims. Sending sensitive data")
data, err := readFile(mySensitiveDataFile)
if err != nil {
fmt.Printf("Failed to read data from the file: %v\n", err)
}
conn.WriteMessage(websocket.BinaryMessage, data)
fmt.Println("Sent payload. Closing the connection")
conn.Close()
...
}
USleep ওয়ার্কলোড তৈরির ধাপ
- স্ক্রিপ্ট ডিরেক্টরিতে নেভিগেট করুন
cd ~/confidential-space/codelabs/health_data_analysis_codelab/scripts
- UWear ওয়ার্কলোড তৈরি করতে create_uwear_workload.sh স্ক্রিপ্টটি চালান:
- UWear এর মালিকানাধীন আর্টিফ্যাক্ট রেজিস্ট্রি (
$UWEAR_ARTIFACT_REPOSITORY) তৈরি করে যেখানে কাজের চাপ প্রকাশ করা হবে। - uwear/workload.go কোড তৈরি করে এবং এটিকে একটি ডকার ছবিতে প্যাকেজ করে। USleep এর জন্য Dockerfile কনফিগারেশন দেখুন।
- UWear এর মালিকানাধীন আর্টিফ্যাক্ট রেজিস্ট্রিতে (
$UWEAR_ARTIFACT_REPOSITORY) ডকার ছবিটি প্রকাশ করে। - আর্টিফ্যাক্ট রেজিস্ট্রি (
$UWEAR_ARTIFACT_REPOSITORY) এর জন্য পরিষেবা অ্যাকাউন্ট$UWEAR_WORKLOAD_SERVICE_ACCOUNTপড়ার অনুমতি দেয়।
./create_uwear_workload.sh
৭. USleep এবং UWear ওয়ার্কলোড চালান
USleep ওয়ার্কলোড চালান
gcloud config set project $USLEEP_PROJECT_ID
gcloud compute instances create \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--maintenance-policy=MIGRATE \
--scopes=cloud-platform --zone=${USLEEP_PROJECT_ZONE} \
--image-project=confidential-space-images \
--image-family=confidential-space \
--service-account=${USLEEP_WORKLOAD_SERVICE_ACCOUNT}@${USLEEP_PROJECT_ID}.iam.gserviceaccount.com \
--metadata ^~^tee-image-reference=${USLEEP_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${USLEEP_PROJECT_ID}/${USLEEP_ARTIFACT_REPOSITORY}/${USLEEP_WORKLOAD_IMAGE_NAME}:${USLEEP_WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-container-log-redirect=true usleep
প্রতিক্রিয়াটি একটি STATUS: RUNNING ফেরত পাঠাবে এবং EXTERNAL_IPও এর মতোই ফেরত পাঠাবে:
NAME: usleep
ZONE: us-west1-b
MACHINE_TYPE: n2d-standard-2
PREEMPTIBLE:
INTERNAL_IP: 10.138.0.6
EXTERNAL_IP: 34.168.56.10
STATUS: RUNNING
একটি ভেরিয়েবলের মধ্যে বহিরাগত আইপি সংরক্ষণ করুন
export USLEEP_EXTERNAL_IP=<add your external IP>
USleep ওয়ার্কলোড সঠিকভাবে চলছে কিনা তা যাচাই করুন।
USleep ওয়ার্কলোড সঠিকভাবে চলছে কিনা তা যাচাই করতে, USleep প্রজেক্টের VM Instances পৃষ্ঠায় যান। "usleep" ইনস্ট্যান্সে ক্লিক করুন এবং Logs বিভাগের অধীনে "Serial port 1(console)" টিপুন। সার্ভারটি চালু হয়ে গেলে, লগের নীচে, লগগুলিতে নিম্নলিখিতগুলির মতো কিছু দেখাবে।
2024/09/13 17:00:00 workload task started
#####----- Local IP Address is <YOUR-LOCAL-IP> -----#####
Starting Server..
UWear ওয়ার্কলোড চালান
gcloud config set project $UWEAR_PROJECT_ID
gcloud compute instances create \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--maintenance-policy=MIGRATE \
--scopes=cloud-platform --zone=${UWEAR_PROJECT_ZONE} \
--image-project=confidential-space-images \
--image-family=confidential-space \
--service-account=${UWEAR_WORKLOAD_SERVICE_ACCOUNT}@${UWEAR_PROJECT_ID}.iam.gserviceaccount.com \
--metadata ^~^tee-image-reference=${UWEAR_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${UWEAR_PROJECT_ID}/${UWEAR_ARTIFACT_REPOSITORY}/${UWEAR_WORKLOAD_IMAGE_NAME}:${UWEAR_WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-container-log-redirect=true~tee-env-remote_ip_addr=$USLEEP_EXTERNAL_IP uwear
UWear ওয়ার্কলোড সঠিকভাবে চলছে কিনা তা যাচাই করুন।
UWear ওয়ার্কলোডের লগগুলি দেখতে UWear প্রকল্পের VM Instances পৃষ্ঠায় যান। "uwear" ইনস্ট্যান্সে ক্লিক করুন এবং লগ বিভাগের অধীনে "Serial port 1(console)" টিপুন।
ইনস্ট্যান্স সম্পূর্ণরূপে শুরু হয়ে গেলে লগ আউটপুটটি এইরকম দেখাবে
UWear প্রকল্পে, সিরিয়াল লগগুলিতে অনুরূপ কিছু দেখানো উচিত
token: eyJ[...]MrXUg
PKI token validated successfully
Performing OPA query evaluation...
OPA policy evaluation completed.
OPA policy result values:
[ hw_verified ]: true
[ image__digest_verified ]: true
[ audience_verified ]: true
[ nonce_verified ]: true
[ issuer_verified ]: true
[ secboot_verified ]: true
[ sw_name_verified ]: true
[ allow ]: true
Policy check PASSED
JWT is authorized.
Validated token and claims. Sending sensitive data
Sent payload. Closing the connection
যদি আপনার UWear ওয়ার্কলোড এইরকম না দেখায়, তাহলে নির্দেশাবলীর জন্য নীচের নোটগুলি দেখুন।
USleep ফলাফল দেখুন
ফলাফল দেখতে USleep প্রজেক্টের VM Instances পৃষ্ঠায় ফিরে যান। "usleep" ইনস্ট্যান্সে ক্লিক করুন এবং Logs বিভাগের অধীনে "Serial port 1(console)" টিপুন। লগের নীচে কাজের চাপের ফলাফল দেখুন। এগুলি নীচের নমুনার মতো দেখতে হবে।
Token from the attestation service: eyJhbGci...Ii5A3CJBuDM2o5Q
Received content from other side, {
"name": "Amy",
"age": 29,
"sleep": {
"light": {
"minutes": 270
},
"deep": {
"minutes": 135
},
"rem": {
"minutes": 105
}
}
}
Sleep quality result: total sleep time is less than 8 hours
ফলাফল হওয়া উচিত "total sleep time is less than 8 hours".
অভিনন্দন, আপনি UWear এবং USleep এর মধ্যে সংবেদনশীল তথ্য ভাগ করে নেওয়ার জন্য একটি গোপনীয় স্থান সফলভাবে তৈরি করেছেন!
৮. (ঐচ্ছিক) অননুমোদিত কাজের চাপ চালান
পরবর্তী পরিস্থিতিতে USleep কোড আপডেট করে এবং UWear দ্বারা প্রদত্ত ঘুমের ডেটার উপর একটি ভিন্ন ওয়ার্কলোড চালায়। UWear এই নতুন ওয়ার্কলোডে সম্মত হয়নি এবং নতুন ইমেজ ডাইজেস্টের অনুমতি দেওয়ার জন্য তাদের OPA নীতি আপডেট করেনি। আমরা যাচাই করব যে UWear তার সংবেদনশীল ডেটা অননুমোদিত ওয়ার্কলোডে পাঠাবে না।
ইউএসলিপ তাদের কাজের চাপ পরিবর্তন করে
- প্রকল্পটি $USLEEP_PROJECT_ID তে সেট করুন।
gcloud config set project $USLEEP_PROJECT_ID
- USleep VM ইনস্ট্যান্সটি মুছে ফেলুন।
gcloud compute instances delete usleep --zone $USLEEP_PROJECT_ZONE
- usleep/workload.go ডিরেক্টরিতে যান।
cd ~/confidential-space/codelabs/health_data_analysis_codelab/src/usleep
- usleep/workload.go ফাইলে।
"audience": "uwear".এই উদাহরণে, ইমেজ ডাইজেস্ট পরিবর্তন করার জন্য আমরা অডিয়েন্সকে একটি ভিন্ন মানে আপডেট করব যা UWear অনুমোদিত নয়। তাই UWear এর দুটি কারণে এটি প্রত্যাখ্যান করা উচিত - অপ্রমাণিত ইমেজ ডাইজেস্ট এবং ভুল অডিয়েন্স।
"audience": "anotherCompany.com",
- নতুন USleep ওয়ার্কলোড তৈরি করুন
cd ~/confidential-space/codelabs/health_data_analysis_codelab/scripts
./create_usleep_workload.sh
- নতুন USleep VM ইন্সট্যান্স তৈরি করুন এবং ওয়ার্কলোড চালান
gcloud compute instances create \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--maintenance-policy=MIGRATE \
--scopes=cloud-platform --zone=${USLEEP_PROJECT_ZONE} \
--image-project=confidential-space-images \
--image-family=confidential-space \
--service-account=${USLEEP_WORKLOAD_SERVICE_ACCOUNT}@${USLEEP_PROJECT_ID}.iam.gserviceaccount.com \
--metadata ^~^tee-image-reference=${USLEEP_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${USLEEP_PROJECT_ID}/${USLEEP_ARTIFACT_REPOSITORY}/${USLEEP_WORKLOAD_IMAGE_NAME}:${USLEEP_WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-container-log-redirect=true usleep
- পরবর্তীতে ব্যবহারের জন্য নতুন USleep এক্সটার্নাল আইপি এক্সট্র্যাক্ট করুন।
export USLEEP_EXTERNAL_IP=<add your external IP>
কাজের চাপ পুনরায় চালান
- UWear VM ইনস্ট্যান্সটি মুছে ফেলুন
gcloud config set project $UWEAR_PROJECT_ID
gcloud compute instances delete uwear --zone $UWEAR_PROJECT_ZONE
- নতুন এক্সটার্নাল আইপি ব্যবহার করে UWear VM ইনস্ট্যান্সটি পুনরায় তৈরি করুন
gcloud compute instances create \
--confidential-compute-type=SEV \
--shielded-secure-boot \
--maintenance-policy=MIGRATE \
--scopes=cloud-platform --zone=${UWEAR_PROJECT_ZONE} \
--image-project=confidential-space-images \
--image-family=confidential-space \
--service-account=${UWEAR_WORKLOAD_SERVICE_ACCOUNT}@${UWEAR_PROJECT_ID}.iam.gserviceaccount.com \
--metadata ^~^tee-image-reference=${UWEAR_PROJECT_REPOSITORY_REGION}-docker.pkg.dev/${UWEAR_PROJECT_ID}/${UWEAR_ARTIFACT_REPOSITORY}/${UWEAR_WORKLOAD_IMAGE_NAME}:${UWEAR_WORKLOAD_IMAGE_TAG}~tee-restart-policy=Never~tee-container-log-redirect=true~tee-env-remote_ip_addr=$USLEEP_EXTERNAL_IP uwear
- UWear সিরিয়াল লগে নিম্নলিখিত বার্তাটি উপস্থিত হওয়া উচিত এবং USleep VM কোনও সংবেদনশীল ডেটা গ্রহণ করবে না
OPA policy result values:
[ nonce_verified ]: true
[ issuer_verified ]: true
[ secboot_verified ]: true
[ sw_name_verified ]: true
[ allow ]: false
[ hw_verified ]: true
[ image__digest_verified ]: false
[ audience_verified ]: false
Policy check FAILED
Remote TEE's JWT failed policy check.
Failed to validate claims against OPA policy: remote TEE's JWT failed policy check
9. পরিষ্কার করা
এই কোডল্যাবের অংশ হিসেবে আমরা যে রিসোর্সগুলি তৈরি করেছি সেগুলি পরিষ্কার করার জন্য ক্লিনআপ স্ক্রিপ্ট ব্যবহার করা যেতে পারে। এই ক্লিনআপের অংশ হিসেবে, নিম্নলিখিত রিসোর্সগুলি মুছে ফেলা হবে:
- UWear পরিষেবা অ্যাকাউন্ট (
$UWEAR_SERVICE_ACCOUNT)। - UWear আর্টিফ্যাক্ট রেজিস্ট্রি (
$UWEAR_ARTIFACT_REPOSITORY)। - UWear কম্পিউট ইনস্ট্যান্স
- USleep পরিষেবা অ্যাকাউন্ট (
$USLEEP_SERVICE_ACCOUNT)। - USleep আর্টিফ্যাক্ট রেজিস্ট্রি (
$USLEEP_ARTIFACT_REPOSITORY)। - ইউএসলিপ কম্পিউট ইনস্ট্যান্স
./cleanup.sh
যদি আপনার অন্বেষণ শেষ হয়ে যায়, তাহলে অনুগ্রহ করে এই নির্দেশাবলী অনুসরণ করে আপনার প্রকল্পটি মুছে ফেলার কথা বিবেচনা করুন।
অভিনন্দন
অভিনন্দন, আপনি কোডল্যাবটি সফলভাবে সম্পন্ন করেছেন!
আপনি গোপনীয় স্থান ব্যবহার করে গোপনীয়তা বজায় রেখে কীভাবে নিরাপদে ডেটা ভাগ করে নিতে হয় তা শিখেছেন।
এরপর কী?
এই ধরণের কিছু কোডল্যাব দেখুন...
- গোপন স্থান ব্যবহার করে এমএল মডেল এবং বৌদ্ধিক সম্পত্তি সুরক্ষিত করা
- মাল্টি-পার্টি কম্পিউটেশন এবং গোপনীয় স্থান ব্যবহার করে কীভাবে ডিজিটাল সম্পদ লেনদেন করবেন
- গোপনীয় স্থান ব্যবহার করে গোপনীয় তথ্য বিশ্লেষণ করুন