当没有配置时,ubuntu
Ubuntu Server 12.04 的 AWS 映像上的用户如何实现所有命令均无密码?sudo
/etc/sudoers
我在 Amazon 上使用 Ubuntu 服务器 12.04。我想添加一个具有与默认 Ubuntu 用户相同行为的新用户。具体来说,我希望sudo
这个新用户无需密码。
所以我添加了一个新用户并开始编辑/etc/sudoers
(当然使用 visudo)。从阅读该文件来看,似乎默认用户作为该组的成员ubuntu
无需密码。所以我将我的新用户添加到其中。但这没有用。然后我尝试将指令添加到。但这也没有用。sudo
admin
NOPASSWD
sudoers
ubuntu
无论如何,现在我只是很好奇。如果未在 中定义无密码权限,用户如何获得无密码权限/etc/sudoers
。允许这样做的机制是什么?
答案1
好吧,我找到了答案,所以不妨把它放在这里以保证完整性。最后/etc/sudoers
有一条我认为只是评论的内容:
#includedir /etc/sudoers.d
但是这实际上包括了该目录的内容。里面是文件
/etc/sudoers.d/90-cloudimg-ubuntu
。其中包含预期的内容
# ubuntu user is default user in cloud-images.
# It needs passwordless sudo functionality.
ubuntu ALL=(ALL) NOPASSWD:ALL
这就是默认 ubuntu 用户的 sudo 配置所在的位置。
您应该使用 visudo 编辑此文件。以下命令将允许您使用 visudo 编辑正确的文件。
sudo visudo -f /etc/sudoers.d/90-cloudimg-ubuntu
并添加如下一行:
aychedee ALL=(ALL) NOPASSWD:ALL
在最后。
答案2
我发现,为了轻松地在多台服务器上复制此行为,最直接的做法如下:
sudo visudo
更改此行:
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
到这一行:
# Members of the admin group may gain root privileges
%admin ALL=(ALL) NOPASSWD:ALL
并移动它在下面这行:
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
你现在应该有这个:
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) NOPASSWD:ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
然后对于每个需要 sudo 访问的用户使用密码:
sudo adduser <user> sudo
对于每个需要 sudo 访问权限的用户无需密码:
sudo adduser <user> admin
(在旧版本的 ubuntu 上,您可能需要):
sudo service sudo restart
就是这样!
编辑:您可能必须添加管理员组,因为我认为它默认不存在。
sudo groupadd admin
您还可以通过以下命令将默认 AWSubuntu
用户添加到组中:admin
sudo usermod ubuntu -g admin
注:如@哈塔如上所述,您可能需要使用它adm
作为管理员组名称,具体取决于所使用的 Ubuntu 版本。
答案3
我将在 /etc/sudoers.d/ 目录下创建自己的文件 - 如果有任何更新,Amazon Cloud 创建的文件可能会被覆盖。在 /etc/sudoers.d 中创建文件后,添加此条目,
<your user name> ALL=(ALL) NOPASSWD:ALL
重新启动系统即可。
答案4
当我研究这个问题时,我意识到/etc/sudoers
文件中有一行不是注释,而是指示这使得目录下的任何文件或文件/etc/sudoers/*
夹覆盖的内容/etc/sudoers
。
这是一个很狡猾的小指令,因为乍一看它似乎是一行注释。它看起来像这样:
#includedir /etc/sudoers.d
这是我在临时 Docker 映像中实现非 root、无密码用户的方法,该映像用于 CICD 管道,其基础映像为ubuntu:18.04
:
RUN \
useradd -U foo -m -s /bin/bash -p foo -G sudo && passwd -d foo && passwd -d root && \
sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
sed -i /etc/sudoers -re 's/^#includedir.*/## Removed the #include directive! ##"/g' && \
echo "Customized the sudoers file for passwordless access!" && \
echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
echo "root ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
echo "foo user:"; su foo -c 'whoami && id' && \
echo "root user:"; su root -c 'whoami && id'
上述代码会发生什么情况:
- 用户和组
foo
已创建。 - 该用户
foo
被添加到foo
和sudo
组中。 - 主目录设置为
/home/foo
。 - 外壳设置为
/bin/bash
。 foo
和的密码root
均被删除。- 该
sed
命令对文件进行内联更新,/etc/sudoers
以允许foo
用户root
无密码访问该sudo
命令。 - 该
sed
命令禁用#includedir
指令允许子目录中的任何文件覆盖这些内联更新。