如果有两个用户,一个是用来管理网络属性,一个是用对用户进行管理,这就意味着这两个用户需要root的权限,那么这就超过他们需要的权限了,这就引入了sudo。
什么是sudo?
Sudo是可以让某个用户不需要拥有管理员的账号密码,可以执行管理员的权限的。
作为管理员可以指派某些用户可以执行某些特定命令,类似与suid (不需要切换到某些用户下,但是可以执行这些用户的命令,不仅如此这些买了还是指定给他们的命令,超出这些命令的执行都不会成功)。
所以sudo就是某用户能够以另外一个用户的身份通过那些主机执行哪些命令。sudo为了怕别人冒充,在使用的过程当中需要输入该用户的密码。
它的特性主要有这样几点:
§ Sudo能够限制用户只在某台主机上运行某些命令。
§ Sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。
§ Sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票(这个值可以在编译的时候改变)。
§ Sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性为0440(为了避免其他用户去查看该文件)。
[root@localhost ~]# ll /etc/sudoers --只有root用户和属于root组的用户才有查看的权限。
-r--r-----. 1 root root 3938 Jun 7 2017 /etc/sudoers
[test@localhost ~]$ cat /etc/sudoers
cat: /etc/sudoers: Permission denied
visudo
编辑命令visudo(这个命令是用来编辑sudo配置文件的,可以检查语法准确性,不要使用vim sudoers,使用这种方式是不会检查语法错误的)。
sudo的语法和别名
配置文件里面每一行都是一个sudo条目(语法格式 who which_hosts=(runas)) command)
意思就是谁可以以谁的身份,可以从哪些主机连接进来,运行什么命令。
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
管理员可以一任意人的身份,在任意主机上执行任意命令。
下面这些信息可以使用[root@localhost ~]# man sudoers --来查看sudoers文档。
sudo支持用户别名,使用man sudoers可以查看(who which_hosts=(runas)) command)。
以下英文信息都是man手册里面的:
Aliases
There are four kinds of aliases: User_Alias, Runas_Alias, Host_Alias and Cmnd_Alias.
Alias ::= 'User_Alias' User_Alias (':' User_Alias)* | --相当于who
'Runas_Alias' Runas_Alias (':' Runas_Alias)* | --相当于 runas
'Host_Alias' Host_Alias (':' Host_Alias)* | --相当于which_hosts
'Cmnd_Alias' Cmnd_Alias (':' Cmnd_Alias)* --相当于command
User_Alias ::= NAME '=' User_List
Runas_Alias ::= NAME '=' Runas_List
Host_Alias ::= NAME '=' Host_List
Cmnd_Alias ::= NAME '=' Cmnd_List
下面是别名使用例子(注意在使用别名的时候都要使用大写的字符,并且是全英文的)。
EXAMPLES
Below are example sudoers file entries. Admittedly, some of these are a bit contrived. First, we allow a few envi?
ronment variables to pass and then define our aliases:
# Run X applications through sudo; HOME is used to find the
# .Xauthority file. Note that other programs use HOME to find
# configuration files and this may lead to privilege escalation!
Defaults env_keep += "DISPLAY HOME"
# User alias specification --用户别名可以包含用户的用户名,组名(如果使用组名,那么组里面所有成员都被包含,组名使用%引导),还可以包含其他用户别名(意思就是别名可以嵌套别名)
User_Alias FULLTIMERS = millert, mikef, dowdy -表示FULLTIMERS别名包含了millert, mikef, dowdy这三个用户
User_Alias PARTTIMERS = bostley, jwfox, crawl
User_Alias WEBMASTERS = will, wendy, wim
# Runas alias specification -以另外哪个用户身份执行命令,可以包含用户名,也可以包含%组名,或者是其他的runas别名
Runas_Alias OP = root, operator
Runas_Alias DB = oracle, sybase
Runas_Alias ADMINGRP = adm, oper
# Host alias specification --可以包含主机名,IP,网络地址,其他主机别名
Host_Alias SPARC = bigtime, eclipse, moet, anchor :\
SGI = grolsch, dandelion, black :\
ALPHA = widget, thalamus, foobar :\
HPPA = boa, nag, python
Host_Alias CUNETS = 128.138.0.0/255.255.0.0
Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0
Host_Alias SERVERS = master, mail, www, ns
Host_Alias CDROM = orion, perseus, hercules
# Cmnd alias specification --注意,这里的命令最好使用绝对路径。如果使用的是目录,那么代表该目录下面所有的命令都包含进去了。或者使用命令别名。
Cmnd_Alias DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\
/usr/sbin/restore, /usr/sbin/rrestore,\
sha224:0GomF8mNN3wlDt1HD9XldjJ3SNgpFdbjO1+NsQ== \
/home/operator/bin/start_backups
Cmnd_Alias KILL = /usr/bin/kill
Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm
Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown
Cmnd_Alias HALT = /usr/sbin/halt
Cmnd_Alias REBOOT = /usr/sbin/reboot
Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh,\
/usr/local/bin/tcsh, /usr/bin/rsh,\
/usr/local/bin/zsh
Cmnd_Alias SU = /usr/bin/su
Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less
最后注意别名必须先定义,再去使用,而且只能使用大写的英文字母。
sudo具体用法举例
定义hadoop用户可以以root身份执行useradd,usermod两个命令。
[root@localhost ~]# useradd hadoop
[root@localhost ~]# su - hadoop
[hadoop@localhost ~]$ useradd
-bash: /usr/sbin/useradd: Permission denied
[hadoop@localhost ~]$ sudo useradd
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 hadoop:
hadoop is not in the sudoers file. This incident will be reported. --在dudo文件里面还没有定义所以执行不了,所以百八十sduo这个命令想随便使用就可以随便使用。
ALL是一个通配符,代表所有主机,即代表所有,可以代表所以用户,所有主机,所有命令。
hadoop ALL=(root) /usr/sbin/useradd,/usr/sbin/usermod --在配置文件的最末尾加上该条目,该ALL代表在任意一台主机,这里注意命令使用绝对路径
[hadoop@localhost ~]$ sudo useradd tom
[sudo] password for hadoop:
[hadoop@localhost ~]$ id tom
uid=1003(tom) gid=1004(tom) groups=1004(tom)
[hadoop@localhost ~]$ tail -1 /etc/passwd
tom:x:1003:1004::/home/tom:/bin/bash
[hadoop@localhost ~]$ sudo usermod -s /bin/csh tom
[hadoop@localhost ~]$ tail -1 /etc/passwd --可以看到在执行第二个命令没有让输入密码,因为sudo在默认第一次通过身份验证后,有效期为五分钟,即五分钟内不需要输入密码
tom:x:1003:1004::/home/tom:/bin/csh
[hadoop@localhost ~]$ sudo userdel tom --可以看到,如果使用了未授权的命令,是没有权限执行的。