如果有两个用户,一个是用来管理网络属性,一个是用对用户进行管理,这就意味着这两个用户需要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具体用法举例
(1)定义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. --在sudo文件里面还没有定义所以执行不了,所以并不是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 -k --如果使用-k选项,那么无论是否超时五分钟下次都得输入密码,即让之前输入的认证信息失效,并重新继续验证
[hadoop@localhost ~]$ sudo useradd hellow
[sudo] password for hadoop:
[hadoop@localhost ~]$ sudo userdel tom --可以看到,如果使用了未授权的命令,是没有权限执行的
Sorry, user hadoop is not allowed to execute '/sbin/userdel tom' as root on localhost.localdomain.
[hadoop@localhost ~]$ sudo -l --使用-l选项可以看到当前用户可以以什么身份执行什么命令
User hadoop may run the following commands on localhost:
(root) /usr/sbin/useradd, /usr/sbin/usermod
如果想要其他用户执行命令的时候不需要输入密码验证,那么可以使用标签NOPASSWD:
hadoop ALL=(root) NOPASSWD: /usr/sbin/useradd,/usr/sbin/usermod --以后hadoop用户再去使用useradd,usermod命令的时候就不需要再次输入密码
[root@localhost ~]# su - hadoop --可以看到没有提示说需要输入密码,注意是NOPASSWD后面的所有命令都不需要输入密码
Last login: Tue Feb 25 10:03:35 HKT 2020 on pts/0
[hadoop@localhost ~]$ sudo useradd jerry
hadoop ALL=(root) NOPASSWD: /usr/sbin/useradd,PASSWD:/usr/sbin/usermod --这样就是useradd使用不需要输入密码,usermod使用需要输入密码
(2)别名的使用
User_Alias USERADMIN=hadoop,%hadoop,%useradmin --定义用户别名,hadoop用户和在hadoop,useradmin组里面的用户
Cmnd_Alias USERADMINCMND=/usr/sbin/useradd,/usr/sbin/usermod,/usr/sbin/userdel,/usr/bin/passwd
--命令别名,USERADMINCMND别名里面包含了usermod,userdel,passwd这些命令
USERADMIN ALL=(root) NOPASSWD: USERADMINCMND --即 USERADMIN别名里面定义的用户和用户组里面的用户,可以从任意主机登入到该服务器上面,以root用户身份执行USERADMINCMND别名里面定义的命令
对于使用/usr/bin/passwd可能会使得普通用户修改root密码,这是很危险的,可以在末尾加上 ! /usr/bin/passwd root
User_Alias USERADMIN=hadoop,%hadoop,%useradmin
Cmnd_Alias USERADMINCMND=/usr/sbin/useradd,/usr/sbin/usermod,/usr/sbin/userdel,/usr/bin/passwd,! /usr/bin/passwd root,命令前面加上感叹号表示不可以执行该命令
USERADMIN ALL=(root) NOPASSWD: USERADMINCMND
最后验证一下是否成功
[root@localhost ~]# su - hadoop
Last login: Tue Feb 25 10:23:13 HKT 2020 on pts/0
[hadoop@localhost ~]$ sudo passwd jerry
Changing password for user jerry.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[hadoop@localhost ~]$ sudo passwd root
Sorry, user hadoop is not allowed to execute '/bin/passwd root' as root on localhost.localdomain.
[hadoop@localhost ~]$ sudo passwd --可以看到还是可以以另外方式修改root密码
Changing password for user root.
New password:
Cmnd_Alias
USERADMINCMND=/usr/sbin/useradd,/usr/sbin/usermod,/usr/sbin/userdel,/usr/bin/passwd [A-Za-z]*,! /usr/bin/passwd root --可以在加上该红色部分
最后sudo的好处是有日志记录,谁以管理员的身份执行了哪些命令都可以在日志里面查看到
[root@localhost ~]# tail /var/log/secure
Feb 25 10:47:47 localhost sudo: hadoop : TTY=pts/0 ; PWD=/home/hadoop ; USER=root ; COMMAND=/bin/passwd jerry
Feb 25 10:47:54 localhost passwd: pam_unix(passwd:chauthtok): password changed for jerry
Feb 25 10:47:58 localhost sudo: hadoop : command not allowed ; TTY=pts/0 ; PWD=/home/hadoop ; USER=root ; COMMAND=/bin/passwd root
Feb 25 10:52:49 localhost sudo: hadoop : TTY=pts/0 ; PWD=/home/hadoop ; USER=root ; COMMAND=/bin/passwd
Feb 25 10:53:31 localhost su: pam_unix(su-l:session): session opened for user root by root(uid=1002)
Feb 25 10:54:38 localhost su: pam_unix(su-l:session): session opened for user hadoop by root(uid=0)