[2026-04-08 修正] 記事の構成・文章を改善しました。
chezmoi の使い方について書いた記事一覧は以下です。
[基本編] | [テンプレート機能編] | [ファイル暗号化機能編] (この記事)
chezmoi を使って個人設定ファイルを GitHub リポジトリで管理していると、「このファイルの内容は秘密なので暗号化してからコミットしたい」ということもあると思います。
chezmoi ではそのようなファイルの暗号化もサポートしています。いくつかの暗号化ツールが使用できますが、以下では最初に紹介されている age による方法について記します。
公式ドキュメント
-
Encryption - chezmoi : chezmoi では age, gpg, git-crypt, transcrypt によるファイル暗号化が可能とあります。特に拘りがなければ、ファイル暗号化に特化したツール age (chezmoi にビルトインされています) がシンプルで便利です。
- age - chezmoi : age を使用したファイル暗号化のセットアップ手順です。PATH に age がなければビルトインを使用する旨があります。なお、このページの Symmetric encryption 以降はビルトインでは使用できません。
ファイルを暗号化して登録する手順
(1) 秘密鍵の生成
初めてファイルを暗号化するときは、まず作業する PC (PC1 とします) で下記コマンドを実行し、適当なパスに秘密鍵を生成します。すると公開鍵も表示されます。
- 秘密鍵はコミットしないので
~/.local/share/chezmoi/ではなく~/.config/chezmoi/に生成する方がよいと思います (前者にまとめたい場合は git に無視させてください)。
chezmoi age-keygen --output=~/.config/chezmoi/key.txt
# -> Public key: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p
# ※ 上記の公開鍵は公式ドキュメントの例のコピペです
# ※ 表示された公開鍵を見逃してしまっても秘密鍵ファイルを開けば書いてあります
(2) 設定ファイルの記入
生成した秘密鍵のパスと公開鍵を chezmoi 設定ファイル ~/.config/chezmoi/chezmoi.toml に記入します。
- 秘密鍵は
identity(=私の身分証明) というキーに記入します。 - 公開鍵は
recipients(=暗号化ファイルを復号できる人) というキーに記入します。- 暗号化したファイルを PC2 から復号する予定なら、この時点で PC2 でも秘密鍵を生成しておき
recipientsに PC2 の公開鍵も記入しておくと再暗号化の手間が省けます。ただ、取り急ぎファイルを暗号化してコミットしておきたいだけの場合は PC1 の公開鍵を登録するだけでもよいです。
- 暗号化したファイルを PC2 から復号する予定なら、この時点で PC2 でも秘密鍵を生成しておき
# このファイルの冒頭に以下を書く
# (既にこのファイルに [data] などを登録している場合は encryption キーをその下に入れない)
encryption = "age"
[age]
identity = "~/.config/chezmoi/key.txt" # その PC における秘密鍵パス
recipients = [ # chezmoi でファイル同期するすべての PC の公開鍵を登録
"age1...", # PC1 公開鍵
"age1...", # PC2 公開鍵
]
(3) ファイルを暗号化して登録
手順 (2) を実施した上で、オプション --encrypt をつけて chezmoi にファイルを登録すると、ファイルを暗号化して登録できます。
chezmoi add --encrypt ~/himitsu.txt
試しに手元で himitsu.txt を作成して暗号化してソースディレクトリに登録すると、以下のように暗号化されることと復号できることがわかります。
# himitsu.txt を暗号化してソースディレクトリに登録します
chezmoi add --encrypt ~/himitsu.txt
# 暗号化して登録するとプレフィクス encrypted_ とツールに応じた拡張子が付きます
# 登録された encrypted_himitsu.txt.age のファイル種別を調べると age 暗号化ファイルです
file ~/.local/share/chezmoi/encrypted_himitsu.txt.age
# -> /c/Users/Cookie/.local/share/chezmoi/encrypted_himitsu.txt.age:
# age encrypted file, ASCII armored
# 復号を試すためにローカル側を消してみます
rm himitsu.txt
# ソースディレクトリとローカルの差分コマンドを叩くと復号されるのがわかります
chezmoi diff
# --- /dev/null
# +++ b/himitsu.txt
# @@ -0,0 +1 @@
# +これはとてもひみつです
2 つ目以降の PC から復号する手順 (PC 追加時の手順)
続けて 2 つ目以降の PC から復号する流れは以下になります。上記の手順 (2) の時点で PC2 の秘密鍵を生成して PC1 の設定ファイルに登録していた場合は (4) (6) (7) をスキップできます。なお、PC1 での作業も伴うので注意してください (PC1 から PC2 へのリプレースのケースでは、PC1 の廃棄前に PC2 の追加を実施してください;最悪、PC1 の秘密鍵ファイルをサルベージしておいてください)。
- (4) PC2 でも上記の手順 (1) を実施して秘密鍵を生成してください。
- (5) PC2 でも上記の手順 (2) を実施して設定ファイルを記入してください。ただしこのとき、PC1 の公開鍵と PC2 の公開鍵をどちらも記入してください (※1) (※2)。
- (6) そして、PC1 に戻って、PC1 の設定ファイルにも PC2 の公開鍵を追加してください。
-
(7) その上で、PC1 で、暗号化済みファイルを全て再登録 (再暗号化) してください。
- 暗号化して登録されているファイル一覧は
chezmoi managed --include=encryptedで表示できます。 - 公開鍵を増やすたびに、暗号化ファイルのファイルサイズは少し大きくなります (ラップされた対称鍵が増えるので) (後述)。
- 暗号化して登録されているファイル一覧は
- (8) そうすれば、PC1 で暗号化したファイルを PC2 から復号できます。
(※1) PC2 の設定ファイルにも PC1 の公開鍵を記入しておかないと、PC2 で暗号化したファイルを PC1 から復号することができません。
(※2) 公開鍵は暗号化時につかうものであるため、運用上「PC2 からファイルを登録することはない (PC2 ではもっぱら復号しかしない)」といった場合は、原理上は PC2 設定ファイルの recipients は空でもよいのかもしれません。が、私はそうしていないので空にしてエラーにならないかは知りません。
参考 : age でのファイル暗号化フロー
age がファイルを暗号化するフローは以下のようなものになります。より正確な情報は C2SP/age.md at main · C2SP/C2SP を参照してください。
-
ユーザの事前準備 :
- ユーザは既定の楕円曲線 (X25519) の上で秘密鍵-公開鍵ペア S, P を生成します。
-
暗号化 :
- ユーザは age に公開鍵 P をみせてファイル F を暗号化するよう頼みます。
- age はまず適当な対称鍵 A を生成し、ファイル F を対称鍵暗号方式で暗号化します。
- age は次に既定の楕円曲線の上で適当な秘密鍵-公開鍵ペア S', P' を生成し、S'@P を算出します。ここで @ は楕円曲線上での掛け算で、S'@P = S@P' になります (ECDH)。そしてこの S'@P を適宜変換したもので (HKDF 変換)、さっきの対称鍵 A をラップ (=ある種の暗号化) します。
- age は公開鍵 P' と ラップされた対称鍵 W[A] と暗号化されたファイル E[F] を合わせた
ファイルを出力します (age 暗号化ファイル)。
-
復号 :
- age に秘密鍵 S をみせて age 暗号化ファイルを復号するよう頼みます。
- age は age ファイルから公開鍵 P' と ラップされた対称鍵 W[A] を取り出し、S@P' を適宜変換したもので W[A] をアンラップして対称鍵 A を得ます。
- age は対称鍵 A で暗号化されたファイル E[F] を元のファイル F に復号します。
age でファイルを暗号化するとき、公開鍵を複数指定することもできます。その場合は、age 暗号化ファイルのヘッダーにラップされた対称鍵が増えます。復号するときは、age は与えられた秘密鍵でアンラップできるか順に試すことになります。