CSM: Dynamic Secretをためす

## 概要
[初回の記事"CipherTrust Secrets Management (CSM)をためす"](https://qiita.com/shinyaarai/items/0da7ea8164df552c4bfd)で、"Static Secret"の操作について紹介しました。今回は注目の機能である"Dynamic Secret"をためしてみます

### "Dynamic Secret"とは何でしょうか？
"必要なときに作成され、利用後削除される'一時的に利用される認証情報'"ということになります


Static Secret を利用することにより、ハードコードや、Configration Fileに、認証情報を保存しておく必要がなくなり、認証情報を一元管理でき、Akeylessの特許取得済みの暗号化技術"DFC"を利用し安全に保存できることができるようになりました

しかしながら、Static Secret が、なんらかの要因により漏洩してしまうと、悪意を持った人がそのSecretを利用し、情報にアクセスできてしまいます

Dynamic Secret を利用することにより、Secretは、クライアントが必要なときに必要な権限を持つ Secretを随時個別に作成されるようになります。また、Secretの有効期間を設定できるので、利用後に削除することができます
これにより、万が一、Secretが漏洩した場合でも、データ漏洩の被害を縮小することができます

![CSM_DS-Overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/63e48dc4-f1db-3996-6d4c-bf84596aeab8.png)

"App Servre"からDBへアクセスする簡単な例を用いて"Dynamic Secret"についてご紹介させていただきます

Clientである"App Server"が、"Akeyless Gateway"を経由し、"Akeyless SaaS"へ、Targetである、DBのシークレットを要求します。Akeyless は、DBに予め登録してある"Target"の情報を用いて、DBへログインし、一時的に利用できるSecretを作成します。Akeyless SaaSはPublic Network(Internet)上に存在するため、Private Network（お客様ネットワーク環境）上のDBへ直接アクセスすることができません。このため Private Network 上の"Akeyless Gateway"から、DBへログインし、一時的に利用できるSecretを作成を行います。作成されたSecretは、App Serverへ送られます。App ServerはこのSecretを用いDBへのアクセスを行います。TTL（有効期間が経過すると、Akeyless Gatewayは、再度、DBへアクセスし、先程作成したSecretの削除をおこないます

## 目的

MySQLを対象に、Dynamic Secret の設定を行い、利用してみます

## 参照ドキュメント

- Akeyless Documentation
    - WORKING WITH SECRETS
        - [Targets](https://docs.akeyless.io/docs/targets)
        - [Dynamic Secrets](https://docs.akeyless.io/docs/how-to-create-dynamic-secret)
        - [Rotated Secrets](https://docs.akeyless.io/docs/rotated-secrets)
- Akeyless Tutorial
    - WORKING WITH SECRETS
        - [Creating and Configuring Targets](https://tutorials.akeyless.io/docs/creating-targets)
        - [Creating and Using Dynamic Secrets](https://tutorials.akeyless.io/docs/creating-and-fetching-dynamic-secrets)
        - [Creating and Using Rotated Secrets](https://tutorials.akeyless.io/docs/creating-and-using-rotated-secrets)


## 手順

### Target の作成
まずは、"Target"の作成をおこないます。今回の例ですと対象のDBのIP address, port, データベース名や、一時的なアカウント作成に必要な権限を持ったID、password 等の情報の設定を行います

"Target" > "Next"をクリックします

![CSM_DS-1-1a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/25a9b38e-cdc8-e61e-98e0-39cd80fc8906.png)

"MySQL"を選択し、"Next"をクリックします
![CSM_DS-1-2a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/d7716c02-1dd2-177c-e088-a05cd938486e.png)

Nameを入力します（任意: 例 "mysqlTarget"）
"Next"をクリックします
![CSM_DS-1-3a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/81c2f309-3004-4346-6af9-7d1c69e20de5.png)

DB管理者権限の Username、 Password、DBのHostname(または IP address)、DBのNameを入力します
"Next"をクリックします
![CSM_DS-1-4a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/ba9ed1d5-abe2-bcfb-c1c0-ad1b07cad242.png)

"Next"をクリックします
![CSM_DS-1-5a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/ffc7bdb8-776f-6eba-4c9e-2454fbb45658.png)

”Target"が作成されました
![CSM_DS-1-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/fbb252d0-3877-c0d4-31d4-20fe2a55a26b.png)

### Dynamic Secretの作成

次に Dynamic Secretの作成を行います
"Items" > "New" > "Dynamic Secret" を選択します

![CSM_DS-2-2a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/40c118ca-c2b8-c335-a82a-ba82ddb36900.png)

"MySQL"を選択し、"Next"をクリックします
![CSM_DS-2-4a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/a92e9849-54ea-3f8e-024b-6d757da3a86a.png)

"Name"（任意: 例"mysqlDS"）を入力します
"Target Mode"の"Choose an existing taget"のリストから、先程、作成した"Target"(例: "/mysqlTarget")を選択します
（画面の下半分へスクロールします）
![CSM_DS-2-5a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/a07ef706-8403-c2f1-3f26-579c51b99435.png)

"Gateway"で"This Gateway"("defaultCluster")をリストから選択します
"Finish"をクリックします
![CSM_DS-2-6a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/fec84d46-4477-4fd1-2c71-890c96e2321c.png)

Dynamic Secretが作成されたことを確認します
"Get Dynamic Secret"をクリックします

![CSM_DS-2-7a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/0ed07242-f75d-4711-9086-089b16ca9fc8.png)

作成された Dynamic Secretの Userame, Password が取得できました
![CSM_DS-2-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/929864d0-babb-2ecb-14fa-a9e2f226c547.png)

"Expire in”で、このDynamic Secret の有効な残り時間が確認できます
今回は Defaultの60分で作成しています。60分経過すると、このDynamic Secretは自動的に削除されます

Akyless CLIからも取得できます

```
$ akeyless dynamic-secret get-value --name /mysqlDS
{
  "id": "tmp_p-4ca2_h1MJg",
  "password": "62k@dyNt=hIvb@BI",
  "ttl_in_minutes": "60",
  "user": "tmp_p-4ca2_h1MJg"
}

$
```

### Rotated Secretの作成

Akeyless Gatewayから、"Target"に指定した MySQLへ管理者権限でログインし、Dynamic Secret として、MySQLの新規アカウントを作成及び削除ができるようになりました
しかしながら、"Target"で使用した管理者権限のアカウントのセキュリティへの懸念が残ります。Rotated Secret を用いることにより、特定アカウント（今回の例ではMySQL管理者"root")のパスワードの変更を特定間隔で自動的に行うことができます


実際に Rotated Secretの作成を行ってみます
"Items" > "New" > "Rotated Secret" を選択します

![CSM_DS-3-2a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/ad98abd3-8594-3169-d068-c5c80587ef1d.png)

"MySQL"を選択し、"Next"をクリックします
![CSM_DS-3-4a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/afbbc935-80d1-f308-89f2-423d1f1e33a8.png)

"Name"（任意: 例"mysqlRS"）を入力します
"Next"をクリックします
![CSM_DS-3-5a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/761f055d-b796-7701-6d90-2ffcb25b2fe7.png)

"Target"のリストから、作成した"Target"(例: "/mysqlTarget")を選択します
"Rotator Type"から"Target"を選択します
"Gateway"で"This Gateway"("defaultCluster")をリストから選択します
"Finish"をクリックします
![CSM_DS-3-6a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/37bfa226-e76b-d6ab-089d-be467a4c3628.png)

Rotated Secretが作成されたことを確認します
![CSM_DS-3-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/688ea411-900e-4676-38fb-26e3e123bcae.png)

"Auto Rotate"で指定された間隔で Password が更新されるようになりました

CLIからマニュアルで Rotate (パスワード更新）を行ってみます
```
$ akeyless gateway-rotate-secret -n /mysqlRS
The Rotated Secret named /mysqlRS was successfully rotated
```
更新されたパスワードを確認します
```
$ akeyless get-rotated-secret-value -n /mysqlRS
{
  "value": {
    "password": "QSH~pb1a48A1J=85",
    "username": "root"
  }
}
```

Akeyless Gateway コンソールから確認します
"Versions"をクリックします
Version 2 の"目"のアイコンをクリックします

![CSM_DS-3-8a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/1135daac-c7d6-dc08-2ab0-19da97c6d3b1.png)

更新されたパスワードを確認します
![CSM_DS-3-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613085/8da4394a-0e59-9271-e92d-44a820feb77e.png)