Credentialsを含む環境変数を1passwordで管理しdirenvでディレクトリごとに読み込む方法

Credentialsを含む環境変数を1passwordで管理しdirenvでディレクトリごとに読み込む方法

はじめに

開発環境では、APIキーやなどのCredentialsを環境変数として扱うことが一般的です。この管理方法は簡潔で便利ですが、下記の問題があります。

  • Credentialを共有するときにメールやSlackのDMで送付する必要がある
  • PCに侵入された場合に攻撃者が容易にcredentialを奪取できる
  • 間違えてgitにコミットしてしまう

そこで、1passwordとdirenvを組み合わせて、ディレクトリごとに必要な環境変数をロードしてCredentialsを安全に管理できるようにします。

Credentialsを保持している1passwordのvaultがチームメンバーと共有されていれば、Slackなどでやり取りする必要がなくなり安全性が高まります。

実装方法

前提条件

1password cliとdirenvがインストールされ、セットアップされている必要があります。

設定手順

  1. 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アプリケーションから設定しても問題ありません。

  1. 対象のプロジェクトディレクトリに .envrc ファイルを作成します
touch .envrc
  1. 以下のスクリプトを .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: 取得したい環境変数のキー名の配列

これらの値は自分の環境に適したものを設定してください。

  1. direnv allow コマンドを実行して、このディレクトリでの環境変数の自動読み込みを許可します。

実行すると下記のようにログインリクエストが表示されるので、許可操作を行うと環境変数にロードされます。

1Passwordのアクセス要求画面

特にエラーが出なければ成功です。

プロジェクトディレクトリに移動した時にロードに時間がかかるようになってしまいますが、安全の方が大切なので諦めましょう。

この記事をシェア

弊社では、一緒に会社を面白くしてくれる仲間を募集しています。
お気軽にお問い合わせください!