CSM: Python SDKによるシークレット管理をためす

# 概要

これまで CSM (CipherTrust Secret Management powered by AKEYLESS)をもちいたシークレット管理方法をご紹介してきました。

https://qiita.com/tags/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の取得を行います。

# 参照ドキュメント

https://docs.akeyless.io/docs/sdks

https://github.com/akeylesslabs/akeyless-python

# 手順
## 前準備
これまでご紹介した記事の内容に沿って、CSMのセットアップを行います。
- [CipherTrust Secrets Management (CSM)をためす](https://qiita.com/shinyaarai/items/0da7ea8164df552c4bfd)
- [CSM: AWS IAM 認証をためす](https://qiita.com/shinyaarai/items/03beb8cbcc0aa722294a0)
- [CSM: Dynamic Secretをためす](
https://qiita.com/shinyaarai/items/3312112f3ce563f58ac4)

## Python パッケージのインストール

Akeyless の　パッケージのインストールを行います
```
 pip install akeyless
```
今回は AWS IAM認証を用いるため、"cloud ID"とboto3(AWS SDK)のインストールを行います
```
 pip install akeyless_cloud_id
 pip install boto3
```

## サンプルコード

サンプルコードはこちらになります
コメント (#)に解説を記載しております

```python:csm_test.py
 #!/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漏洩の懸念が残ります。
```python
body = akeyless.Auth(access_id='p-XXXXXXXXXXXX', access_key='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=')　
```

## AWS IAM認証 = "Vault less"
今回のサンプルでは Akeylessへの認証にAWS IAMを用いていました。
access_keyを排除でき、Secretを完全に排除し"Vault less"となり、Secret漏洩の懸念を排除することができました。
```python

body = akeyless.Auth(access_id='p-XXXXXXXXXXXXXX', access_type='aws_iam', cloud_id=cloud_id)　# accessid へ、AWS IAM認証で作成したaccess_idを指定
```