Python के साथ सीक्रेट मैनेजर का इस्तेमाल करना

1. खास जानकारी

इस कोडलैब में, Python में Secret Manager के इस्तेमाल पर ध्यान दिया जाएगा.

सीक्रेट मैनेजर की मदद से, सीक्रेट को बाइनरी ब्लॉब या टेक्स्ट स्ट्रिंग के तौर पर सेव, मैनेज, और ऐक्सेस किया जा सकता है. ज़रूरी अनुमतियों के साथ, सीक्रेट का कॉन्टेंट देखा जा सकता है.

सीक्रेट मैनेजर, रनटाइम के दौरान ऐप्लिकेशन के लिए ज़रूरी कॉन्फ़िगरेशन की जानकारी को स्टोर करने के लिए अच्छे से काम करता है. इसमें डेटाबेस पासवर्ड, एपीआई कुंजियां या TLS सर्टिफ़िकेट जैसी जानकारी शामिल है.

आप इन चीज़ों के बारे में जानेंगे

  • Cloud Shell का इस्तेमाल कैसे करें
  • Python के लिए Secret Manager क्लाइंट लाइब्रेरी इंस्टॉल करने का तरीका
  • Python क्लाइंट लाइब्रेरी का इस्तेमाल करके, सीक्रेट बनाने और उन्हें ऐक्सेस करने का तरीका
  • Python क्लाइंट लाइब्रेरी का इस्तेमाल करके, Cloud Functions में सीक्रेट ऐक्सेस करने का तरीका

आपको इन चीज़ों की ज़रूरत होगी

  • Google Cloud प्रोजेक्ट
  • ब्राउज़र, जैसे कि Chrome या Firefox
  • Python 3 का इस्तेमाल करने के बारे में जानकारी

सर्वे

इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?

इसे सिर्फ़ पढ़ें इसे पढ़ें और कसरतों को पूरा करें

Python के साथ अपने अनुभव को आप कितनी रेटिंग देंगे?

शुरुआती इंटरमीडिएट कुशल

Google Cloud की सेवाएं इस्तेमाल करने का आपका अनुभव कैसा रहा?

शुरुआती इंटरमीडिएट कुशल

2. सेटअप और ज़रूरी शर्तें

अपने हिसाब से एनवायरमेंट सेटअप करना

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको नया खाता बनाना होगा.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों का डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करता. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होना चाहिए. साथ ही, आईडी को बदला नहीं जा सकता. सेट अप के बाद इसे बदला नहीं जा सकता. Cloud Console, एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है; आम तौर पर, आपको उसके होने की कोई परवाह नहीं होती. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना होगा. आम तौर पर, इसे PROJECT_ID के तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं है, तो किसी भी क्रम में एक और आईडी जनरेट किया जा सकता है. इसके अलावा, खुद भी आज़माया जा सकता है और देखें कि वह उपलब्ध है या नहीं. इस चरण के बाद इसे बदला नहीं जा सकता और प्रोजेक्ट के कुल समय तक बना रहेगा.
  • आपकी जानकारी के लिए, एक तीसरी वैल्यू यानी प्रोजेक्ट नंबर है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
  1. इसके बाद, आपको क्लाउड संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा, संसाधनों को बंद करने के लिए कि आपको बिलिंग न करनी पड़े. इसके लिए, अपने बनाए गए संसाधनों को मिटाएं या पूरा प्रोजेक्ट मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले प्रोग्राम में हिस्सा ले सकते हैं.

Cloud Shell शुरू करना

Google Cloud को आपके लैपटॉप से, कहीं से भी ऑपरेट किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जा रहा है. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.

Cloud Shell चालू करें

  1. Cloud Console में, Cloud Shell चालू करें 853e55310c205094.png पर क्लिक करें.

55efc1aaa7a4d3ad.png

अगर आपने Cloud Shell का इस्तेमाल पहले कभी नहीं किया है, तो आपको इसके बारे में जानकारी देने वाली एक इंटरमीडिएट स्क्रीन (पेज के फ़ोल्ड के नीचे) दिखेगी. अगर ऐसा है, तो जारी रखें पर क्लिक करें (यह आपको फिर कभी नहीं दिखेगा). एक बार इस्तेमाल होने वाली स्क्रीन कुछ इस तरह दिखती है:

9c92662c6a846a5c.png

प्रावधान करने और Cloud Shell से कनेक्ट होने में कुछ ही समय लगेगा.

9f0e51b578fecce5.png

इस वर्चुअल मशीन में ऐसे सभी डेवलपमेंट टूल मौजूद हैं जिनकी आपको ज़रूरत है. यह पांच जीबी की स्थायी होम डायरेक्ट्री उपलब्ध कराता है और Google Cloud में चलता है. यह नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस को बेहतर बनाता है. अगर सभी नहीं, तो इस कोडलैब में आपका बहुत सारा काम बस किसी ब्राउज़र या आपके Chromebook से किया जा सकता है.

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

3. Secret Manager API चालू करें

Secret Manager API का इस्तेमाल शुरू करने से पहले, आपको API चालू करना होगा. Cloud Shell का इस्तेमाल करके, एपीआई को चालू करने के लिए यह निर्देश दिया जा सकता है:

gcloud services enable secretmanager.googleapis.com

आपको इस तरह का आउटपुट दिखेगा:

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

4. Python के लिए Secret Manager क्लाइंट लाइब्रेरी इंस्टॉल करना

सीक्रेट मैनेजर क्लाइंट लाइब्रेरी इंस्टॉल करें:

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

5. इंटरैक्टिव Python शुरू करें

इस ट्यूटोरियल के हिस्से के लिए, आपको IPython नाम के एक इंटरैक्टिव Python अनुवादक का इस्तेमाल करना होगा. यह Cloud Shell में पहले से इंस्टॉल होता है. Cloud Shell में ipython चलाकर सेशन शुरू करें:

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 कमांड-लाइन का इस्तेमाल करके बनाया जा सकता है, लेकिन इन्हें Python का इस्तेमाल करके भी बनाया जा सकता है.

सीक्रेट का इस्तेमाल करने के लिए, आपको सबसे पहले सीक्रेट के नाम वाला सीक्रेट बनाना होगा. इसके बाद, आपको सीक्रेट का कोई वर्शन जोड़ना होगा, जो कि सीक्रेट की value है.

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

ध्यान दें कि कैसे हमारे सीक्रेट का नया वर्शन, हमारे ओरिजनल वर्शन से काफ़ी लंबा है. इस एट्रिब्यूट की जानकारी बाद में दी जाएगी.

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. Cloud फ़ंक्शन के साथ सीक्रेट मैनेजर का इस्तेमाल करना

Google Cloud के कई हिस्सों में सीक्रेट डेटा का इस्तेमाल किया जा सकता है. इस सेक्शन में, Cloud Functions पर फ़ोकस किया जाएगा. यह Google की बिना सर्वर वाली कंप्यूट सुविधा है, जो इवेंट पर आधारित है.

अगर आपको Cloud Functions में Python का इस्तेमाल करना है, तो Python कोडलैब में एचटीटीपी Google Cloud Functions को फ़ॉलो किया जा सकता है.

exit फ़ंक्शन को कॉल करके IPython को बंद करें:

exit

आपको अपने Cloud Shell पर वापस भेज दिया जाएगा:

yourname@cloudshell:~ (<PROJECT_ID>)$

Cloud Functions API का इस्तेमाल शुरू करने से पहले, आपको एपीआई चालू करना होगा. Cloud Shell का इस्तेमाल करके, एपीआई को चालू करने के लिए यह निर्देश दिया जा सकता है:

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

क्लाउड शेल के सबसे ऊपर दाईं ओर मौजूद कोड एडिटर को खोलें:

7651a97c51e11a24.png

secret-manager-api-demo फ़ोल्डर में मौजूद main.py फ़ाइल पर जाएं. आपको अपना पूरा कोड यहां डालना होगा.

9. सीक्रेट ऐक्सेस करने के लिए Cloud फ़ंक्शन लिखना

कमांड लाइन या 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 पैकेज जोड़ें:

requirements.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 फ़ंक्शन डिप्लॉय करना

पिछले सेक्शन में आपने सेटअप किया था. इसलिए, अब अपने 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
...

नीचे दिए गए निर्देश की मदद से, अपने फ़ंक्शन (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 में, संसाधन मैनेज करें पेज पर जाएं.
  • प्रोजेक्ट की सूची में, अपना प्रोजेक्ट चुनें. इसके बाद, Delete पर क्लिक करें.
  • डायलॉग बॉक्स में, प्रोजेक्ट आईडी टाइप करें. इसके बाद, प्रोजेक्ट मिटाने के लिए शट डाउन करें पर क्लिक करें.

ज़्यादा जानें

लाइसेंस

इस काम को क्रिएटिव कॉमंस एट्रिब्यूशन 2.0 जेनरिक लाइसेंस के तहत लाइसेंस मिला है.