linux用户管理-赋予普通用户特别权限[sudo命令]

admin 发布于:2014-8-12 14:30 分类:Linux  有 2397 人浏览,获得评论 0 条 标签: sudo 

在Linux系统中,管理员往往不止一人,若每位管理员都用root身份进行管理工作,根本无法弄清晰谁该做什么。所以最佳的方式是:管理员创建一些普通用户,分配一部分系统管理工作给他们。
由于su 对转换到终极权限用户root后,权限的无限制性,所以su并不能担任多个管理员所管理的系统。如果用su 来转换到终极用户来管理系统,也不能明确哪些工作是由哪个管理员进行的操作。特别是对于服务器的 管理有多人参和管理时,最佳是针对每个管理员的技术特长和管理范围,并且有针对性的下放给权限,并且约定其使用哪些工具来完成和其相关的工作,这时我们就 有必要用到 sudo。通过sudo,我们能把某些终极权限有针对性的下放,并且不必普通用户知道root密码,所以sudo 相对于权限无限制性的su来说,还是比较安全的,所以sudo 也能被称为受限制的su ;另外sudo 是需要授权许可的,所以也被称为授权许可的su;sudo 执行命令的流程是当前用户转换到root(或其他指定转换到的用户),然后以root(或其他指定的转换到的用户)身份执行命令,执行完成后,直接退回到当前用户;而这些的前提是要通过sudo的设置文件/etc/sudoers来进行授权;
我们不能使用su让他们直接变成root,因为这些用户都必须知道root的密码,这种方法非常不安全,而且也不符合我们的分工需求。一般的做法是利用权限的设置,依工作性质分类,让特别身份的用户成为同一个工作组,并设置工作组权限。例如:要wwwadm这位用户负责管理网站数据,一般Apache Web Server的进程httpd的所有者是www,你能设置用户wwwadm和www为同一工作组,并设置Apache默认存放网页录 /usr/local/httpd/htdocs的工作组权限为可读、可写、可执行,这样属于此工作组的每位用户就能进行网页的管理了。
但这并不是最佳的解决办法,例如管理员想授予一个普通用户关机的权限,这时使用上述的办法就不是非常最佳。这时你也许会想,我只让这个用户能以root身份执行 shutdown命令就行了。完全没错,可惜在通常的Linux系统中无法实现这一功能,不过已有了工具能实现这样的功能??sudo。

sudo 通过维护一个特权到用户名映射的数据库将特权分配给不同的用户,这些特权可由数据库中所列的一些不同的命令来识别。为了获得某一特权项,有资格的用户只需简单地在命令行输入sudo和命令名之后,按照提示再次输入口令。例如,sudo允许普通用户格式化磁盘,不过却没有赋予其他的root用户特权。


[root@WEB66 etc]# su www
[www@WEB66 etc]$ apachectl -k restart
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
(13)Permission denied: Error retrieving pid file run/httpd.pid
Remove it before continuing if it is corrupted.
[www@WEB66 etc]$ sudo apachectl -k restart

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.


[www@WEB66 etc]$ sudo apachectl -k restart
[sudo] password for www:
demouser2 is not in the sudoers file.  This incident will be reported.




注:sudo的初衷是:为了让一个普通用户执行root的命令。当第一次使用sudo的时候会提示输入密码。
        这个密码是用户自己的密码。
        不过在suse 9和10中,使用sudo发现输入密码的时候必须输入root用户的密码。
        经过查实发目前sudo的设置文件中存在 Defaults targetpw 表示的是sudo将提示输入由sudo的-u选项指定的用户(默认为root)的口令而不是执行sudo  的用户的口令,如果将其注释掉,那么输入的密码是当前执行用户的。suse里默认需求输入的是root的密码。 
        能这样去理解:你的服务器不允许使用root直接ssh到服务器或不允许直接使用root在tty中登录。添加一个用户让他能够ssh不过不让他使用su命令。这样能使用此方法来让他从事root的其中一条命令。
sudo的公式;
授权用户 主机=[(转换到哪些用户或用户组)] [是否需要密码验证] 命令1,[(转换到哪些用户或用户组)] [是否需要密码验证] [命令2],[(转换到哪些用户或用户组)] [是否需要密码验证] [命令3]......
注:
凡是[ ]中的内容,是能省略;命令和命令之间用,号分隔;通过本文的例子,能对照着看哪些是省略了,哪些地方需要有空格;在[(转换到哪些用户或用户组)] ,如果省略,则默认为root用户;如果是ALL ,则代表能转换到所有用户;注意要转换到的目的用户必须用()号括起来,比如(ALL)、(beinan)

1、sudo工具由文件/etc/sudoers进行设置,该文件包含所有能访问sudo工具的用户列表并定义了他们的特权。一个典型的/etc/sudoers条目如下:
zte ALL=(ALL) ALL
这个条目使得用户zte作为终极用户访问所有应用程式,如用户zte需要作为终极用户运行命令,他只需简单地在命令前加上前缀sudo。因此,要以root用户的身份执行命令ifconfig,zte能输入如下命令:
zte@SMPS-WEB1:/home># sudo /usr/sbin/ifconfig
注意: 执行的ifconfig命令要写绝对路径/usr/sbin/ifconfig,/usr/sbin默认不在普通用户的搜索路径中,或加入此路 径:PATH=$PATH:/usr/sbin;export PATH。另外,不同系统命令的路径不尽相同。能使用命令“whereis 命令名”来查找其路径。ex : zte@SMPS-WEB1:/home> whereis usermod
usermod: /usr/sbin/usermod  /usr/share/man/man8/usermod.8.gz ,这里搜索到2个路径,取第一个. 表示在zte用户登录下查看usermod命令的具体路径
这时会显示下面的输出结果:
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these two things:
#1) Respect the privacy of others.
#2) Think before you type.
Password:
如果zte正确地输入了他的口令,命令ifconfig将会以root用户身份执行。
注意:设置文件/etc/sudoers必须使用命令Visudo来编辑。
只要把相应的用户名、主机名和许可的命令列表以标准的格式加入到文件/etc/sudoers,并保存就能生效,再看一个例子。
2、例子:
[1]管理员需要允许gem用户在主机sun上执行reboot和shutdown命令,在/etc/sudoers中加入:
gem sun=/usr/sbin/reboot,/usr/sbin/shutdown
注意:命令一定要使用绝对路径,以避免其他目录的同名命令被执行,从而造成安全隐患。
然后保存退出,gem用户想执行reboot命令时,只要在提示符下运行下列命令:
$ sudo /usr/sbin/reboot
输入正确的密码,就能重启服务器了。
[2]beinan ALL=(root) /bin/chown, /bin/chmod
表示的是beinan 能在所有可能出现的主机名的主机中,能转换到root下执行 /bin/chown ,能转换到所有用户招执行/bin/chmod 命令,通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;
[3]beinan ALL=(root) NOPASSWD: /bin/chown,/bin/chmod
表示的是beinan 能在所有可能出现的主机名的主机中,能转换到root下执行 /bin/chown ,不必输入beinan用户的密码;并且能转换到所有用户下执行/bin/chmod 命令,但执行chmod时需要beinan输入自己的密码;通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;
关于一个命令动作是不是需要密码,我们能发目前系统在默认的情况下是需要用户密码的,除非特加指出不必用户需要输入自己密码,所以要在执行动作之前加入NOPASSWD: 参数; 
[4]取消程式某类程式的执行,要在命令动作前面加上!号; 在本例中也出现了通配符的*的用法;
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 程式;
[5]如果你想对一组用户进行定义,能在组名前加上%,对其进行设置,如:
%cuug ALL=(ALL) ALL
那么属于cuug这个组的所有成员都能sudo来执行特定的任务
3、另外,还能利用别名来简化设置文件。别名类似组的概念,有用户别名、主机别名和命令别名。多个用户能首先用一个别名来定义,然后在规定他们能执行什么 命令的时候使用别名就能了,这个设置对所有用户都生效。主机别名和命令别名也是如此。注意使用前先要在/etc/sudoers中定义: User_Alias, Host_Alias, Cmnd_Alias项,在其后面加入相应的名称,也以逗号分隔开就能了,举例如下:
Host_Alias SERVER=no1
User_Alias ADMINS=liming,gem
Cmnd_Alias
SHUTDOWN=/usr/sbin/halt,/usr/sbin/shutdown,/usr/sbin/reboot
ADMINS SERVER=SHUTDOWN
4、sudo命令还能加上一些参数,完成一些辅助的功能,如:
$ sudo -l
会显示出类似这样的信息:
User liming may run the following commands on this host:
(root) /usr/sbin/reboot
说明root允许用户liming执行/usr/sbin/reboot命令。这个参数能使用户查看自己目前能在sudo中执行哪些命令。
5、在命令提示符下键入sudo命令会列出所有参数,其他一些参数如下:
-V 显示版本编号。
-h 显示sudo命令的使用参数。
-v 因为sudo在第一次执行时或是在N分钟内没有执行(N预设为5)会询问密码。这个参数是重新做一次确认,如果超过N分钟,也会问密码。
-k 将会强迫使用者在下一次执行sudo时询问密码(不论有没有超过N分钟)。
-b 将要执行的命令放在背景执行。
-p prompt 能更改问密码的提示语,其中%u会替换为使用者的账号名称,%h会显示主机名称。
-u username/#uid 不加此参数,代表要以root的身份执行命令,而加了此参数,能以username的身份执行命令(#uid为该username的UID)。
-s 执行环境变量中的SHELL所指定的Shell,或是/etc/passwd里所指定的Shell。
-H 将环境变量中的HOME(宿主目录)指定为要变更身份的使用者的宿主目录。(如不加-u参数就是系统管理者root。)
要以系统管理者身份(或以-u更改为其他人)执行的命令。 


用户和用户组应用实例
drwxr-xr-x   7 zte_a  users  4096 2007-11-22 09:58 zte_a
drwxr-xr-x   7 zte_b  users  4096 2007-11-22 09:14 zte_b
drwxr-xr-x   7 zte_c  users  4096 2007-11-22 09:14 zte_c
建三个用户zte_a,zte_b,zte_c 都所属于users组
创建time目录
drwxr-xr-x   2 root   root 4096 2007-11-22 09:26 time
创建time目录下的time文件
-rw-r--r--   1 root root  27 2007-11-22 09:26 time.txt
需求:让root用户能wrx目录time下的time.txt,同时,而只允许属于users用户组的用户读time.txt文件
步骤:
chmod o-r-x time 设置目录权限
drwxr-x---   2 root   root 4096 2007-11-22 09:26 time
chmod o-r time.txt设置文件权限
-rw-r-----   1 root root  27 2007-11-22 09:26 time.txt
chgrp user time 设置目录所属组
drwxr-x---   2 root users 4096 2007-11-22 09:26 time
chgrp user time.txt设置文件所属组
-rw-r-----   1 root users 27 2007-11-22 09:26 time.txt
注: 以后要为user组新扩此类用户时,只需useradd -m new,再usermod -g user new 将new 用户归属于user组即可