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
Anket
Bu eğiticiden nasıl yararlanacaksınız?
Python deneyiminizi nasıl değerlendirirsiniz?
Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
2. Kurulum ve Gereksinimler
Kendi hızınızda ortam kurulumu
- 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.
- 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.
- 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
- Cloud Console'da, Cloud Shell'i etkinleştir simgesini tıklayın.
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:
Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.
İ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.
- 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`
- 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:
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:
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
- Secret Manager: https://cloud.google.com/secret-manager/
- Google Cloud'da Python: https://cloud.google.com/python/
- Python için Cloud İstemci Kitaplıkları: https://googlecloudplatform.github.io/google-cloud-python/
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.