Linux下的/etc/sudoers文件的一些说明
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了。
参考链接:
它的主要配置文件是 /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能执行的某些命令
- Host_Alias
- Cmnd_Alias
- User_Alias
- Runas_Alias
1) 配置Host_Alias:就是主机的列表
2) 配置Cmnd_Alias:就是允许执行的命令的列表
3) 配置User_Alias:就是具有sudo权限的用户的列表
4) 配置Runas_Alias:就是用户以什么身份执行(例如root,或者oracle)的列表
5) 配置权限
配置示例:
# 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
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. 别名设置
设置方法:
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 条评论
在 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
`
有研究者公开了一个前两周的 Linux Sudo get_process_ttyname()(CVE-2017-1000367:Sudo本地提权漏洞) 漏洞的 Exploit
https://xianzhi.aliyun.com/forum/read/1640.html
http://seclists.org/oss-sec/2017/q2/470
https://github.com/c0d3z3r0/sudo-CVE-2017-1000367
sudo相关的一些问题
https://stackoverflow.com/questions/tagged/sudo?sort=votes&pageSize=15
https://stackoverflow.com/questions/21659637/how-to-fix-sudo-no-tty-present-and-no-askpass-program-specified-error
Sudoers Manual
https://www.sudo.ws/man/sudoers.man.html
Sudo 1.6.x<=1.6.9p21 and 1.7.x<=1.7.2p4 Local Privilege Escalation (包括 exp 和 漏洞测试环境)
https://github.com/t0kx/privesc-CVE-2010-0426
替换linux系统文件/etc/passwd的字段获取真正的root权限
http://www.cnblogs.com/KevinGeorge/p/9685815.html
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