استفاده از Secret Manager با پایتون

۱. مرور کلی

در این آزمایشگاه کد، شما بر استفاده از Secret Manager در پایتون تمرکز خواهید کرد.

مدیر راز به شما امکان می‌دهد رازها را به صورت حباب‌های دودویی یا رشته‌های متنی ذخیره، مدیریت و به آنها دسترسی داشته باشید. با مجوزهای مناسب، می‌توانید محتوای راز را مشاهده کنید.

Secret Manager برای ذخیره اطلاعات پیکربندی مانند رمزهای عبور پایگاه داده، کلیدهای API یا گواهی‌های TLS که یک برنامه در زمان اجرا به آنها نیاز دارد، به خوبی کار می‌کند.

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

  • نحوه استفاده از ابر پوسته
  • نحوه نصب کتابخانه کلاینت Secret Manager برای پایتون
  • نحوه ایجاد و دسترسی به اسرار با استفاده از کتابخانه کلاینت پایتون
  • نحوه دسترسی به اسرار در توابع ابری با استفاده از کتابخانه کلاینت پایتون

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

  • یک پروژه ابری گوگل
  • یک مرورگر، مانند کروم یا فایرفاکس
  • آشنایی با پایتون ۳

نظرسنجی

چگونه از این آموزش استفاده خواهید کرد؟

فقط تا انتها بخوانید آن را بخوانید و تمرین‌ها را انجام دهید

تجربه خود را با پایتون چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

تجربه خود را در استفاده از خدمات ابری گوگل چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

۲. تنظیمات و الزامات

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه ، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود. می‌توانید آن را در هر زمانی به‌روزرسانی کنید.
  • شناسه پروژه باید در تمام پروژه‌های گوگل کلود منحصر به فرد باشد و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاه‌های کد، باید شناسه پروژه را ارجاع دهید (که معمولاً با عنوان PROJECT_ID شناخته می‌شود). اگر شناسه تولید شده را دوست ندارید، می‌توانید یک شناسه تصادفی دیگر ایجاد کنید. به عنوان یک جایگزین، می‌توانید شناسه خودتان را امتحان کنید و ببینید که آیا در دسترس است یا خیر. پس از این مرحله قابل تغییر نیست و در طول پروژه باقی خواهد ماند.
  • برای اطلاع شما، یک مقدار سوم هم وجود دارد، شماره پروژه که برخی از APIها از آن استفاده می‌کنند. برای کسب اطلاعات بیشتر در مورد هر سه این مقادیر، به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/API های ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، هزینه زیادی نخواهد داشت. برای خاموش کردن منابع به طوری که پس از این آموزش متحمل پرداخت صورتحساب نشوید، می‌توانید منابعی را که ایجاد کرده‌اید یا کل پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

شروع پوسته ابری

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

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید 853e55310c205094.png .

55efc1aaa7a4d3ad.png

اگر قبلاً Cloud Shell را شروع نکرده‌اید، یک صفحه میانی (در پایین صفحه) به شما نمایش داده می‌شود که توضیح می‌دهد چیست. در این صورت، روی ادامه کلیک کنید (و دیگر هرگز آن را نخواهید دید). آن صفحه یکبار مصرف به این شکل است:

9c92662c6a846a5c.png

آماده‌سازی و اتصال به Cloud Shell فقط چند لحظه طول می‌کشد.

9f0e51b578fecce5.png

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

پس از اتصال به Cloud Shell، باید ببینید که از قبل احراز هویت شده‌اید و پروژه از قبل روی شناسه پروژه شما تنظیم شده است.

  1. برای تأیید احراز هویت، دستور زیر را در Cloud Shell اجرا کنید:
gcloud auth list

خروجی دستور

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:
gcloud config list project

خروجی دستور

[core]
project = <PROJECT_ID>

اگر اینطور نیست، می‌توانید با این دستور آن را تنظیم کنید:

gcloud config set project <PROJECT_ID>

خروجی دستور

Updated property [core/project].

۳. فعال کردن رابط برنامه‌نویسی کاربردی مدیریت مخفی

قبل از اینکه بتوانید از رابط برنامه‌نویسی کاربردی (API) مدیر مخفی استفاده کنید، باید آن را فعال کنید. با استفاده از Cloud Shell، می‌توانید API را با دستور زیر فعال کنید:

gcloud services enable secretmanager.googleapis.com

شما باید خروجی مانند این را ببینید:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

۴. نصب کتابخانه کلاینت Secret Manager برای پایتون

کتابخانه کلاینت Secret Manager را نصب کنید:

pip3 install --user google-cloud-secret-manager==2.10.0

۵. پایتون تعاملی را شروع کنید

برای بخشی از این آموزش، از یک مفسر تعاملی پایتون به نام IPython استفاده خواهید کرد که از قبل در Cloud Shell نصب شده است. با اجرای ipython در Cloud Shell، یک جلسه را شروع کنید:

ipython

شما باید چیزی شبیه به این را ببینید:

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.3.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

۶. ایجاد رازها

یک راز شامل یک یا چند نسخه مخفی است. آنها را می‌توان با استفاده از خط فرمان gcloud ایجاد کرد، اما می‌توان آنها را با استفاده از پایتون نیز ایجاد کرد.

برای استفاده از یک راز، ابتدا باید راز را با نام راز ایجاد کنید، سپس یک نسخه از راز را که مقدار راز است، اضافه کنید.

شناسه پروژه خود را در IPython تنظیم کنید:

PROJECT_ID = "<PROJECT_ID>"

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

کد زیر را در جلسه IPython خود کپی کنید:

from google.cloud import secretmanager

def create_secret(secret_id):
    # Create the Secret Manager client.
    client = secretmanager.SecretManagerServiceClient()

    # Build the resource name of the parent project.
    parent = f"projects/{PROJECT_ID}"

    # Build a dict of settings for the secret
    secret = {'replication': {'automatic': {}}}

    # Create the secret
    response = client.create_secret(secret_id=secret_id, parent=parent, secret=secret)

    # Print the new secret name.
    print(f'Created secret: {response.name}')   

تابع را برای ایجاد یک راز جدید به نام my_secret_value فراخوانی کنید:

create_secret("my_secret_value")

شما باید خروجی زیر را ببینید:

Created secret: projects/<PROJECT_NUM>/secrets/my_secret_value

یک نسخه مخفی اضافه کنید

حالا که راز وجود دارد، می‌توانید با ایجاد یک نسخه، به آن مقداری اختصاص دهید.

کد زیر را در جلسه IPython خود کپی کنید:

def add_secret_version(secret_id, payload):
    # Create the Secret Manager client.
    client = secretmanager.SecretManagerServiceClient()

    # Build the resource name of the parent secret.
    parent = f"projects/{PROJECT_ID}/secrets/{secret_id}"

    # Convert the string payload into a bytes. This step can be omitted if you
    # pass in bytes instead of a str for the payload argument.
    payload = payload.encode('UTF-8')

    # Add the secret version.
    response = client.add_secret_version(parent=parent, payload={'data': payload})

    # Print the new secret version name.
    print(f'Added secret version: {response.name}')   

برای ایجاد یک نسخه مخفی جدید، تابع را فراخوانی کنید:

add_secret_version("my_secret_value", "Hello Secret Manager")

شما باید خروجی زیر را ببینید:

Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/1

رازها می‌توانند چندین نسخه داشته باشند. تابع را دوباره با مقدار متفاوتی فراخوانی کنید:

add_secret_version("my_secret_value", "Hello Again, Secret Manager")

شما باید خروجی زیر را ببینید:

Added secret version: projects/<PROJECT_NUM>/secrets/my_secret_value/versions/2

توجه کنید که نسخه جدید راز ما به طور قابل توجهی طولانی‌تر از نسخه اصلی است. این ویژگی بعداً مورد اشاره قرار خواهد گرفت.

۷. دسترسی به اسرار

دسترسی به یک نسخه مخفی، محتویات مخفی و همچنین فراداده‌های اضافی در مورد نسخه مخفی را برمی‌گرداند. وقتی به یک نسخه مخفی دسترسی پیدا می‌کنید، می‌توانید یک نسخه خاص را مشخص کنید، یا فقط با مشخص کردن "آخرین" آخرین نسخه را درخواست کنید.

اسرار باید مخفی نگه داشته شوند. اعتبارنامه‌های پایگاه داده را به عنوان اسرار ذخیره کنید و سپس از آنها برای احراز هویت استفاده کنید، یا گواهینامه‌ها را ذخیره کرده و از آنها استفاده کنید؛ اما اسرار خود را مستقیماً چاپ نکنید، زیرا این کار هدف مخفی نگه داشتن آنها را نقض می‌کند.

شما قرار است عملیاتی را روی اسرار ما انجام دهید و مقدار آن را بدون چاپ مستقیم ارزیابی کنید. در عوض، یک هش از مقدار راز چاپ خواهید کرد.

کد زیر را در جلسه IPython خود کپی کنید:

def access_secret_version(secret_id, version_id="latest"):
    # Create the Secret Manager client.
    client = secretmanager.SecretManagerServiceClient()

    # Build the resource name of the secret version.
    name = f"projects/{PROJECT_ID}/secrets/{secret_id}/versions/{version_id}"

    # Access the secret version.
    response = client.access_secret_version(name=name)

    # Return the decoded payload.
    return response.payload.data.decode('UTF-8')
    
import hashlib

def secret_hash(secret_value): 
  # return the sha224 hash of the secret value
  return hashlib.sha224(bytes(secret_value, "utf-8")).hexdigest()

تابع را برای بازیابی رمز به صورت هش از مقدار آن فراخوانی کنید:

secret_hash(access_secret_version("my_secret_value"))

باید خروجی شبیه به یک هش را ببینید (ممکن است مقدار دقیق با این خروجی مطابقت نداشته باشد):

83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11

از آنجایی که نسخه‌ای را مشخص نکردید، آخرین مقدار بازیابی شد.

برای تأیید، تابع را با اضافه کردن شماره نسخه مورد انتظار فراخوانی کنید:

secret_hash(access_secret_version("my_secret_value", version_id=2))

شما باید همان خروجی دستور قبلی را ببینید:

83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11

دوباره تابع را فراخوانی کنید، اما این بار نسخه اول را مشخص کنید:

secret_hash(access_secret_version("my_secret_value", version_id=1))

این بار باید هش متفاوتی ببینید که نشان‌دهنده‌ی خروجی متفاوتی است:

9a3fc8b809ddc611c82aee950c636c7557e220893560ec2c1eeeb177

۸. استفاده از Secret Manager با توابع ابری

شما می‌توانید از رمزها در بسیاری از بخش‌های Google Cloud استفاده کنید. در این بخش، بر Cloud Functions، ارائه محاسبات بدون سرور مبتنی بر رویداد گوگل، تمرکز خواهید کرد.

اگر به استفاده از پایتون در توابع ابری علاقه‌مند هستید، می‌توانید از HTTP Google Cloud Functions in Python Codelab پیروی کنید.

با فراخوانی تابع exit ، IPython را ببندید:

exit

شما باید به Cloud Shell خود بازگردانده شوید:

yourname@cloudshell:~ (<PROJECT_ID>)$

قبل از اینکه بتوانید از API توابع ابری استفاده کنید، باید API را فعال کنید. با استفاده از Cloud Shell، می‌توانید API را با دستور زیر فعال کنید:

gcloud services enable cloudfunctions.googleapis.com cloudbuild.googleapis.com

یک پوشه جدید برای ساخت تابع خود ایجاد کنید و فایل‌های خالی برای نوشتن در آنها ایجاد کنید:

mkdir secret-manager-api-demo
cd secret-manager-api-demo
touch main.py
touch requirements.txt

ویرایشگر کد را از سمت راست بالای Cloud Shell باز کنید:

7651a97c51e11a24.png

به فایل main.py در پوشه secret-manager-api-demo بروید. اینجا جایی است که تمام کدهای خود را قرار خواهید داد.

۹. نوشتن یک تابع ابری برای دسترسی به اسرار

اگرچه ذخیره و بازیابی مقادیر مخفی از خط فرمان یا ترمینال IPython مفید است، اما دسترسی به این اسرار در یک تابع بسیار مفیدتر است.

با استفاده از تابع access_secret_version که قبلاً ایجاد کردید، می‌توانید از آن به عنوان پایه‌ای برای تابع ابری خود استفاده کنید.

کد زیر را در فایل main.py کپی کنید:

فایل اصلی.py

import os

from google.cloud import secretmanager

project_id = os.environ["PROJECT_ID"]

client = secretmanager.SecretManagerServiceClient()
name = f"projects/{project_id}/secrets/my_secret_value/versions/latest"
response = client.access_secret_version(name=name)
my_secret_value = response.payload.data.decode("UTF-8")


def secret_hello(request):
    if "Again" in my_secret_value:
        return "We meet again!\n"

    return "Hello there.\n"

قبل از اینکه بتوانید تابع خود را مستقر کنید، باید تنظیمات محیط را نهایی کنید. این امر مستلزم آن است که وابستگی تابع خود را تنظیم کنید.

یک فایل جدید به نام requirements.txt ایجاد کنید و بسته google-cloud-secret-manager را به آن اضافه کنید:

الزامات.txt

google-cloud-secret-manager==2.10.0

حالا باید پوشه‌ای داشته باشید که فقط شامل main.py و requirements.txt باشد.

اجازه دسترسی به اطلاعات محرمانه شما

قبل از اینکه بتوانید تابع خود را مستقر کنید، باید به توابع ابری اجازه دسترسی به رمز خود را بدهید.

به ترمینال برگردید:

c5b686edf94b5222.png

برای دسترسی به اطلاعات محرمانه‌تان، به حساب سرویس توابع ابری دسترسی بدهید:

export PROJECT_ID=$(gcloud config get-value core/project)

gcloud secrets add-iam-policy-binding my_secret_value \
    --role roles/secretmanager.secretAccessor \
    --member serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com

شما باید خروجی زیر را ببینید:

Updated IAM policy for secret [my_secret_value].
bindings:
- members:
  - serviceAccount:<PROJECT_ID>@appspot.gserviceaccount.com
  role: roles/secretmanager.secretAccessor
etag: BwWiRUt2oB4=
version: 1

۱۰. استقرار عملکرد ابری شما

با توجه به تنظیماتی که در بخش‌های قبلی انجام دادید، اکنون می‌توانید عملکرد ابری خود را مستقر و آزمایش کنید.

درون پوشه‌ای که فقط شامل دو فایلی است که ایجاد کرده‌اید، تابع را مستقر کنید:

gcloud functions deploy secret_hello \
    --runtime python39 \
    --set-env-vars PROJECT_ID=${PROJECT_ID} \
    --trigger-http \
    --allow-unauthenticated

باید خروجی زیر (به صورت خلاصه) را مشاهده کنید:

Deploying function (may take a while - up to 2 minutes)...done.

...

entryPoint: secret_hello
httpsTrigger:
  url: https://<REGION>-<PROJECT_ID>.cloudfunctions.net/secret_hello
...
status: ACTIVE
...

با دستور زیر، آدرس اینترنتی تابع خود (متادیتای httpsTrigger.url ) را بازیابی کنید:

FUNCTION_URL=$(gcloud functions describe secret_hello --format 'value(httpsTrigger.url)')

اکنون، با فراخوانی تابع خود، بررسی کنید که آیا می‌توان به تابع با مقدار بازگشتی مورد انتظار دسترسی داشت یا خیر:

curl $FUNCTION_URL

شما باید خروجی زیر را ببینید:

We meet again!

این تابع به جدیدترین نسخه از رمز اشاره می‌کند که برای شامل کردن رشته "Again" تنظیم شده است، بنابراین این تابع همانطور که انتظار می‌رود عمل می‌کند.

۱۱. تبریک می‌گویم!

شما یاد گرفتید که چگونه از API مدیریت مخفی با استفاده از پایتون استفاده کنید!

تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این آموزش:

  • در کنسول ابری، به صفحه مدیریت منابع بروید.
  • در لیست پروژه‌ها، پروژه خود را انتخاب کنید و سپس روی حذف کلیک کنید.
  • در کادر محاوره‌ای، شناسه پروژه را تایپ کنید و سپس برای حذف پروژه، روی خاموش کردن (Shut down) کلیک کنید.

بیشتر بدانید

مجوز

این اثر تحت مجوز عمومی Creative Commons Attribution 2.0 منتشر شده است.