Sử dụng Trình quản lý bí mật với Python

1. Tổng quan

Trong lớp học lập trình này, bạn sẽ tập trung vào việc sử dụng Secret Manager (Trình quản lý bí mật) trong Python.

Secret Manager cho phép bạn lưu trữ, quản lý và truy cập vào các khoá bí mật dưới dạng blob nhị phân hoặc chuỗi văn bản. Khi có các quyền thích hợp, bạn có thể xem nội dung của khoá bí mật.

Trình quản lý bí mật hoạt động hiệu quả để lưu trữ thông tin cấu hình, chẳng hạn như mật khẩu cơ sở dữ liệu, khoá API hoặc chứng chỉ TLS mà ứng dụng cần trong thời gian chạy.

Kiến thức bạn sẽ học được

  • Cách sử dụng Cloud Shell
  • Cách cài đặt thư viện ứng dụng Secret Manager (Trình quản lý bí mật) cho Python
  • Cách tạo và truy cập vào các khoá bí mật bằng thư viện ứng dụng Python
  • Cách truy cập vào các khoá bí mật trong Cloud Functions bằng thư viện ứng dụng Python

Bạn cần có

  • Một dự án trong Google Cloud
  • Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
  • Quen thuộc với Python 3

Khảo sát

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ có thể đọc Đọc và hoàn thành bài tập

Bạn đánh giá thế nào về trải nghiệm sử dụng Python?

Người mới tập Trung cấp Thành thạo

Bạn đánh giá thế nào về trải nghiệm sử dụng các dịch vụ của Google Cloud?

Người mới tập Trung cấp Thành thạo

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
  • Mã dự án phải là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (mã này thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử phương pháp của riêng mình và xem có được cung cấp hay không. Bạn không thể thay đổi thông tin này sau bước này và thông báo đó sẽ vẫn tồn tại trong thời gian của dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số dự án) mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạn đã tạo hoặc xoá toàn bộ dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Khởi động Cloud Shell

Mặc dù bạn có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trong Đám mây.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell 853e55310c205094.pngs.

55efc1aaa7a4d3ad.pngS

Nếu trước đây bạn chưa từng khởi động Cloud Shell, thì bạn sẽ thấy một màn hình trung gian (dưới màn hình đầu tiên) mô tả về ứng dụng này. Nếu trường hợp đó xảy ra, hãy nhấp vào Tiếp tục (và bạn sẽ không thấy thông báo đó nữa). Màn hình một lần đó sẽ có dạng như sau:

9c92662c6a846a5c.pngS

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

9f0e51b578fecce5.pngs

Máy ảo này chứa tất cả các công cụ phát triển mà bạn cần. Dịch vụ này cung cấp thư mục gốc 5 GB ổn định và chạy trong Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Trong lớp học lập trình này, đa số mọi người đều có thể thực hiện chỉ bằng một trình duyệt hoặc Chromebook.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy mình đã được xác thực và dự án đã được đặt thành mã dự án.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Kết quả lệnh

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
gcloud config list project

Kết quả lệnh

[core]
project = <PROJECT_ID>

Nếu chưa, bạn có thể thiết lập chế độ này bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Kết quả lệnh

Updated property [core/project].

3. Bật Secret Manager API

Bạn phải bật API này thì mới có thể bắt đầu sử dụng Secret Manager API. Khi sử dụng Cloud Shell, bạn có thể bật API bằng lệnh sau:

gcloud services enable secretmanager.googleapis.com

Bạn sẽ thấy kết quả như sau:

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

4. Cài đặt thư viện ứng dụng Secret Manager cho Python

Cài đặt Thư viện ứng dụng trình quản lý bí mật:

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

5. Khởi động tương tác Python

Trong phần hướng dẫn này, bạn sẽ sử dụng trình thông dịch Python tương tác có tên là IPython, được cài đặt sẵn trong Cloud Shell. Bắt đầu một phiên bằng cách chạy ipython trong Cloud Shell:

ipython

Bạn sẽ thấy như sau:

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. Tạo Khoá bí mật

Khoá bí mật chứa một hoặc nhiều phiên bản bí mật. Bạn có thể tạo các thành phần này bằng dòng lệnh gcloud, nhưng cũng có thể tạo bằng Python.

Để sử dụng một khoá bí mật, trước tiên, bạn cần tạo khoá bí mật bằng tên của khoá bí mật, sau đó thêm phiên bản của khoá bí mật, là giá trị của khoá bí mật.

Đặt Mã dự án trong IPython:

PROJECT_ID = "<PROJECT_ID>"

Tạo khoá bí mật

Sao chép mã sau vào phiên IPython của bạn:

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}')   

Gọi hàm để tạo một khoá bí mật mới có tên là my_secret_value:

create_secret("my_secret_value")

Bạn sẽ thấy kết quả sau đây:

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

Thêm phiên bản bí mật

Giờ đây khi bí mật đã tồn tại, bạn có thể gán một giá trị cho khoá bí mật đó bằng cách tạo một phiên bản.

Sao chép mã sau vào phiên IPython của bạn:

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}')   

Gọi hàm để tạo phiên bản bí mật mới:

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

Bạn sẽ thấy kết quả sau đây:

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

Khoá bí mật có thể có nhiều phiên bản. Gọi lại hàm này bằng một giá trị khác:

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

Bạn sẽ thấy kết quả sau đây:

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

Hãy lưu ý rằng phiên bản mới của khoá bí mật dài hơn đáng kể so với phiên bản gốc. Thuộc tính này sẽ được tham khảo sau.

7. Truy cập vào khoá bí mật

Việc truy cập vào phiên bản bí mật sẽ trả về nội dung bí mật cũng như siêu dữ liệu bổ sung về phiên bản bí mật đó. Khi truy cập vào phiên bản bí mật, bạn có thể chỉ định một phiên bản cụ thể hoặc chỉ cần yêu cầu cung cấp phiên bản mới nhất bằng cách chỉ định "mới nhất".

Bí mật phải được giữ bí mật. Lưu trữ thông tin đăng nhập cơ sở dữ liệu dưới dạng thông tin bí mật, sau đó sử dụng thông tin đó để xác thực hoặc lưu trữ các giấy chứng nhận và sử dụng các thông tin đó; nhưng đừng trực tiếp in ra các bí mật của các em, vì điều này phá vỡ mục đích của việc giữ bí mật chúng.

Bạn sẽ thực hiện các thao tác đối với các bí mật của chúng tôi, đánh giá giá trị của các bí mật đó mà không trực tiếp in ra. Thay vào đó, bạn sẽ in hàm băm giá trị của mã bí mật.

Sao chép mã sau vào phiên IPython của bạn:

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()

Gọi hàm này để truy xuất khoá bí mật dưới dạng hàm băm cho giá trị của khoá đó:

secret_hash(access_secret_version("my_secret_value"))

Bạn sẽ thấy kết quả giống với hàm băm (giá trị chính xác có thể không khớp với kết quả này):

83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11

Vì bạn không chỉ định phiên bản, nên hệ thống đã truy xuất giá trị mới nhất.

Gọi hàm thêm số phiên bản dự kiến để xác nhận:

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

Bạn sẽ thấy kết quả tương tự như lệnh cuối cùng:

83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11

Gọi lại hàm này, nhưng lần này chỉ định phiên bản đầu tiên:

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

Lần này, bạn sẽ thấy một hàm băm khác, cho biết một dữ liệu đầu ra khác:

9a3fc8b809ddc611c82aee950c636c7557e220893560ec2c1eeeb177

8. Sử dụng Trình quản lý bí mật bằng Cloud Functions

Bạn có thể sử dụng khoá bí mật trong nhiều phần của Google Cloud. Trong phần này, bạn sẽ tập trung vào Cloud Functions, một giải pháp điện toán không máy chủ dựa trên sự kiện của Google.

Nếu quan tâm đến việc sử dụng Python trong Cloud Functions, bạn có thể tham khảo Lớp học lập trình về HTTP Google Cloud Functions trong Python.

Đóng IPython bằng cách gọi hàm exit:

exit

Bạn sẽ được chuyển về Cloud Shell:

yourname@cloudshell:~ (<PROJECT_ID>)$

Trước khi có thể bắt đầu sử dụng Cloud Functions API, bạn phải bật API này. Khi sử dụng Cloud Shell, bạn có thể bật API bằng lệnh sau:

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

Tạo một thư mục mới để xây dựng hàm, tạo các tệp trống để ghi vào:

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

Mở trình soạn thảo mã ở trên cùng bên phải của Cloud Shell:

7651a97c51e11a24.pngS

Chuyển đến tệp main.py bên trong thư mục secret-manager-api-demo. Đây là nơi bạn sẽ đặt tất cả mã của mình.

9. Viết một hàm đám mây để truy cập vào giá trị bí mật

Mặc dù việc lưu trữ và truy xuất các giá trị bí mật từ dòng lệnh hoặc thiết bị đầu cuối IPython rất hữu ích, nhưng sẽ hữu ích hơn nhiều nếu bạn có thể truy cập vào các giá trị bí mật này trong một hàm.

Bằng cách sử dụng hàm access_secret_version mà bạn đã tạo trước đó, bạn có thể dùng hàm đó làm cơ sở cho Hàm đám mây của mình.

Sao chép mã nguồn sau đây vào tệp 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"

Trước khi có thể triển khai hàm, bạn cần hoàn tất việc thiết lập môi trường. Điều này yêu cầu bạn phải thiết lập phần phụ thuộc hàm.

Tạo một tệp mới có tên là requirements.txt rồi thêm gói google-cloud-secret-manager vào tệp đó:

requirements.txt

google-cloud-secret-manager==2.10.0

Bây giờ, bạn sẽ có một thư mục chỉ chứa main.pyrequirements.txt.

Cho phép truy cập vào dữ liệu bí mật của bạn

Trước khi có thể triển khai hàm, bạn cần cấp cho Cloud Functions khả năng truy cập vào dữ liệu bí mật của bạn.

Chuyển trở lại thiết bị thanh toán:

c5b686edf94b5222.png

Cấp quyền truy cập vào Tài khoản dịch vụ Cloud Functions để truy cập vào mã bí mật của bạn:

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

Bạn sẽ thấy kết quả sau đây:

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. Triển khai chức năng đám mây

Dựa trên cách thiết lập ở các phần trước, bạn hiện có thể triển khai và kiểm thử Chức năng đám mây của mình.

Trong thư mục chỉ chứa hai tệp bạn đã tạo, hãy triển khai hàm:

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

Bạn sẽ thấy kết quả sau (được cắt bớt):

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

Truy xuất URL của hàm (siêu dữ liệu httpsTrigger.url) bằng lệnh sau:

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

Bây giờ, hãy kiểm thử hàm có thể truy cập được với giá trị trả về dự kiến bằng cách gọi hàm của bạn:

curl $FUNCTION_URL

Bạn sẽ thấy kết quả sau đây:

We meet again!

Hàm này tham chiếu phiên bản mới nhất của mã bí mật, đã được đặt để chứa chuỗi "Again" (Có lại). Vì vậy, hàm này đang hoạt động như dự kiến.

11. Xin chúc mừng!

Bạn đã tìm hiểu cách sử dụng Secret Manager API (API Trình quản lý bí mật) bằng Python!

Dọn dẹp

Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho các tài nguyên được sử dụng trong hướng dẫn này:

  • Trong Cloud Console, hãy chuyển đến trang Quản lý tài nguyên.
  • Trong danh sách dự án, hãy chọn dự án rồi nhấp vào Delete (Xoá).
  • Trong hộp thoại, hãy nhập mã dự án rồi nhấp vào Tắt để xoá dự án.

Tìm hiểu thêm

Giấy phép

Tác phẩm này được cấp phép theo Giấy phép chung Ghi nhận tác giả Creative Commons 2.0.