Plan 9とGo言語のブログ

主にPlan 9やGo言語の日々気づいたことを書きます。

plan9portのsecstoreを秘密のメモとして使う

この記事は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を使うに書きました。launchdsecstoredを起動させるところまで設定しましょう。

そのあとで、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
"

このリポジトリは、内容は暗号化されているとはいっても、プライベートに設定しておくのが無難でしょう。

類似ツール