📄 linux 系统中的超级权限的控制 linuxsir_org.htm
字号:
注:定义主机别名HT01,通过=号列出成员<BR>Host_Alias HT02=st09,st10
注:主机别名HT02,有两个成员;<BR>Host_Alias
HT01=localhost,st05,st04,10,0,0,4,255.255.255.0,192.168.1.0/24:HT02=st09,st10
注:上面的两条对主机的定义,可以通过一条来实现,别名之间用:号分割;</CODE></DIV>
<P></P>
<P>注:我们通过Host_Alias
定义主机别名时,项目可以是主机名、可以是单个ip(整段ip地址也可以),也可以是网络掩码;如果是主机名,必须是多台机器的网络中,而且这些机器得能通过主机名相互通信访问才有效。那什么才算是通过主机名相互通信或访问呢?比如
ping
主机名,或通过远程访问主机名来访问。在我们局域网中,如果让计算机通过主机名访问通信,必须设置/etc/hosts,/etc/resolv.conf
,还要有DNS做解析,否则相互之间无法通过主机名访问;在设置主机别名时,如果项目是中某个项目是主机名的话,可以通过hostname
命令来查看本地主机的主机名,通过w命令查来看登录主机是来源,通过来源来确认其它客户机的主机名或ip地址;对于主机别名的定义,看上去有点复杂,其实是很简单。</P>
<P>如果您不明白Host_Alias
是怎么回事,也可以不用设置主机别名,在定义授权规则时通过ALL来匹配所有可能出现的主机情况。如果您把主机方面的知识弄的更明白,的确需要多多学习。</P>
<P>
<DIV class=codeblock><CODE>User_Alias
SYSAD=beinan,linuxsir,bnnnb,lanhaitun
注:定义用户别名,下有四个成员;要在系统中确实在存在的;<BR>User_Alias NETAD=beinan,bnnb 注:定义用户别名NETAD
,我想让这个别名下的用户来管理网络,所以取了NETAD的别名;<BR>User_Alias WEBMASTER=linuxsir
注:定义用户别名WEBMASTER,我想用这个别名下的用户来管理网站;<BR>User_Alias
SYSAD=beinan,linuxsir,bnnnb,lanhaitun:NETAD=beinan,bnnb:WEBMASTER=linuxsir
注:上面三行的别名定义,可以通过这一行来实现,请看前面的说明,是不是符合?</CODE></DIV>
<P></P>
<P>
<DIV class=codeblock><CODE>Cmnd_Alias
USERMAG=/usr/sbin/adduser,/usr/sbin/userdel,/usr/bin/passwd
[A-Za-z]*,/bin/chown,/bin/chmod
<BR> 注意:命令别名下的成员必须是文件或目录的绝对路径;<BR>Cmnd_Alias
DISKMAG=/sbin/fdisk,/sbin/parted<BR>Cmnd_Alias
NETMAG=/sbin/ifconfig,/etc/init.d/network<BR>Cmnd_Alias KILL =
/usr/bin/kill<BR>Cmnd_Alias PWMAG =
/usr/sbin/reboot,/usr/sbin/halt<BR>Cmnd_Alias SHELLS = /usr/bin/sh,
/usr/bin/csh, /usr/bin/ksh,
\<BR> /usr/local/bin/tcsh,
/usr/bin/rsh,
\<BR> /usr/local/bin/zsh<BR>注:这行定义命令别名有点长,可以通过
\ 号断行;<BR>Cmnd_Alias SU =
/usr/bin/su,/bin,/sbin,/usr/sbin,/usr/bin</CODE></DIV>
<P></P>
<P>在上面的例子中,有KILL和PWMAG的命令别名定义,我们可以合并为一行来写,也就是等价行;</P>
<P>
<DIV class=codeblock><CODE>Cmnd_Alias KILL = /usr/bin/kill:PWMAG =
/usr/sbin/reboot,/usr/sbin/halt
注:这一行就代表了KILL和PWMAG命令别名,把KILL和PWMAG的别名定义合并在一行写也是可以的;</CODE></DIV>
<P></P>
<P>
<DIV class=codeblock><CODE>Runas_Alias OP = root, operator<BR>Runas_Alias
DBADM=mysql:OP = root, operator 注:这行是上面两行的等价行;至于怎么理解Runas_Alias
,我们必须得通过授权规则的实例来理解;</CODE></DIV>
<P></P>
<P><FONT id=4.4 size=3><B><BR>4、/etc/sudoers中的授权规则:<BR></B></FONT></P>
<P>授权规则是分配权限的执行规则,我们前面所讲到的定义别名主要是为了更方便的授权引用别名;如果系统中只有几个用户,其实下放权限比较有限的话,可以不用定义别名,而是针对系统用户直接直接授权,所以在授权规则中别名并不是必须的;</P>
<P>授权规则并不是无章可寻,我们只说基础一点的,比较简单的写法,如果您想详细了解授权规则写法的,请参看man sudoers<BR>
<DIV class=codeblock><CODE>授权用户 主机=命令动作</CODE></DIV>
<P></P>
<P>这三个要素缺一不可,但在动作之前也可以指定切换到特定用户下,在这里指定切换的用户要用(
)号括起来,如果不需要密码直接运行命令的,应该加NOPASSWD:参数,但这些可以省略;举例说明;</P>
<P><B><BR>实例一:<BR></B><BR>
<DIV class=codeblock><CODE>beinan ALL=/bin/chown,/bin/chmod</CODE></DIV>
<P></P>
<P>如果我们在/etc/sudoers 中添加这一行,表示beinan 可以在任何可能出现的主机名的系统中,可以切换到root用户下执行
/bin/chown 和/bin/chmod 命令,通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;</P>
<P>值得注意的是,在这里省略了指定切换到哪个用户下执行/bin/shown
和/bin/chmod命令;在省略的情况下默认为是切换到root用户下执行;同时也省略了是不是需要beinan用户输入验证密码,如果省略了,默认为是需要验证密码。</P>
<P>为了更详细的说明这些,我们可以构造一个更复杂一点的公式;</P>
<P><B><BR>授权用户 主机=[(切换到哪些用户或用户组)] [是否需要密码验证] 命令1,[(切换到哪些用户或用户组)]
[是否需要密码验证] [命令2],[(切换到哪些用户或用户组)] [是否需要密码验证] [命令3]......<BR></B></P>
<P><B>注解:</B></P>
<P>凡是[
]中的内容,是可以省略;命令与命令之间用,号分隔;通过本文的例子,可以对照着看哪些是省略了,哪些地方需要有空格;<BR>在[(切换到哪些用户或用户组)]
,如果省略,则默认为root用户;如果是ALL
,则代表能切换到所有用户;注意要切换到的目的用户必须用()号括起来,比如(ALL)、(beinan)</P>
<P><B><BR>实例二:<BR></B><BR>
<DIV class=codeblock><CODE>beinan ALL=(root) /bin/chown,
/bin/chmod</CODE></DIV>
<P></P>
<P>如果我们把第一个实例中的那行去掉,换成这行;表示的是beinan 可以在任何可能出现的主机名的主机中,可以切换到root下执行
/bin/chown ,可以切换到任何用户招执行/bin/chmod 命令,通过sudo -l 来查看beinan
在这台主机上允许和禁止运行的命令;<BR><B><BR>实例三:<BR></B></P>
<P>
<DIV class=codeblock><CODE>beinan ALL=(root) NOPASSWD:
/bin/chown,/bin/chmod</CODE></DIV>
<P></P>
<P>如果换成这个例子呢?表示的是beinan 可以在任何可能出现的主机名的主机中,可以切换到root下执行 /bin/chown
,不需要输入beinan用户的密码;并且可以切换到任何用户下执行/bin/chmod
命令,但执行chmod时需要beinan输入自己的密码;通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;</P>
<P>关于一个命令动作是不是需要密码,我们可以发现在系统在默认的情况下是需要用户密码的,除非特加指出不需要用户需要输入自己密码,所以要在执行动作之前加入NOPASSWD:
参数; </P>
<P>有可能有的弟兄对系统管理的命令不太懂,不知道其用法,这样就影响了他对
sudoers定义的理解,下面我们再举一个最简单,最有说服务力的例子;<BR><B><BR>实例四:<BR></B></P>
<P>比如我们想用beinan普通用户通过more /etc/shadow文件的内容时,可能会出现下面的情况;</P>
<P>
<DIV class=codeblock><CODE>[beinan@localhost ~]$ more
/etc/shadow<BR>/etc/shadow: 权限不够</CODE></DIV>
<P></P>
<P>这时我们可以用sudo more /etc/shadow 来读取文件的内容;就就需要在/etc/soduers中给beinan授权;</P>
<P>于是我们就可以先su 到root用户下通过visudo 来改/etc/sudoers ;(比如我们是以beinan用户登录系统的)<BR>
<DIV class=codeblock><CODE>[beinan@localhost ~]$ su<BR>Password:
注:在这里输入root密码 <BR>下面运行visodu;<BR>[root@localhost beinan]# visudo
注:运行visudo 来改 /etc/sudoers</CODE></DIV>
<P></P>
<P>加入如下一行,退出保存;退出保存,在这里要会用vi,visudo也是用的vi编辑器;至于vi的用法不多说了;<BR>
<DIV class=codeblock><CODE>beinan ALL=/bin/more 表示beinan可以切换到root下执行more
来查看文件;</CODE></DIV>
<P></P>
<P>退回到beinan用户下,用exit命令;</P>
<P>
<DIV class=codeblock><CODE>[root@localhost beinan]#
exit<BR>exit<BR>[beinan@localhost ~]$</CODE></DIV>
<P></P>
<P>查看beinan的通过sudo能执行哪些命令? </P>
<P>
<DIV class=codeblock><CODE>[beinan@localhost ~]$ sudo -l<BR>Password:
注:在这里输入beinan用户的密码<BR>User beinan may run the following commands on this
host: 注:在这里清晰的说明在本台主机上,beinan用户可以以root权限运行more ;在root权限下的more
,可以查看任何文本文件的内容的;<BR> (root) /bin/more</CODE></DIV>
<P></P>
<P>最后,我们看看是不是beinan用户有能力看到/etc/shadow文件的内容;</P>
<P>
<DIV class=codeblock><CODE>[beinan@localhost ~]$ sudo more
/etc/shadow</CODE></DIV>
<P></P>
<P>beinan 不但能看到 /etc/shadow文件的内容,还能看到只有root权限下才能看到的其它文件的内容,比如;</P>
<P>
<DIV class=codeblock><CODE>[beinan@localhost ~]$ sudo more
/etc/gshadow</CODE></DIV>
<P></P>
<P>对于beinan用户查看和读取所有系统文件中,我只想把/etc/shadow 的内容可以让他查看;可以加入下面的一行;</P>
<P>
<DIV class=codeblock><CODE>beinan ALL=/bin/more /etc/shadow</CODE></DIV>
<P></P>
<P>题外话:有的弟兄会说,我通过su
切换到root用户就能看到所有想看的内容了,哈哈,对啊。但咱们现在不是在讲述sudo的用法吗?如果主机上有多个用户并且不知道root用户的密码,但又想查看某些他们看不到的文件,这时就需要管理员授权了;这就是sudo的好处;</P>
<P><B><BR>实例五:练习用户组在/etc/sudoers中写法;<BR></B><BR>如果用户组出现在/etc/sudoers
中,前面要加%号,比如%beinan ,中间不能有空格;</P>
<P>
<DIV class=codeblock><CODE>%beinan ALL=/usr/sbin/*,/sbin/*</CODE></DIV>
<P></P>
<P>如果我们在 /etc/sudoers
中加上如上一行,表示beinan用户组下的所有成员,在所有可能的出现的主机名下,都能切换到root用户下运行
/usr/sbin和/sbin目录下的所有命令;</P>
<P><B><BR>实例六:练习取消某类程序的执行;<BR></B></P>
<P>取消程序某类程序的执行,要在命令动作前面加上!号; 在本例中也出现了通配符的*的用法;</P>
<P>
<DIV class=codeblock><CODE>beinan ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk
注:把这行规则加入到/etc/sudoers中;但您得有beinan这个用户组,并且beinan也是这个组中的才行;</CODE></DIV>
<P></P>
<P>本规则表示beinan用户在所有可能存在的主机名的主机上运行/usr/sbin和/sbin下所有的程序,但fdisk 程序除外; </P>
<P>[beinan@localhost ~]$ sudo -l<BR>Password: 注:在这里输入beinan用户的密码;<BR>User
beinan may run the following commands on this host:<BR>(root)
/usr/sbin/*<BR>(root) /sbin/*<BR>(root) !/sbin/fdisk</P>
<P>[beinan@localhost ~]$ sudo /sbin/fdisk -l<BR>Sorry, user beinan is not
allowed to execute '/sbin/fdisk -l' as root on localhost. </P>
<P>注:不能切换到root用户下运行fdisk 程序;<BR></CODE></P>
<P><B><BR>实例七:别名的运用的实践;<BR></B></P>
<P>假如我们就一台主机localhost,能通过hostname
来查看,我们在这里就不定义主机别名了,用ALL来匹配所有可能出现的主机名;并且有beinan、linuxsir、lanhaitun
用户;主要是通过小例子能更好理解;sudo虽然简单好用,但能把说的明白的确是件难事;最好的办法是多看例子和man soduers ;</P>
<P>
<DIV class=codeblock><CODE>User_Alias
SYSADER=beinan,linuxsir,%beinan<BR>User_Alias
DISKADER=lanhaitun<BR>Runas_Alias OP=root<BR>Cmnd_Alias
SYDCMD=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -