Python
 Computer >> コンピューター >  >> プログラミング >> Python

Boto3を使ってAWS Secrets Managerのバイナリ/暗号化形式のシークレットをプレーンテキストで取得する方法

課題

Pythonのboto3ライブラリを使用して、AWS Secrets Managerにバイナリ/暗号化形式で保存されているシークレットキーを、プレーンテキスト(平文)として取得する方法を解説します。

解決までの手順・アルゴリズム

  • ステップ1: 例外処理のために、boto3およびbotocore.exceptionsの例外クラスをインポートします。

  • ステップ2: シークレットが保存されている場所を示すsecret_stored_locationは必須パラメータです。

  • ステップ3: boto3ライブラリを使ってAWSセッションを作成します。デフォルトプロファイルにregion_nameが設定されているか確認してください。設定されていない場合は、セッション作成時に明示的にregion_nameを指定する必要があります。

  • ステップ4: secretmanager向けのAWSクライアントを作成します。

  • ステップ5: get_secret_valueを呼び出し、secret_stored_locationSecretIdとして渡します。

  • ステップ6: 取得したレスポンスがプレーンテキスト(SecretString)か、暗号化されたバイナリ形式(SecretBinary)かを判定します。

  • ステップ7: バイナリ形式の場合は、base64.b64decodeを使ってデコードします。

  • ステップ8: 指定した場所に保存されたすべてのシークレットが、復号化されたプレーンテキストとして返されます。

  • ステップ9: 値の取得中に予期しない問題が発生した場合に備え、汎用的な例外ハンドリングを行います。

サンプルコード

AWS Secrets Managerから復号化済みのプレーンテキストシークレットを取得するには、以下のコードを使用します。

import boto3
import base64
from botocore.exceptions import ClientError

def get_decrypted_secret_details(secret_stored_location):
    session = boto3.session.Session()
    secrets_client = session.client('secretmanager')
    try:
        response = secrets_client.get_secret_value(SecretId=secret_stored_location)
        if 'SecretString' not in response:
            # バイナリ形式の場合はBase64でデコード
            decoded_secret_values = base64.b64decode(response['SecretBinary'])
        else:
            decoded_secret_values = response['SecretString']
        return decoded_secret_values
    except ClientError as e:
        raise Exception("boto3 client error in get_decrypted_secret_details: " + str(e))
    except Exception as e:
        raise Exception("Unexpected error in get_decrypted_secret_details: " + str(e))

a = get_decrypted_secret_details('/secrets/aws')
print(a)

なお、元のコードにはimport base64が欠けているため、上記では追記しています。また、SecretStringが存在する場合にも値を正しく返せるよう、分岐処理を補完しています。

実行結果

{"user":"SERVICE_USER","accesskey":"I**************"}

このように、SecretBinaryフィールドに格納されたBase64エンコード済みのデータをデコードすることで、シークレットを安全に平文として取得できます。本番環境では、取得したシークレットをログなどに出力せず、必要な箇所でのみ利用するよう注意してください。

  1. Boto3を使ってAWS Glueクローラーのメトリクスを1つまたは複数取得する方法【Pythonコード例】

    はじめにこの記事では、Pythonのboto3ライブラリを使用して、AWS Glueデータカタログに登録された指定したクローラーのメトリクスを取得する方法を解説します。単一のクローラーだけでなく、複数のクローラーを一度に指定することも可能です。課題: Pythonのboto3ライブラリを使って、指定されたクローラーのメトリクスを取得する。例: クローラー「crawler_for_s3_file_job」のメトリクスを取得する。解決のためのアプローチ以下の手順で、指定されたクローラーのメトリクスを取得できます。ステップ1: 例外処理のためにboto3とbotocore.exceptions(Cl

  2. Boto3を使用して移行操作のステータスを取得する方法

    課題の概要 Pythonのboto3ライブラリを使用して、AWS Glueデータカタログの移行(インポート)操作のステータスを取得します。 例: アカウント内で実行された移行操作のステータスを取得します。 解決のためのアプローチと手順 ステップ1: 例外処理のために、boto3とbotocore.exceptionsをインポートします。 ステップ2: 移行ステータスを確認したい対象の catalog_id をパラメータとして渡します。なお、このパラメータは省略可能です。指定しなかった場合は、デフォルトでログイン中のユーザーアカウントに対して、移行が進行中か完了済みかが確認されます。catal