Linux下的/etc/sudoers文件的一些说明


Linux下的/etc/sudoers文件的一些说明

进入Ubuntu系统,用sudo命令的时候出现了下面的错误提示:
sudo: /etc/sudoers is mode 0540, should be 0440

觉得难以理解,怎么我怎么不能用 sudo 命令了,之前用得好好的呀,现在怎么这样了。

只好先切换成root用户:
$ su root

更改 /etc/sudoers 文件的属性:
# chmod 0440 /etc/sudoers
# chown root:root /etc/sudoers

再切回原先的用户,发现可以正常使用sudo了。

参考链接:
http://askubuntu.com/questions/50704/sudo-error-is-mode-0777-should-be-0440

sudo是linux下常用的允许普通用户使用超级用户权限的工具。

它的主要配置文件是 /etc/sudoers ,Linux系统通常位于 /etc 目录下,如果是solaris,缺省是不装 sudo的,编译安装后通常在安装目录的/etc目录下,不过不管sudoers文件在哪儿,sudo都提供了一个编辑该文件的命令:visudo来对该文件进行修改。强烈推荐使用该命令修改 sudoers 文件,因为它会帮你校验文件配置是否正确,如果不正确,在保存退出时就会提示你哪段配置出错的。

言归正传,下面介绍如何配置 /etc/sudoers 文件。

首先写sudoers的缺省配置:

#########################################################
# sudoers file.
#
# This file MUST be edited with the ‘visudo’ command as root.
#
# See the sudoers man page for the details on how to write a sudoers file.
#
# Host alias specification
# User alias specification
# Cmnd alias specification
# Defaults specification
# User privilege specification
root ALL=(ALL) ALL
# Uncomment to allow people in group wheel to run all commands
# %wheel ALL=(ALL) ALL

用户名主机 权限 命令列表    #权限默认省略,不用指定
# Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
# Samples
# %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users localhost=/sbin/shutdown -h now
#########################################################

1. 最简单的配置,让用户support具有root的所有权限

执行visudo之后,可以看见缺省只有一条配置:
root ALL=(ALL) ALL
那么你就在下边再加一条配置:
support ALL=(ALL) ALL
这样,普通用户support就能够执行root权限的所有命令
以support用户登录之后,执行:
sudo su –
然后输入support用户自己的密码,就可以切换成root用户了

2. 让用户support只能在某几台服务器上,执行root能执行的某些命令
首先需要配置一些Alias,这样在下面配置权限时,会方便一些,不用写大段大段的配置。Alias主要分成4种:
  1. Host_Alias
  2. Cmnd_Alias
  3. User_Alias
  4. Runas_Alias
1) 配置Host_Alias:就是主机的列表
Host_Alias HOST_FLAG = hostname1, hostname2, hostname3
2) 配置Cmnd_Alias:就是允许执行的命令的列表
Cmnd_Alias COMMAND_FLAG = command1, command2, command3
3) 配置User_Alias:就是具有sudo权限的用户的列表
User_Alias USER_FLAG = user1, user2, user3
4) 配置Runas_Alias:就是用户以什么身份执行(例如root,或者oracle)的列表
Runas_Alias RUNAS_FLAG = operator1, operator2, operator3
5) 配置权限
配置权限的格式如下:
USER_FLAG HOST_FLAG=(RUNAS_FLAG) COMMAND_FLAG
==
如果不需要密码验证的话,则按照这样的格式来配置
USER_FLAG HOST_FLAG=(RUNAS_FLAG) NOPASSWD: COMMAND_FLAG
配置示例:
#########################################################
# sudoers file.
#
# This file MUST be edited with the ‘visudo’ command as root.
#
# See the sudoers man page for the details on how to write a sudoers file.
#
# Host alias specification
Host_Alias EPG = 192.168.1.1, 192.168.1.2
# User alias specification
# Cmnd alias specification
Cmnd_Alias SQUID = /opt/vtbin/squid_refresh, /sbin/service, /bin/rm
# Defaults specification
# User privilege specification
root ALL=(ALL) ALL
support EPG=(ALL) NOPASSWD: SQUID
# Uncomment to allow people in group wheel to run all commands
# %wheel ALL=(ALL) ALL
# Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
# Samples
# %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users localhost=/sbin/shutdown -h now
===========================================
/etc/sudoers | inotseeyou http://inotseeyou.com/2011/04/02/etcsudoers/
===========================================
例子:
jorge ALL=(root) /usr/bin/find, /bin/rm
  上面的第一栏规定它的适用对象:用户或组,就本例来说,它是用户jorge。此外,因为系统中的组和用户可以重名,要想指定该规则的适用对象是组而非用户的话,组对象的名称一定要用百分号%开头。
  第二栏指定该规则的适用主机。当我们在多个系统之间部署sudo环境时,这一栏格外有用,这里的ALL代表所有主机。但是,对于桌面系统或不想将sudo部署到多个系统的情况,这一栏就换成相应的主机名。
  第三栏的值放在括号内,指出第一栏规定的用户能够以何种身份来执行命令。本例中该值设为root,这意味着用户jorge能够以root用户的身份来运行后面列出的命令。该值也可以设成通配符ALL,jorge便能作为系统中的任何用户来执行列出的命令了。
  最后一栏(即/usr/bin/find,/bin/rm)是使用逗号分开的命令表,这些命令能被第一栏规定的用户以第三栏指出的身份来运行它们。本例中,该配置允许jorge作为超级用户运行/usr/bin/find和 /bin/rm这两个命令。需要指出的是,这里列出的命令一定要使用绝对路径。

对 Linux 有一定了解的人多少也会知道点关于sudo命令。

sudo命令的核心思想是权限的赋予,即某个命令的所属用户不是你自己,而你却有权限执行它。但是我们需要注意的是,虽然你有权限执行这个命令,但是在执行的时候却仍是以这个命令本身所属用户来完成的[注释]。(su命令类似sudo命令,但是两者的差别在于前者su是一个粗粒度权限赋予,

对su最好的理解我觉得是 change user running command permanent 。即永久的切换到了su过去的用户,然后以这个su到的新用户干它能干的一切事情,而 sudo 则是指在执行某个命令的时候临时切换到这个命令的所属用户执行[注释],而且sudo可以做到以单个命令为单位将权限赋予给其他用户,相比 su 显得更加灵活。)

大概了解了sudo的功能,那么你知道怎么配置 sudo 吗?下面来简要说明一下:

配置sudo的配置文件在/etc/sudoers里面,一般通过visudo命令来安全打开编辑。查看/etc/sudoers的用法可以使用命令: man 5 sudoers。在/etc/sudoers文件里面主要包括这两部分:

1. 别名设置
别名主要包括这几种:User_Alias,Host_Alias,Runas_Alias,Cmnd_Alias,分别是用户别名,主机别名,运行用户别名,命令别名。设置这几个别名的命令主要是为了配置方便,这个很类似Linux用户群组或是数据库中角色的作用,有了别名便可以批量的赋予权限。
设置方法:
Alias_Type alias_name = name1, name2, name3
例如:
User_Alias User1 = user1, user2, user3
其他类型的alias设置方法类似。
2. 真正的sudo entry
这个就是真正配置哪些用户可以使用哪些命令了(你甚至可以不使用别名设置那部分)。
格式为:用户名(用户别名) 主机名(主机别名)=[(运行用户或是Runas_Alias)可选] [tag可选]  可以执行的命令(或Cmmd_Alias)
这样描述语法很生硬,不易理解,举例子:
user1  host1 = /bin/kill  # user1 可以在host1上使用命令/bin/kill
user1  host1 = NOPASSWD: /bin/kill  # user1 可以在host1上使用命令/bin/kill 同时可以不必输入密码(这里就是使用了NOPASSWD,这个tag,默认是PASSWD)
user1  host1 = NOPASSWD: /bin/kill , PASSWORD: /bin/ls  # user1 可以在host1上使用命令/bin/kill无需输入密码,但是使用/bin/ls则需要输入密码
user1  host1 = (opterator) /bin/kill  # user1 可以在host1上使用命令/bin/kill但是必须是以operator用户运行这个命令,等价于 su -u opertor /bin/kill
user1  host1 = (:group_name) /bin/kill  # user1 可以在host1上使用命令/bin/kill,且必须以group_name这个用户群组里面的用户来运行。
%group_name host1 = /bin/kill  # 所有group_name里面的用户都可以在host1上执行/bin/kill(linux中一般代表整个用户群组用%group_name)

再举个实际例子,我之前对 sudo su 这个命令不理解,为什么我可以直接就 su 到 root 用户了呢,连密码都不需要?查看了一下 /etc/sudoers 文件才知道原来里面有这么一行:

xxx ALL=NOPASSWD: /bin/su

注释:
在Linux中每个进程都是有与之相关的UID/GID,分为有效UID,真实UID,有效GID,真实GID。有效UID,GID是用来判断权限,而真实UID,GID是用来记账(哪个进程属于哪个用户,或记录日志等等)。当配置了sudo entry后,有效UID里面就包含了这个被配置的用户UID,因而权限验证的时候就可以通过。

参考文章:
  • Linux技术管理手册
  • Unix高级环境编程
  • man sudoers
Tips小结
:w !sudo tee %    #在Vim中保存对只读文件作出的修改
, ,

《 “Linux下的/etc/sudoers文件的一些说明” 》 有 6 条评论

  1. 在 Linux 中设置 sudo 的十条 sudoers 实用配置
    https://linux.cn/article-8145-1.html
    `
    1、 设置一个安全的 PATH 环境变量
    2、 允许 tty 用户会话使用 sudo
    3、 使用 pty 运行 sudo 命令
    4、 创建 sudo 日志文件
    5、 记录 sudo 命令的输入/输出
    6、 为 sudo 用户提示命令用法
    7、 输入错误的 sudo 密码是显示自定义信息
    8、 增加 sudo 密码尝试限制次数
    9、 在输错密码时让 sudo 羞辱用户
    10、了解 su 与 sudo 的差异以及如何配置 sudo
    `

  2. sudo -A ignoring my SUDO_ASKPASS variable
    https://askubuntu.com/questions/1333850/sudo-a-ignoring-my-sudo-askpass-variable
    `
    -A, –askpass
    Normally, if sudo requires a password, it will read it from the user’s terminal. If the -A (askpass) option is specified, a (possibly graphical) helper program is executed to read the user’s password and output the password to the standard output. If the SUDO_ASKPASS environment variable is set, it specifies the path to the helper program. Otherwise, if sudo.conf(5) contains a line specifying the askpass program, that value will be used. For example:
    # Path to askpass helper program
    Path askpass /usr/X11R6/bin/ssh-askpass
    If no askpass program is available, sudo will exit with an error.

    通常,如果sudo需要密码,它将从用户的终端读取密码。如果指定了 -A(askpass) 选项,将执行一个(可能是图形化的)辅助程序来读取用户的密码并将密码输出到标准输出。如果设置了 SUDO_ASKPASS 环境变量,它将指定辅助程序的路径。否则,如果sudo.conf(5)包含一行指定askpass程序,则将使用该值。
    `

    Using sudo with Python script
    https://stackoverflow.com/questions/13045593/using-sudo-with-python-script

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注