我正在尝试做的是编写一个脚本,允许某人注册以及何时输入他们的 pgp 公钥。这似乎很容易。
这就是我所坚持的。
我在系统用户下设置了我的密钥环,所以当我想添加密钥时,我必须这样做:
sudo -u encryption /usr/bin/gpg --homedir /var/gpg/.gnupg --keyserver hkp://keys.keyserver.org --search myemail@DOMAIN.COM ( or --import key.asc )
(加密是系统用户)
因此,当用户注册时,我需要他们的密钥才能进入正确的位置,这意味着我必须使用 sudo,据我所知,这意味着我必须执行 exec()。
所以,我可以:
$command = "insert command string to be executed here";
$oldhome = getEnv("HOME");
putenv("HOME=/var/gpg/.gnupg");
$result = exec($command, $output, $errorcode);
putenv("HOME=$oldhome");
我猜 exec() 的使用是不受欢迎的,更不用说必须对另一个用户进行 sudo 了。另外,这对我来说似乎不正确。
同样从我读过的内容来看,sudo 部分必须使用无密码的 sudo 来完成。
%admin ALL=(ALL) NOPASSWD: ALL
如果存在以下行(通过 visudo 在 /etc/sudoers 中),还要注释掉:
Defaults requiretty
有没有更好、更安全的方法来解决这个问题?我想我可以移动钥匙圈说 www-data 但我不确定这意味着什么。邮件服务器使用密钥环来加密邮件,因此它可以真正移动到任何地方。
我希望这是有道理的。谢谢。
更新:
我很可能在这里错了,但这就是我“解决这个问题”的方法
www-data ALL=(encryption) NOPASSWD:/usr/bin/gpg
这就是我的 sudoers 文件中的内容。除非我在阅读中弄错了,否则它实际上只允许它运行该命令,如果是这样,请告诉我。
这样我就可以运行 exec() 了,现在我唯一需要担心的是验证数据。