はじめに
Dynamic Secrets (Secret Backend) の Lease 機能について動作を確認しましたので備忘録として記録しておきます。
やったこと
- Vaultが作成したAWSユーザの有効期限(TTL)を確認する
- Lease機能を利用して有効期限(TTL)を設定する
- Lease機能を利用してAWSユーザの有効期限(TTL)を延長する
HashiCorp Vaultとは?
HashiCorpが提供している機密情報の管理ツールです。
Dynamic Secrets (Secret Backend) とは
VaultにAWSやDatabaseなどのアカウントを管理させる機能です。
この機能を利用することでVaultを通じてAWSなどのユーザ作成、削除を実施できるようになります。
有効期間が経過したユーザについてはVaultが自動で削除を行ってくれます。
参考
公式サイト
ドキュメント
AWS Secret Backend - HTTP API - Vault by HashiCorp
/sys/leases - HTTP API - Vault by HashiCorp
過去の投稿
HashiCorp Vault の Dynamic Secrets (Secret Backend) を試す - Qiita
事前準備
VaultをDevモードで起動
$ vault server -dev
...
export VAULT_ADDR='http://127.0.0.1:8200'
...
Root Token: dae8c23c-3749-0286-abc5-fbdf57b634f1
環境変数の設定
$ export VAULT_ADDR='http://127.0.0.1:8200'
$ export VAULT_TOKEN='dae8c23c-3749-0286-abc5-fbdf57b634f1'
AWS Backendをマウント
$ vault mount aws
Successfully mounted 'aws' at 'aws'!
AWSのTokenを設定
$ vault write aws/config/root \
access_key=AKIAIFOCRMPWZMVED74Q \
secret_key=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
Success! Data written to: aws/config/root
ポリシーを設定
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1426528957000",
"Effect": "Allow",
"Action": [
"ec2:*"
],
"Resource": [
"*"
]
}
]
}
$ vault write aws/roles/deploy policy=@policy.json
Success! Data written to: aws/roles/deploy
1. Vaultが作成したAWSユーザの有効期限(TTL)を確認する
初期状態でLease設定や有効期限(TTL)を確認します。
Lease設定を確認する
Lease設定を確認しても、未設定のため取得できません。
$ curl \
--header "X-Vault-Token: $VAULT_TOKEN" \
$VAULT_ADDR/v1/aws/config/lease
{"errors":[]}
VaultにAWSユーザを作成させる
この状態(Lease未設定)でAWSユーザを作成せた場合、lease_duration": 2764800
となっています。
$ curl \
--header "X-Vault-Token: $VAULT_TOKEN" \
$VAULT_ADDR/v1/aws/creds/deploy
{
"request_id": "333374cd-1d0e-6015-adc9-85656d78a1c9",
"lease_id": "aws/creds/deploy/6ceb69a0-249a-e65e-ff9a-9996a85bed45",
"renewable": true,
"lease_duration": 2764800,
"data": {
"access_key": "AKIAJIFBBLEAXHS4NQNQ",
"secret_key": "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",
"security_token": null
},
"wrap_info": null,
"warnings": null,
"auth": null
}
Lease設定を確認
AWSユーザのLease設定を確認すると、
- "issue_time" : "2017-10-08T17:30:30.873476458+09:00"
- "expire_time": "2017-11-09T17:30:30.873476739+09:00"
となっており、有効期限(TTL)が 2764800秒 = 32日間 であることがわかりました。
$ curl \
--header "X-Vault-Token: $VAULT_TOKEN" \
--request PUT \
--data '{ "lease_id": "aws/creds/deploy/6ceb69a0-249a-e65e-ff9a-9996a85bed45" }' \
$VAULT_ADDR/v1/sys/leases/lookup
{
"request_id": "21234bd6-e722-8993-22f7-175f2c4d8dc6",
"lease_id": "",
"renewable": false,
"lease_duration": 0,
"data": {
"expire_time": "2017-11-09T17:30:30.873476739+09:00",
"id": "aws/creds/deploy/6ceb69a0-249a-e65e-ff9a-9996a85bed45",
"issue_time": "2017-10-08T17:30:30.873476458+09:00",
"last_renewal": null,
"renewable": true,
"ttl": 2764126
},
"wrap_info": null,
"warnings": null,
"auth": null
}
2. Lease機能を利用して有効期限(TTL)を設定する
初期設定では有効期限(TTL)が長いので、短い有効期限(TTL)を設定して、AWSユーザが実際に削除されるのか確認したいと思います。
Lease設定
lease
を30m
、lease_max
を12h
に設定します。
$ curl \
--header "X-Vault-Token: $VAULT_TOKEN" \
--request POST \
--data '{ "lease": "30m", "lease_max": "12h" }' \
$VAULT_ADDR/v1/aws/config/lease
Lease設定を確認すると、lease
, lease_max
が指定した値になっています。
$ curl \
--header "X-Vault-Token: $VAULT_TOKEN" \
$VAULT_ADDR/v1/aws/config/lease
{
"request_id": "3b09ce08-b6b6-848f-3622-f3711d1a7d26",
"lease_id": "",
"renewable": false,
"lease_duration": 0,
"data": {
"lease": "30m0s",
"lease_max": "12h0m0s"
},
"wrap_info": null,
"warnings": null,
"auth": null
}
AWSユーザ作成
Lease設定後にAWSユーザを作成させると、lease_duration": 1800
となっています。
$ curl \
--header "X-Vault-Token: $VAULT_TOKEN" \
$VAULT_ADDR/v1/aws/creds/deploy
{
"request_id": "5413657e-78e4-4128-e7c0-ed61c6158bc8",
"lease_id": "aws/creds/deploy/5d7f8036-762b-8fcb-fcea-7bb7f1842f13",
"renewable": true,
"lease_duration": 1800,
"data": {
"access_key": "AKIAJCVNQTVWYDKAEIMA",
"secret_key": "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",
"security_token": null
},
"wrap_info": null,
"warnings": null,
"auth": null
}
AWSユーザのLease設定を確認すると、
- "issue_time" : "2017-10-08T17:52:06.741853365+09:00"
- "expire_time": "2017-10-08T18:22:06.741853771+09:00"
となっており、有効期限(TTL)が1800秒 = 30分となってることがわかります。
$ curl \
--header "X-Vault-Token: $VAULT_TOKEN" \
--request PUT \
--data '{ "lease_id": "aws/creds/deploy/5d7f8036-762b-8fcb-fcea-7bb7f1842f13" }' \
$VAULT_ADDR/v1/sys/leases/lookup
{
"request_id": "e528ba92-53f0-cee0-973d-069612a24207",
"lease_id": "",
"renewable": false,
"lease_duration": 0,
"data": {
"expire_time": "2017-10-08T18:22:06.741853771+09:00",
"id": "aws/creds/deploy/5d7f8036-762b-8fcb-fcea-7bb7f1842f13",
"issue_time": "2017-10-08T17:52:06.741853365+09:00",
"last_renewal": null,
"renewable": true,
"ttl": 1646
},
"wrap_info": null,
"warnings": null,
"auth": null
}
AWSユーザの削除確認
AWSの管理コンソールを確認したところ、expire_time
に到達したタイミングでVaultが作成したAWSユーザ(vault-root-deploy-1507452723-604)が削除されました。
expire_time
到達前
↓
expire_time
到達後
3. Lease機能を利用してAWSユーザの有効期限(TTL)を延長する
Lease機能には有効期限(TTL)を延長(renew)させる機能があるので、こちらの動作も確認してみます。
AWSユーザ作成
前回と同様にVaultにAWSユーザを作成させます。
$ curl \
--header "X-Vault-Token: $VAULT_TOKEN" \
$VAULT_ADDR/v1/aws/creds/deploy
{
"request_id": "15e22c37-ff2f-2277-6bc5-0834f4dd4eba",
"lease_id": "aws/creds/deploy/f822cb89-98d6-0cd5-05e7-69020bda05b9",
"renewable": true,
"lease_duration": 1800,
"data": {
"access_key": "AKIAIGFBKDIZ6VU7UOUA",
"secret_key": "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",
"security_token": null
},
"wrap_info": null,
"warnings": null,
"auth": null
}
前回と同様にAWSユーザの有効期限(TTL)は30分間です。
- "issue_time" : "2017-10-08T18:34:39.368521987+09:00"
- "expire_time": "2017-10-08T19:04:39.368522185+09:00"
$ curl \
--header "X-Vault-Token: $VAULT_TOKEN" \
--request PUT \
--data '{ "lease_id": "aws/creds/deploy/f822cb89-98d6-0cd5-05e7-69020bda05b9" }' \
$VAULT_ADDR/v1/sys/leases/lookup
{
"request_id": "f1848a4a-7f3f-8e0c-90cf-7024dd242c35",
"lease_id": "",
"renewable": false,
"lease_duration": 0,
"data": {
"expire_time": "2017-10-08T19:04:39.368522185+09:00",
"id": "aws/creds/deploy/f822cb89-98d6-0cd5-05e7-69020bda05b9",
"issue_time": "2017-10-08T18:34:39.368521987+09:00",
"last_renewal": null,
"renewable": true,
"ttl": 1753
},
"wrap_info": null,
"warnings": null,
"auth": null
}
有効期限(TTL)の延長
Lease機能を利用してAWSユーザの有効期限(TTL)を3600秒(30分)延長させます。
$ curl \
--header "X-Vault-Token: $VAULT_TOKEN" \
--request PUT \
--data '{ "lease_id": "aws/creds/deploy/28def48b-c990-d1d4-1691-610a8f2be0e9", "increment": 3600 }' \
$VAULT_ADDR/v1/sys/leases/renew
{
"request_id": "86f059ec-1680-c886-2ade-3e15635ed38e",
"lease_id": "aws/creds/deploy/28def48b-c990-d1d4-1691-610a8f2be0e9",
"renewable": true,
"lease_duration": 3600,
"data": null,
"wrap_info": null,
"warnings": null,
"auth": null
}
Lease設定を確認するとexpire_time
が更新されてます。
issue_time
から+3600秒(30分)されるわけではなく、延長(renew)コマンドを実行した時点(last_renewal
)から3600秒(30分)延長されるようです。
延長前
- "issue_time" : "2017-10-08T18:34:39.368521987+09:00"
- "expire_time": "2017-10-08T19:04:39.368522185+09:00"
延長後
- "issue_time" : "2017-10-08T18:27:57.65077363+09:00"
- "last_renewal": "2017-10-08T18:35:52.918241764+09:00"
- "expire_time" : "2017-10-08T19:35:52.918241648+09:00"
$ curl \
--header "X-Vault-Token: $VAULT_TOKEN" \
--request PUT \
--data '{ "lease_id": "aws/creds/deploy/28def48b-c990-d1d4-1691-610a8f2be0e9" }' \
$VAULT_ADDR/v1/sys/leases/lookup
{
"request_id": "f8e035a6-a72b-395a-aca0-641ed7c747ce",
"lease_id": "",
"renewable": false,
"lease_duration": 0,
"data": {
"expire_time": "2017-10-08T19:35:52.918241648+09:00",
"id": "aws/creds/deploy/28def48b-c990-d1d4-1691-610a8f2be0e9",
"issue_time": "2017-10-08T18:27:57.65077363+09:00",
"last_renewal": "2017-10-08T18:35:52.918241764+09:00",
"renewable": true,
"ttl": 3556
},
"wrap_info": null,
"warnings": null,
"auth": null
}
有効期限(TTL)の最大値を確認
lease_max
を12h
に設定していたので12時間を超える有効期限(TTL)は設定できなくなっています。
有効期限(TTL)を 43200秒(1日)延長(renew)させても、expire_time
がissue_time
の12時間後となっており、lease_max
を超えた有効期限(TTL)が設定できないことがわかります。
- "issue_time" : "2017-10-08T18:27:57.65077363+09:00"
- "last_renewal": "2017-10-08T18:38:06.850822545+09:00"
- "expire_time" : "2017-10-09T06:27:57.650782301+09:00"
$ curl \
--header "X-Vault-Token: $VAULT_TOKEN" \
--request PUT \
--data '{ "lease_id": "aws/creds/deploy/28def48b-c990-d1d4-1691-610a8f2be0e9", "increment": 43200 }' \
$VAULT_ADDR/v1/sys/leases/renew
{
"request_id": "9ed0ca65-18ee-2186-689a-1569f4f9e058",
"lease_id": "aws/creds/deploy/28def48b-c990-d1d4-1691-610a8f2be0e9",
"renewable": true,
"lease_duration": 42590,
"data": null,
"wrap_info": null,
"warnings": null,
"auth": null
}
$ curl \
--header "X-Vault-Token: $VAULT_TOKEN" \
--request PUT \
--data '{ "lease_id": "aws/creds/deploy/28def48b-c990-d1d4-1691-610a8f2be0e9" }' \
$VAULT_ADDR/v1/sys/leases/lookup
{
"request_id": "00d1c93f-431d-61f0-a116-b5d8a57af815",
"lease_id": "",
"renewable": false,
"lease_duration": 0,
"data": {
"expire_time": "2017-10-09T06:27:57.650782301+09:00",
"id": "aws/creds/deploy/28def48b-c990-d1d4-1691-610a8f2be0e9",
"issue_time": "2017-10-08T18:27:57.65077363+09:00",
"last_renewal": "2017-10-08T18:38:06.850822545+09:00",
"renewable": true,
"ttl": 42560
},
"wrap_info": null,
"warnings": null,
"auth": null
}