如何使用 gpg / gnupg 解密文件而不失去原始文件权限?

如何使用 gpg / gnupg 解密文件而不失去原始文件权限?

我目前正在尝试自动加密和解密一组文件。对于我当前使用的加密:

gpg --batch --recipient [RECIPIENT] --encrypt-files [FILES]

对于解密我使用几乎相同的:

gpg --batch --decrypt-files [FILES]

但在加密和解密过程中,原始文件权限都会丢失:

$ gpg --batch --recipient aram --encrypt-files foo
$ ls -l foo*
-rw------- 1 aram aram foo
-rw-r--r-- 1 aram aram foo.gpg

$ rm foo && gpg --batch --decrypt-files foo
$ ls -l foo*
-rw-r--r-- 1 aram aram foo
-rw-r--r-- 1 aram aram foo.gpg

我在加密过程中对此感到满意,我可以手动设置文件权限。但在解密过程中,某些文件(例如 ssh 密钥)会在没有适当权限的情况下使用功能,从而带来安全风险。

有没有一种机制可以在批量解密过程中保留文件权限?

当然,我可以循环文件,读取权限,解密,然后再次设置权限。但这违背了批量解密的目的。


gnupg.org 上有一个悬而未决的问题,该问题已有 4 年历史,此后一直没有太多活动:https://dev.gnupg.org/T2945

答案1

作为@ab@弗罗斯特舒茨建议,将文件包装在一个tar文件中,然后加密是一种选择。

但是,我希望能够访问原始文件结构而不解密。目前,我已采取在批量解密后对齐文件权限的方法。当解密的文件已经位于磁盘上时,这具有对齐权限的额外好处:

gpg --batch --decrypt-files $files

for encrypted in $files ; do
  decrypted=${encrypted%.gpg}
  chmod --reference="$encrypted" -- "$decrypted"
done

当然,也可以在每个解密文件之后进行对齐:

for encrypted in $files ; do
  gpg --decrypt-files "$encrypted"

  decrypted=${encrypted%.gpg}
  chmod --reference="$encrypted" -- "$decrypted"
done

如果您想绝对确保解密的文件永远不会比加密的文件拥有更多的权限,您可以使用临时虚拟文件并强制gpg覆盖它:

for encrypted in $files ; do
  decrypted=${encrypted%.gpg}

  touch "$decrypted" && chmod --reference="$encrypted" -- "$decrypted"
  gpg --yes --decrypt-files "$encrypted"
done

加密后可以使用相同的机制来调整权限。我没有做过任何性能测试,不确定其中一种选项是否更快。


我不会立即接受这个答案,也许有人会想出比这更好的解决方案。

相关内容