sudo 命令把特定命令的执行权限赋予给指定用户,
这样既可保证普通用户能够完成特定的工作,也可以避免泄露 root 管理员密码。我们要做
的就是合理配置 sudo 服务,以便兼顾系统的安全性和用户的便捷性。sudo 服务的配置原
则也很简单—在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限。
sudo 命令用于给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务,格式
为“sudo [参数] 命令名称”。sudo 服务中可用的参数以及相应的作用如下 所示。
sudo 服务中的可用参数以及作用
-h 列出帮助信息
-l 列出当前用户可执行的命令
-u 用户名或 UID 值 以指定的用户身份执行命令
-k 清空密码的有效时间,下次执行 sudo 时需要再次进行密码验证
-b 在后台执行指定的命令
-p 更改询问密码的提示语
总结来说,sudo 命令具有如下功能:
➢ 限制用户执行指定的命令:
➢ 记录用户执行的每一条命令;
➢ 配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
➢ 验证密码的后 5 分钟内(默认值)无须再让用户再次验证密码。
当然,如果担心直接修改配置文件会出现问题,则可以使用 sudo 命令提供的 visudo 命令
来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改 sudoers 配置文件,还
可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。
只有root管理员才可以使用visudo命令编辑sudo服务的配置文件。
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
fff
"/etc/sudoers.tmp" 112L, 3733C written
visudo:>>> /etc/sudoers:syntax error 在行 112 附近<<<
现在做什么?
选项有:
重新编辑 sudoers 文件(e)
退出,不保存对 sudoers 文件的更改(x)
退出并将更改保存到 sudoers 文件(危险!)(Q)
现在做什么?
使用 visudo 命令配置 sudo 命令的配置文件时,其操作方法与 Vim 编辑器中用到的方法
一致,因此在编写完成后记得在末行模式下保存并退出。在 sudo 命令的配置文件中,按照下
面的格式将第 92 行(大约)填写上指定的信息:
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
[root@localhost ~]# visudo
90 ## Allow root to run any commands anywhere
91 root ALL=(ALL) ALL
92 jingpan ALL=(ALL) ALL
在填写完毕后记得要先保存再退出,然后切换至指定的普通用户身份,此时就可以用 sudo
-l 命令查看到所有可执行的命令了(下面的命令中,验证的是该普通用户的密码,而不是 root
管理员的密码,请读者不要搞混了):
[root@localhost ~]# su - jingpan
[jingpan@localhost ~]$ sudo -l
[sudo] password for jingpan:
匹配此主机上 jingpan 的默认条目:
!visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION
LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
用户 jingpan 可以在该主机上运行以下命令:
(ALL) ALL
接下来是见证奇迹的时刻!作为一名普通用户,是肯定不能看到 root 管理员的家目录
(/root)中的文件信息的,但是,只需要在想执行的命令前面加上 sudo 命令就可以了:
[root@localhost ~]# su - jingpan
[jingpan@localhost ~]$ pwd
/home/jingpan
[jingpan@localhost ~]$ ls /root
ls: 无法打开目录/root: 权限不够
[jingpan@localhost ~]$ sudo ls /root
[sudo] password for jingpan:
anaconda-ks.cfg c++ ff install.log.syslog linuxprobe test~ 公共的 视频 文档 音乐
backup.tar.gz c_plus install.log linux test testdir 模板 图片 下载 桌面
效果立竿见影!但是考虑到生产环境中不允许某个普通用户拥有整个系统中所有命令的
最高执行权(这也不符合前文提到的权限赋予原则,即尽可能少地赋予权限),因此 ALL 参
数就有些不合适了。因此只能赋予普通用户具体的命令以满足工作需求,这也受到了必要的
权限约束。如果需要让某个用户只能使用 root 管理员的身份执行指定的命令,切记一定要给
出该命令的绝对路径,否则系统会识别不出来。我们可以先使用 whereis 命令找出命令所对应
的保存路径,然后把配置文件第 99 行的用户权限参数修改成对应的路径即可:
[root@localhost ~]# whereis cat
cat: /bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@localhost ~]# visudo
90 ## Allow root to run any commands anywhere
91 root ALL=(ALL) ALL
92 jingpan ALL=(ALL) /bin/cat
"/etc/sudoers.tmp" 111L, 3755C written
在编辑好后依然是先保存再退出。再次切换到指定的普通用户,然后尝试正常查看某个
文件的内容,此时系统提示没有权限。这时再使用 sudo 命令就可以顺利地查看文件内容了:
[root@localhost ~]# su - jingpan
[jingpan@localhost ~]$ cat /etc/shadow
cat: /etc/shadow: 权限不够
[jingpan@localhost ~]$ sudo cat /etc/shadow
[sudo] password for jingpan:
root:$6$iQhIz9ya4lR1VzvM$9Hn6PpYxxgdeR.O1OIfCw/lCZF4el9BNSE3zZX7kFugLnQr5pzC07je9rV3a4amT3juPrsvQZeNyXDjgWo1yC/:17476:0:99999:7:::
bin:*:15980:0:99999:7:::
daemon:*:15980:0:99999:7:::
adm:*:15980:0:99999:7:::
lp:*:15980:0:99999:7:::
sync:*:15980:0:99999:7:::
shutdown:*:15980:0:99999:7:::
halt:*:15980:0:99999:7:::
mail:*:15980:0:99999:7:::
uucp:*:15980:0:99999:7:::
operator:*:15980:0:99999:7:::
games:*:15980:0:99999:7:::
gopher:*:15980:0:99999:7:::
ftp:*:15980:0:99999:7:::
nobody:*:15980:0:99999:7:::
dbus:!!:17476::::::
大家千万不要以为到这里就结束了,刘遄老师还有更压箱底的宝贝。不知大家是否发觉
在每次执行 sudo 命令后都会要求验证一下密码。虽然这个密码就是当前登录用户的密码,但
是每次执行 sudo 命令都要输入一次密码其实也挺麻烦的,这时可以添加 NOPASSWD 参数,
使得用户执行 sudo 命令时不再需要密码验证:
[root@localhost ~]# visudo
root ALL=(ALL) ALL
jingpan ALL=NOPASSWD: /bin/cat
这样,当切换到普通用户后再执行命令时,就不用再频繁地验证密码了,我们在日常工
作中也就痛快至极了。
[root@localhost ~]# su - jingpan
[jingpan@localhost ~]$ sudo cat /etc/shadow
root:$6$iQhIz9ya4lR1VzvM$9Hn6PpYxxgdeR.O1OIfCw/lCZF4el9BNSE3zZX7kFugLnQr5pzC07je9rV3a4amT3juPrsvQZeNyXDjgWo1yC/:17476:0:99999:7:::
bin:*:15980:0:99999:7:::
daemon:*:15980:0:99999:7:::
adm:*:15980:0:99999:7:::
lp:*:15980:0:99999:7:::
sync:*:15980:0:99999:7:::
shutdown:*:15980:0:99999:7:::
这样,当切换到普通用户后再执行命令时,就不用再频繁地验证密码了,我们在日常工作中也就痛快至极了。
[root@localhost ~]# visudo
root ALL=(ALL) ALL
jingpan ALL=(ALL) NOPASSWD: /sbin/poweroff,/bin/cat
[root@localhost ~]# su - jingpan
[jingpan@localhost ~]$ cat /etc/shadow
cat: /etc/shadow: 权限不够
[jingpan@localhost ~]$ sudo cat /etc/shadow
root:$6$iQhIz9ya4lR1VzvM$9Hn6PpYxxgdeR.O1OIfCw/lCZF4el9BNSE3zZX7kFugLnQr5pzC07je9rV3a4amT3juPrsvQZeNyXDjgWo1yC/:17476:0:99999:7:::
bin:*:15980:0:99999:7:::
daemon:*:15980:0:99999:7:::
adm:*:15980:0:99999:7:::
lp:*:15980:0:99999:7:::
sync:*:15980:0:99999:7:::
shutdown:*:15980:0:99999:7:::
halt:*:15980:0:99999:7:::
mail:*:15980:0:99999:7:::
uucp:*:15980:0:99999:7:::
operator:*:15980:0:99999:7:::
games:*:15980:0:99999:7:::
gopher:*:15980:0:99999:7:::
ftp:*:15980:0:99999:7:::
nobody:*:15980:0:99999:7:::
dbus:!!:17476::::::
usbmuxd:!!:17476::::::
rpc:!!:17476:0:99999:7:::
rtkit:!!:17476::::::
avahi-autoipd:!!:17476::::::
vcsa:!!:17476::::::
abrt:!!:17476::::::
rpcuser:!!:17476::::::
nfsnobody:!!:17476::::::
haldaemon:!!:17476::::::
ntp:!!:17476::::::
apache:!!:17476::::::
saslauth:!!:17476::::::
postfix:!!:17476::::::
gdm:!!:17476::::::
pulse:!!:17476::::::
sshd:!!:17476::::::
tcpdump:!!:17476::::::
jingpan:$6$cBJD8McW$2sMe0jCEzfiJQrZ3YJBYoDZl1CevSUdQOGCMBowutnCzMT2wLYxLGyXe0aMirroOw/FIE6Q..JqIVk8nYtihz1:17765:0:99999:7:::
radvd:!!:17476::::::
qemu:!!:17476::::::
nignx:!!:17478:0:99999:7:::
nginx:!!:17478:0:99999:7:::
test:$6$yYoRSvor$uxthWJNKczBKI87bEaaFSK64J9al9XUvcznTnYaEljmaePyXPnDdYytGyGxz57R9AElkbqsv4V1E/floTZruC/:17606:0:99999:7:::
andy:$6$.rqJslVj$.2iArZn.On57xhB4fytcqazluV5GokKrov5Ft6MR6kGFjKeU5nzia3wkJVQkv6lQKVPBUtDNBWBR9TF0gGVZb0:17759:0:99999:7:::
barry:$6$r/WmtLsY$0v5d9nrNBF.wuJGGGSEoLRfj3.M4CMPGwpYE2AoxV2gfJOk20ImEHuhQ7My4Mi4qeRrnuHqtlZfHVVAt/u3u80:17759:0:99999:7:::
carl:$6$Lv7tctKY$lLYBDSJ.bZkChUbsYnnbJWCpto4JSjj31lTZ/Mj06UUFGIhId5kAz6x31n2ZHSU/Q4rk2bi4yUAwO82iHgtpp1:17759:0:99999:7:::
duke:$6$nJwekHox$0nkucdzJkn/01OhtKDevUmrd3Ykq3axSYJ1xGiw5rYNRf4No9hi3BmZprahxWKaMWCbAZhNTr4exbULx68IYs0:17759:0:99999:7:::
eric:$6$WQGPly7.$XaR.vYocw.mkYJzSZT98BhzER8zgXagyFGKk.c4dOWvYGiBVFrsCJQCOBZRX53UV.1z2CZ4WIm05Ad.STjtpR0:17759:0:99999:7:::
george:$6$8MLh/lq1$VopeMkYnd8khHZfPILQoXlgxgDqn6Nnk/.2B4dNgNMaFTu8SABn8m0wtuXIHYoBDovPzOeTbKKNAXDrOcRLHK1:17759:0:99999:7:::
john:!!:17765:0:99999:7:::
[jingpan@localhost ~]$ poweroff
poweroff: Need to be root
[jingpan@localhost ~]$ sudo poweroff
Broadcast message from root@localhost.localdomain
(/dev/pts/0) at 16:32 ...
The system is going down for power off NOW!