[转载]Linux用户管理全攻略(九)

 
实例一:
 
beinan ALL=/bin/chown,/bin/chmod
如果我们在/etc/sudoers 中添加这一行,表示beinan 可以在任何可能出现的主机名的系统中,可以切换到root用户下执行 /bin/chown 和/bin/chmod 命令,通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;
值得注意的是,在这里省略了指定切换到哪个用户下执行/bin/shown 和/bin/chmod命令;在省略的情况下默认为是切换到root用户下执行;同时也省略了是不是需要beinan用户输入验证密码,如果省略了,默认为是需要验证密码。
为了更详细的说明这些,我们可以构造一个更复杂一点的公式;

授权用户 主机=[(切换到哪些用户或用户组)] [是否需要密码验证] 命令1,[(切换到哪些用户或用户组)] [是否需要密码验证] [命令2],[(切换到哪些用户或用户组)] [是否需要密码验证] [命令3]......

注解:
凡是[ ]中的内容,是可以省略;命令与命令之间用,号分隔;通过本文的例子,可以对照着看哪些是省略了,哪些地方需要有空格;
在[(切换到哪些用户或用户组)] ,如果省略,则默认为root用户;如果是ALL ,则代表能切换到所有用户;注意要切换到的目的用户必须用()号括起来,比如(ALL)、(beinan)

实例二:
 
beinan ALL=(root) /bin/chown, /bin/chmod
如果我们把第一个实例中的那行去掉,换成这行;表示的是beinan 可以在任何可能出现的主机名的主机中,可以切换到root下执行 /bin/chown ,可以切换到任何用户招执行/bin/chmod 命令,通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;
实例三:
 
beinan ALL=(root) NOPASSWD: /bin/chown,/bin/chmod
如果换成这个例子呢?表示的是beinan 可以在任何可能出现的主机名的主机中,可以切换到root下执行 /bin/chown ,不需要输入beinan用户的密码;并且可以切换到任何用户下执行/bin/chmod 命令,但执行chmod时需要beinan输入自己的密码;通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;
关于一个命令动作是不是需要密码,我们可以发现在系统在默认的情况下是需要用户密码的,除非特加指出不需要用户需要输入自己密码,所以要在执行动作之前加入NOPASSWD: 参数;
有可能有的弟兄对系统管理的命令不太懂,不知道其用法,这样就影响了他对 sudoers定义的理解,下面我们再举一个最简单,最有说服务力的例子;
实例四:

比如我们想用beinan普通用户通过more /etc/shadow文件的内容时,可能会出现下面的情况;

[beinan@localhost ~]$ more /etc/shadow
/etc/shadow: 权限不够
这时我们可以用sudo more /etc/shadow 来读取文件的内容;就就需要在/etc/soduers中给beinan授权;
于是我们就可以先su 到root用户下通过visudo 来改/etc/sudoers ;(比如我们是以beinan用户登录系统的)

[beinan@localhost ~]$ su
Password: 注:在这里输入root密码
下面运行visodu;
[root@localhost beinan]# visudo 注:运行visudo 来改 /etc/sudoers
加入如下一行,退出保存;退出保存,在这里要会用vi,visudo也是用的vi编辑器;至于vi的用法不多说了;

beinan ALL=/bin/more 表示beinan可以切换到root下执行more 来查看文件;
退回到beinan用户下,用exit命令;

[root@localhost beinan]# exit
exit
[beinan@localhost ~]$
查看beinan的通过sudo能执行哪些命令?

[beinan@localhost ~]$ sudo -l
Password: 注:在这里输入beinan用户的密码
User beinan may run the following commands on this host: 注:在这里清晰的说明在本台主机上,beinan用户可以以root权限运行more ;在root权限下的more ,可以查看任何文本文件的内容的;
    (root) /bin/more
最后,我们看看是不是beinan用户有能力看到/etc/shadow文件的内容;

[beinan@localhost ~]$ sudo more /etc/shadow
beinan 不但能看到 /etc/shadow文件的内容,还能看到只有root权限下才能看到的其它文件的内容,比如;

[beinan@localhost ~]$ sudo more /etc/gshadow
对于beinan用户查看和读取所有系统文件中,我只想把/etc/shadow 的内容可以让他查看;可以加入下面的一行;

beinan ALL=/bin/more /etc/shadow
题外话:有的弟兄会说,我通过su 切换到root用户就能看到所有想看的内容了,哈哈,对啊。但咱们现在不是在讲述sudo的用法吗?如果主机上有多个用户并且不知道root用户的密码,但又想查看某些他们看不到的文件,这时就需要管理员授权了;这就是sudo的好处;

实例五:练习用户组在/etc/sudoers中写法;
如果用户组出现在/etc/sudoers 中,前面要加%号,比如%beinan ,中间不能有空格;

%beinan ALL=/usr/sbin/*,/sbin/*
如果我们在 /etc/sudoers 中加上如上一行,表示beinan用户组下的所有成员,在所有可能的出现的主机名下,都能切换到root用户下运行 /usr/sbin和/sbin目录下的所有命令;

实例六:练习取消某类程序的执行;

取消程序某类程序的执行,要在命令动作前面加上!号; 在本例中也出现了通配符的*的用法;

beinan ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk 注:把这行规则加入到/etc/sudoers中;但您得有beinan这个用户组,并且beinan也是这个组中的才行;
本规则表示beinan用户在所有可能存在的主机名的主机上运行/usr/sbin和/sbin下所有的程序,但fdisk 程序除外;
[beinan@localhost ~]$ sudo -l
Password: 注:在这里输入beinan用户的密码;
User beinan may run the following commands on this host:
(root) /usr/sbin/*
(root) /sbin/*
(root) !/sbin/fdisk
[beinan@localhost ~]$ sudo /sbin/fdisk -l
Sorry, user beinan is not allowed to execute '/sbin/fdisk -l' as root on localhost.
注:不能切换到root用户下运行fdisk 程序;
 
实例七:别名的运用的实践;

假如我们就一台主机localhost,能通过hostname 来查看,我们在这里就不定义主机别名了,用ALL来匹配所有可能出现的主机名;并且有beinan、linuxsir、lanhaitun 用户;主要是通过小例子能更好理解;sudo虽然简单好用,但能把说的明白的确是件难事;最好的办法是多看例子和man soduers ;

User_Alias SYSADER=beinan,linuxsir,%beinan
User_Alias DISKADER=lanhaitun
Runas_Alias OP=root
Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk 注:定义命令别名DSKCMD,下有成员parted和fdisk ;
SYSADER ALL= SYDCMD,DSKCMD
DISKADER ALL=(OP) DSKCMD
注解:
第一行:定义用户别名SYSADER 下有成员 beinan、linuxsir和beinan用户组下的成员,用户组前面必须加%号;
第二行:定义用户别名 DISKADER ,成员有lanhaitun
第三行:定义Runas用户,也就是目标用户的别名为OP,下有成员root
第四行:定义SYSCMD命令别名,成员之间用,号分隔,最后的!/usr/bin/passwd root 表示不能通过passwd 来更改root密码;
第五行:定义命令别名DSKCMD,下有成员parted和fdisk ;
第六行: 表示授权SYSADER下的所有成员,在所有可能存在的主机名的主机下运行或禁止 SYDCMD和DSKCMD下定义的命令。更为明确遥说,beinan、linuxsir和beinan用户组下的成员能以root身份运行 chown 、chmod 、adduser、passwd,但不能更改root的密码;也可以以root身份运行 parted和fdisk ,本条规则的等价规则是;

beinan,linuxsir,%beinan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root,/sbin/parted,/sbin/fdisk
第七行:表示授权DISKADER 下的所有成员,能以OP的身份,来运行 DSKCMD ,不需要密码;更为明确的说 lanhaitun 能以root身份运行 parted和fdisk 命令;其等价规则是:

lanhaitun ALL=(root) /sbin/parted,/sbin/fdisk
可能有的弟兄会说我想不输入用户的密码就能切换到root并运行SYDCMD和DSKCMD 下的命令,那应该把把NOPASSWD:加在哪里为好?理解下面的例子吧,能明白的;

SYSADER ALL= NOPASSWD: SYDCMD, NOPASSWD: DSKCMD

5、/etc/sudoers中其它的未尽事项;

在授权规则中,还有 NOEXEC:和EXEC的用法,自己查man sudoers 了解;还有关于在规则中通配符的用法,也是需要了解的。这些内容不多说了,毕竟只是一个入门性的文档。soduers配置文件要多简单就有多简单,要多难就有多难,就看自己的应用了。

6、sudo的用法;

我们在前面讲的/etc/sudoers 的规则写法,最终的目的是让用户通过sudo读取配置文件中的规则来实现匹配和授权,以便替换身份来进行命令操作,进而完成在其权限下不可完成的任务;
我们只说最简单的用法;更为详细的请参考man sudo
sudo [参数选项] 命令
-l 列出用户在主机上可用的和被禁止的命令;一般配置好/etc/sudoers后,要用这个命令来查看和测试是不是配置正确的;
-v 验证用户的时间戳;如果用户运行sudo 后,输入用户的密码后,在短时间内可以不用输入口令来直接进行sudo 操作;用-v 可以跟踪最新的时间戳;
-u 指定以以某个用户执行特定操作;
-k 删除时间戳,下一个sudo 命令要求用求提供密码;

举列:
首先我们通过visudo 来改/etc/sudoers 文件,加入下面一行;

beinan,linuxsir,%beinan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root,/sbin/parted,/sbin/fdisk
然后列出beinan用户在主机上通过sudo 可以切换用户所能用的命令或被禁止用的命令;

[beinan@localhost ~]$ sudo -l 注:列出用户在主机上能通过切换用户的可用的或被禁止的命令;
Password: 注:在这里输入您的用户密码;
User beinan may run the following commands on this host:
    (root) /bin/chown 注:可以切换到root下用chown命令;
    (root) /bin/chmod 注:可以切换到root下用chmod命令;
    (root) /usr/sbin/adduser 注:可以切换到root下用adduser命令;
    (root) /usr/bin/passwd [A-Za-z]* 注:可以切换到root下用 passwd 命令;
    (root) !/usr/bin/passwd root 注:可以切换到root下,但不能执行passwd root 来更改root密码;
    (root) /sbin/parted 注:可以切换到 root下执行parted ;
    (root) /sbin/fdisk 注:可以切换到root下执行 fdisk ;
通过上面的sudo -l 列出可用命令后,我想通过chown 命令来改变/opt目录的属主为beinan ;

[beinan@localhost ~]$ ls -ld /opt 注:查看/opt的属主;
drwxr-xr-x 26 root root 4096 10月 27 10:09 /opt 注:得到的答案是归属root用户和root用户组;
[beinan@localhost ~]$ sudo chown beinan:beinan /opt 注:通过chown 来改变属主为beinan用户和beinan用户组;
[beinan@localhost ~]$ ls -ld /opt 注:查看/opt属主是不是已经改变了;
drwxr-xr-x 26 beinan beinan 4096 10月 27 10:09 /opt
我们通过上面的例子发现beinan用户能切换到root后执行改变用户口令的passwd命令;但上面的sudo -l 输出又明文写着不能更改root的口令;也就是说除了root的口令,beinan用户不能更改外,其它用户的口令都能更改。下面我们来测试;
对于一个普通用户来说,除了更改自身的口令以外,他不能更改其它用户的口令。但如果换到root身份执行命令,则可以更改其它用户的口令;
比如在系统中有linuxsir这个用户, 我们想尝试更改这个用户的口令,

[beinan@localhost ~]$ passwd linuxsir 注:不通过sudo 直接运行passwd 来更改linuxsir用户的口令;
passwd: Only root can specify a user name. 注:失败,提示仅能通过 root来更改;
[beinan@localhost ~]$ sudo passwd linuxsir 注:我们通过/etc/sudoers 的定义,让beinan切换到root下执行 passwd 命令来改变linuxsir的口令;
Changing password for user linuxsir.
New UNIX password: 注:输入新口令;
Retype new UNIX password: 注:再输入一次;
passwd: all authentication tokens updated successfully. 注:改变成功;

后记:

本文是用户管理的文档的重要组成部份,我计划在明天开始写用户管理控制工具,比如 useradd、userdel、usermod ,也就是管理用户的工具介绍;当然我还会写用户查询工具等与用户管理相关的;

关于本文:

超级权限管理这篇文档是我写的最费力气的文档,写的我都怕了;虽然这个文档是最简单的文档,我自己是明白,但就是表达不出来,而且无论怎么表达,我都感觉是把问题看的太复杂。前前后后写了一个星期都不止;每天坚持十几个小时就是为了写这篇文档,写了好多字,一看不太行就删除重写。得写次数不下十次。改了又写,写了又改,人都崩溃了,不知道什么时候才是尽头;
 
很好的文章
我是初学者,能看懂,不过刚开始文章所说的"别名"的作用说的不是很清楚,我看了实例七:别名的运用的实践才知道了何作用,我觉得别名应该放在文章后面讲,正如你所说,要多简单就有多简单,要多复杂就有多复杂,从简单的加一行:
ssl ALL=NOPASSWD:/bin/sbin/*,NOPASSWD:/sbin/*,NOPASSWD:/bin/*
到大量用户的别名方式
By ssl at 周五, 2005/11/11 - 17:38 | 回复
谢谢,在这方面是有点乱
兄弟说的极对,是应该把别名放在最后来说。
我在近期内调整一下,初学的弟兄能看懂是最好的,如果看不懂,这篇文档就是一无可用;
北南 呈上
By 北南南北 at 周日, 2005/11/13 - 10:01 | 回复
看得不累并且有收获
这篇文章看了我近1小时,看得不累并且有收获,不错,谢了。
另外北南兄自己注意身体!一天写10多个小时别累出病了~~~~
感觉应该把程序的suid sgid简单提一下,做个对比。
By Anonymous (没有被验证) at 周二, 2005/11/01 - 12:00 | 回复
有关suid和sgid的,我想放在其它文档中写
谢谢兄弟鼓励和关心,我想把suid和sgid放在另一篇中写;
用户的角色、权限和文件、目录的相关联的。写基础文档有点感觉无从下手;只能一个一个的来解决。现在感觉自己实力不足,但对我也是有好处的,能把原来的东西加强一下,现在对有些东西能知其所以然了;
北南 呈上
By beinan at 周二, 2005/11/01 - 12:37 | 回复
感谢eTony 、懒猫、Arch等的修改;
eTony兄弟修正了若干,主要是概念及表达上的冲突;
+++++++++++++++++++++++++++++++++++
懒猫兄弟修正的内容如下:
+++++++++++++++++++++++++++++++++++
关于您的 su 和 sudo 的文档。
可能对于初学者或者阅读者来说,一篇好的文章,如果有一个目录纲要在前面“导航”一下,文档内容归类得清晰一些,看起来会更加舒服吧。
个人建议您把文档内第一大点(对……的理解)的内容再细分一下(不一定追加内容),用小标题概括起来,然后在目录纲要中体现,这样会不会对于编写者您来说也会更加清晰一点呢?或许经过这样的编排你的思路也会更清晰、修改也更加容易吧?
刚才重新看了一遍,对该文档的目录结构提一个参考方案(也许其实只是某些点换了个标题,应该还有错漏的
一. 理解 Linux 系统中的用户和用户权限
1. 什么是超级用户
2. 理解 UID 和用户的对应关系
3. 普通用户和伪装用户
二. 超级用户(权限)在系统管理中的作用
1. 管理文件、目录和进程
2. 全局性管理操作
3. 超级权限的不可替代性
三. 使用 su 命令临时切换用户身份
1. su 的适用条件和威力
2. su 命令的用法
3. 范例
4. 优势和不足
四. sudo :受限使用的 su
1. sudo 的适用条件和威力
2. 从编写 sudo 配置文件开始
3. 如何配置别名规则
4. 如何配置授权规则
5. 如何使用 sudo 命令
五. 后记
六. 关于本文

+++++++++++++++++++++++++++++++++++
Arch兄弟修正内容如下:
+++++++++++++++++++++++++++++++++++
第六行: 表示授权SYSADER下的所有成员,在所有可能存在的主机名的主机下运行或禁止 SYDCMD和DSKCMD下定义的命令。更为明确遥说,beinan、linuxsir和beinan用户组下的成员能以root身份运行 chown 、chmod 、adduser、passwd,但不能更改root的密码;也可以以root身份运行 parted和fdisk ,本条规则的等价规则是;

beinan,linuxsir,%beinan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd,!/usr/bin/passwd root,/sbin/parted,/sbin/fdisk
这里好像没有达到不能修改root密码的要求,sudo passwd和sudo passwd root的效果是等价的吧,^_^
您看这样改是否可行?

beinan,linuxsir,%beinan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,!/usr/bin/passwd,!/usr/bin/passwd root,/usr/bin/passwd [A-Za-z]*, /sbin/parted,/sbin/fdisk
posted @ 2011-10-26 13:50  刘竹青  阅读(108)  评论(0编辑  收藏  举报