🙌

【chezmoi】dotfileのセキュアな値をdashlaneから参照できるようにする

2023/09/07に公開

はじめに

chezmoiを使うまでワイはdotfileを公開していませんでした。
というのも、GitHub CLIで使うパーソナルアクセストークンをベタガキしていたりと「わざわざあげるのもなー」と思っていたからです。

この度Discordのコミュニティでchezmoiを教えてもらいなんやかんやで念願のdotfileを公開できるようになりました。🎉

https://github.com/hulk510/dotfiles

セキュアな値を載せずにgit管理できるのでchezmoi便利↓
https://github.com/hulk510/dotfiles/blob/54724738803e33b191080c2db84715abec04b18e/dot_config/gh/hosts.yml.personal.tmpl#L1-L3

chezmoiそのものについては下記の記事で分かりやすくまとめている方がいるので詳しく知りたい方は見て見てみるといいかも知れません。
https://zenn.dev/ryo_kawamata/articles/introduce-chezmoi

記事では1passwordで使っていましたがワイはdashlaneを使っているので、
今回はchezmoidashlane-cliを使い、dashlaneに保存したパスワードをdotfileで使えるようにします。

dashlane cliのインストール

dashlaneのパスワードを取得するためにcliツールをインストールします。
https://github.com/Dashlane/dashlane-cli

brewでインストールできます。

brew install dashlane/tap/dashlane-cli

インストールができたら、dcliコマンドが使えるようになるので、ログインしていきます。

dcli sync

login

dashlaneに登録しているメールアドレスを入力し、メールアドレス宛に送られるコードを入れ、パスワードを入力すれば完了です。Successfully syncedと表示されたらok

テンプレートファイルの作成

chezmoiを使ってパスワードマネージャーから値を取得して展開させて使うにはテンプレートファイルに記載する必要があるためまずテンプレートファイルを作成します。

作成方法

~/.zshrcの部分は自分がテンプレートファイルにしたいパスを書いてください。
やり方は公式から引用。

テンプレートにしておらず、またchezmoidで管理していない場合

chezmoi add --template ~/.zshrc

すでに管理しているがテンプレートになっていない場合

chezmoi chattr +template ~/.zshrc

Dashlaneでパスワードの取得・設定

使うパスワードはweb、アプリなど好きな方法でdashlaneにパスワードを保存してください。

filter parameter

後述するchezmoiのdashlanePasswordではdashlane上で項目名という名前を探すようになっているため、赤丸で記している項目名はできる限り一意に特定できる名前がいいと思います。

今回パスワードはDashlane上で "example-test-dashlane" として作成しました。
また、パスワードに保存している値がdotfileで展開される値になります。

dashlane cliで保存したパスワードが取得できるか確認する

新しくパスワードを保存したり変更した場合は、syncコマンドを使用してください。
syncコマンドは、ログインだけではなくweb等でdashlaneのパスワードを追加・変更した際に同期する役割も持っています。

下記のコマンドを入力して先ほど作成した example-test-dashlaneが取得できることを確認します。

$ dcli password --output json "example-test-dashlane"

検索に引っかかるとこんなふうにJsonが返ってきます。

{
  "id": "{0A58A0AB-3134-4618-A413-D263D56116D9}",
  "anonId": "{61D54392-3A95-47CA-97A0-8081AC4655BD}",
  "creationDatetime": "1693814579",
  "lastBackupTime": "0",
  "lastUse": "1693814579",
  "localeFormat": "UNIVERSAL",
  "userModificationDatetime": "1693814579",
  "autoLogin": "true",
  "autoProtected": "false",
  "checked": "false",
  "login": "example-user",
  "password": "password",
  "status": "ACCOUNT_NOT_VERIFIED",
  "strength": "0",
  "subdomainOnly": "false",
  "title": "example-test-dashlane",
  "url": "https://example.com",
  "userSelectedUrl": "https://example.com",
  "useFixedUrl": "true",
  "linkedServices": "{\"associated_domains\":[]}",
  "modificationDatetime": "1693814579"
}

dashlane cliではfilterする時はデフォルトだとtitleurlで検索するみたいです。

値が返ってくることがわかれば、テンプレートに書き込んでいきます。

テンプレートに書いていく

dashlaneのパスワードをchezmoiで展開するにはdashlanePasswordを使います。

書き方例

{{ (index (dashlanePassword "filter") 0).password }}

https://www.chezmoi.io/reference/templates/dashlane-functions/dashlanePassword/

テンプレートファイル内で、パスワードの値を展開したい場所に書いてください。
冒頭のものを再度載せるのですがこんな感じです。
https://github.com/hulk510/dotfiles/blob/54724738803e33b191080c2db84715abec04b18e/dot_config/gh/hosts.yml.personal.tmpl#L1-L3

例でfilterと書かれている箇所に、先ほどの example-test-dashlaneを入れます。

{{ (index (dashlanePassword "example-test-dashlane") 0).password }}

変更を適用する

そのままだとまだdotfileで展開されないため変更をapplyして反映させます。

$ chezmoi apply -v

変更反映の際、dashlaneからパスワードが取得され、ファイルにテンプレート記法で書いていた部分が値に変換され入力されていたら成功です。

おわり

公式ドキュメントのfilterが具体的に何を指しているのかが分からず、またテンプレートファイルに記載していなかったため結構な時間詰まってしまったので記事を書いてみました。

私と同じように詰まっている人の助けになれば幸いです。

Discordでエンジニアとゆるく繋がるコミュニティ作ってるのでよかったらきてください。たまにボイチャしてダラダラ喋ったり、雑談したりしてます。

基本どなたでも歓迎ですのでツイッターのプロフに貼っているリンクから飛んでください。
見学もご自由にどうぞー。

それでは、お疲れ様でした👋。

Discussion