sudo是什么
當我們?nèi)?zhí)行某個命令時,是切換用戶以另外一個用戶的身份運行。這個是在sudo文件中設(shè)定的另外一個發(fā)起人,這個發(fā)起人一般是管理員,并在文件中定義好發(fā)起人能夠運行的命令列表,之后就能臨時切換到發(fā)起人來執(zhí)行這些命令,這種授權(quán)機制就是sudo。其中sudo的配置文件位置在/etc/sudoers,可以使用專用命令visudo來編輯這個文件完成授權(quán)。
授權(quán)項語法:
root ALL=(ALL) ALL —— 管理員用任何人的權(quán)限執(zhí)行任何命令
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定義的能執(zhí)行的命令
使用visudoer命令來配置各種應(yīng)用場景
添加用戶fedora
[root@localhost ~]# useradd fedora
[root@localhost ~]# echo '112233' | passwd --stdin fedora
如果以普通用戶fedora運行useradd、userdel等命令會因沒有權(quán)限被拒絕
[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能以管理員身份執(zhí)行useradd,userdel命令
普通用戶fedora用sudo來執(zhí)行在配置中定義的命令
[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分鐘之內(nèi)同一賬號就不需再次驗證,超過5分鐘在執(zhí)行就會繼續(xù)要輸入密碼才能執(zhí)行。
我們現(xiàn)在來使用 %wheel ALL=(ALL) ALL的格式來定義組內(nèi)的用戶能以任何人的身份在任何主機上執(zhí)行任何命令。
賬號fedora添加附加組wheel
[root@localhost ~]# usermod -a -G wheel fedora
[root@localhost ~]# id fedora
uid=1002(fedora) gid=1002(fedora) groups=1002(fedora),10(wheel)
刪除之前定義的規(guī)則,添加新的組規(guī)則
[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以管理員身份執(zhí)行很多命令,那么執(zhí)行sudo su - root命令時能以root的身份切到root,此時sudo的能以管理員身份運行任何命令是很危險的,相當于有root權(quán)限了。解決此問題可以定義執(zhí)行sudo命令時可以執(zhí)行所有命令但不能用su就可以了。
修改剛剛的規(guī)則
[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執(zhí)行切換root了,但是執(zhí)行sudo passwd root命令可以直接修改管理員的登錄密碼,這是我們可以添加規(guī)則!/usr/bin/passwd root,不允許sudo執(zhí)行passwd命令時修改root賬戶的密碼。
配置規(guī)則
[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.
有些命令需要多次調(diào)用時,避免每次書寫復雜冗長的命令,可以把命令定義別名來調(diào)用。我們向多個用戶同時授權(quán)的時候,也可以把這些用戶定義別名。
清除之前的規(guī)則,添加新的規(guī)則
[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
#添加賬號,設(shè)置密碼
[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別名來配置規(guī)則
[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能執(zhí)行ip,useradd,userdel
每次用戶操作的時候都要輸入用戶密碼,只要在規(guī)則的別名前面加一個標簽NOPASSWD就可以不需要密碼操作。每次需要用戶輸入密碼則加PASSWD。
修改規(guī)則
[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命令需要輸入密碼在執(zhí)行