Secret Manager'ı Python ile kullanma

1. Genel Bakış

Bu codelab'de, Python'da Secret Manager'ı kullanmaya odaklanacaksınız.

Secret Manager, gizli anahtarları ikili blob'lar veya metin dizeleri olarak depolamanıza, yönetmenize ve bunlara erişmenize olanak tanır. Uygun izinlerle sırrın içeriğini görüntüleyebilirsiniz.

Secret Manager, bir uygulamanın çalışma zamanında ihtiyaç duyduğu veritabanı şifreleri, API anahtarları veya TLS sertifikaları gibi yapılandırma bilgilerini depolamak için uygundur.

Neler öğreneceksiniz?

  • Cloud Shell'i kullanma
  • Python için Secret Manager istemci kitaplığını yükleme
  • Python istemci kitaplığını kullanarak gizli anahtar oluşturma ve gizli anahtarlara erişme
  • Python istemci kitaplığını kullanarak Cloud Functions'taki sırlara erişme

Gerekenler

  • Google Cloud projesi
  • Chrome veya Firefox gibi bir tarayıcı
  • Python 3'ü kullanma konusunda bilgi sahibi olma

Anket

Bu eğitimi nasıl kullanacaksınız?

Yalnızca okuyun Okuyun ve alıştırmaları tamamlayın

Python ile ilgili deneyiminizi nasıl değerlendirirsiniz?

Yeni başlayan Orta düzey Uzman

Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?

Başlangıç Orta İleri

2. Kurulum ve Gereksinimler

Yönlendirmesiz ortam kurulumu

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Dilediğiniz zaman bunu güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersiz olmalı ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğine (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projenin tamamını silebilirsiniz. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Cloud Shell'i başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir. Ancak bu codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da Cloud Shell'i etkinleştir 'i 853e55310c205094.png tıklayın.

55efc1aaa7a4d3ad.png

Cloud Shell'i daha önce hiç başlatmadıysanız ne olduğunu açıklayan bir ara ekran (ekranın alt kısmı) gösterilir. Bu durumda Devam'ı tıkladığınızda bu ekranı bir daha görmezsiniz. Bu tek seferlik ekran aşağıdaki gibi görünür:

9c92662c6a846a5c.png

Cloud Shell'in temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır.

9f0e51b578fecce5.png

Bu sanal makine, ihtiyaç duyduğunuz tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki çalışmalarınızın neredeyse tamamını yalnızca bir tarayıcı veya Chromebook'unuzla yapabilirsiniz.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, proje kimliğinize ayarlandığını görürsünüz.

  1. Kimliğinizin doğrulandığını onaylamak için Cloud Shell'de şu komutu çalıştırın:
gcloud auth list

Komut çıkışı

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud komutunun projeniz hakkında bilgi sahibi olduğunu onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Değilse şu komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. Secret Manager API'yi etkinleştirme

Secret Manager API'yi kullanmaya başlamadan önce API'yi etkinleştirmeniz gerekir. Cloud Shell'i kullanarak API'yi aşağıdaki komutla etkinleştirebilirsiniz:

gcloud services enable secretmanager.googleapis.com

Şuna benzer bir çıkış görürsünüz:

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

4. Python için Secret Manager istemci kitaplığını yükleme

Secret Manager İstemci Kitaplığı'nı yükleyin:

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

5. Etkileşimli Python'u başlatma

Bu eğitimin bir bölümünde, Cloud Shell'de önceden yüklenmiş olan IPython adlı etkileşimli bir Python yorumlayıcısı kullanacaksınız. Cloud Shell'de ipython komutunu çalıştırarak bir oturum başlatın:

ipython

Aşağıdakine benzer bir tablo görürsünüz:

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. Gizli anahtar oluşturma

Bir gizli anahtar, bir veya daha fazla gizli anahtar sürümü içerir. Bu dosyalar gcloud komut satırı kullanılarak oluşturulabilir ancak Python kullanılarak da oluşturulabilir.

Bir gizli anahtarı kullanmak için önce gizli anahtarın adını kullanarak gizli anahtarı oluşturmanız, ardından gizli anahtarın değeri olan gizli anahtarın bir sürümünü eklemeniz gerekir.

IPython'da proje kimliğinizi ayarlayın:

PROJECT_ID = "<PROJECT_ID>"

Gizli anahtar oluşturma

Aşağıdaki kodu IPython oturumunuza kopyalayı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}')   

my_secret_value adlı yeni bir gizli anahtar oluşturmak için işlevi çağırın:

create_secret("my_secret_value")

Aşağıdaki çıkışı göreceksiniz:

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

Gizli anahtar sürümü ekleme

Gizli anahtar oluşturulduğuna göre artık bir sürüm oluşturarak buna değer atayabilirsiniz.

Aşağıdaki kodu IPython oturumunuza kopyalayı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}')   

Yeni bir gizli anahtar sürümü eklemek için işlevi çağırın:

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

Aşağıdaki çıkışı göreceksiniz:

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

Gizli anahtarların birden fazla sürümü olabilir. İşlevi farklı bir değerle tekrar çağırın:

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

Aşağıdaki çıkışı göreceksiniz:

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

Yeni gizli anahtar sürümünün orijinalinden çok daha uzun olduğuna dikkat edin. Bu özelliğe daha sonra referans verilecektir.

7. Gizli anahtarlara erişme

Gizli anahtar sürümüne erişildiğinde gizli anahtar içeriğinin yanı sıra gizli anahtar sürümüyle ilgili ek meta veriler de döndürülür. Bir gizli anahtar sürümüne erişirken belirli bir sürümü belirtebilir veya "en son"u belirterek yalnızca en son sürümü isteyebilirsiniz.

Sırlar gizli tutulmalıdır. Veritabanı kimlik bilgilerini gizli anahtar olarak saklayın ve kimlik doğrulamak için kullanın veya sertifikaları saklayıp kullanın. Ancak gizli anahtarlarınızı doğrudan yazdırmayın. Aksi takdirde, gizli tutma amacına ulaşamazsınız.

Sırlarımız üzerinde işlemler yapacak ve doğrudan yazdırmadan değerini değerlendireceksiniz. Bunun yerine, gizli anahtarın değerinin karma değerini yazdırırsınız.

Aşağıdaki kodu IPython oturumunuza kopyalayı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()

Gizliyi değerinin karması olarak almak için işlevi çağırın:

secret_hash(access_secret_version("my_secret_value"))

Karma değerine benzeyen bir çıkış görmeniz gerekir (tam değer bu çıkışla eşleşmeyebilir):

83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11

Sürüm belirtmediğiniz için en son değer alındı.

Beklenen sürüm numarasını ekleyen işlevi arayarak onaylayın:

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

Son komutla aynı çıkışı görmeniz gerekir:

83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11

İşlevi tekrar çağırın ancak bu kez ilk sürümü belirterek:

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

Bu sefer farklı bir karma görmeniz gerekir. Bu, farklı bir çıkış olduğunu gösterir:

9a3fc8b809ddc611c82aee950c636c7557e220893560ec2c1eeeb177

8. Secret Manager'ı Cloud Functions ile kullanma

Google Cloud'un birçok bölümünde gizli anahtarlardan yararlanabilirsiniz. Bu bölümde, Google'ın etkinlik odaklı sunucusuz bilgi işlem hizmeti olan Cloud Functions'a odaklanacaksınız.

Cloud Functions'da Python kullanmak istiyorsanız HTTP Google Cloud Functions in Python Codelab'i inceleyebilirsiniz.

exit işlevini çağırarak IPython'ı kapatın:

exit

Cloud Shell'e yönlendirilirsiniz:

yourname@cloudshell:~ (<PROJECT_ID>)$

Cloud Functions API'yi kullanmaya başlamadan önce API'yi etkinleştirmeniz gerekir. Cloud Shell'i kullanarak API'yi aşağıdaki komutla etkinleştirebilirsiniz:

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

İşlevimizi oluşturmak için yeni bir klasör oluşturun ve yazılacak boş dosyalar oluşturun:

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

Cloud Shell'in sağ üst tarafındaki kod düzenleyiciyi açın:

7651a97c51e11a24.png

secret-manager-api-demo klasöründeki main.py dosyasına gidin. Tüm kodunuzu buraya yerleştireceksiniz.

9. Gizli anahtarlara erişmek için Cloud Function yazma

Gizli değerleri komut satırından veya IPython terminalinden depolayıp almak faydalı olsa da bu gizli bilgilere bir işlev içinde erişebilmek çok daha kullanışlıdır.

Daha önce oluşturduğunuz access_secret_version işlevini Cloud Functions işleviniz için temel olarak kullanabilirsiniz.

Aşağıdaki kodu main.py dosyasına kopyalayın:

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"

İşlevinizi dağıtmadan önce ortamın kurulumunu tamamlamanız gerekir. Bunun için işlev bağımlılığınızı ayarlamanız gerekir.

requirements.txt adlı yeni bir dosya oluşturun ve google-cloud-secret-manager paketini bu dosyaya ekleyin:

requirements.txt

google-cloud-secret-manager==2.10.0

Artık yalnızca main.py ve requirements.txt içeren bir klasörünüz olmalıdır.

Gizli bilginize erişime izin verme

İşlevinizi dağıtabilmeniz için Cloud Functions'ın gizli anahtarınıza erişmesine izin vermeniz gerekir.

Terminale geri dönün:

c5b686edf94b5222.png

Gizli bilgilerinize erişmek için Cloud Functions hizmet hesabına erişim izni verin:

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

Aşağıdaki çıkışı göreceksiniz:

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 Functions işlevinizi dağıtma

Önceki bölümlerdeki kurulumunuz göz önüne alındığında, artık Cloud Functions işlevinizi dağıtabilir ve test edebilirsiniz.

Yalnızca oluşturduğunuz iki dosyayı içeren klasörde işlevi dağıtın:

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

Aşağıdaki çıkışı (kısaltılmış) görmeniz gerekir:

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

Aşağıdaki komutla işlevinizin URL'sini (httpsTrigger.url meta verileri) alın:

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

Şimdi işlevinizi çağırarak işlevin beklenen dönüş değeriyle erişilip erişilemediğini test edin:

curl $FUNCTION_URL

Aşağıdaki çıkışı göreceksiniz:

We meet again!

Bu işlev, gizli dizenin en son sürümüne referans veriyor. Bu sürüm, "Again" dizesini içerecek şekilde ayarlandığı için işlev beklendiği gibi çalışıyor.

11. Tebrikler!

Python kullanarak Secret Manager API'yi nasıl kullanacağınızı öğrendiniz.

Temizleme

Bu eğiticide kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız:

  • Cloud Console'da Kaynakları yönetin sayfasına gidin.
  • Proje listesinde projenizi seçip Sil'i tıklayın.
  • İletişim kutusunda proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.

Daha fazla bilgi

Lisans

Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.