概要
これまで CSM (CipherTrust Secret Management powered by AKEYLESS)をもちいたシークレット管理方法をご紹介してきました。
今回は 実際にアプリケーションからシークレットを呼び出しを想定して、Python から CSMへアクセスし、Static Secret 及び、Dynamic Secretの取得を行ってみます
Akeyless は REST APIを提供しています。Java, Python, Go, C#.NET, Ruby 等へはSDKを提供しており、より容易にSecret管理をアプリケーションへ取り込む事が可能です
目的
Akeyless の Python SDKを用いて、Static Secret、Dynamic Secret の取得を行ってみます。
認証には AWS IAMを用います。これにより、完全にSecret を排除しSecretの取得を行います。
参照ドキュメント
手順
前準備
これまでご紹介した記事の内容に沿って、CSMのセットアップを行います。
Python パッケージのインストール
Akeyless の パッケージのインストールを行います
pip install akeyless
今回は AWS IAM認証を用いるため、"cloud ID"とboto3(AWS SDK)のインストールを行います
pip install akeyless_cloud_id
pip install boto3
サンプルコード
サンプルコードはこちらになります
コメント (#)に解説を記載しております
#!/usr/bin/env python3
import akeyless
from akeyless_cloud_id import CloudId
## Configration
configuration = akeyless.Configuration()
#configuration.host = "https://api.akeyless.io" # Akeyless SaaS
configuration.host = "https://web.ciphertrustmanager.local/akeyless-api/v2/" # Akeyless GW URL (CM内)
configuration.ssl_ca_cert = '/home/ubuntu/web-ciphertrustmanager-local.pem' # サーバ証明書
api_client = akeyless.ApiClient(configuration)
api = akeyless.V2Api(api_client)
## 認証
# API Key
#body = akeyless.Auth(access_id='p-XXXXXXXXXXXX', access_key='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=')
# AWS IAM
cloud_id_generator = CloudId()
cloud_id = cloud_id_generator.generate()
body = akeyless.Auth(access_id='p-XXXXXXXXXXXXXX', access_type='aws_iam', cloud_id=cloud_id) # accessid へ、AWS IAM認証で作成したaccess_idを指定
res = api.auth(body)
token = res.token
# Static Secretの取得
body = akeyless.GetSecretValue(names=['MyFirstSecret'], token=token) # namesへ取得対象のStatic Secretを指定
res = api.get_secret_value(body)
print(res['MyFirstSecret']) # 取得した Static Secretの値を表示
## MySQL Dynamic Secretの取得
body = akeyless.GetDynamicSecretValue(name='/aws-p02/mysqlDS1', token=token) # nameへ取得対象のDynamic Secretを指定
res = api.get_dynamic_secret_value(body)
print(res) # 取得した Dynamic Secretの値を表示
実行結果
$ ./test_ds.py
My First Secret Value
{'id': 'tmp_p-6i3d_IMJ12', 'password': 'pe4KEi~G58TLN~vi', 'ttl_in_minutes': '60', 'user': 'tmp_p-6i3d_IMJ12'}
1行目: "My First Secret Value" が Static Secret の値
2行目: "{'id': 'tmp_p-6i3d_IMJ12', ....."が Dynamic Secretの値
"Vault less"
API Key認証 = 非”Vault less"
API Key での認証ですと、access_keyが必要となるため、"Vault less"とはならず、Secret漏洩の懸念が残ります。
body = akeyless.Auth(access_id='p-XXXXXXXXXXXX', access_key='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=')
AWS IAM認証 = "Vault less"
今回のサンプルでは Akeylessへの認証にAWS IAMを用いていました。
access_keyを排除でき、Secretを完全に排除し"Vault less"となり、Secret漏洩の懸念を排除することができました。
body = akeyless.Auth(access_id='p-XXXXXXXXXXXXXX', access_type='aws_iam', cloud_id=cloud_id) # accessid へ、AWS IAM認証で作成したaccess_idを指定