我正在寻找正确设置我的 sudoers 文件,但我找到的文档似乎没有帮助。
我有一个用户,例如用户1
我有两台 Debian 服务器,服务器1和服务器2。
目前,我可以使用 SSH 从我的 Windows PC 连接到任一服务器,并在需要时执行sudo
以提升我的权限。
我现在需要能够从服务器1到服务器2在 shell 脚本中,并执行文件服务器2as sudo
,无需输入密码(在脚本中或手动输入)。
我知道我可以使用该sudoers
文件来执行此操作。
但我该怎么做呢?
在我的sudoers
文件中(在服务器2)我有:
# User privilege specification
root ALL=(ALL:ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
%user1 ALL=(ALL:ALL) ALL
我知道我可以做类似的事情:
%user1 ALL = NOPASSWD: /path/to/myscript
这将允许用户1运行脚本/路径/到/mysqcript无需输入密码。但是,当我从 Windows PC 连接时,除了运行脚本之外,这会阻止我执行其他任何操作吗?
理想情况下,我想将此NOPASSWD
功能限制为来自的连接服务器1。
我在这里错过了什么吗?我不愿意“测试”这些变化,以免我把自己完全锁在外面。
答案1
在得到真正的答案之前需要调整一件事。使用“%user1”意味着“人在团体user1”;您可能只想让“user1”表示 user1。
其次,sudo 不知道你在哪里登录从-- 仅在您当前运行 sudo 的地方。
第三,确保您使用“visudo”进行更改;它会尽力防止您犯语法错误。
第四,添加 sudoers 行只会增加您当前的访问权限;它不会阻止您运行其他脚本;如果这些脚本需要 sudo,那么您将需要更多 sudoers 条目。
答案2
您询问有关将功能限制为来自 的连接server1
。我会用 来做到这一点ssh
。修改用户的代码适用于Debian/Ubuntu。这些原则和大多数其他代码应该是相当通用的。进行此配置后,要在server2
from上执行脚本server1
,您将发出以下命令:
$ ssh -i ~/.ssh/script_identity.pub ruser@server2
上述命令将连接server2
并运行您的脚本,无需进一步干预ssh
或sudo
身份验证。公钥文件ssh
是在 上远程运行脚本的唯一访问权限server2
,从而使您能够决定哪些计算机和/或帐户可以通过 访问脚本ssh
。
下面的描述举例说明了完成这些任务的代码。
此配置需要 上的专用帐户server2
。有很多充分的理由,其中之一您已经提到过,您可能会被锁定server2
,或者更糟糕的是,无意中修改了工作帐户中的错误文件。
ssh
配置受限远程访问的步骤
在server1
- 从将执行脚本的帐户中
server1
,创建一个新的 ssh 密钥,该密钥仅用于执行远程脚本。 - 修改新的 ssh 公钥以限制仅执行一个命令(请参阅
command=
联机sshd
帮助页)。 - 制作一个打印用户 ID 和日期的测试脚本。
开server2
(所有操作都将在 远程完成server1
)
- 在 上创建一个新帐户
server2
。 - 将修改后的公共身份文件复制到
.ssh/authorized_keys
新用户的主目录中server2
。 - 将测试脚本复制到 上的新用户主目录
server2
。 - 检查新用户帐户中所有文件的所有权限和所有权。
代码
将以下脚本保存为ruser.sh
on 后server1
,并且在了解它将执行的操作后,发出以下命令来执行:
$ sh ./ruser.sh ruser server2
将此脚本保存ruser.sh
在您的用户帐户中system1
:
#!/bin/sh -e
#
# ruser.sh -- setup user on remote host for secure remote script execution
#
# This is for first time setup!
# Always use a new user on remote host.
#
USAGE="ERROR: Usage: sh $0 remote-username remote-hostname"
RUSER="${1:?$USAGE}"
RHOST="${2:?$USAGE}"
UNIQUE=$$
# build files that will be transferred to the remote host
# Make the new ssh key, and modify the public key so that
# it can only be used to execute "./rscript.sh"
ssh-keygen -N '' -f ~/.ssh/script_identity
sed -i '1 {
s,command="./rscript.sh",,
s,^,command="./rscript.sh" ,
}' ~/.ssh/script_identity.pub
# rscript.sh -- the only script that can be executed
# with the modified public key.
printf '%s' '(id;date) > rscript.out' > /tmp/rscript.sh.$$
# copy the new identity public key and rscript.sh to the remote host
scp ~/.ssh/script_identity.pub "${RHOST}":/tmp/script_identity.pub.${UNIQUE}
scp /tmp/rscript.${UNIQUE} "${RHOST}":/tmp/script_identity.pub.${UNIQUE}
# setup remote user for script execution
# Create new user
# Move identity file and script to new user's home directory.
# Fix ownership and permissions
ssh -t ${RHOST} "sudo /bin/sh -cex '
adduser --system --shell=/bin/sh ${RUSER};
mkdir -m0700 ~${RUSER}/.ssh;
mv /tmp/script_identity.pub.${UNIQUE} ~${RUSER}/.ssh/authorized_keys;
mv /tmp/rscript.sh.${UNIQUE} ~${RUSER}/rscript.sh
chmod -R 0600 ~${RUSER}/.ssh/;
chmod 0700 ~${RUSER}/.ssh/;
chmod 0700 ~${RUSER}/rscript.sh;
chown -R ${RUSER}:nogroup ~${RUSER}/;
'
"
# remove temp files
rm -rf /tmp/rscript.sh.${UNIQUE}
通过执行以下命令来测试上述配置server1
:
$ ssh -i ~/.ssh/script_identity.pub ruser@server2
ruser
然后检查on的主目录,server2
发现文件rscript.out
确实创建了,说明一切配置正确。
如果是这样,请修改ruser@server2:rscript.sh
以调用您的/path/to/myscript
.在修改 sudoers 文件之前,请再次发出 ssh 命令以再次运行远程脚本,以确保您的输出和错误输出按您想要的方式工作。
现在配置server2
sudoers 文件以允许该新用户server2
以 root 身份仅执行一个脚本而无需密码。
ruser ALL = NOPASSWD: /path/to/myscript
恭喜,您现在可以安全地远程运行特权脚本,无需密码ssh
或sudo
系统密码。