[关闭]
@cdmonkey 2015-05-28T07:17:29.000000Z 字数 5771 阅读 1216

sudo

命令总结


1. 命令简介

sudo指令用于解决Linux下的授权问题,它允许授权用户以超级用户或者其他用户的身份去执行指令。sudo命令用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户在使用sudo时,必须先输入密码,之后有五分钟的有效期限,超过期限则必须重新输入密码。

我们一般使用“visudo”命令编辑修改/etc/sudoers配置文件。

之所以使用visudo有两个原因:

sudo是Unix/Linux平台上的一个非常有用的工具,可以使管理员的管理工作更加方便灵活,在不公开root用户密码的前提下,允许为非root用户赋予一些合理的“权力”,允许他们执行一些只有管理员用户或特许用户才能完成的任务,从而减少根用户的登陆次数和管理时间同时也提高了系统安全性。

指令特点:

sudo指令的运行情况会记录在日志文件/var/log/secure中。

此处输入图片的描述

  1. #显示本用户可以通过sudo执行的指令。
  2. [cdmonkey@WEB-A1 ~]$ sudo -l
  3. ...
  4. [sudo] password for cdmonkey:
  5. Sorry, user cdmonkey may not run sudo on WEB-A1.

在默认的情况下,普通用户没有任何被授权通过“sudo”使用的指令。

2. 初步授权

配置文件/etc/sudoers的配置:

  1. [root@WEB-A1 ~]# visudo
  2. #默认情况下面的第一条授权配置条目,而第二条使我们刚刚增加的:
  3. root ALL=(ALL) ALL
  4. cdmonkey ALL=(root) /usr/sbin/useradd

所以,上面我们新建的授权条目就可以解释为:表示“允许cdmonkey用户从任何主机登录,并且可以通过管理员的身份使用/usr/sbin/useradd命令”。

  1. #在没有添加上面的第二行授权条目前:
  2. [cdmonkey@WEB-A1 ~]$ useradd newtest
  3. -bash: /usr/sbin/useradd: Permission denied
  4. #作为普通用户,在没被授权之前,是没有权限去新建用户的。
  5. [cdmonkey@WEB-A1 ~]$ sudo useradd newtest
  6. [sudo] password for cdmonkey:
  7. cdmonkey is not in the sudoers file. This incident will be reported.
  8. -------------------------
  9. #接下来我们将上文中的授权条目添加上去,然后再执行创建用户的指令:
  10. [cdmonkey@WEB-A1 ~]$ sudo useradd newtest
  11. [sudo] password for cdmonkey:
  12. [cdmonkey@WEB-A1 ~]$ cat /etc/passwd
  13. newtest:x:575:575::/home/newtest:/bin/bash

注意:对sudoers配置文件的编辑可以立即生效,无需被授权用户重新登录。

我们编辑这个文件的时候不用vi直接编辑,而是要使用visudo指令,况且还不能用多个终端同时编辑这个文件,否则会出现下面的提示信息:

  1. [root@WEB-A1 ~]# visudo
  2. visudo: /etc/sudoers busy, try again later
  3. #下面是我自己目前能够想到的解决办法:
  4. [root@WEB-A1 ~]# ps -ef|grep visudo
  5. root 1132 1066 0 13:36 pts/0 00:00:00 visudo
  6. root 1250 1215 0 14:32 pts/1 00:00:00 grep visudo
  7. [root@WEB-A1 ~]# kill 1132

3. 深入配置

3.1 多个用户的设置(非同一群组用户)

对于不同需求的用户,可以按照上面的方法依次增加多行,每行对应一个用户。但是如果需要授权的用户较多,被授权的命令也很多,逐条配置就显然非常的低效和不利于统一管理了。这时我们可以采取定义别名的方法,将用户、主机、命令等元素按实际需求分组规划,以方便授权及管理。

别名类型(Alias_Type)包括如下四种:

别名类型 说明
User_Alias 定义用户别名,别名成员可以是用户,用户组(前面要加%号)。
Host_Alias 定义主机别名。
Runas_Alias 定义runas别名,这个别名指定的是“目的用户”,即sudo指令允许切换至的用户。
Cmnd_Alias 定义命令别名。
定义别名的格式:Alias_Type NAME=item1,item2,item3...

此处输入图片的描述

  1. #若是相同需求的多个用户可以定义『用户别名』:
  2. User_Alias SUDO01=user1,user2,user3
  3. SUDU01 ALL=(root) /usr/sbin/useradd #书写格式:用户列使用别名。
  4. -------------------------
  5. #若是统一设置多个命令则可以定义『命令别名』:
  6. Cmnd_Alias COMMAND01 = /usr/sbin/useradd,/usr/sbin/userdel
  7. SUDO01 ALL=(root) COMMAND01
  8. -------------------------
  9. #对于多主机的设置,同样可以定义『主机别名』:
  10. Host_Alias HOST01=host1,host2,host3
  11. -------------------------
  12. #对于多登陆角色,还可以定义runas别名,指定的是『目的用户』,即允许转换至的用户:
  13. Runas_Alias OP=root
  14. #建立相关别明后,相关命令行相应的列也可以用我们定义的别名:
  15. SUDO01 HOST01=(OP) COMMAND01

编写条目的格式:如上图所示
注意:在被授权执行的命令之前,还有一个可选项,包括:

  1. cdmonkey ALL=(root) NOPASSWD:/usr/sbin/useradd
  2. ----------------------
  3. [cdmonkey@WEB-A1 ~]$ sudo useradd newtest3
  4. #无需输入密码,就成功的创建了用户。

注意:合法的别名名称包含“大写字母、下划线以及数字”,但必须以一个大写字母开头。

3.2 需要注意的问题

配置文件中每行算一个规则,前面带有“#”号可以当作是说明的内容,并不执行。如果规则很长,一行列不下时,可以用“\”号来续行,这样看来一个规则也可以拥有多个行。如果一个别名下有多个成员,成员与成员之间,可以通过使用半角“,”号分隔。成员在必须是有效并事实存在的。什么是有效的呢?

别名的成员受别名类型“Host_Alias、User_Alias、Runas_Alias、Cmnd_Alias”的制约,定义什么类型的别名,就要有什么类型的成员相配。

运行身份别名(Runas_Alias)需要用小括号“()”括起来。
禁止使用的命令需要使用叹号“!”
对于别名规则是每行算一个规则,如果一个别名规则一行容不下时,可以通过“\”来续行。
同一类型别名的定义,一次也可以定义几个别名,他们中间用“:”号分隔。

  1. Host_Alias HT01=moban,st05,st04,192.168.1.0/24
  2. Host_Alias HT01=moban,st05,st04,192.168.1.0/24:HT02=st09,st10
  3. #上面的两条对主机别名的定义,可以通过一条来实现,别名之间用冒号分隔。

多个用户的设置(同一群组用户):用户组前面加上百分号(%)。用户组必须是系统中已经存在的组。

授权规则:授权规则是分配权限的执行规则,我们前面所讲到的定义别名主要是为了更方便的授权引用别名;如果系统中只有几个用户,其实下放权限比较有限的话,可以不用定义别名,而是针对系统用户直接直接授权,所以在授权规则中别名并不是必须的。

规则格式:授权用户 主机=命令动作

这三个要素缺一不可,但在动作之前也可以指定切换到特定用户下,在这里指定切换的用户要用括号号括起来,如果不需要密码直接运行命令的,应该加NOPASSWD:参数,但这些可以省略。

3.3 实例演示

  1. oldboy host1 = /bin/rm
  2. oldboy host1 = NOPASSWD:/bin/rm #无需输入密码即可执行指令。
  3. oldboy host1 = NOPASSWD:/bin/kill, PASSWORD:/bin/ls
  4. ----------------------
  5. %group_test host1 = /bin/rm #同时对系统中的『group_test』用户组里面的所有用户进行授权。
  6. ----------------------
  7. oldboy ALL=/bin/chown,/bin/chmod
  8. #表示用户可以在任何可能出现的主机名的系统中,可以切换到root用户下执行相应的命令。
  9. #这里省略了指定切换到哪个用户下执行命令,则默认是切换到root用户下执行。
  10. #同时也省略了是不是需要用户输入验证密码,如果省略了,则默认是需要验证密码的。
  11. ----------------------
  12. oldboy ALL=(root) NOPASSWD: /bin/chown,/bin/chmod
  13. #表示用户可以在任何可能出现的主机中,能够切换到root下执行指定的指令,而且不需要输入该用户的密码。
  14. #但执行chmod指令时需要用户输入自己的密码。

关于一个命令动作是不是需要密码,我们可以发现在系统在默认的情况下是需要用户密码的,除非特加指出不需要用户需要输入自己密码,所以要在执行动作之前加入“NOPASSWD:”参数。

  1. oldboy ALL=/bin/more /etc/shadow #只允许用户用户查看/etc/shadow文件。
  2. ----------------------
  3. %network ALL=/usr/sbin/*,/sbin/*
  4. #如果要通过用户组进行授权,组名前面要加%号,中间不能有空格。
  5. #表示该用户组下的所有成员,在所有可能的主机上,都能切换到root用户下运行/usr/sbin和/sbin目录下的所有命令。
  1. oldboy ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk
  2. #取消程序某类程序的执行,要在命令动作前面加上『!』叹号。
  3. #表示用户在所有可能存在的主机上运行指定目录下所有的指令,但是fdisk指令除外。

关于命令的排除:

  1. app ALL=(ALL) NOPASSWD:ALL, !/usr/bin/passwd root,!/bin/su

上面的设定基本上杜绝了被授权的普通用户夺取根用户身份,但仍有漏洞,那就是其可以编辑“sudoers”文件,所以还需进一步进行加固。

3.4 配置日志

我们可以通过建立日志文件来监控sudo命令的使用情况,过程如下:

  1. echo "Defaults logfile=/var/log/sudo.log">>/etc/sudoers
  2. echo "local2.debug /var/log/sudo.log">>/etc/rsyslog.conf
  3. #local2.debug:表示正确和错误的操作都计入日志。然后重启日志服务:
  4. [root@WEB-A1 ~]# /etc/init.d/rsyslog restart
  5. ----------------------
  6. [root@WEB-A1 ~]# cat /var/log/secure
  7. Aug 21 04:04:18 moban sudo: kkk : TTY=pts/1...
  8. Aug 21 04:05:13 moban sudo: kkk : TTY=pts/1...

需要注意:
当我们为用户定义可以运行的命令时,必须使用完整的命令路径。这样做是完全出于安全的考虑,如果我们给出的命令只是简单的useradd而非/usr/sbin/useradd,那么用户完全有可能创建一个他自己的脚本,也叫做useradd,然后放在它的本地路径中,如此一来他就能够通过这个名为“useradd”的本地脚本,作为root来执行任何他想要的命令了,这是相当危险的!

写在结尾:
sudo命令核心思想是“权限的赋予”,即某个命令的所属用户不是你自己,而你却有权限执行它。但是我们需要注意的是,虽然你有权限执行这个命令,但是在执行的时候却仍是以这个命令本身所属用户来完成的。(su命令类似于sudo命令,但是两者的差别在于前者su是永久的切换到了su过去的用户,然后以这个su到的新用户干它能干的一切事情;而sudo则是指在执行某个命令的时候临时切换到这个命令的所属用户执行,而且sudo可以做到以单个命令为单位将权限赋予给其他用户,相比su显得更加灵活。)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注