credential管理をorg-encryptからpassword-storeに移行した

Table of Contents

Introduction

credential管理をorg-encryptからpassword-storeに移行したので作業内容をメモしておく。

現状の運用と問題

org-crypt運用メモ に書いたとおり、 ~/.aws/credentials のような秘匿情報を secret.orgorg-babel-tangle して出力していた。

次のように org-decrypt-entriesorg-encrypt-entries をadviceして対応していたのだが、org-nix-shell がうまく動かなくなってしまった。

(advice-add 'org-babel-tangle :before #'org-decrypt-entries)
(advice-add 'org-babel-tangle :after #'org-encrypt-entries)

ob-async を有効にした時もorg-nix-shellが実行できなくなってしまったので、 advice-add をすると問題が起きるのかもしれない。(要検証) org-nix-shell入門 にも書いたが、org-nix-shellはキラーアプリケーションなので消す訳にはいかない。

M-x org-encrypt-entries を手動で実行する運用にしていたが、うっかり叩き忘れたままcommitを何度かしてしまった。

newren/git-filter-repoなどを使ってcommit hisotryから消したが面倒だった。

また、mcp-servers-nixを導入した時点では実装されてなかったが、mcp-servers-nixpasswordCommand をサポートしてくれた。 よい機会なのでpassword-store管理に移行にすることにした。

作業手順

1. 既存のorg-encryptしてた鍵情報をpassword-store管理下に移行

次のように秘密鍵をpassコマンドで検索できるようにする。

pass show gemini/private

2. org-babel templateを作成

passコマンドをwrapするコマンドを用意する。

#+name: pass
#+begin_src emacs-lisp :var id="" :results value raw
  (string-trim (shell-command-to-string (format "pass show %s" id)))
#+end_src

3. 各秘密鍵に埋め込み

:noweb yes で関数を実行できるようにする。 M-x org-babel-tangle を実行すると、秘密鍵の入った状態で ~/.aider.conf.yml が出力される。

** ~/.aider.conf.yml
#+begin_src yaml :tangle (expand-file-name "~/.aider.conf.yml") :mkdirp yes :noweb yes
  dark-mode: true
  model: gemini
  api-key:
    - gemini=<<pass(id='gemini/private')>>
#+end_src

終わりに

外部コマンドを叩いてる関係で多少tangleに時間がかかるようになってしまったが許容できる範囲内。 長年秘密鍵の管理方法について悩んでたけど方針が決まってよかった。