sudo 是一个在 Linux 系统中用于执行特权命令的超级用户工具。sudo 命令默认安装在大多数 Linux 发行版中,它可以允许用户以 root 用户权限执行某些命令,只需在 linux 系统 /etc/sudoers 文件中配置用户和组执行 sudo 命令的权限,root 用户默认配置 sudo 权限。
利用 sudo 实现授权 #
sudo 介绍 #
sudo: superuser do
sudo 是允许普通用户执行一些或全部的root命令的一个工具,如:halt,reboot,su等。
这样可以减少系统对root账户的依赖,使root不必经常在线,从而可以提高系统安全性,在最早之前,一般用户管理系统的方式是利用su切换成为超级管理员,但是,使用su切换,必须要先知道root用户的密码。
sudo 于1980年前后推出,sudo 使一般用户不需要知道root 用户的密码即可获得权限。
root 用户将普通用户的名字,可以执行的特定命令,按照哪种用户或用户组的身份执行等信息,登记在特殊文件中(通常是 /etc/sudoers),即完成对该用户的授权(此时此用户被称为 sudoer),在一般用户需要取得特殊权限时,其可在命令前加上 sudo,此时sudo会询问该用户自己的密码(以确定是当前用户在操作),回答后系统即会将该命令的进程以root用户的权限运行,之后的一段时间内(默认5分钟(redhat 系列),可在/etc/sudoers 中自定义),使用sudo 不需要再次输入密码,由于不需要root 用户密码,部份unix 系统甚至利用 sudo 使一般用户取代root用户作为管理员账号,例如:Ubuntu,Mac OS X等。
sudo特性
- sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
- sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器
- sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票
- sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0440
sudo 组成 #
软件包
[root@ubuntu ~]# dpkg -l sudo
配置文件
#主配置文件
/etc/sudo.conf
#授权规则配置文件
/etc/sudoers
/etc/sudoers.d/*
审计文件
/var/db/sudo
/var/log/auth.log
工具命令
#安全编辑授权规则文件和语法检查工具
/usr/sbin/visudo
#授权编辑规则文件的工具
/usr/bin/sudoedit
#执行授权命令
/usr/bin/sudo
#语法检查
visudo -c
visudo -f /etc/sudoers.d/test
sudo 命令 #
sudo [options...] [command]
sudo [options...] file...
#常用选项
-b|--background #在后台执行
-B|--bell #响铃
-E|--preserve-env #继承当前环境变量
-e|--edit filename... #编辑文件
-g|--group=group #以指定组执行
-H|--set-home #指定切换用户的家目录
-h|--host=host #在指定主机上执行
-i|--login #直接登录
-K|--remove-timestamp #删除时间戳文件,则下次执行要重新输入密码
-k|--reset-timestamp #清除时间戳,则下次执行要重新输入密码
-l|--list #列出指定用户己配置的sudo规则,不指定用户则是查看当前登录用户
-p|--prompt=prompt #改变密码询问时的提示语句
-s|--shell #以指定shell来执行
-U|--other-user=user #配合-l使用,指定要查看的用户
-u|--user=user #指定要代表的用户,默认root
-V|--version #显示版本
-h|--help #显示帮助
-v|--validate #再延长密码有效期5分钟
sudo 授权规则配置 #
配置文件:
/etc/sudoers
/etc/sudoers.d/*
配置格式:
user host=(runas) [TAG:]command #授权user用户可以在host主机上以runas的身份执行command,TAG可为空
#可使用通配符
? #任意单个字符
* #任意长度字符
[abc] #匹配abc中的一个字符
[!abc] #匹配任意一个除abc之外的字符
\x #转义
[[alpha]] #字母
#user 和 runnas
userName #用户名
#uid #用户ID
%groupName #组名
%#gid #组ID
User_Alias #user别名
Runas_Alias #runas别名
#host
ip #ip地址
hostname #主机名
network/netmask #网段/子网掩码
Host_Alias #别名
#command
cmmand #具体命令
directory/* #某个目录下所有命令
sudoedit #sudoedit命令,有此命令就可以编辑sudo规则
Cmnd_Alias #命令别名
别名:
#类型
User_Alias|Runas_Alias|Host_Alias|Cmnd_Alias
#格式
Alias_Type NAME = item1, item2, ...
#别名名称由大写字母开始,后面接大写字母,数字,下划线
NAME = [A-Z]([A-Z][0-9]_)*
配置范例:
#指定IP或网段的写法,要求在对应主机上也有该配置
vxbus 10.0.0.158=(root) /bin/ls /root/
vxbus 10.0.0.0/24=(root) /bin/touch /root/from-vxbus
vxbus 10.0.0.157=(root) /sbin/shutdown -h now
visudo 实现语法检查
[root@ubuntu ~]# visudo
查看配置
#在10.0.0.158主机上查看配置
[root@ubuntu ~]# sudo -l
......
User root may run the following commands on rocky86:
(ALL) ALL
#查看指定用户
vxbus@ubuntu:~$ sudo -l -U vxbus
......
User vxbus may run the following commands on rocky86:
(root) /bin/ls /root/
(root) /bin/touch /root/from-vxbus
#该用户没有配置sudo规则
tom@ubuntu:~$ sudo -l
[sudo] password for tom:
Sorry, user tom may not run sudo on ubuntu.
#在10.0.0.157主机上查看
[root@ubuntu ~]# sudo -l -U vxbus
......
User vxbus may run the following commands on rocky86:
(root) /bin/touch /root/from-vxbus
(root) /sbin/shutdown -h now
#查看指定用户,alex是初始用户,属于sudo组
alex@ubuntu:~$ sudo -l
[sudo] password for alex:
Matching Defaults entries for alex on ubuntu:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty
User alex may run the following commands on ubuntu:
(ALL : ALL) ALL
默认sudo到root身份执行
vxbus@ubuntu:~$ sudo ls /root/
[sudo] password for vxbus:
0722 0920 ca.sh id_rsa.pub Music test
......
#五分钟内再次执行,则不需要输入密码
vxbus@ubuntu:~$ sudo touch /root/from-vxbus
指定执行用户
#配置
vxbus 10.0.0.158=(tom) /bin/ls /home/tom/
vxbus 10.0.0.159,10.0.0.158=(tom,jerry) /bin/touch /tmp/from-vxbus.txt
#查看
vxbus@ubuntu:~$ sudo -l
[sudo] password for vxbus:
......
User vxbus may run the following commands on rocky86:
(root) /bin/ls /root/
(root) /bin/touch /root/from-vxbus
(tom) /bin/ls /home/tom/
(tom, jerry) /bin/touch /tmp/from-vxbus.txt
#指定执行用户
vxbus@ubuntu:~$ sudo -u tom ls /home/tom/
from-vxbus test
vxbus@ubuntu:~$ sudo -u jerry touch /tmp/from-vxbus.txt
vxbus@ubuntu:~$ ll /tmp/from-vxbus.txt
-rw-r--r-- 1 jerry jerry 0 Sep 25 16:07 /tmp/from-vxbus.txt
id配置写法
#1011,#1012,%#1013,u2 ALL=(#0) /bin/cat /etc/shadow
%#1013,tom ALL=(%#0) /bin/cat /var/log/secure
tom@ubuntu:~$ id
uid=1012(tom) gid=1012(tom) groups=1012(tom)
tom@ubuntu:~$ sudo -l
......
User tom may run the following commands on ubuntu:
(#0) /bin/cat /etc/shadow #来源于用户ID配置
(%#0) /bin/cat /var/log/auth.log #来源于用户名配置
#组ID
u1@ubuntu:~$ id
uid=1013(u1) gid=1013(u1) groups=1013(u1)
u1@ubuntu:~$ sudo -l
[sudo] password for u1:
......
User u1 may run the following commands on ubuntu:
(#0) /bin/cat /etc/shadow #来源于用户组ID配置
(%#0) /bin/cat /var/log/auth.log #来源于用户组ID配
别名写法
User_Alias ANLMAL=tom,jerry,%vxbus,#1013,%#1014
Runas_Alias ROOT=root
Host_Alias LOCAL=rocky86,10.0.0.158
Cmnd_Alias CMD=/sbin/init *,/usr/bin/yum update
Cmnd_Alias SHUTDOWN=/sbin/shutdown -h now
ANLMAL LOCAL=(ROOT) CMD,SHUTDOWN
#来源于用户名 tom
tom@ubuntu:~$ id
uid=1012(tom) gid=1012(tom) groups=1012(tom)
tom@ubuntu:~$ sudo -l
[sudo] password for tom:
......
User tom may run the following commands on ubuntu:
(root) /sbin/init *, /usr/bin/yum update, /sbin/shutdown -h now
#来源于组名 vxbus
vxbus@ubuntu:~$ id
uid=1010(vxbus) gid=1010(vxbus) groups=1010(vxbus)
vxbus@ubuntu:~$ sudo -l
[sudo] password for vxbus:
......
User vxbus may run the following commands on ubuntu:
(root) /sbin/init *, /usr/bin/yum update, /sbin/shutdown -h now
#来源于用户ID 1013
u1@ubuntu:~$ id
uid=1013(u1) gid=1013(u1) groups=1013(u1)
u1@ubuntu:~$ sudo -l
[sudo] password for u1:
......
User u1 may run the following commands on ubuntu:
(root) /sbin/init *, /usr/bin/yum update, /sbin/shutdown -h now
#来源于组ID 1014
u2@ubuntu:~$ id
uid=1014(u2) gid=1014(u2) groups=1014(u2)
u2@ubuntu:~$ sudo -l
[sudo] password for u2:
......
User u2 may run the following commands on ubuntu:
(root) /sbin/init *, /usr/bin/yum update, /sbin/shutdown -h now
配置不需要密码验证
#不要密码,排除useradd
vxbus ALL=(root) NOPASSWD: /usr/sbin/,!/usr/sbin/useradd
vxbus@ubuntu:~$ id
uid=1010(vxbus) gid=1010(vxbus) groups=1010(vxbus)
vxbus@ubuntu:~$ sudo -l #不需要密码验证
......
User vxbus may run the following commands on ubuntu:
(root) NOPASSWD: /usr/sbin/, !/usr/sbin/useradd
#可执行userdel
vxbus@ubuntu:~$ userdel -h
Usage: userdel [options] LOGIN
vxbus@ubuntu:~$ touch abc
vxbus@ubuntu:~$ sudo touch xyz
vxbus@ubuntu:~$ ls
0910 09102 abc xyz
vxbus@ubuntu:~$ sudo ls
Sorry, user vxbus is not allowed to execute '/bin/ls' as root on rocky86.
指定默认切换账户
Defaults:vxbus runas_default=tom
vxbus ALL=(tom,jerry) ALL
vxbus@ubuntu:~$ sudo -l
[sudo] password for vxbus:
......
User vxbus may run the following commands on ubuntu:
(tom, jerry) ALL
#默认sudo 到 tom
vxbus@ubuntu:~$ sudo touch /tmp/from-vxbus
vxbus@ubuntu:~$ ll /tmp/from-vxbus
-rw-r--r-- 1 tom tom 0 Sep 29 08:39 /tmp/from-vxbus
#指定sudo 到 jerry
vxbus@ubuntu:~$ sudo -u jerry touch /tmp/from-vxbus-2
vxbus@ubuntu:~$ ll /tmp/from-vxbus-2
-rw-r--r-- 1 jerry jerry 0 Sep 29 08:41 /tmp/from-vxbus-2
配置排除规则
vxbus ALL=(root) /usr/sbin/,!/usr/sbin/useradd,!/usr/sbin/userdel
vxbus@ubuntu:~$ sudo -l
[sudo] password for vxbus:
......
User vxbus may run the following commands on ubuntu:
(root) /usr/sbin/, !/usr/sbin/useradd, !/usr/sbin/userdel
#没有权限执行
vxbus@ubuntu:~$ sudo useradd user1
Sorry, user vxbus is not allowed to execute '/sbin/useradd user1' as root on ubuntu.
配置中转规则
vxbus@ubuntu:~$ vim /etc/sudoers
tom ALL=(root) /usr/bin/cat /etc/shadow
vxbus ALL=(tom) /usr/bin/sudo /usr/bin/cat /etc/shadow
#执行
vxbus@ubuntu:~$ sudo -u tom sudo /usr/bin/cat /etc/shadow
配置bug
vxbus ALL=(root) NOPASSWD: /usr/bin/cat /var/log/message*
vxbus@ubuntu:~$ id
uid=1010(vxbus) gid=1010(vxbus) groups=1010(vxbus)
vxbus@ubuntu:~$ cat /var/log/messages
cat: /var/log/messages: Permission denied
vxbus@ubuntu:~$ sudo cat /var/log/messages | head -n 3
......
#bug,能打开其它文件
vxbus@ubuntu:~$ sudo cat /var/log/messages /etc/shadow
解决方案
vxbus ALL=(root) NOPASSWD: /usr/bin/cat /var/log/syslog*, !/usr/bin/cat /var/log/syslog* *
修改生命周期时长
[root@ubuntu ~]# sudo -V | grep time
......
Lecture user the first time they run sudo
Authentication timestamp timeout: 15.0 minutes #默认一次密码有效期15分钟
Password prompt timeout: 0.0 minutes
Path to authentication timestamp dir: /run/sudo/ts #sudo切换用户的认证时间记录文件
Type of authentication timestamp record: tty
Sudo log server timeout in seconds: 30
Path to the file that is created the first time sudo is run:
~/.sudo_as_admin_successful
#修改配置文件,添加如下行
[root@ubuntu ~]# vim /etc/sudoers
Defaults timestamp_timeout=2
#再次查看
[root@rocky86 ~]# sudo -V | grep timeout
Authentication timestamp timeout: 2.0 minutes
......
重置生命周期
vxbus@ubuntu:~$ sudo -l
[sudo] password for vxbus:
......
User vxbus may run the following commands on ubuntu:
(root) /usr/sbin/, !/usr/sbin/useradd, !/usr/sbin/userdel
#查看生命周期文件
[root@ubuntu ~]# ls -lh /run/sudo/ts/
total 8.0K
-rw------- 1 root vxbus 112 May 28 20:05 vxbus
-rw------- 1 root alex 168 May 28 17:59 alex
#删除文件
vxbus@ubuntu:~$ sudo -K
[root@ubuntu ~]# ls -lh /run/sudo/ts/
total 4.0K
-rw------- 1 root alex 168 May 28 17:59 alex
#再次sudo 则需要重输密码
vxbus@ubuntu:~$ sudo -l
[sudo] password for vxbus:
......
User vxbus may run the following commands on ubuntu:
(root) /usr/sbin/, !/usr/sbin/useradd, !/usr/sbin/userdel
#使用 -k 选项,一样也可以重置认证生命周期
vxbus@ubuntu:~$ sudo -k
vxbus@ubuntu:~$ sudo -l
[sudo] password for vxbus:
sudo 生命周期采用的是续命机制,如果认证有效期是2分钟,则只要在2分钟内执行一次 sudo 命令,就可以一直不用输入密码。