sudoers 安全

sudoers 安全

我已经设置了一个脚本来在两个服务器(本地主机和远程服务器)之间执行 Subversion 更新,该脚本由 www-data 用户运行的提交后挂钩调用。

/srv/svn/mysite/hooks/post-commit 包含:

sudo -u cli /usr/local/bin/svn_deploy

/usr/local/bin/svn_deploy 由 cli 用户拥有,并包含:

#!/bin/sh

svn update /srv/www/mysite
ssh cli@remotehost 'svn update /srv/www/mysite'

为了使其正常工作,我必须将以下内容添加到 sudoers 文件中:

www-data ALL = (cli) NOPASSWD: /usr/local/bin/svn_deploy
cli ALL = NOEXEC:NOPASSWD: /usr/local/bin/svn_deploy

为了避免错误,必须输入 www-data 和 cli:

post commit hook failed: no tty present and no askpass program specified

我对授予 www-data 任何形式的高级权限持谨慎态度。我还应该做些什么来减少或消除任何安全风险?

答案1

您可以使用类似 svnsync 的工具。

从他们的地点

svnsync 是 Subversion 远程存储库镜像工具。简单来说,它允许你将一个存储库的修订版本重播到另一个存储库中。

因此,您可以做的是在提交后钩子部分放置如下条目:

/usr/bin/svnsync 同步 svn://XXXX/ --用户名 XXXX --密码 'XXXXXX' --非交互式

这会将更新同步到远程服务器,并且您也不需要向任何用户提供任何特殊权限。

希望这有帮助。

答案2

我不会使用非特权用户 (www-data) 来执行管理任务。svn update 似乎更像是 root 的工作。因此,我不会为 www-data 添加此额外权限。当您使用 SSH 连接时,您可以使用密钥身份验证进行连接并创建强制命令以将 root 执行的操作限制为“svn update”。要保存在 /root/.ssh/authorized_keys 上的公钥将如下所示:

command='svn update /srv/www/mysite',ssh-rsa dedllrfflr[...]

这样,您的连接将被限制到这个特定的命令,并且 www-data 不会获得额外的权限。

在客户端,启动更新的命令是:

ssh -i /path/to/private/key root@server whatEverCommandYouMayImagine

如果认证成功,则仅执行强制命令中包含的命令

然后,您可以处理上传文件的 Unix 组/权限。对于 Apache,它通常会打开:

find /srv/www/mysite -type f -print0 | xargs -0 chmod 640
find /srv/www/mysite -type d -print0 | xargs -0 chmod 750
find /srv/www/mysite -print0 | xargs -0 chown root:www-data

相关内容