1Password CLIのログイン操作でSecretKey等をhistoryへ残さない様にしてやってみる

1Password-CLIを使う際に、SecretKeyやMasterPasswordがhistoryに残ってしまう事を避けるために調査して試してみた結果をまとめてみました。正直酔狂な領域だと思います。でも、割と便利です。
2018.11.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1Passwordはログイン情報、特にパスワードの安全管理において頼り甲斐のあるアプリケーションです。ただ、実際のログイン操作で若干手間を感じることもあります。

1Passwordには公式のCommandLine Toolが存在しており、うまく使う事でターミナルから素早く認証コードを取得することもできます。

1Password command-line tool: Getting started

ですが、historyの設定次第ではSecret KeyとMaster Passwordの入力がログに残っていたりします。macOS上でhistoryの設定に関して弄らずに、1Password-CLIログイン操作後Secret KeyとMaster Passwordがhistoryへ残らないようにする方法についてまとめてみました。

目次

1Password-CLIのインストール

今回はHomeBrew経由でのインストールにしました。

% brew cask install 1password-cli
% brew install gpg

パスワードを直接入力せずにログインセッションを生成する

こちらの記事を参考にしつつ操作していきます。

via: Kanasansoft Web Lab. 環境変数にIDやPASSWORDを設定しなければならない状況で、ID/PASSWORDをファイルに平文で保存したりシェルの履歴に残したくない

暗号化用関数の設定

参考サイトより、secenv関数を.zshrc辺りに追加します。

secenv()
{
    file=~/.secret_environment_value
    if [ $# -eq 0 ]; then
    `gpg <$file`
    fi
    if [ $# -eq 1 ]; then
    `gpg -c --output $file $1`
    fi
}

キーとパスワードの暗号化

1password-CLIのログインには以下の要素が必要となります。

  • Login Domain
  • Mail Address
  • Secret Key
  • Master Password

これらの情報をテキストデータへ入力し、それを暗号化していきます。

% vim env.txt
export login_domain=my.1password.com
export mail_address=xxxxx@xxxxxx.zzz
export secret_key=XXXX-XXXX-XXXX-XXXX
export master_password=xxxxxxxxxxxxxx

% secenv env.txt

secenv env.txtを入力した際に暗号化のパスワードを求められますが、環境によっては盛大に文字化けします。

ですが、カーソルはパスワード入力欄にフォーカスされているため、そのまま入力してEnterを押します。確認のダイアログも同じく操作します。

以下の出力が表示されたことを確認できたら、env.txtを削除します。

gpg: *警告*: コマンドが指定されていません。なにを意味しているのか当ててみます ...
gpg: AES暗号化済みデータ
gpg: 1 個のパスフレーズで暗号化

1Password-CLIへのログイン

暗号化した環境変数を読み込みます。暗号化時のパスワードが求められます。

% secenv

次にMasterPasswordをクリップボードへコピーします。

% echo $master_password | pbcopy

最後に、ログインコマンドを入力します。

% op signin $login_domain $mail_address $secret_key
Enter the password for xxxxx@xxxxxx.zzz at my.1password.com:
# Command-Vでクリップボードの中身を貼り付けます。

export OP_SESSION_my="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
# This command is meant to be used with your shell's eval function.
# Run 'eval $(op signin my)' to sign into your 1Password account.
# If you wish to use the session token itself, pass the --output=raw flag value.

あとは1Password-CLIの各種操作となります。

まとめ

1Password-CLIを知ったものの、平文でhistoryにKey類が残る状態となることを知り、それらを回避するために始めた内容でした。ただ、正直「そこまでする価値はあるのか」という思いも頭によぎりました。

ですが、実際に一通りこなしてみると、ワンタイムパスワードの自動生成等の比較的CLIに頼りたくなる場面にて大きな効果が出てきます。パイプラインでの利用等、応用の幅はあると思いますので、気になる方は試してみてはいかがでしょうか。