ちょっと話題の記事

1Passwordとtmuxで、ひたすら楽してMFA入力してみた

2019.04.02

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

はじめに

AWSのサービスを頻繁に使うようになり、MFAの入力が煩わしくなってきました。 もちろんセキュリティのためなのはわかりますが、 試行錯誤しているときに5秒前に聞かれたものをまた聞かれるのは面倒。。。 MFAを切ったり別の認証方法にしたりなどのやり方もありますが、 それができないこともあるかと思います。

ということで、ターミナルでワンタイムパスワードを聞かれた時に、 できるだけラクして入力する手段を力技で作ってみました。

下準備

私はAWSのMFAを1passwordに紐づけています。 この方法については以下の記事を参考にして下さい。

1Password で2要素認証のワンタイムパスワードを管理する

そして、1password CLIを使ってターミナル内でMFAを取得するやり方は以下の記事を参考にして下さい。

1Password CLIを使ってワンタイムパスワードをターミナル上に表示する

tmuxでキー入力に落とし込む

1passwordを使ってワンタイムパスワードを標準出力に出すことができましたので、 あとはこれをキー入力にまで持っていければ非常にスマートです。

私はターミナルでは常にtmuxを使っているので、 ペインにキー入力を送り込む機能send-keysを使って実現しました。

全体の構成

tmuxでは設定した特定のキーを入力することで、任意のコマンドを実行できます。 なので、以下のような内容のスクリプトを実行させます。

  1. tmuxのターゲットペインを受け取る
  2. 1passwordから現在のワンタイムパスワードを受け取る
  3. ワンタイムパスワードをターゲットペインにsend-keysする

色々調べてみましたが、send-keysは決まった文字列しか送れないようなので、 送る文字列(ワンタイムパスワード)を求めるプログラムの最後で ターゲットとなるペインを指定してsend-keysしています。

スクリプト

要点となるシェルスクリプトは以下のようになります。

readonly PANE_ID=$1
pass=$(OP_SESSION_xxxx=$(cat ~/.1password) op get totp yyyy)
tmux send-keys -t ${PANE_ID} "${pass}" C-m
  • xxxxは1passwordのアカウント名
  • yyyyは1password内でMFAを紐付けたサービス名
  • ~/.1passwordのような認証情報を書き出しておくファイルを利用します

最後のC-mはエンターで、パスワードを貼り付けるだけでなく、実行までやっています。

1passwordの認証情報

1password CLIの認証情報は通常そのプロセスの環境変数に設定されます。 しかしtmuxから呼び出されたプロセスはその環境変数を引き継げない (プロセスはtmuxからforkされるので、個々のペインの環境変数は引き継げない) ので、認証情報はファイルに書き出すようにしています。 このファイルを読むことでしばらくは継続的に1passwordを使うことができます。

一定時間が経過し、1passwordの認証情報を更新する必要がある場合は以下のようなコマンドを実行します。

op signin xxxx --output=raw > ~/.1password

ただ、実際は「認証きれてないかな?」と考えながら実行したりするのは面倒なので、 最終的なスクリプトでは、認証がきれていたら自動的に上記コマンドを実行するようにしています。 (もちろんパスワードの入力は必要です)

キーバインドの設定

最後にtmuxでのキーバインド設定です。 下記設定を.tmux.confに書きます。 今回はとりあえず雑に<prefix> + aで起動するようにしました。

bind a run-shell 'bash <作成したスクリプト> #{pane_id}'

#{pane_id}はtmuxの設定に書ける特殊な変数で、現在のペインのIDに展開されます。 書き換える必要はなく、そのまま記述すればOKです。

配布場所

以下の場所に少しまとめたスクリプトを置いています。

https://github.com/cm-hirano-shigetoshi/mfa-with-1password

こちらのスクリプトでは1passwordの認証が必要になったらそれを入力するペインが開くようになっていますので、 認証が通る状態か確認する必要がないようにしています。

おわりに

1passwordのCLIでワンタイムパスワードを取得できる機能とtmuxでペインにキー入力を送り込む機能を合わせることで、 2ストロークでMFA入力できるようにできました。

MFAを聞かれたらキーボードで<prefix> + aを押す。 もし1passwordの認証が切れていたら、その場で聞かれるのでパスワードを入力する。 というように、思考を阻害しないような流れにすることができ、なかなか実用性があります。 1passwordからワンタイムパスワードを取得するところで少し時間がかかります(2秒くらい)が、 待っているだけなので特に不満はない感じですね。

MFAを切れないけどラクに入力したいという方はお試し頂ければと思います。