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

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

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

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

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

आपको क्या सीखने को मिलेगा

  • 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 में बिलिंग चालू करनी होगी, ताकि Cloud संसाधनों/एपीआई का इस्तेमाल किया जा सके. इस कोडलैब को पूरा करने में ज़्यादा खर्च नहीं आएगा. इस ट्यूटोरियल के बाद बिलिंग से बचने के लिए, बनाए गए संसाधनों को बंद किया जा सकता है. इसके लिए, बनाए गए संसाधनों को मिटाएं या पूरे प्रोजेक्ट को मिटाएं. Google Cloud के नए उपयोगकर्ताओं को, मुफ़्त में आज़माने के लिए 300 डॉलर का क्रेडिट मिलता है.

Cloud Shell शुरू करें

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

Cloud Shell चालू करें

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

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

Cloud Shell से कनेक्ट होने में कुछ ही सेकंड लगेंगे.

9f0e51b578fecce5.png

इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद होते हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है और 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. यह पुष्टि करने के लिए कि gcloud कमांड को आपके प्रोजेक्ट के बारे में पता है, Cloud Shell में यह कमांड चलाएं:
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 का इस्तेमाल शुरू करने से पहले, आपको इसे चालू करना होगा. Cloud Shell का इस्तेमाल करके, इस निर्देश की मदद से एपीआई को चालू किया जा सकता है:

gcloud services enable secretmanager.googleapis.com

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

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

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

Secret Manager Client Library इंस्टॉल करें:

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

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

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 Functions के साथ Secret Manager का इस्तेमाल करना

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

अगर आपको Cloud Functions में Python का इस्तेमाल करना है, तो Python में HTTP 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

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

7651a97c51e11a24.png

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

9. सीक्रेट ऐक्सेस करने के लिए Cloud Functions लिखना

कमांड लाइन या IPython टर्मिनल से सीक्रेट वैल्यू को सेव और वापस पाने की सुविधा काम की है. हालांकि, किसी फ़ंक्शन के अंदर इन सीक्रेट को ऐक्सेस करने की सुविधा ज़्यादा काम की है.

आपने पहले जो access_secret_version फ़ंक्शन बनाया था उसका इस्तेमाल, Cloud Function के लिए किया जा सकता है.

नीचे दिए गए कोड को 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 Function को डिप्लॉय और टेस्ट किया जा सकता है.

आपने जो दो फ़ाइलें बनाई हैं उन्हें जिस फ़ोल्डर में रखा गया है उसमें जाकर, फ़ंक्शन को डिप्लॉय करें:

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" स्ट्रिंग को शामिल करने के लिए सेट किया गया था. इसलिए, यह फ़ंक्शन उम्मीद के मुताबिक काम कर रहा है.

11. बधाई हो!

आपने Python का इस्तेमाल करके, Secret Manager API को इस्तेमाल करने का तरीका जान लिया है!

व्यवस्थित करें

इस ट्यूटोरियल में इस्तेमाल किए गए संसाधनों के लिए, अपने Google Cloud खाते से शुल्क न लिए जाने के लिए:

  • Cloud Console में, संसाधन मैनेज करें पेज पर जाएं.
  • प्रोजेक्ट की सूची में, अपना प्रोजेक्ट चुनें. इसके बाद, मिटाएं पर क्लिक करें.
  • डायलॉग बॉक्स में, प्रोजेक्ट आईडी टाइप करें. इसके बाद, प्रोजेक्ट मिटाने के लिए बंद करें पर क्लिक करें.

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

लाइसेंस

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