Bitwardenとchezmoiを使って複数のデバイス間で機密情報を共有する
最近dotfilesの管理にzxを使用した自作スクリプトを使うのをやめて、chezmoiに変更したのですが、chezmoiの特徴的な機能の一つにパスワードマネージャーを使って機密情報を複数のデバイス間で共有できるというものがあるので、パスワードマネージャーにBitwardenを使用した場合どうするのかを記事にしたものになります。
例として~/.ssh/id_ed25519
が機密情報であることを前提に、デバイス間で共有できるようにしていきましょう。
必要なもの
Bitwarden
このセクションではBitwardenにid_ed25519
の内容をセキュアノートに保存していきます。
そしてBitwarden側に作成したアイテム(この場合セキュアノート)のIDがchezmoiで必要になるので、Bitwarden CLIを使った操作が必要になります。
ログイン
既にログインしている場合は不要です。
bw login
一時的なセッションを作成
$env.BW_SESSION = (bw unlock --raw)
ローカルにある機密情報をBitwardenに移す
セキュアノートにファイルの内容を保存していきます。
bw create item
の引数に渡すデータを作成する
面倒くさいことにbw create item
を使ってBitwardenにセキュアノートを作るにはJSONをBase64でエンコードしたものを引数に渡す必要があるため、まずはそれを作成します。
bw get template item
でbw create item
に必要なデータのテンプレートが手に入るため、それを編集してbw encode
でBase64にエンコードしたものをBW_ENCODED_JSON
という名前でも付けて変数に格納しておきます。
let BW_ENCODED_JSON = (
| bw get template item
| from json
| update secureNote { type: 0 } # セキュアノートを作る場合に必要
| update type 2 # セキュアノートの場合は"type"に2を指定
| update name private_key # セキュアノートに付ける名前
| update notes (open ~/.ssh/id_ed25519) # セキュアノートの内容(ファイル内容)
| to json
| bw encode
)
セキュアノートを作成
bw create item
と先ほど作成したデータ($BW_ENCODED_JSON
)を使ってセキュアノートを作成します。
成功すればアイテムの情報が入ったJSONが出力されるので、取り出してBW_ITEM_ID
という名前の変数でも作って保持しておきます。(次のセクションで使います)
let BW_ITEM_ID = (bw create item $BW_ENCODED_JSON | from json | get id)
以上でBitwarden側での作業は終了になります。
参考
chezmoi
chezmoi init
を実行したときに~/.local/share/chezmoi
にできるローカルリポジトリが存在していることが前提で話をしていきます。
機密として管理するファイルを追加する
chezmoi add -T ~/.ssh/id_ed25519
Bitwardenから機密情報を取り出すのにテンプレート関数を使用するので、必ずchezmoi add
を使用するときは -T (--template) オプションを加えます。
そうすると、~/.local/share/chezmoi/dot_ssh/id_ed25519.tmpl
というファイルが作成されるはずです。
参考
テンプレートファイルを編集
Bitwardenセクションで作成した変数$BW_ITEM_ID
が必要になります。
このままの状態で~/.local/share/chezmoi/dot_ssh/id_ed25519.tmpl
をコミットしてプッシュまでしてしまうと機密情報ダダ漏れでご愁傷さまコースなので、bitwarden
というテンプレート関数を使って、機密情報をchezmoi apply
を実行したら~/.ssh/id_ed25519
の内容はBitwardenにあるものに置き換えて、~/.local/share/chezmoi/dot_ssh/id_ed25519.tmpl
には機密情報を載せないようにしていきます。
$"{{ \(bitwarden "item" "($BW_ITEM_ID)").notes }}" | save -f ~/.local/share/chezmoi/dot_ssh/id_ed25519.tmpl
bitwarden
関数の返り値はbw get item $BW_ITEM_ID
で確認することができます。
セキュアノートの場合はnotes
キーの中に機密情報が格納されているので、{{ (bitwarden "item" "itemId").notes }}
という形になります。
参考
変更を適用する
以上でchezmoi側での作業が終了になるため、git
を使って変更をリモートリポジトリに反映しましょう。
その後作業を行ったマシンでchezmoi apply
を実行し、別のデバイスではchezmoi update
を実行すると見事~/.ssh/id_ed25519
にBitwardenに保存した内容が反映されているはずです。
Bitwardenを使って管理する機密情報が増えてきたら、Bitwardenのセクションで記載した通り$env.BW_SESSION = (bw unlock --raw)
を実行してからchezmoi update
とchezmoi apply
を行うようにすることをオススメします。
終わり
書いてから思ったけど、セキュアノートではなくユーザーネームとパスワードが設定されていないログインアイテムを作ってから添付ファイルに機密ファイルを設定してbitwardenAttachment
を使うのがより適切なのではなかろうか?
それと最近Fishやめて、Nushellにしたのでこの記事のコマンドサンプルはゴリゴリにNushellを使用したものにしてみました。
UNIX-likeなコマンドサンプルを期待していた方はごめんなさい、Nushell始めてください!
Discussion