はじめに
systemd-creds コマンドでファイル単位で TPM2 の秘密鍵を使った暗号化・復号化をする方法を説明します。
LUKS 等でパーティションごと暗号化してれば、こんなことは不要ですが、私は、隠したいファイルだけ隠せれば良い派です。
コマンド説明
詳しくは man を叩いてもらうとして、
systemd-creds.socket の状態確認
> systemctl status systemd-creds.socket
● systemd-creds.socket - Credential Encryption/Decryption
Loaded: loaded (/usr/lib/systemd/system/systemd-creds.socket; static)
Active: active (listening) since Sat 2026-03-21 09:27:53 JST; 5min ago
Invocation: a00bf54dab3f4034af2ab44e22001dee
Docs: man:systemd-creds(1)
Listen: /run/systemd/io.systemd.Credentials (Stream)
Accepted: 0; Connected: 0;
普通は勝手に開いてると思いますが、ミニマリストは mask しちゃってるかもしれないので unmask して start しましょう。
暗号化
ファイル hoge を tpm2 の秘密鍵で暗号化し、その結果を hoge.tpm2 に出力します。
systemd-creds encrypt hoge hoge.tpm2 --with-key=tpm2
root のログインパスワードを入力する必要があります。
復号化
さっき作った hoge.tpm2 を複合化します。ファイルの中身が標準出力されます。
systemd-creds decrypt hoge.tpm2
またまた root のログインパスワードを聞かれます。
聞かれたくないなら、次の polkit ルールを作っておきます。tss または wheel グループに所属してるユーザは認証をスキップします。
/etc/polkit-1/rules.d/10-systemd-creds.rules/10-systemd-creds.rules
polkit.addRule(function(action, subject) {
if (action.id == "io.systemd.credentials.decrypt" &&
(subject.isInGroup("tss") || subject.isInGroup("wheel"))) {
return polkit.Result.YES;
}
});
何を守りたいかによりますが、攻撃者にすでに自分の ID でログインを突破された上で、それでもなお、そのファイルが開かれてしまう、というのを防ぎたければ、root のパスワードを打ち込ませることにも意味がなくはないと思います。
一方、SSD を抜き去られた場合に、そのファイルを守りたいなら、root のパスワードを打ち込ませる意味はありません。TPM2 の秘密鍵を盗むことはできないからです。
補足 GPG との比較
ファイルの暗号化で有名なのは GPG なので比較です。
| 項目 | GPG | TPM |
|---|---|---|
| 秘密鍵のポータル性 | 自由 | その TPM の外には出せない |
| 復号化のポータル性 | 秘密鍵さえあれば、どこでもできる | その TPM のあるハードでのみ可能 |
| 考えられる用途 | どこでも使いたいファイル、無くしたくないファイルの暗号化 | その PC でのみ使えれば良いファイル、また別途作れば良いファイルの暗号化 |