systemd-creds

出自 ArchWiki

systemd-creds 是由 systemd 提供的实用程序和服务,旨在安全地存储和检索 systemd 单元使用的凭据。它的目标是简化敏感信息的管理,例如各种服务和应用程序所需的用户名、密码、API 密钥和其他身份验证数据。

有关更多信息,请参阅 https://systemd.io/CREDENTIALS/systemd-creds(1)

凭据加密

凭据可以选择性地进行加密和身份验证,可以使用从本地 TPM2 芯片派生的密钥,或者存储在 /var/ 中的密钥,或者两者都使用(如果可用,则为默认设置)。要检查您的系统是否使用 TPM2 加密或仅使用存储在 /var/ 中的密钥,请运行

$ systemd-analyze has-tpm2
yes
+firmware
+driver
+system
+subsystem

要加密存储在 plaintext.txt 中的密钥,请运行

# systemd-creds --name=foobar encrypt plaintext.txt ciphertext.cred
注意: 对于敏感凭据,请考虑为 plaintext.txt 使用 tmpfs

加密的凭据在其中携带预期的名称,因此它们不会被误用。如果省略 --name,则文件名将用作凭据名称。

您可以使用以下命令检查加密是否成功

# shred -u plaintext.txt
# systemd-run -P --wait -p LoadCredentialEncrypted=foobar:$(pwd)/ciphertext.cred systemd-creds cat foobar

如果不使用上面的 --name,则正确的命令将是

# systemd-run -P --wait -p LoadCredentialEncrypted=ciphertext.cred:$(pwd)/ciphertext.cred systemd-creds cat ciphertext.cred 

或者,您可以使用 systemd-ask-password 来提供密钥,而无需先将其写入磁盘。-p 开关允许以准备好包含在服务文件中的格式输出凭据

# systemd-ask-password -n | systemd-creds encrypt --name=mysql-password -p - -
🔐 Password: ***************         
SetCredentialEncrypted=mysql-password: \
       k6iUCUh0RJCQyvL8k8q1UyAAAAABAAAADAAAABAAAAD42X4T5h86ynMHG5MAAAAAgAAAA \
       AAAAAALACMA8AAAACAAAAAAngAgws4cwpkrOvpxVf4/GSyOYCoQ4dmPs3Vcfg3D0eH/Ov \
       cAEC/U9JTyeHgktYBDl8U5jOq/NqFX3IPc24EX7aeTevsL6OKwlTDcF04W1M6eodqngRo \
       1JfRqHWnSfVHHYVXgMjIkWT4AcC0OoqAzQobK5e5G1zjTPygiG/ewGttY9sueKCL/INUu \
       n1e6/QB6D9T0x9Sl18CeBtoASepCAE4ACAALAAAAEgAgY9RHOefBR+mMgV/Frr+UzQX1S \
       IsLFItIbfB6Ep76It0AEAAgKH2Tduip205Dw0GVkME+yvOUNYVhnSHYqWHQoxelKrdj1E \
       c558FH6YyBX8Wuv5TNBfVIiwsUi0ht8HoSnvoi3QAAAAA3WzuXTYG2OFX9wFo740b3YjE \
       ZtiCWakoAOxzX+D/vIFyB3INROxpfXUCV7LY4eRITI9PJZiE6lGn4kjZBnbUf47yo1WDG \
       Wg==

编辑 服务文件以包含相关的凭据

用户凭据加密

systemd-creds 实用程序也可以由普通用户使用。

$ echo -n hunter2 | systemd-creds --user encrypt - ciphertext.cred
$ systemd-creds --user decrypt password.cred
hunter2
$ cat <(systemd-creds --user decrypt ciphertext.cred)
hunter2$

systemd-creds(1) 中所述,用户的范围和 /etc/machine-id 用于加密凭据。例如,root 用户可以解密它,但只能匹配用户范围

$ systemd-creds --uid anotheruser decrypt ciphertext.cred
Failed to decrypt: io.systemd.InteractiveAuthenticationRequired
# systemd-creds decrypt ciphertext.cred
Encrypted file is scoped to a user, but no user selected.
# systemd-creds --uid user decrypt ciphertext.cred
hunter2