ubuntu中没有配置时,Ubuntu Server 12.04的AWS映像上的sudo用户如何对所有命令都使用无密码的/etc/sudoers?我想要添加一个行为与默认Ubuntu用户相同的新用户。具体来说,我想为这个新用户提供无密码的sudo

所以我添加了一个新用户,然后编辑了/etc/sudoers(当然使用visudo)。通过读取该文件,似乎默认的ubuntu用户已成为sudo组的成员而获得了无密码的admin。所以我添加了新用户。哪个没有用。然后,我尝试将NOPASSWD指令添加到sudoers。这也没有用。

无论如何,现在我很好奇。如果ubuntu用户未在/etc/sudoers中定义,则如何获得无密码特权。允许这样做的机制是什么?

评论

相关:不使用密码执行sudo吗?

#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
13年2月14日在20:40

新的sudo规则将用于每个新登录的用户-因此您至少需要重新登录

– bluszcz
13年2月27日在10:17

'sudo服务sudo restart'的工作:)

– Laice
2013年6月11日在2:23



在更高版本(例如14.04)中,包含的文件是/etc/sudoers.d/90-cloud-init-users(以便进行编辑。.sudo visudo -f /etc/sudoers.d/90-cloud-init-users )。尽管创建其他文件比编辑生成的文件更干净。请注意,包含的文件。或以〜结尾的内容将不包括在内。

– Molomby
15年8月27日在5:29

@ Phil_1984_最有可能的是,它被添加为注释,以允许与其他(标准?)版本的sudo兼容,该版本不允许包含,但不会被奇怪的注释绊倒。 (标准很难!;-)

– jpaugh
16年11月23日14:39



#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

,对于需要sudo访问的每个用户,不使用密码:
# 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

(在旧版本的ubuntu上,可能需要):
sudo adduser <user> sudo

就这样!
编辑:您可能必须添加管理组,因为我认为默认情况下不存在该管理组。
sudo adduser <user> admin

还可以添加默认组通过以下命令将AWS ubuntu用户添加到admin组: br />

评论


自我注意:这是一种惯例,可以将限制较少的权限降低到堆栈中的较低位置。但是不这样做不会影响功能。

– poweratom
2014年9月5日在9:47

正如jiminikiz解释的那样,我必须在我的Ubuntu GNOME 16.04 LTS上的%sudo之后放置%admin。另外,我的Ubuntu上的管理员组ID完全不是admin,而是adm。无需重新启动。

– hata
17-10-26在10:52



#3 楼

我将在/etc/sudoers.d/目录下创建自己的文件-如果进行任何更新,Amazon Cloud创建的文件可能会被覆盖。在/etc/sudoers.d中创建文件后,添加此条目,

<your user name> ALL=(ALL) NOPASSWD:ALL


重新引导系统,这将起作用。

#4 楼

不使用任何编辑器的简短答案(在bash上测试,在远程主机上执行非常冒险)。

配置sudo以在不使用当前用户密码的情况下工作: class =“ lang-bash prettyprint-override”> echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee -a /etc/sudoers

使用以下方法检查编辑:

 sudo visudo -c
 


验证是否可以在没有密码的情况下使用sudo:

 sudo cat /etc/sudoers | grep "$USER"
 


...或简单地尝试:

 sudo <anything> 


评论


这是非常危险的建议...复制并粘贴错误的内容,您将无法使用自己的服务器。因此建议使用visudo。在保存到磁盘之前,它将检查语法是否正确。因此,对于任何想要使用此功能的人。不要在您关心的远程服务器上执行此操作。您可能要在答案中包含有关此内容的警告。

–aychedee
2014年8月14日9:25



不使用visudo是一个可怕的想法。相信我,我知道。

– gn
2015年9月9日在17:22

恕我直言,复制粘贴比手动编辑更安全。略作简化:echo“ $ USER ALL =(ALL)NOPASSWD:ALL” | sudo tee -a / etc / sudoers

–theartofrain
16-4-5在23:56



@theartofrain-通常,我会同意,但是visudo特别适合不允许您破坏sudoers文件,从而不会将您锁定在计算机之外(或至少是sudo)。

–乔恩五世
17 Mar 15 '17 2:43

@JonV您也可以通过visudo失去管理员权限,但通常不会偶然,因为visudo只保存根据sudoers文件的语法正确形成的更改。大多数错误在语法上都是错误的,因此它们不会对visudo造成伤害。如果/ etc / sudoers或/etc/sudoers.d中的文件格式错误,sudo拒绝将任何人的特权提升作为安全措施,这就是为什么不使用visudo的危险。 (尽管有时pkexec可以在不重新启动的情况下对其进行修复。)

– Eliah Kagan
17年9月28日在12:29

#5 楼

在研究这一点时,我意识到/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被添加到foosudo组中。
主目录设置为/home/foo
将外壳设置为/bin/bash
删除fooroot的密码。
sed命令对/etc/sudoers文件进行内联更新,以允许fooroot用户无密码访问sudo
sed命令禁用#includedir指令,该指令将允许子目录中的任何文件覆盖这些内联更新。