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 gizli anahtarın içeriğini görüntüleyebilirsiniz.

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

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 bu gizli anahtarlara erişme
  • Python istemci kitaplığını kullanarak Cloud Functions'taki gizli anahtarlara erişme

Gerekenler

  • Bir Google Cloud projesi
  • Chrome veya Firefox gibi bir tarayıcı
  • Python 3 kullanımı hakkında bilgi

Anket

Bu eğiticiden nasıl yararlanacaksınız?

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

Python deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

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

Acemi Orta Yeterli

2. Kurulum ve Gereksinimler

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp 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. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersiz olmalıdır ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğini (genellikle PROJECT_ID olarak tanımlanır) referans almanız gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz için bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırma yapılmaması için kaynakları kapatmak isterseniz oluşturduğunuz kaynakları silebilir veya projenin tamamını silebilirsiniz. Yeni Google Cloud kullanıcıları, 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloud Shell'i başlatma

Google Cloud dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de 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 853e55310c205094.png simgesini 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ında) gösterilir. Bu durumda Devam'ı tıklayın (bunu bir daha görmezsiniz). Tek seferlik ekran şöyle görünür:

9c92662c6a846a5c.png

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

9f0e51b578fecce5.png

İhtiyaç duyduğunuz tüm geliştirme araçları bu sanal makinede yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı yalnızca bir tarayıcı veya Chromebook'unuzla yapılabilir.

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. Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki 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 projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Doğru değilse aşağıdaki 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ış alı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şlatın

Bu eğiticinin bir kısmında, Cloud Shell'e önceden yüklenmiş olan IPython adlı etkileşimli bir Python yorumlayıcısını kullanacaksınız. Cloud Shell'de ipython çalıştırarak 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

Gizli anahtar, bir veya daha fazla gizli anahtar sürümü içeriyor. Kodlar gcloud komut satırı kullanılarak oluşturulabilir ancak Python kullanılarak da oluşturulabilir.

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

Proje kimliğinizi IPython'da 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 mevcut olduğuna göre artık bir sürüm oluşturarak gizli anahtara 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ü oluşturmak 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

Gizli anahtarımızın yeni sürümünün orijinal sürümümüzden önemli ölçüde 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ştiğinizde gizli anahtar içerikleri ve gizli anahtar sürümüyle ilgili ek meta veriler döndürülür. Bir gizli anahtar sürümüne eriştiğinizde belirli bir sürümü belirtebilir veya "En son" değerini belirterek en son sürümü istemeniz yeterlidir.

Sırlar gizli tutulmalıdır. Veritabanı kimlik bilgilerini gizli anahtar olarak saklayabilir, ardından kimlik doğrulaması yapmak için kullanabilir veya sertifikaları depolayıp kullanabilir. Ancak sırlarınızı doğrudan yazdırmayın. Aksi halde, sırlarınızın saklanması amaçlanmamış olur.

Gizli anahtarlarımız üzerinde işlemler gerçekleştirecek ve doğrudan yazdırmadan değerini değerlendireceksiniz. Bunun yerine, gizli anahtar değerinin karma kısmını 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()

Gizli anahtarı değerinin karma değeri olarak almak için işlevi çağırın:

secret_hash(access_secret_version("my_secret_value"))

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

Onaylamak için beklenen sürüm numarasını ekleyerek işlevi çağırın:

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

Son komutla aynı çıkışı görürsünüz:

83f8a4edb555cde4271029354395c9f4b7d79706ffa90c746e021d11

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

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

Bu kez, farklı bir çıkış olduğunu belirten farklı bir karma görürsünüz:

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 teklifi Cloud Functions'a odaklanacaksınız.

Cloud Functions'da Python kullanmak istiyorsanız Python Codelab'de HTTP Google Cloud Functions başlıklı makaleden inceleyebilirsiniz.

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

exit

Cloud Shell'inize döndürülürsünüz:

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 derlemek için yeni bir klasör oluşturun ve üzerine 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ından kod düzenleyiciyi açın:

7651a97c51e11a24.png

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

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

Gizli anahtar değerlerini komut satırından veya IPython terminalinden depolamak ve almak işe yarar olsa da bu gizli anahtarlara bir işlev içinden erişebilmek çok daha yararlıdır.

Daha önce oluşturduğunuz access_secret_version işlevini kullanarak bunu 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ğıtabilmek için ortam kurulumunu tamamlamanız gerekir. Bunun için işlev bağımlılığınızı ayarlamanız gerekir.

requirements.txt adında 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 olması gerekir.

Gizli anahtarınıza erişim izni verme

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

Terminale geri dönün:

c5b686edf94b5222.png

Gizli anahtarınıza erişmesi için Cloud Functions Hizmet Hesabına erişim 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ümlerde yer alan ayarlarınız doğrultusunda, Cloud Functions işlevinizi dağıtıp test edebilirsiniz.

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

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

Şu çıkışı (kısaltılmış) göreceksiniz:

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 beklenen dönüş değeriyle işlevi test edin:

curl $FUNCTION_URL

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

We meet again!

Bu işlev, gizli anahtarın "Tekrar" dizesini içerecek şekilde ayarlanmış en son sürümüne referans verir. Bu nedenle işlev beklendiği gibi çalışır.

11. Tebrikler!

Python ile 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 önlemek amacıyla:

  • Cloud Console'da Kaynakları yönetin sayfasına gidin.
  • Proje listesinde projenizi seçin ve Sil'i tıklayın.
  • İletişim kutusuna 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.