zl程序教程

您现在的位置是:首页 >  系统

当前栏目

Linux sudo详解

Linux 详解 sudo
2023-09-14 09:01:46 时间

如果有两个用户,一个是用来管理网络属性,一个是用对用户进行管理,这就意味着这两个用户需要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)