Azure KeyVaultのチュートリアル

このチュートリアルをやったのでメモ

https://docs.microsoft.com/ja-jp/azure/key-vault/tutorial-python-linux-virtual-machine

# 動機

idとpasswordをコード上に直書きしたくないんだけどどうすればいいのか。
azureにはkeyvaultというサービスがあり、これに問い合わせるとkeyに対応するvalueを返してくれる。
しかし、keyvaultにアクセスするにはkeyvaultのidとpasswordが必要になって、このidとpassはどこに保存するの？という堂々巡りになってしまう。
これを解決するために system assigned identity を使う。keyvaultに対するアクセスが許可されたidentityを割り当てられたvmは無条件にkeyvaultにアクセスできる。
逆に言うとvmに不正アクセスされてしまうとidとパスがただ漏れだがそれはしょうがないって考えなのかな？

# 手順

詳しいことはリンクのチュートリアルを見てね。ここでは手順だけメモ。

## リソースグループの作成

ここではmyresourcegroupというリソースグループを作る。 チュートリアルが終わったときmyresourcegroupごとごっそり削除すればすべて一括で削除できる。

```
az group create --name "myresourcegroup" --location "West US"
```

## keyvaultの作成

ここではmyvaultというkeyvaultを作成する。

```
az keyvault create --name "mykeyvault" --resource-group "myresourcegroup" --location "West US"
```

azureポータルの all reources を見るとmykeyvaultが出来上がってるのが確認できる。

![keyvault.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233578/02d01ad8-143f-94ea-81f0-6045de90b188.png)

## keyvaultにkeyとvalueを登録する

さっき作ったmyvaultにmykeyとmyvalueを登録する。mykeyが何かのidでmyvalueが何かのpasswordのつもりで読んで。

```
az keyvault secret set --vault-name "mykeyvault" --name "mykey" --value "myvalue"
```

mykeyvaultのSecretsを見るとたしかに登録されている。

![スクリーンショット 2019-08-12 21.12.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233578/26d68409-c80d-dfb2-7474-edad92b819d9.png)

## vmを建てる

myVMというvｍを建てる

```
az vm create \
  --resource-group myresourcegroup \
  --name myVM \
  --image UbuntuLTS \
  --admin-username azureuser \
  --generate-ssh-keys
```

するとvm一式が出来上がっているのがportalから確認できる。

![vm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233578/892c40ee-bf2c-4d32-b34d-a7d93560b759.png)

## vmに system assigned identityを割り当てる

さっき立てたvｍのsistem assigned identityを有効にする。

```
az vm identity assign --name myVM --resource-group myresourcegroup
```

さっき立てたvmのidentityを見るとsystem assignedタブのStatus がONになり、ObjectIDが設定されている。

![スクリーンショット 2019-08-12 21.21.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233578/b0959329-d488-b8b6-f0dd-4b43625b658d.png)

## system assigned identityにkeyvaultのアクセス権をつける

さっき作ったvmのidentityにkeyvaultへのgetとlistの権限を付与する。

```
az keyvault set-policy --name 'mykeyvault' --object-id <vmのobject id> --secret-permissions get list
```

keyvaultのaccess policiesを見るとmyVMから２つの権限が割り振られているのがわかる。

![スクリーンショット 2019-08-12 21.32.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233578/c81a2acc-5307-3ccd-a3ae-40943a3cfad2.png)

以上、設定終わり

## vmの中からkeyvaultにアクセス

vmにssh接続する。

以下のpythonスクリプトを実行
keyvaultの名前mykeyvaultと読み取るkeyのmykeyは適当に読み替えてね。

```python
# importing the requests library
import requests

# Step 1: Fetch an access token from an MSI-enabled Azure resource      
# Note that the resource here is https://vault.azure.net for the public cloud, and api-version is 2018-02-01
MSI_ENDPOINT = "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net"
r = requests.get(MSI_ENDPOINT, headers = {"Metadata" : "true"})

# Extracting data in JSON format 
# This request gets an access token from Azure Active Directory by using the local MSI endpoint
data = r.json()

# Step 2: Pass the access token received from the previous HTTP GET call to the key vault
KeyVaultURL = "https://mykeyvault.vault.azure.net/secrets/mykey?api-version=2016-10-01"
kvSecret = requests.get(url = KeyVaultURL, headers = {"Authorization": "Bearer " + data["access_token"]})

print(kvSecret.json()["value"])
```
これで最初に設定したmykeyに対応するmyvalueの呼び出しに成功する。