我有一个 Linux(基于 debian)服务器,它配置为允许与用户“admin”进行 SSH 会话,但不允许与用户“root”进行 SSH 会话。这两个帐户以某种方式链接,因为它们共享相同的密码。
在以管理员身份进行 SSH 会话期间,需要“sudo”才能运行命令,除非我切换到用户“root”。
我有一些服务需要时不时运行,甚至在系统启动时运行。我目前正在使用私钥/公钥机制在服务器上远程执行命令。有些命令是手动输入的,其他命令是我执行的 shell 脚本。目前,当命令使用 sudo 时,服务器仍然要求输入密码。
问题:如何在不提供密码的情况下以“admin”用户身份远程执行?是否可以使用私钥/公钥来满足 sudo 的要求?或者甚至可能是一种以用户“root”身份启动 shell 脚本的方法?
是否可以避免使用 sudo 输入密码?如果没有,对于像我这样的情况,他们还有其他选择吗?
答案1
你可以告诉 sudo 跳过某些命令的密码。
例如在/etc/sudoers
archemar ALL = (www-data) NOPASSWD: /bin/rm -rf /var/www/log/upload.*
这让我可以使用
sudo -u www-data /bin/rm -rf /var/www/log/upload.*
作为没有密码的 archemar。
注意
sudo -u www-data rm -rf /var/www/log/upload.*
不会工作(会询问密码),因为rm
与/bin/rm
. (*)
请务必/etc/sudoers
使用visudo
命令进行编辑。
一旦您达到高级水平,您可能希望在/etc/sudoers.d
.
(*) 现代操作系统(redhat 7.x 大约 2022 年)中的这一变化,如果rm
您的路径匹配/bin/rm
,sudoers.conf
您可能会使用rm
.
答案2
最简单的方法是提供密码(stdin
如果您sudo
支持的话)(-S 键)
ssh -t admin@remotehost "echo <yourpassword> |sudo -S <yourcommand>"
答案3
如果帐户以某种方式链接,则允许其中一个帐户使用 ssh 而另一个帐户则不允许使用 ssh 是没有意义的。这是我会做的:
- 为 root 启用 ssh,仅允许使用 ssh 密钥进行访问,而不允许使用密码
- 创建一个仅用于您的特定命令的新密钥
- 将密钥和需要执行的命令放在
authorized_keys
root 中,以便一旦与该密钥建立连接,就会启动该命令。
这是安全的,因为这样调用者就不能拥有 shell 也不能执行任何其他命令(即使他提供了一个命令)。
您可以在此处查看示例:https://stackoverflow.com/questions/402615/how-to-restrict-ssh-users-to-a-predefined-set-of-commands-after-login与command=
语法。如果您使用证书而不是密钥,您还可以通过将命令嵌入到证书中来执行相同的操作,或者使用配置选项全局执行此操作ForceCommand
看http://larstobi.blogspot.com/2011/01/restrict-ssh-access-to-one-command-but.html另一个例子(这说明您需要考虑命令的参数)
答案4
要添加到 Archemar 的答案中,sudo
请输入正在运行的用户的密码sudo
,而不是运行命令的用户的密码。您说“admin”和“root”帐户已“链接”并共享相同的密码。如果您基于sudo
接受“admin”帐户的密码(并且sudo
当“admin”的密码更改时密码接受更改)得出此结论,则这是 的正常行为sudo
。