Bitwarden Secrets CLI(docker)での認証
Bitwarden Secrets CLI(docker)を使って、なるべくアクセストークンを露出させずに認証する試み
Bitwarden Secrest(以下、BWS)について
https://bitwarden.com/help/secrets-manager-cli/
OSSパスワードマネージャBitwardenが提供する、SecretsManager.類似製品として1passwordやLastpassなど。
動機
1Passwordを使って、ローカルにファイル(~/.configや.env)として置かれてる生のパスワードなどを削除した
上記記事では、1passwordを使ってローカルマシンから各種機微情報を削除しつつ、envなどを使用したローカル開発を(部分的にせよ)実現している。
codexやclaude codeなどAIの使用頻度も上がってきたため、env系に限らず、こうした認証情報ファイル(特に、奪取されたときの影響が大きいもの)に対するセキュリティが気になってきた。 そこにこの記事を見かけたため、自分が使っているBitwardenでも同じようなことができないかと考えた。
BitwardenもCLIおよびSecretsManager CLIを提供していたので試そうとしてみたところ、認証の仕方で若干工夫が必要と感じたので、ここにメモしておく。
前提
- Bitwardenのアカウントを作成済み
- Bitwarden Secretsに参加済み(プランは任意)
TL;DR
- docker経由でBWSを使用
- aliasで簡単に呼び出せるようにしておく
- BWSのアクセストークン本体は環境変数に設定
- “—access-token=\$BWS_ACCESS_TOKEN” とエスケープしてaliasに追記
手順
1. bwsをaliasに登録
Bitwarden Secrets CLIは、自分でダウンロード・インストールする方法と、Dockerを使う方法の二種類が提供されている。
Secrets Manager CLI の Download and Install
ただし、ダウンロードするファイルへの導線が明確に記載されているわけではなく、単にGitHub上のReleaseNotesへの導線が張られているのみ。正直いちいち探すのも面倒だし、バージョン管理なども面倒なので、Dockerを使う方法を選んだ。
もっとも、これはこれでいちいち使うたびに docker run などと書きたくもないので、普段はaliasに登録して使うことにする。
alias bws="docker run --rm -it bitwarden/bws"
これで、普段は特に意識することなく bws と打てばBWS CLIが使える。
$ bws help
Bitwarden Secrets CLI
Usage: bws [OPTIONS] [COMMAND]
Commands:
config Configure the CLI
completions Generate shell completion files
project Commands available on Projects
secret Commands available on Secrets
run Run a command with secrets injected
help Print this message or the help of the given subcommand(s)
Options:
-o, --output <OUTPUT> Output format [default: json] [possible values: json, yaml, env, table, tsv, none]
-c, --color <COLOR> Use colors in the output [default: auto] [possible values: no, yes, auto]
-t, --access-token <ACCESS_TOKEN> Specify access token for the service account [env: BWS_ACCESS_TOKEN]
-f, --config-file <CONFIG_FILE> [default: ~/.config/bws/config] Config file to use [env: BWS_CONFIG_FILE=]
-p, --profile <PROFILE> Profile to use from the config file [env: BWS_PROFILE=]
-u, --server-url <SERVER_URL> Override the server URL from the config file [env: BWS_SERVER_URL=]
-h, --help Print help
-V, --version Print version
2. access tokenの作成
BWSの管理ページにアクセスして、マシンアカウントの登録~アクセストークン発行を行う。詳細はBitwardenのマニュアルを参照。
余談:個人的には、アクセストークンはいちいち削除・再登録しなくてもローテートできるようにしてほしいところ。
3. 環境変数にaccess tokenを保存
Bitwardenのドキュメントに従って、環境変数にaccess tokenを保存。 historyに残る分は secretlintなどを使ってカバーすることになるか。
4. BWSを呼び出すaliasに追記
docker経由でBWSを使う場合、ホストマシンの環境変数に設定してあるだけでは、アクセストークンは伝播しない。
docker run --env などを使って環境変数をdocker内部で実行されるBWSのプロセスに届けるか、BWSのオプション --access-token で直接アクセストークンを指定する必要がある。
どちらを使うにしろ、いちいちアクセストークンを渡すのは面倒だし、コマンドラインやhistoryに生のアクセストークンが露出するので避けたい。
そこでaliasに追記することになるが、単に --access-token=$BWS_ACCESS_TOKEN などと書いてしまうと、環境変数部分が展開されてしまうので、実際に使うとhistoryはもちろんaliasにもアクセストークンが露出してしまう。
$ alias bws="docker run --rm -it bitwarden/bws --access-token=$BWS_ACCESS_TOKEN"
$ alias
alias bws='docker run --rm -it bitwarden/bws --access-token {生のアクセストークン}'
そこで、aliasを設定するときは $ をエスケープしてやることで、alias設定時にはアクセストークンは展開されず、実行時に記述の通り環境変数を参照して解決されるようになる。
- alias bws="docker run --rm -it bitwarden/bws --access-token=$BWS_ACCESS_TOKEN"
+ alias bws="docker run --rm -it bitwarden/bws --access-token=\$BWS_ACCESS_TOKEN"
普段遣いとしては、 .bashrc などに以下のaliasを貼り付けておけば良い
alias bws="docker run --rm -it bitwarden/bws --access-token=\$BWS_ACCESS_TOKEN"