sudo是什么
当我们去执行某个命令时,是切换用户以另外一个用户的身份运行。这个是在sudo文件中设定的另外一个发起人,这个发起人一般是管理员,并在文件中定义好发起人能够运行的命令列表,之后就能临时切换到发起人来执行这些命令,这种授权机制就是sudo。其中sudo的配置文件位置在/etc/sudoers,可以使用专用命令visudo来编辑这个文件完成授权。
授权项语法:
root ALL=(ALL) ALL —— 管理员用任何人的权限执行任何命令
users hosts=(runas) command —— users能够以runas的身份运行commands命令
其中users能够代表以下几种类型:
username —— 用户名
#uid —— 用户名id
%groupname —— 组名
%#gid —— 组名id
user_alias —— 用户别名
user_alias用户别名定义时必须使用全大写字符,可以定义为User_Alias、Host_Alias、Runas_Alias、Cmnd_Alias这些,User_Alias代表新建一个组,把几个用户归并为一个组,Cmnd_Alias表示把命令定义别名。
sudo的一些命令:
sudo -k —— 忘记此前的登录信息
sudo -l —— 列出sudo定义的能执行的命令
使用visudoer命令来配置各种应用场景
添加用户fedora
[root@localhost ~]# useradd fedora
[root@localhost ~]# echo '112233' | passwd --stdin fedora
如果以普通用户fedora运行useradd、userdel等命令会因没有权限被拒绝
[root@localhost ~]# su - fedora
[fedora@localhost ~]$ useradd user1
-bash: /usr/sbin/useradd: Permission denied
用visudo编辑sudo配置文件,让fedora能运行useradd、userdel命令
[root@localhost ~]# visudo
fedora ALL=(ALL) /usr/sbin/useradd,/sbin/userdel
#用户fedora能以管理员身份执行useradd,userdel命令
普通用户fedora用sudo来执行在配置中定义的命令
[root@localhost ~]# su - fedora
Last login: Wed Jul 4 02:16:41 EDT 2018 on pts/0
[fedora@localhost ~]$ sudo useradd user1
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for fedora:
#第一次使用sudo命令会要验证登录才能使用
[fedora@localhost ~]$ id user1
uid=1003(user1) gid=1003(user1) groups=1003(user1)
#成功添加了user1账号
[fedora@localhost ~]$ sudo userdel user1
[fedora@localhost ~]$ id user1
id: user1: no such user
#成功删除了user1账号
[fedora@localhost ~]$ sudo -l
。。。
(ALL) /usr/sbin/useradd, /sbin/userdel
#此时用-l选项可以查看fedora账户定义的两条sudo命令
第一次使用sudo命令会验证su账号的密码才能使用,后5分钟之内同一账号就不需再次验证,超过5分钟在执行就会继续要输入密码才能执行。
我们现在来使用 %wheel ALL=(ALL) ALL的格式来定义组内的用户能以任何人的身份在任何主机上执行任何命令。
账号fedora添加附加组wheel
[root@localhost ~]# usermod -a -G wheel fedora
[root@localhost ~]# id fedora
uid=1002(fedora) gid=1002(fedora) groups=1002(fedora),10(wheel)
删除之前定义的规则,添加新的组规则
[root@localhost ~]# visudo
%wheel ALL=(ALL) /usr/sbin/useradd,/sbin/userdel
wheel组中的fedora也可以使用sudo命令
[root@localhost ~]# su - fedora
[fedora@localhost ~]$ sudo -l
(ALL) /usr/sbin/useradd, /sbin/userdel
#看到有两条命令可以用
[fedora@localhost ~]$ sudo useradd user1
[fedora@localhost ~]$ sudo userdel user1 -r
之前介绍了能用sudo以管理员身份执行很多命令,那么执行sudo su - root命令时能以root的身份切到root,此时sudo的能以管理员身份运行任何命令是很危险的,相当于有root权限了。解决此问题可以定义执行sudo命令时可以执行所有命令但不能用su就可以了。
修改刚刚的规则
[root@localhost ~]# visudo
%wheel ALL=(ALL) ALL,!/bin/su
#wheel组中的账户使用sudo能运行所有命令,但是不能运行su
切换到fedora后,在用sudo切换到root时失败
[root@localhost ~]# su - fedora
[fedora@localhost ~]$ sudo su -root
Sorry, user fedora is not allowed to execute '/bin/su -root' as root on localhost.localdomain.
虽然刚刚禁止sudo执行切换root了,但是执行sudo passwd root命令可以直接修改管理员的登录密码,这是我们可以添加规则!/usr/bin/passwd root,不允许sudo执行passwd命令时修改root账户的密码。
配置规则
[root@localhost ~]# visudo
%wheel ALL=(ALL) ALL,!/bin/su,!/usr/bin/passwd root
此时添加普通账号修改密码成功,但修改root密码失败
[fedora@localhost ~]$ sudo useradd user1
[fedora@localhost ~]$ sudo passwd user1
Changing password for user user1.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[fedora@localhost ~]$ sudo passwd root
Sorry, user fedora is not allowed to execute '/bin/passwd root' as root on localhost.localdomain.
有些命令需要多次调用时,避免每次书写复杂冗长的命令,可以把命令定义别名来调用。我们向多个用户同时授权的时候,也可以把这些用户定义别名。
清除之前的规则,添加新的规则
[root@localhost ~]# visudo
User_Alias USERADMIN=fedora,centos
#把两个账号定义别名
Cmnd_Alias NETADMINCMD=/usr/sbin/ip
#命令ip定义别名NETADMINCMD
Cmnd_Alias USERADMINCMD=/usr/sbin/useradd,/sbin/userdel
#命令useradd和userdel定义别名USERADMINCMD
fedora ALL=(ALL) NETADMINCMD
#账户fedora能以任何人的身份运行NETADMINCMD中的命令
centos ALL=(ALL) NETADMINCMD,USERADMINCMD
#账户centos能以任何人的身份运行NETADMINCMD和USERADMINCMD中的命令
添加账号centos后,切换centos能看到两个别名中定义的ip、useradd、userdel。切换fedora能看到一个别名中定义的ip命令。
[root@localhost ~]# useradd centos
[root@localhost ~]# echo '112233' | passwd --stdin centos
#添加账号,设置密码
[root@localhost ~]# su - centos
[centos@localhost ~]$ sudo -l
(ALL) /usr/sbin/ip, /usr/sbin/useradd, /sbin/userdel
[centos@localhost ~]$ exit
[root@localhost ~]# su - fedora
[fedora@localhost ~]$ sudo -l
(ALL) /usr/sbin/ip
使用USERADMIN别名来配置规则
[root@localhost ~]# visudo
USERADMIN ALL=(ALL) NETADMINCMD,USERADMINCMD
#USERADMIN中的用户都可以使用NETADMINCMD,USERADMINCMD两个别名中定义的命令
[root@localhost ~]# su - fedora
[fedora@localhost ~]$ sudo -l
(ALL) /usr/sbin/ip, /usr/sbin/useradd, /sbin/userdel
#此时fedora能执行ip,useradd,userdel
每次用户操作的时候都要输入用户密码,只要在规则的别名前面加一个标签NOPASSWD就可以不需要密码操作。每次需要用户输入密码则加PASSWD。
修改规则
[root@localhost ~]# visudo
USERADMIN ALL=(ALL) NOPASSWD:NETADMINCMD,PASSWD:USERADMINCMD
[root@localhost ~]# su - fedora
[fedora@localhost ~]$ sudo -k #清除之前的登录信息
[fedora@localhost ~]$ sudo -l
(ALL) NOPASSWD: /usr/sbin/ip, PASSWD: /usr/sbin/useradd, /sbin/userdel
#显示ip不需密码,useradd、userdel需要密码
[fedora@localhost ~]$ sudo ip a l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:9d:a6:14 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.11/24 brd 192.168.10.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::ab0:a9:3e59:622a/64 scope link
valid_lft forever preferred_lft forever
#输入ip命令不需要密码
[fedora@localhost ~]$ sudo useradd user2
[sudo] password for fedora:
[fedora@localhost ~]$ id user2
uid=1005(user2) gid=1005(user2) groups=1005(user2)
#此时输入useradd命令需要输入密码在执行