visudo使用方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
visudo与/etc/sudoers
从上面的说明我们可以知道,除了root 之外的其他账号,若想要使用sudo 执行属于root 的权限指令,则root 需要先使用visudo 去修改/etc/sudoers ,让该账号能够使用全部或部分的root 指令功能。
为什么要使用visudo 呢?这是因为/etc/sudoers 是有设定语法的,如果设定错误那会造成无法使用sudo 指令的不良后果。
因此才会使用visudo 去修改,并在结束离开修改画面时,系统会去检验/etc/sudoers 的语法就是了。
一般来说,visudo 的设定方式有几种简单的方法喔,底下我们以几个简单的例子来分别说明:
I. 单一用户可进行root 所有指令,与sudoers 文件语法:
假如我们要让vbird1 这个账号可以使用root 的任何指令,基本上有两种作法,第一种是直接透过修改/etc/sudoers ,方法如下:
[root@study ~]# visudo
....(前面省略)....
root ALL=(ALL) ALL <==找到这一行,大约在98 行左右
vbird1 ALL=(ALL) ALL <==这一行是你要新增的!
....(底下省略)....
有趣吧!其实visudo 只是利用vi 将/etc/sudoers 文件呼叫出来进行修改而已,所以这个文件就是/etc/sudoers 啦!这个文件的设定其实很简单,如上面所示,如果你找到98 行(有root 设定的那行) 左右,看到的数据就是:
使用者账号登入者的来源主机名=(可切换的身份) 可下达的指令
root ALL=(ALL) ALL <==这是默认值
上面这一行的四个组件意义是:
1.『使用者账号』:系统的哪个账号可以使用sudo 这个指令的意思;
2.『登入者的来源主机名』:当这个账号由哪部主机联机到本Linux 主机,意思是这个账号可能是由哪一部网络主机联机过来的,这个设定值可以指定客户端计算机(信任的来源的意思)。
默认值root 可来自任何一部网络主机
3.『(可切换的身份)』:这个账号可以切换成什么身份来下达后续的指令,默认root 可以切换成任何人;
4.『可下达的指令』:可用该身份下达什么指令?这个指令请务必使用绝对路径撰写。
预设root 可以切换任何身份且进行任何指令之意。
那个ALL 是特殊的关键词,代表任何身份、主机或指令的意思。
所以,我想让vbird1 可以进行任何身份的任何指令,就如同上表特殊字体写的那样,其实就是复制上述默认值那一行,再将root 改成vbird1 即可啊!此时『vbird1 不论来自哪部主机登入,他可以变换身份成为任何人,且可以进行系统上面的任何指令』之意。
修改完请储存后离开vi,并以vbird1 登入系统后,进行如下的测试看看:
[vbird1@study ~]$ tail -n 1 /etc/shadow <==注意!身份是vbird1
tail: cannot open `/etc/shadow' for reading: Permission denied
# 因为不是root 嘛!所以当然不能查询/etc/shadow
[vbird1@study ~]$ sudo tail -n 1 /etc/shadow <==透过sudo
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 vbird1: <==注意啊!这里输入的是『vbird1 自己的密码』
pro3:$6$DMilzaKr$OeHeTDQPHzDOz/u5Cyhq1Q1dy...:16636:0:99999:7:::
# 看!vbird1 竟然可以查询shadow !
注意到了吧!vbird1 输入自己的密码就能够执行root 的指令!所以,系统管理员当然要了解vbird1 这个用户的『操守』才行!否则随便设定一个用户,他恶搞系统怎办?另外,一个一个设定太麻烦了,能不能使用群组的方式来设定呢?参考底下的第二种方式吧。
II.利用wheel 群组以及免密码的功能处理visudo
我们在本章前面曾经建立过pro1, pro2, pro3 ,这三个用户能否透过群组的功能让这三个人可以管理系统?可以的,而且很简单!同样我们使用实际案例来说明:
[root@study ~]# visudo <==同样的,请使用root 先设定
....(前面省略)....
%wheel A LL=(ALL) ALL <==大约在106 行左右,请将这行的# 拿掉!
# 在最左边加上% ,代表后面接的是一个『群组』之意!改完请储存后离开
[root@study ~]# usermod -a -G wheel pro1 <==将pro1 加入wheel 的支持
上面的设定值会造成『任何加入wheel 这个群组的使用者,就能够使用sudo 切换任何身份来操作任何指令』的意思。
你当然可以将wheel 换成你自己想要的群组名。
接下来,请分别切换身份成为pro1 及pro2 试看看sudo 的运作。
[pro1@study ~]$ sudo tail -n 1 /etc/shadow <==注意身份是pro1
....(前面省略)....
[sudo] password for pro1: <==输入pro1 的密码喔!
pro3:$6$DMilzaKr$OeHeTDQPHzDOz/u5Cyhq1Q1dy...:16636:0:99999:7:::
[pro2@study ~]$ sudo tail -n 1 /etc/shadow <==注意身份是pro2
[sudo] password for pro2: <==输入pro2 的密码喔!
pro2 is not in the sudoers file. This incident will be reported.
# 仔细看错误讯息他是说这个pro2 不在/etc/sudoers 的设定中!
这样理解群组了吧?如果你想要让pro3 也支持这个sudo 的话,不需要重新使用visudo ,只要利用usermod 去修改pro3 的群组支持,让pro3 用户加入wheel 群组当中,那他就能够进行sudo 啰!好了!那么现在你知道为啥在安装时建立的用户,就是那个dmstai 预设可以使用sudo 了吗?请使用『id dmtsai 』看看,这个用户是否有加入wheel 群组呢?嘿嘿!了解乎?
Tips 从CentOS 7 开始,在sudoers 文件中,预设已经开放%wheel 那一行啰!以前的CentOS 旧版本都是没有启用的呢!
简单吧!不过,既然我们都信任这些sudo 的用户了,能否提供『不需要密码即可使用sudo 』呢?就透过如下的方式:
[root@study ~]# visudo <==同样的,请使用root 先设定
....(前面省略)....
%wheel A LL=(ALL) NOPASSWD: ALL <==大约在109 行左右,请将# 拿掉!
# 在最左边加上% ,代表后面接的是一个『群组』之意!改完请储存后离开
重点是那个NOPASSWD 啦!该关键词是免除密码输入的意思喔!
III. 有限制的指令操作:
上面两点都会让使用者能够利用root 的身份进行任何事情!这样总是不太好~如果我想要让用户仅能够进行部分系统任务,比方说,系统上面的myuser1 仅能够帮root 修改其他用户的密码时,亦即『当使用者仅能使用passwd 这个指令帮忙root 修改其他用户的密码』时,你该如何撰写呢?可以这样做:
[root@study ~]# visudo <==注意是root 身份
myuser1 ALL=(root) /usr/bin/passwd <==最后指令务必用绝对路径
上面的设定值指的是『myuser1 可以切换成为root 使用passwd 这个指令』的意思。
其中要注意的是:指令字段必须要填写绝对路径才行!否则visudo 会出现语法错误的状况发生!此外,上面的设定是有问题的!我们使用底下的指令操作来让您了解:
[myuser1@study ~]$ sudo passwd myuser3 <==注意,身份是myuser1
[sudo] password for myuser1: <==输入myuser1 的密码
Changing password for user myuser3. <==底下改的是myuser3 的密码喔!这样是正确的New password: Retype new password:
passwd: all authentication tokens updated successfully.
[myuser1@study ~]$ sudo passwd
Changing password for user root. <==见鬼!怎么会去改root 的密码?
恐怖啊!我们竟然让root 的密码被myuser1 给改变了!下次root 回来竟无法登入系统...欲哭无泪~怎办?所以我们必须要限制用户的指令参数!修改的方法为将上述的那行改一改先:[root@study ~]# visudo <==注意是root 身份
myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
在设定值中加上惊叹号『! 』代表『不可执行』的意思。
因此上面这一行会变成:可以执行『passwd 任意字符』,但是『passwd 』与『passwd root 』这两个指令例外!如此一来myuser1 就无法改变root 的密码了!这样这位使用者可以具有root 的能力帮助你修改其他用户的密码,而且也不能随意改变root 的密码!很有用处的!
IV. 透过别名建置visudo:
如上述第三点,如果我有15 个用户需要加入刚刚的管理员行列,那么我是否要将上述那长长的设定写入15 行啊?而且如果想要修改命令或者是新增命令时,那我每行都需要重新设定,很麻烦ㄟ!有没有更简单的方式?是有的!透过别名即可!我们visudo 的别名可以是『指令别名、帐户别名、主机别名』等。
不过这里我们仅介绍帐户别名,其他的设定值有兴趣的话,可以自行玩玩!
假设我的pro1, pro2, pro3 与myuser1, myuser2 要加入上述的密码管理员的sudo 列表中,那我可以创立一个帐户别名称为ADMPW 的名称,然后将这个名称处理一下即可。
处理的方式如下:
[root@study ~]# visudo <==注意是root 身份
User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
ADMPW ALL=(root) ADMPWCOM
我透过User_Alias 建立出一个新账号,这个账号名称一定要使用大写字符来处理,包括Cmnd_Alias(命令别名)、Host_Alias(来源主机名别名) 都需要使用大写字符的!这个ADMPW 代表后面接的那些实际账号。
而该账号能够进行的指令就如同ADMPWCOM 后面所指定的那样!上表最后一行则写入这两个别名(账号与指令别名),未来要修改时,我只要修改
User_Alias 以及Cmnd_Alias 这两行即可!设定方面会比较简单有弹性喔!
V. sudo 的时间间隔问题:
或许您已经发现了,那就是,如果我使用同一个账号在短时间内重复操作sudo 来运作指令的话,在第二次执行sudo 时,并不需要输入自己的密码!sudo 还是会正确的运作喔!为什么呢?第一次执行sudo 需要输入密码,是担心由于用户暂时离开座位,但有人跑来你的座位使用你的账号操作系统之故。
所以需要你输入一次密码重新确认一次身份。
两次执行sudo 的间隔在五分钟内,那么再次执行sudo 时就不需要再次输入密码了,这是因为系统相信你在五分钟内不会离开你的作业,所以执行sudo 的是同一个人!呼呼!真是很人性化的设计啊~^_^。
不过如果两次sudo 操作的间隔超过 5 分钟,那就得要重新输入一次你的密码了(注4)
VI. sudo 搭配su 的使用方式:
很多时候我们需要大量执行很多root 的工作,所以一直使用sudo 觉得很烦ㄟ!那有没有办法使用sudo 搭配su ,一口气将身份转为root ,而且还用用户自己的密码来变成root 呢?是有的!而且方法简单的会让你想笑!我们建立一个ADMINS 帐户别名,然后这样做:[root@study ~]# visudo
User_Alias ADMINS = pro1, pro2, pro3, myuser1
ADMINS ALL=(root) /bin/su -
接下来,上述的pro1, pro2, pro3, myuser1 这四个人,只要输入『sudo su - 』并且输入『自己的密码』后,立刻变成root 的身份!不但root 密码不会外流,用户的管理也变的非常方便!这也是实务上面多人共管一部主机时常常使用的技巧呢!这样管理确实方便,不过还是要强调一下大前提,那就是『这些你加入的使用者,全部都是你能够信任的用户』!。