Credentialsを含む環境変数を1passwordで管理しdirenvでディレクトリごとに読み込む方法
2025年 03月 29日 土曜日
Credentialsを含む環境変数を1passwordで管理しdirenvでディレクトリごとに読み込む方法
はじめに
開発環境では、APIキーやなどのCredentialsを環境変数として扱うことが一般的です。この管理方法は簡潔で便利ですが、下記の問題があります。
- Credentialを共有するときにメールやSlackのDMで送付する必要がある
- PCに侵入された場合に攻撃者が容易にcredentialを奪取できる
- 間違えてgitにコミットしてしまう
そこで、1passwordとdirenvを組み合わせて、ディレクトリごとに必要な環境変数をロードしてCredentialsを安全に管理できるようにします。
Credentialsを保持している1passwordのvaultがチームメンバーと共有されていれば、Slackなどでやり取りする必要がなくなり安全性が高まります。
実装方法
前提条件
1password cliとdirenvがインストールされ、セットアップされている必要があります。
設定手順
- 1Password側にCredentialsを記録します。コマンドラインから行う場合は以下のコマンドを実行します:
$ op item create --category=login --vault=vault-name --title='item-name'
$ op item edit --vault=vault-name item-name CREDENTIAL_KEY_1="credential1"
1PasswordのGUIアプリケーションから設定しても問題ありません。
- 対象のプロジェクトディレクトリに
.envrc
ファイルを作成します
touch .envrc
- 以下のスクリプトを
.envrc
に記述します
#!/usr/bin/env bash
export LANG=ja_JP.UTF-8
export LC_ALL=ja_JP.UTF-8
if ! command -v jq >/dev/null 2>&1; then
echo "ERROR: 'jq' not found. Please install jq and retry."
exit 1
fi
trap 'echo "Execution was canceled by the user." >&2; exit 1' INT
echo "Loading environment variables from 1Password..."
eval "$(op signin --account your-account-name.1password.com)" || exit 1
ITEM_NAME="your-item-name"
VAULT_NAME="your-vault-name"
ENV_VARS=("YOUR_ENV_VAR_1" "YOUR_ENV_VAR_2" "YOUR_ENV_VAR_3")
ITEM_JSON="$(op item get "$ITEM_NAME" --vault "$VAULT_NAME" --format json)"
if [ $? -ne 0 ] || [ -z "$ITEM_JSON" ]; then
echo "Error: Failed to get item $ITEM_NAME from vault $VAULT_NAME."
exit 1
fi
for VAR_NAME in "${ENV_VARS[@]}"; do
VALUE="$(echo "$ITEM_JSON" | jq -r --arg var "$VAR_NAME" '.fields[] | select(.label == $var).value')"
if [ -n "$VALUE" ]; then
export "$VAR_NAME"="$VALUE"
else
unset "$VAR_NAME"
echo "Warning: $VAR_NAME could not be retrieved."
fi
done
ITEM_NAME
: 1Password内の項目名(APIキーなどを保存している項目)VAULT_NAME
: 1Password内のVault名ENV_VARS
: 取得したい環境変数のキー名の配列
これらの値は自分の環境に適したものを設定してください。
direnv allow
コマンドを実行して、このディレクトリでの環境変数の自動読み込みを許可します。
実行すると下記のようにログインリクエストが表示されるので、許可操作を行うと環境変数にロードされます。
特にエラーが出なければ成功です。
プロジェクトディレクトリに移動した時にロードに時間がかかるようになってしまいますが、安全の方が大切なので諦めましょう。
この記事をシェア