![如何为无法登录 RHEL 服务器的用户提供启动/停止应用程序或重新启动服务器的能力?](https://linux22.com/image/219622/%E5%A6%82%E4%BD%95%E4%B8%BA%E6%97%A0%E6%B3%95%E7%99%BB%E5%BD%95%20RHEL%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E7%94%A8%E6%88%B7%E6%8F%90%E4%BE%9B%E5%90%AF%E5%8A%A8%2F%E5%81%9C%E6%AD%A2%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%88%96%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E8%83%BD%E5%8A%9B%EF%BC%9F.png)
我们正在构建一个安全平台,以便只有少数人有权通过 ssh 访问服务器,但我仍然需要支持人员能够启动或停止应用程序,并在需要时重新启动服务器,而无需通过 ssh 访问服务器。
答案1
如果实际要求是支持人员不能访问命令行,那么您可以编写一个脚本来显示支持人员允许的固定操作菜单,然后使用该chsh
命令将该脚本设置为支持人员帐户的登录 shell。
如果您想更加确定,您可以构建一个专用的二进制可执行文件来显示菜单,并将其用作登录 shell 而不是脚本。但在原型设计阶段使用脚本可能会更容易。
当菜单脚本/二进制文件用作用户的登录 shell 时,将无法通过中断菜单脚本/二进制文件来访问 shell:如果菜单脚本/二进制文件死亡出于任何原因,会话将立即结束,因为系统认为这是注销。
完成此操作后,每当支持帐户登录(本地登录和 SSH 登录)时,都会显示菜单。尝试退出菜单只会导致会话终止。
或者,sshd
'sauthorized_keys
文件可用于定义强制命令:当使用密钥身份验证启动 SSH 会话并且相关密钥具有与其关联的强制命令时,sshd
将运行仅指定命令一旦结束,会话将终止。
基本上,您可以为用户创建一个 SSH 密钥对support
(例如ssh-keygen -f rebootkey_ed25519 -t ed25519
,将其公钥( 的内容rebootkey_ed25519.pub
)以~support/.ssh/authorized_keys
为前缀no-port-forwarding,no-X11-forwarding,no-agent-forwarding,command="/usr/bin/sudo /sbin/reboot"
,这样authorized_keys
密钥的行将如下所示:
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,command="/usr/bin/sudo /sbin/reboot" ssh-ed25519 <public_key_alphabet_soup_here> [optional comment]
然后使用visudo
配置/etc/sudoers
来允许用户support
运行/sbin/reboot
,无论是否有密码提示:
support ALL=(root) /sbin/reboot
或者
support ALL=(root) NOPASSWD: /sbin/reboot
然后您可以将私钥文件交给支持人员,并指示他们在服务器需要重新启动时rebootkey_ed25519
运行。ssh -i rebootkey_ed25519 support@hostname_or_ip
现在,当rebootkey_ed25519
使用私钥以 user 身份登录时support
,sshd
将忽略命令行上指定的任何远程命令,并以该用户身份ssh
运行。根据所使用的配置版本,可能也可能不需要用户密码。一旦命令因任何原因终止,SSH 会话将结束。sudo reboot
support
sudo
sudo
support
sudo reboot
您可以使用特定命令定义多个 SSH 密钥,每个要运行的命令都有一个唯一的 SSH 密钥。
如果支持人员根本不能使用 SSH,那么您可以设置一个能够运行 CGI 脚本的 Web 服务器,为您希望支持人员能够执行的每个操作编写一个脚本(根据需要使用 和 来sudo
授权NOPASSWD:
用户过去常常以 root 身份运行 CGI 脚本来运行必要的命令),并编写一个简单的网页,其中包含操作菜单作为相应脚本的链接。
如果您这样做,您绝对应该通过 IP 地址限制对该网页的访问和/或要求身份验证 + HTTPS。