Help us understand the problem. What is going on with this article?

Azure Key Vault を利用した .env 内の機密情報の管理

.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 に対するアクセスコントロールを適切に行えていれば)機密情報が漏洩してしまうリスクを低減できます。

参考リンク

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした