この記事はQiitaで公開されていました
Plan 9 from User Spaceのsecstore
を使って秘密メモの扱いを便利にしました。
- コマンドから秘密メモを扱いやすくなった
- ある程度安全に秘密メモをGit管理できるようになった
- 毎回パスワードを入れなくてもよくなった
動機
普段、業務を行なっていると、例えばアクセストークンや秘密鍵のパスフレーズなど、パスワードに限らず色々な機密情報を扱うことがあります。これまではKeychain Access.appの秘密メモを使っていましたが、以下の点に不満がありました。
1つのファイルに複数メモが入っているので変更を追いづらい
Keychain Accessは、~/Library/Keychains/以下に、1つのKeychainあたり1つの*.keychain (Sierraからは.keychain-db)ファイルが作られているので、他のマシンに持って行ったりバックアップを取得したりするには都合が良いのですが、2つのバージョンどちらに必要なメモが入っていたのかを調べるのがとても大変です。
この場合、それぞれの*.keychainファイルをKeychain Accessの管理に入れて、内容を調べる必要があります。
GUIでの利用が前提になる
security
コマンドで、ある程度の操作は行えますが、「ちょっとメモを探す」ために使うのは難しそうです。(security dump-keychain
を加工するしかなさそう)
ちょっと確認するために、Keychain Accessを開いて、メモを探して、パスワードを入力して、という手順を毎回行うのはめんどくさいですね。
secstoreを使う
secstore
はテキストファイルを暗号化して保存するためのサービスと、それを扱うコマンドです。Plan 9 from User Spaceの一部として配布されています。
Plan 9 from User Spaceのインストールは、自前の記事ですがPlan 9 from User Spaceを使うに書きました。launchd
でsecstored
を起動させるところまで設定しましょう。
そのあとで、secuser
を使ってユーザを作成してください。
$ secuser -v $USER
成功すると、\$PLAN9/secstore/who/\$USERというファイルが作られます。
secstoreへ書く
secstore
に-p
オプションを与えると、引数で渡したファイル名そのままの名前で、secstored
にエントリが追加されます。同じファイルが存在した場合は上書きされます。
$ echo hello >memo $ secstore -p memo
このファイルは、secstored
によって暗号化されて、\$PLAN9/secstore/store/\$USER/以下に保存されます。
secstoreから読む
読む場合は2通りの方法があります。保存されているファイル名そのままカレントディレクトリに出力するには、-g
オプションを使います。標準出力に内容を出力する場合は-G
を使います。
$ secstore -G memo hello $ rm -f memo $ secstore -g memo $ cat memo hello
保存しているファイルリストを取得する
-g
または-G
オプションに与えるファイル名が.
の場合、保存されているファイルのリストを出力します。
$ secstore -G . memo 38 Jun 1 09:29:52 JST 2017 j+J2ybyBzP5UzBbt9h/DkwPRDSk=
その他の操作
secstored
からエントリを削除する場合は-r
オプションを与えます。また、保存しているメモのパスワードを変更したい場合は-c
オプションです。これらの詳細はman secstore
してください。
少し便利にする
secstoreパスワードを何度も入力したくない
secstore
は、-i
オプションを与えると、パスワードを標準入力から読むようになります。これを使って、secstore
のパスワードをsecstoreという名前でKeychain Accessに保存しておき、security
コマンドで取り出しましょう。
#!/usr/bin/env bash security find-generic-password -a $USER -l secstore -w | $PLAN9/bin/secstore -i "$@"
バックアップをGitで行いたい
標準のインストール先は/usr/local/plan9なので、secstoreのディレクトリも普通はrootのファイルです。この部分だけを外に出すことができないので、以下のようなスクリプトを使って強引に対応しました。
#!/usr/bin/env bash sudo bash -c " cd $PLAN9/secstore if [[ ! -d .git ]] then git init git remote add origin git@repo.example.local:$USER/secstore.git fi if [[ -z \$(git status -s) ]] then exit 0 fi git add -A git commit -m \"$(date +'%Y-%m-%d %H:%M:%S')\" export GIT_SSH_COMMAND='ssh -o StrictHostKeyChecking=no -i $HOME/.ssh/id_rsa' git push -u origin master "
このリポジトリは、内容は暗号化されているとはいっても、プライベートに設定しておくのが無難でしょう。