Vault CLIとVault UIの対応

## 1. はじめに

[Agent Injectorの動作確認](https://qiita.com/n4k4y05h1/items/a03ede2de60ccd888e9a)や[VSOの動作確認](https://qiita.com/n4k4y05h1/items/a17405f6afe00d342305)時に、Vault CLIを使用してSecret情報の登録を実施したが、同様の設定をVault UIで実施するとどのようになるか確認したのでその手順を記載する。

## 2. Vault UI

- https://developer.hashicorp.com/vault/docs/ui


## 3. 事前準備

### 3.1. k8s clusterの構築

```bash: コマンド
$ minikube start
$ alias kubectl="minikube kubectl --"
```

:::note info
動作確認にk8s(minikube)を使用したため、環境がない場合は下記を参考に構築しておく。

https://qiita.com/n4k4y05h1/items/abff8c110e500ae47437
:::

### 3.2. Vaultの構築

```bash: コマンド
$ helm repo add hashicorp https://helm.releases.hashicorp.com
$ helm repo update
$ helm search repo hashicorp/vault
$ helm install vault hashicorp/vault -n vault --create-namespace
```

### 3.3. Portforward設定

Vault UIにアクセスできるようにport forwardする。

```bash: コマンド
(ubuntu)$ kubectl port-forward service/vault -n vault 8200:8200
```


:::note info
Vaultのドキュメントに、Vault UIのアクセスに関して記載があり、デフォルトではアクセスできないとのこと。port-forwardを使うか、uiパラメーター(ui.enabled, ui.serviceTypeなど)を設定する必要があり、今回はPortforwardを使用した。

- https://developer.hashicorp.com/vault/docs/platform/k8s/helm/run#view-the-vault-ui

> #### View the Vault UI
> 
> The Vault UI is enabled but NOT exposed as service for security reasons. The Vault UI can also be exposed via port-forwarding or through a ui configuration value.
> 
> Expose the Vault UI with port-forwarding:
> 
> ```bash
> $ kubectl port-forward vault-0 8200:8200
> Forwarding from 127.0.0.1:8200 -> 8200
> Forwarding from [::1]:8200 -> 8200
> #...
> ```
:::

Windows PCのブラウザからVault UIの操作を行ったため、以下の手順を実施した。

1. Windows PCのTerminalでSSH portforwardingを実施(橙)
1. Ubuntu Serverでkubectl port-forwardの実施(緑)
1. ブラウザからlocalhostにアクセスする(青)

![vault.gui.portfoward3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/2300ff23-2375-e3cf-3152-44af76c58907.png)

## 4. Vault UI操作

### 4.1. init

Vault UIで初期化を実施する。対応するVault CLIコマンドは下記。

```bash: コマンド
$ kubectl exec -it vault-0 -n vault -- vault operator init
```

1. Windows PC上でブラウザを開き、`http://localhost:8200`にアクセスする
2. 初期化画面が表示されるため、Keyの作成数と閾値(Unsealの回数)を入力し、「Initialize」をクリックする
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/e6859072-e390-e5cd-9eb9-530bd723e2b6.png)

2. initial root tokenとunseal keyが生成されるので、「Continue to Unseal」をクリックする

    ![020240512_145950.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/7bb70707-9f0a-0a2c-dd8a-f8c893c5e13e.png)

:::note info
「Download keys」をクリックすると、下記のようなファイルがDLできる。

```json: vault-cluster-vault-2024-05-12T06_08_23.011Z.json
{
  "keys": [
    "5da9bc7edb87090d2bdab3bbd27c828d15a52ba2145f9b998e18185ac7415c7c7a",
    "adf557602e675e0b922407fc6664cb54b23b1af333deb3a74a29eb3ebda79a111d",
    "9fb931f43dfb9cb67d2ea0a5f6b8ea3834666ca9d3b76f8e8ec14a710e9d9a9ff9",
    "1db0d530935693d01f64985a32d1d11bd53cf31cc7b775aa3dacf7d8e5666052e6",
    "b0ef7d310a0e2badd2eba7ee22c0c2f80154aacadbd92548481a6ce9ea619fd7b1"
  ],
  "keys_base64": [
    "Xam8ftuHCQ0r2rO70nyCjRWlK6IUX5uZjhgYWsdBXHx6",
    "rfVXYC5nXguSJAf8ZmTLVLI7GvMz3rOnSinrPr2nmhEd",
    "n7kx9D37nLZ9LqCl9rjqODRmbKnTt2+OjsFKcQ6dmp/5",
    "HbDVMJNWk9AfZJhaMtHRG9U88xzHt3WqPaz32OVmYFLm",
    "sO99MQoOK63S66fuIsDC+AFUqsrb2SVISBps6ephn9ex"
  ],
  "root_token": "hvs.zPrYGLanjg5bh81svCNDskMh"
}
```
:::

### 4.2. Unseal

Vault UIでUnsealを実施する。対応するVault CLIコマンドは下記。

```bash: コマンド
$ kubectl exec -it vault-0 -n vault -- vault operator unseal
```

1. キー生成画面で「Continue to Unseal」をクリックすると、Unseal画面が表示される
2. 生成したkeyを入力し、「Unseal」をクリックする
    キー生成時に閾値で指定した回数、実行する

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/cc704b0b-43d4-260d-d704-069995b3a9aa.png)

### 3.4. Login

Vault UIでLoginを実施する。対応するVault CLIコマンドは下記。

```bash: コマンド
$ kubectl exec -it vault-0 -n vault -- /bin/sh
(vault)$ vault login
```

1. Unsealが完了すると、ログイン画面が表示される
2. キー生成時に作成したInitial Root Tokenを入力し、「Sign in」をクリックする

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/1069e7da-b880-f78c-5e8f-4a02e4cadae3.png)

3. ログインに成功すると、Vault UIの管理画面が表示される

    ![020240512_034944.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/99acfc7d-0f46-1d2a-a791-55b3be102442.png)

### 4.3. Secret登録

Vault UIでSecretを登録する。対応するVault CLIコマンドは下記。

```bash: コマンド
(vault)$ vault secrets enable -path=app-secret kv-v2
(vault)$ vault kv put app-secret/kv-secret SECRET_KEY1="aaaa" SECRET_KEY2="bbbb"
(vault)$ vault kv list app-secret/
(vault)$ vault kv get app-secret/kv-secret
```

1. 左カラムの「Secrets Engine」をクリックすると、Secrets Engine画面が表示されるので、「Enable new engine」をクリックする。
    ![020240512_035007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/338e7492-8997-d879-257a-9044f2397843.png)

2. 「KV」をクリックする。
    ![020240512_035027.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/c7fe1549-7bb4-6752-ab5d-89c99e46edf4.png)

3. 「Path」を入力し、「Enable engine」をクリックする。
    ![020240512_035056.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/2e7310e1-be2e-e463-75b2-24fc7a854147.png)

4. 「Create secret」をクリックする。
    ![020240512_035112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/d003b4a7-b370-9685-cbea-c544521e33fd.png)

5. 「Path for this secret」と「Secret data」を入力し、「Save」をクリックする。
    ![020240512_035226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/48cfeeb6-f38b-fcaa-6e4b-54886fa63bbc.png)

6. Secretが登録されていることを確認する。
    ![020240512_035243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/b67415c0-f22d-a6ab-60af-a5e3e37d8507.png)


### 4.3. Policy設定

Vault UIでPolicyを設定する。対応するVault CLIコマンドは下記。

```bash: コマンド
(vault)$ vault policy write app-secret-all-read-policy - <<EOF
path "app-secret/data/kv-secret" {
  capabilities = ["read"]
}
EOF
```

1. 左カラムの「Policies」をクリックする

    ![020240512_035350.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/3c8a72ea-9035-ec38-c6d2-e39a42956092.png)

2. 「Create ACL policy」をクリックする

    ![020240512_035406.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/e815bf67-f424-09b7-ced4-51989792b1dc.png)

3. 「Name」と「Policy」を入力し、「Generate policy」をクリックする

    ![020240512_035438.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/3291da11-41fe-13d3-39cd-5e3a14602542.png)

4. Policyが登録されていることを確認する

    ![020240512_035456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/e41326d1-b53d-e2f1-77e6-1cefc11a4901.png)


### 4.5. Auth Method設定

Vault UIでAuth methodとPolicyを設定する。対応するVault CLIコマンドは下記。

#### 4.5.1. kubernetes auth method作成

```bash
(vault)$ vault auth enable --path=kubernetes kubernetes
(vault)$ vault write auth/kubernetes/config kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443"
```

1. 左カラムの「Access」をクリックする

    ![020240512_035530.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/b5130c2d-37f2-8bce-534b-23ca028a5f63.png)

2. Authentication Mehtods画面が表示されるので、「Enable new method」をクリックする

    ![020240512_035549.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/0a60db28-6526-6801-0c2e-02f272e494da.png)

3. 「Kubernetest」をクリックする

    ![020240512_035603.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/72fafcc4-8b94-7c85-31de-79be07ecc62d.png)

4. 「Path」を入力し、「Enable method」をクリックする

    ![020240512_035700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/b02f8a46-3c40-cc27-ab9e-38efec462458.png)

5. 「Kubernetes host」を入力し、「Save」をクリックする

    ![020240512_212616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/6e7e8e9b-dba7-cd05-f2d2-7472a3fdf9fc.png)

:::note warn
Vault CLIで指定している環境変数をVault UIから設定してもうまく動かなかったため、echoでIPを確認する
```bash: コマンド
ubuntu@ubuntu:~$ kubectl exec -it vault-0 -n vault -- /bin/sh
/ $ echo $KUBERNETES_PORT_443_TCP_ADDR
10.96.0.1
/ $ 
```
:::


#### 4.5.2. role作成

```bash
(vault)$ vault write auth/kubernetes/role/app-role \
  bound_service_account_names=app-sa \
  bound_service_account_namespaces=app-ns \
  policies=app-secret-all-read-policy \
  ttl=24h
```

1. Authentication Methods画面から、作成したAuth methodをクリックする

    ![020240512_035800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/720611bc-e218-6dc2-ccc5-69b5c3ba40f5.png)

2. 「Create role」をクリックする

    ![020240512_035830.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/093a444c-9f81-1869-c102-ea5b66759419.png)

3. 必要事項を入力し「Save」をクリックする
    - Name
    - service account
    - sarvice accountのnamespace
    - Policy
    - TTL
    ![020240512_040007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/7c32d6db-a526-8638-5e43-59c79b394683.png)

    > PolicyとTTL設定
    > 
    > Tokensをクリックすると入力フォームがでてくるため、入力する。
    > 
    > ![020240512_203824.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/bf2cad8b-15c9-006c-e829-99f88c4e034e.png)


4. roleが作成されたことを確認する

    ![020240512_040039.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3692186/48d0be0f-d13b-23d1-6d9a-77f7f31f4593.png)