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

1. بررسی اجمالی

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

Secret Manager به شما امکان ذخیره، مدیریت و دسترسی به اسرار را به عنوان حباب های باینری یا رشته های متنی می دهد. با مجوزهای مناسب می توانید محتویات راز را مشاهده کنید.

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

چیزی که یاد خواهید گرفت

  • نحوه استفاده از Cloud Shell
  • نحوه نصب کتابخانه سرویس گیرنده Secret Manager برای پایتون
  • نحوه ایجاد و دسترسی به اسرار با استفاده از کتابخانه مشتری پایتون
  • نحوه دسترسی به اسرار در توابع ابری با استفاده از کتابخانه مشتری پایتون

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

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

نظرسنجی

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

فقط از طریق آن را بخوانید آن را بخوانید و تمرینات را کامل کنید

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

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

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

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

2. راه اندازی و الزامات

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

Cloud Shell را راه اندازی کنید

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید 853e55310c205094.png .

55efc1aaa7a4d3ad.png

اگر قبلاً Cloud Shell را راه‌اندازی نکرده‌اید، یک صفحه میانی (در زیر تاشو) برای شما نمایش داده می‌شود که آن را توصیف می‌کند. اگر اینطور است، روی Continue کلیک کنید (و دیگر آن را نخواهید دید). در اینجا به نظر می رسد که آن صفحه یک بار مصرف:

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز شما بارگذاری شده است. این دایرکتوری اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد شبکه و احراز هویت را بسیار افزایش می دهد. بیشتر، اگر نه همه، کار شما در این کد لبه را می توان به سادگی با یک مرورگر یا Chromebook انجام داد.

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

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

3. Secret Manager API را فعال کنید

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

gcloud services enable secretmanager.googleapis.com

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

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

4. نصب کتابخانه سرویس گیرنده Secret Manager برای پایتون

کتابخانه سرویس گیرنده Secret Manager را نصب کنید:

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

5. Python تعاملی را شروع کنید

برای بخشی از این آموزش، از یک مفسر تعاملی پایتون به نام 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]:

6. ایجاد اسرار

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

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

ID پروژه خود را در 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

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

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

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

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

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

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

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

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

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

کد زیر را در جلسه 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

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

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

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

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

exit

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

yourname@cloudshell:~ (<PROJECT_ID>)$

قبل از شروع استفاده از Cloud Functions 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 بروید. این جایی است که شما تمام کدهای خود را قرار می دهید.

9. نوشتن یک Cloud Function برای دسترسی به اسرار

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

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

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

main.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 باشد.

اجازه دسترسی به راز شما

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

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

c5b686edf94b5222.png

برای دسترسی به راز خود به حساب خدمات Cloud Functions اجازه دسترسی بدهید:

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

10. استقرار عملکرد ابری خود

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

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

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

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

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

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

curl $FUNCTION_URL

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

We meet again!

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

11. تبریک!

شما یاد گرفتید که چگونه با استفاده از Python از Secret Manager API استفاده کنید!

تمیز کردن

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

  • در Cloud Console، به صفحه مدیریت منابع بروید.
  • در لیست پروژه، پروژه خود را انتخاب کنید و سپس روی حذف کلیک کنید.
  • در گفتگو، ID پروژه را تایپ کنید و سپس بر روی Shut down کلیک کنید تا پروژه حذف شود.

بیشتر بدانید

مجوز

این اثر تحت مجوز Creative Commons Attribution 2.0 Generic مجوز دارد.