sudoers - 允许用户作为另一个用户进行 ssh 并运行特定命令

sudoers - 允许用户作为另一个用户进行 ssh 并运行特定命令

我正在编写一个 Bash 脚本来管理多个服务器上的各种 JBoss 实例。

该脚本允许用户检查每个实例的状态以及停止/启动它们。该脚本位于/opt停止/启动部分,它将参数传递给位于每个目录下的子脚本/jboss/bin

被允许停止/停止的用户已经拥有作为应用程序用户 ( jbossuser) 运行任何内容的权限,并且该用户具有为其他服务器设置的 ssh 密钥。我在使用这部分功能时没有遇到任何问题。

我希望允许任何用户(即那些没有作为应用程序用户执行权限的用户)能够检查每个实例的状态。为此我有:

status() {
    pid=$(ssh -q -t jbossuser@${server} "ps -ef | grep "$instance" | grep -wv 'grep\|vi\|vim' | awk '{print \$2}'")
    if [ ${#pid} -gt 0 ]
    then
    echo "$name > ${yellow}ONLINE  ${default}PID: $pid"
    else
    echo "$name > ${red}OFFLINE${default}"
    fi  
}

如果脚本未使用 运行sudo -u jbossuser ./script.sh(标准用户不允许这样做),则会提示输入 jbossuser 的密码。

我知道我需要向 sudoers 文件添加一些内容以允许这些用户运行此特定命令,但我不确定需要添加什么。我已经做到了:

user ALL=(jbossuser) NOPASSWD: /usr/bin/ssh

但我想限制它们只允许 ssh 到少数服务器,并且jbossuser仅限于该ps -ef命令。


/编辑:

根据答案/评论,我想我需要进一步澄清我想要做什么以及问题是什么。

系统管理员将运行该脚本:

sudo -u jbossuser ./script.sh

标准用户不允许使用 sudo,因此只需使用以下命令运行它:

./script.sh

运行它的人在jbossuser选择调用前面提到的函数的选项时没有问题,因为它使用为连接到其他服务器而status()设置的 ssh 密钥。jbossuser

这两个用户没有运行它,因为jbossuser(标准用户)会收到输入密码的提示,然后会收到错误消息,因为他们不允许使用 ssh。即使他们可以使用 ssh,他们也没有用于jbossuser连接到其他服务器的 ssh 密钥。

我想只允许标准用户:

sudo -u jbossuser ssh -q -t jbossuser@[hostname] ps -ef | grep [process]

然后,我会更新该status()函数以包含sudo -u jbossuser在开始时,以便它适用于管理员和标准用户。

答案1

这里有几个不同的问题需要解决:

  1. 如何只允许某些主机访问?

    这可以通过为源主机上的用户提供特定的 SSH 私钥来完成。然后,您安装匹配的公钥仅有的在用户应该有权访问的主机上。确保用户不知道目标帐户密码,或者 中禁用了密码验证sshd_config。用户应该仅有的能够通过 ssh 密钥进行身份验证。

  2. 如何限制用户只能执行特定命令?

    这可以与上面#1 类似地解决 - 在目标服务器上的用户~/.ssh/authorized_keys文件中,添加密钥时,您还可以指定用户将被强制运行的命令。他们会不是能够执行除此命令之外的任何操作。

authorized_keys使用您提供的示例命令,支持此功能的示例条目如下所示:

command="ps -ef | grep \"$SSH_ORIGINAL_COMMAND\" | grep -wv 'grep\|vi\|vim' | awk '{print $2}'",no-pty,no-port-forwarding,no-x11 -转发,无代理转发 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDAkwY/8z8sADor5NmM0rZd3clWIcycSzP1gj1gjZCymuYxXRZX/YFnjphkuCWU7c4KK6AtS4Xv1OFjpqtZ6ucBEws+sJIS7hfdELWuT mmYeO3UKL1p9xt4lJRlv1F8WZkUpy5iUo6VqZbgwywzyiqZj5u100Rcbho4BDFjYbSWOw== jbossuser@source_host

笔记:这一定是一行authorized_keys

当发出 ssh 命令时,用户可以在命令行上传递他们尝试 grep 的进程的名称。下面是一个使用中的示例 - 在此示例中,我将 grep 查找ps列表中的“crond”进程:

jbossuser@source_host ~$ ssh -i .ssh/testkey jbossuser@target_host crond
1044
jbossuser@source_host ~$ 

因此,该命令返回“crond”进程的 PID“1044”。

  1. 源主机上的用户的 sudo 访问权限

    您的语法正确,但命令错误 - 您没有授予 sudo 访问权限ssh,而是授予您希望他们作为 jbossuser 执行的脚本。

如果不同的用户应该访问不同的主机,那么您可以为他们提供不同版本的脚本,这些版本指向仅特定于他们的 SSH 私钥。

相关内容