我正在编写一个 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
这里有几个不同的问题需要解决:
如何只允许某些主机访问?
这可以通过为源主机上的用户提供特定的 SSH 私钥来完成。然后,您安装匹配的公钥仅有的在用户应该有权访问的主机上。确保用户不知道目标帐户密码,或者 中禁用了密码验证
sshd_config
。用户应该仅有的能够通过 ssh 密钥进行身份验证。如何限制用户只能执行特定命令?
这可以与上面#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”。
源主机上的用户的 sudo 访问权限
您的语法正确,但命令错误 - 您没有授予 sudo 访问权限
ssh
,而是授予您希望他们作为 jbossuser 执行的脚本。
如果不同的用户应该访问不同的主机,那么您可以为他们提供不同版本的脚本,这些版本指向仅特定于他们的 SSH 私钥。