.env と機密情報
Laravel を利用したプロジェクトは通常 .env
を使って環境変数を管理しています。.env
には各種認証情報などを含めることもあると思いますが、それらは Git などのバージョン管理システムに平文で保存するべきではありません。
かと言って、どこにも管理されておらず稼動している環境に置いてあるだけの状態というのも心許無さがあります。
そこで Azure Key Vault (和名:キー コンテナー)のシークレットと、Go で書いた簡素な vaultenv というツールで、 .env
に直接機密情報を記述することなく管理できるようにしました。以下では Azure VM を利用していることを前提に、例を紹介します。
Azure Key Vault の準備
- まずは Key Vault を作成します。(ここでは Azure CLI を使った例で説明します)
az keyvault create --location japaneast --name <YourKeyVaultName> --resource-group <YourResourceGroupName>
- 開発者のグループやユーザーに
セット
(set)と一覧取得
(list)の権限を付与します。格納されているデータは取得できないようにします。
az keyvault set-policy --resource-group <YourResourceGroupName> --name <YourKeyVaultName> --secret-permissions set list --object-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
- シークレットを復元したいデプロイ用途などの VM に対して、
取得
の権限を付与します。
az vm identity assign --name <NameOfYourVirtualMachine> --resource-group <YourResourceGroupName>
{
"systemAssignedIdentity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"userAssignedIdentities": {}
}
az keyvault set-policy --name <YourKeyVaultName> --object-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx --secret-permissions get
Key Vault へ機密情報の格納
- 機密情報を Key Vault のシークレットに保存します。
$ az keyvault secret set --vault-name <YourKeyVaultName> -n example-password --value "naisho"
{
"attributes": {
"created": "2019-12-13T03:41:15+00:00",
"enabled": true,
"expires": null,
"notBefore": null,
"recoveryLevel": "Purgeable",
"updated": "2019-12-13T03:41:15+00:00"
},
"contentType": null,
"id": "https://<YourKeyVaultName>.vault.azure.net/secrets/example-password/97a8cfac350c4b67b1f3510b1598cdce",
"kid": null,
"managed": null,
"tags": {
"file-encoding": "utf-8"
},
"value": "naisho"
}
- 登録時に出力された id を
{{ kv < id > }}
の形式で任意のテキストファイルに埋め込みます。example-password 以下(/97a8c...
) も含めるとバージョンを固定することができます。含めない場合は最新の値を取得します。
.env.template
USER=user1
PASSWORD={{ kv "https://<YourKeyVaultName>.vault.azure.net/secrets/example-password" }}
.env への展開
- シークレットの取得を許可した VM 上で行います。上記のファイルを vaultenv を通すことにより
{{ kv < id > }}
で記述された部分が Key Vault に保存したデータに置換されます。実際にはデプロイ時に自動実行されるスクリプト内で行っています。
$ go get github.com/sensyn-robotics/vaultenv
$ vaultenv < .env.template > .env
$ cat .env
USER=user1
PASSWORD=naisho
まとめ
Key Vault のアクセスポリシーを設定するすることにより、開発者自身のアカウントでは保存されたデータを参照せずに、登録のみが行えるようにすることができます。さらに、データの取得権限を特定の VM に限定することで、(VM に対するアクセスコントロールを適切に行えていれば)機密情報が漏洩してしまうリスクを低減できます。