Linux实战教学笔记15:用户管理初级(下)
第十四节 用户管理初级(下)
标签(空格分隔): Linux实战教学笔记-陈思齐
---更多资料点我查看
1,用户查询相关命令id,finger,users,w,who,last,lastlog,groups
本节主要介绍在用户管理中,查询用户的几种常见工具id,finger,w,who,last,lastlog,groups的用法。
用户查询工具的原理:
在用户管理中,用户查询是通过几个常用的工具来完成的,比如id,finger,groups,users....,我们都知道用户的配置文件是/etc/passwd,用户组的配置文件是/etc/group文件,我们对用户的查询除了通过查询工具以外,我们还能直接查看用户和用户组的配置文件或相关的用户日志记录信息来达到查询的目的;
用户查询工具的原理也是读取与用户和用户组有关的配置文件以及相关的用户日志记录信息,然后按一定的规则和条件输出。
1.1 id命令
id命令是用来查询用户的信息,比如用户所归属于哪些用户组,以及UID和GID等。id命令的用法非常简单,我们举例说明一下:
1)id命令语法
语法格式:id(参数)【用户名】
如果id后面不接任何参数和任何用户,默认显示当前操作用户的用户名,所归属的用户组,UID和GID等。
2)id命令实例
实例1:查询自身的相关信息(不加任何参数和用户名)
[root@chensiqi1 ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
说明:在不加任何参数的情况下,查询的是当前操作用户的用户名,UID,GID和用户所归属主用户组(或称做初始有效用户组)和附属用户组,在本例中,用户名是root,UID是0,所归属的主用户组是root,GID为0.root同时属于bin,daemon....等用户组。
实例2:id后面换用户名
如果我们想查询系统中指定用户属于哪些用户组及UID和GID相应内容,可以直接执行“id用户名”,这里的用户名必须是系统中真实存在的
[root@chensiqi1 ~]# id chensiqi3
uid=808(chensiqi3) gid=801(sa) groups=801(sa)
说明:查询用户chensiqi3的信息,用户chensiqi3,UID为808,所归属的主要用户组为sa,主用户组的GID是801。
正如前文所讲的,用户和用户组的对应关系,可以是一对一,一对多,多对一,或多对多的交叉关系,本例就是一个用户属于多个用户组的情况,就象一个人属于多个组织和集体一样,这是合法。
总结:id的命令很简单,在生产场景中常用的方法就是“id 用户名”或“id”的方法。
1.2 finger命令
finger命令侧重于用户信息的查询,查询的内容包括用户名,家目录,登录shell类型,用户真实的名字,办公地址,办公电话,也包括登录终端,写状态,时间等;
前文我们通过useradd,chsh,chfn,usermod等命令修改的信息,都可以通过finger命令查看
finger参数选项 | 注释说明(带特殊颜色的,需要掌握) |
---|---|
-l | 显示所有信息 |
-m | 禁止对用户真实名字进行匹配 |
-p | 把.plan和project文件中内容省略 |
-s | 显示短格式信息 |
1.3 w,who,users,last,lastlog命令
w,who和users几个命令工具,一般是用来查询已登录当前主机的用户信息:finger命令也有这个功能。而看用户更详细的登录信息,不同命令的侧重点略有差别,大家可以仔细对比下。
[root@chensiqi1 ~]# w #显示已经登陆的用户,并且都做了什么的信息
10:28:30 up 8:55, 1 user, load average: 0.06, 0.06, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.197.1 09:41 0.00s 0.03s 0.00s w
??oot@chensiqi1 ~]# who # 显示哪些用户在登录,终端及登录时间,来源主机?
root pts/0 Feb 20 09:41 (192.168.197.1)
[root@chensiqi1 ~]# users #仅显示哪些用户在登录
root
[root@chensiqi1 ~]# finger ##不加参数也表示显示登录用户的相关信息,但这个命令还可以显示其他未登录的用户信息
Login Name Tty Idle Login Time Office Office Phone
root root pts/0 Feb 20 09:41 (192.168.197.1)
[root@chensiqi1 ~]# last #显示已登录的用户列表及登录时间等
root pts/0 192.168.197.1 Mon Feb 20 09:41 still logged in
root pts/1 192.168.197.1 Sun Feb 19 23:24 - 05:35 (06:11)
root pts/0 192.168.197.1 Sun Feb 19 21:34 - 00:22 (02:47)
root pts/0 192.168.197.1 Sun Feb 19 11:11 - 20:43 (09:32)
以下省略....
[root@chensiqi1 ~]# lastlog #报告最近的所有系统用户的登录信息
Username Port From Latest
root pts/0 192.168.197.1 Mon Feb 20 09:41:51 -0500 2017
bin **Never logged in**
daemon **Never logged in**
adm **Never logged in**
lp **Never logged in**
sync **Never logged in**
shutdown **Never logged in**
以下省略...
总结:
w,who,users,last,lastlog等几个命令的功能有很多相似的地方,具体细节,上文已经解释说明,这几个命令我们会经常用到,但使用的方法一般就是仅仅执行命令本身而已。
2,Linux用户身份切换命令
- 我们知道linux系统中,超级用户root具有超级管理权限。由于权限太大,如果管理不好,就会对系统安全带来严重隐患。在工作场景中,我们只在必要时才使用超级用户root的权限。一般的临时性处理工作,都是以普通用户的身份完成的。那么,当普通用户需要超级用户的权限时,是怎么进行切换管理的呢?这就不得不提到两个重要的用户身份切换命令su和sudo。下面我们就讲解这两个命令是如何完成用户切换工作的,达到系统管理目的的?
- 在linux系统中,每个文件,目录和进程,都是归属于某一个用户的,没有用户的许可,其他的普通用户是无法操作的,root除外。root用户的特权还表现在root可以超越任何用户和用户组来对文件或目录进行读取,修改或删除(在系统正常的许可范围内);对可执行程序的执行,终止;对硬件设备的添加,创建和移除等;也可以对文件和目录进行属主和权限进行修改。
2.1 su命令
2.1.1 su命令介绍
- 简单的说,su命令就是切换用户身份的命令。比如,我们以普通用户chensiqi登录到系统后,当要在系统中执行useradd添加用户时,会发现chensiqi用户没有这个权限,这个权限只能由root权限执行。解决方法一是退出chensiqi用户,重新以root用户登录。二是我们直接在chensiqi用户下,使用su命令来切换到root下进行添加用户工作,等工作完成后再退出root用户。毫无疑问,上面两个方法,通过su命令切换是一种比较好的办法。
- 通过su命令可以再用户之间切换,超级权限用户root向普通或虚拟用户切换不需要密码验证(这就是超级权限所在),其他普通用户之间或者普通用户切换到root,都需要切换用户的密码验证。
2.1.2 su命令用法
su 【选项参数】【用户】
为了方便查看,用表格的方式把su命令的常用参数选项列表显示,如下所示:
|su参数选项|注释说明【带特殊颜色表示重要,需要掌握】|
|--|--|
| - | 使一个shell成为登录的shell,如执行su - chensiqi时,表示该用户想改变身份为chensiqi,并且使用chensiqi用户的环境变量配置,如/home/chensiqi/.bash_profile等
|
|-c|临时切换到某一个用户,执行一个命令,执行完,自动返回到当前用户;切换到一个shell,执行一个命令,然后退出所切换的用户环境
|
|-m|切换用户时,不重置用户环境比纳凉,-p的功能同-m这个参数为su默认值。|
|-s|如果/etc/shells允许,则运行指定的shell|
2.1.3 su命令实例
当不加任何参数执行su命令时,表示要切换到root用户,但这样执行,会遇到一些问题。因为虽然是切换到root用户了,但并没有改变为root用户登录环境,用户默认的登录环境,可以在/etc/passwd中查得到,包括家目录,shell类型等。比较规范的操作方法是su -。
实例1:由普通用户chensiqi切换到root用户。
[chensiqi@chensiqi1 ~]$ whoami #确认当前用户为chensiqi root
chensiqi
[chensiqi@chensiqi1 ~]$ su #不加用户就表示切换到root,当然也可以su root root
Password:
[root@chensiqi1 chensiqi]# env
HOSTNAME=chensiqi1
SHELL=/bin/bash
HISTSIZE=500
USER=chensiqi
MAIL=/var/spool/mail/chensiqi
PWD=/home/chensiqi
HOME=/root
LOGNAME=chensiqi
以下省略无关内容...
提示:细心的同学应该已经看到了,如果使用su而不加上“-”这个参数,那么,切换前的用户的相关信息还会存在,这会引起很多麻烦,甚至出现意想不到的结果。因此,切换用户时,最好是“su - 用户名”。这是生产场景中标准的切换用户的操作方法。
[root@chensiqi1 chensiqi]# exit #退出当前用户,这个命令也可以用ctrl+d
[chensiqi@chensiqi1 ~]$ su - root
Password:
[root@chensiqi1 ~]# env | egrep "USER|MALL|PWD|LOGNAME"
USER=root
PWD=/root
LOGNAME=root
提示:这次和上次就不同了,所有的环境变量信息都切换到了root下。因此,请大家在切换用户时一定要加上“su - 用户名”,这里提醒下,不光是切换到root,切换到其他用户也是一样。
2.1.4 su命令总结
1)普通用户切换到root用户,可使用su -或su - root.必须输入root的密码才能完成切换。
2)root用户切换到普通用户,可使用“su - 普通用户”的写法。不需要输入任何密码就能完成切换。切换到普通用户后,在执行一些命令如ifconfig时,可能会遇到环境变量PATH路径问题而找不到某些系统命令(一般/sbin,/usr/sbin等下面的命令),这时就需要将普通用户的PATH,配置成root的PATH内容,前面的文章已讲解过这个配置方法,不清楚的同学,可以查询一下。提示:Centos6.4以上系统不存在这个问题
3)如果仅希望以某用户的角色执行命令,而不直接切换到该用户下操作,可以使用su - 用户名 -c “命令”的方式.
实例2:由root切换到普通用户chensiqi
[root@chensiqi1 ~]# su - chensiqi ##从root切换到任何普通用户,不需要输入密码
[chensiqi@chensiqi1 ~]$ env | egrep "USER|MATL|PWD|LOGNAME"
USER=chensiqi
PWD=/home/chensiqi
LOGNAME=chensiqi
实例3:chensiqi用户使用root身份执行一个命令。
[chensiqi@chensiqi1 ~]$ ls -l /root
ls: cannot open directory /root: Permission denied
[chensiqi@chensiqi1 ~]$ su - root -c "ls -l /root" #这是su的参数组合,表示切换到root用户,并且改变到root环境,然后列出root家目录的文件,然后退出root用户
Password: #需要输入root密码
total 44
-rw-r--r--. 1 root root 4 Feb 20 01:31 111
-rw-------. 1 root root 1144 Jan 11 22:26 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4096 Feb 19 08:41 chen
-rw-r--r--. 1 root root 237 Feb 20 03:02 chen2017-02-20.tar.gz
drwxr-xr-x. 3 808 root 4096 Feb 20 00:14 chensiqi
-rw-r--r--. 1 root root 21764 Jan 11 22:26 install.log
-rw-r--r--. 1 root root 0 Feb 20 00:21 stu1
-rw-r--r--. 1 root root 0 Feb 20 00:21 stu2
-rw-r--r--. 1 root root 0 Feb 20 00:21 stu3
-rw-r--r--. 1 root root 0 Feb 20 00:21 stu4
-rw-r--r--. 1 root root 0 Feb 20 00:21 stu5
-rw-r--r--. 1 root root 0 Jan 11 22:26 ww.etiantian.org
实例4:有关su命令参数生产环境应用案例
在生产场景中,为了安全起见,我们一般会使用普通用户来启动服务器进程(如:apache,nginx,resin,tomcat等),比如,下面例子:
[chensiqi@chensiqi ~]$ ps -ef | grep chensiqi #查看包含chensiqi用户的服务进程
tddoc 9042 1 0 Jan16 ? 00:00:02 java -server -XMN125M -Xmn125M -Xms512M -Xmx512M -Xss2048k -Djava.rmi.server.logCalls=false -Dsun.rmi.transport.tcp.logLevel=WARNING -Xlogge:/home/tddoc/run/resin/logs/gc.log -jar /home/tddoc/run/resin/lib/resin.jar -server a
提示:这是一个resin(提供java服务的软件)的服务进程,当前服务用户是chensiqi
这个时候我们就面临一个问题,如何让系统在每一次开机时也要自动以普通用户启动指定的服务脚本呢?答案在下面
[root@chensiqi1 ~]# tail -5 /etc/rc.local #把要执行的脚本防御开机自启动配置文件/etc/rc.local中
#######分用户方案启动服务命令#######
su - chensiqi -c '/bin/sh /homechensiqi/bin/deloy.sh'
提示:大家注意了,这里就是在系统开机时,通过su - 用户名 -c “命令”,执行的启动服务的命令,其中,/bin/sh /home/chensiqi/bin/deploy.sh就是仅限在chensiqi用户下启动的服务命令脚本。通过普通用户跑服务是个很好的提升系统安全的好方法,在生产环境中,大多数服务(如,apache,nginx,resin,tomcat,rsync,lvs,haproxy,heartbeat,squid)等都可以通过普通用户来启动,而不用root。这样做,使得系统安全又提高了一个等级。目前,taobao支持宝等大公司均有采用。
[root@chensiqi1 ~]# su - chensiqi -c "touch a.txt"
[root@chensiqi1 ~]# ls -l /home/chensiqi/
total 0
-rw-rw-r--. 1 chensiqi chensiqi 0 Feb 21 00:11 a.txt
- 1,从安全角度,普通用户启动服务安全些
- 2,管理,用普通用户即可管理对应的服务/软件
2.1.5 su命令的优缺点
- 毫无疑问,切换用户身份的su命令为我们管理linux系统带来了很多方便,通过切换到root下,可以完成各种系统管理工作,只要任何一个普通用户知道了root用户的密码,都可以以普通用户的身份切换到root来完成本来无法完成的系统管理工作。
- 但是,这样通过su命令切换到root后,也带来了很大安全管理问题,比如系统有8个普通用户,都可以通过切换到root身份进行系统管理,甚至还可以改掉root的密码,让其他的普通用户无法再实现系统管理,还有,这么多用户中,有任何一人对系统操作的重大失误,都可以导致整个系统崩溃或数据损失。这样的非集权式管理,在一定程序上就对系统的安全造成了较大威胁。在工作中,几乎有一半的问题来自于内部。
- 所以使用su命令切换身份在多个系统管理员共同管理的场合,并不是最好的选择,因此,我建议如果是一般的中小公司不超过3个管理员时,为了管理方便,使用su来共同管理是可以接受的。
- 我们既希望超级用户root密码掌握在少数或唯一的管理员手中,又希望多个系统管理员能够完成更多更复杂的系统管理工作。那么,如何解决多个系统管理员都能管理系统而又不让超级权限泛滥的需求呢?这就需要sudo命令来替代或结合su命令来完成这样的苛刻且必要的管理需求。
1,必须知道root用户的密码
2,我们希望普通用户可以临时做回皇帝,但是我们不想给root用户的密码,--sudo解决
3,大部分企业故障,在工作中几乎有一半的问题来自于内部。
3,sudo命令
3.1 sudo命令的用法
sudo 【参数选项】命令
为了方便,我们用表格把sudo命令常用参数选项列表显示,如下所示:
|sudo参数选项|注释说明(带特殊颜色的表示重要,需要掌握)|
|--|--|
|-l|列出用户在主机上可用的和被禁止的命令:当配置好sudo权限规则后,可用这个参数来查看授权情况
|
|-v|验证用户的时间戳,当用户运行sudo,输入用户的密码后,在短时间内可以不用输入口令直接进行sudo操作;用-v可以跟踪最新的时间戳|
|-u|指定以某个用户身份执行特定的命令操作,chensiqi ALL=(ALL) /bin/cp|
|-k|同-K,删除时间戳,下一个sudo命令要求提供密码,前提是该用户授权中不能有NOPASSWD参数。时间戳默认5分钟也会时效。|
3.2 sudo命令实例
实例1:使用chensiqi用户在/root目录下建立文件
[chensiqi@chensiqi1 ~]$ whoami #查看当前用户
chensiqi
[chensiqi@chensiqi1 ~]$ sudo touch /root/ett #这是sudo生产场景的标准用法
[sudo] password for chensiqi: #提示输入密码,密码为当前用户的密码
Sorry, user chensiqi is not allowed to execute '/bin/touch /root/ett' as root on chensiqi1. #因为没有sudo权限,所以不让操作
接下来我们进行权限配置
[root@chensiqi1 ~]# whoami #查看当前用户
root
[root@chensiqi1 ~]# grep chensiqi /etc/sudoers
chensiqi ALL=(ALL) /bin/touch #给chensiqi用户授权/bin/touch命令
[root@chensiqi1 ~]# su - chensiqi #切换账户
[chensiqi@chensiqi1 ~]$ sudo touch /root/ett #申请授权在/root下创建一个文件
[chensiqi@chensiqi1 ~]$ exit
logout
[root@chensiqi1 ~]# ls -l ett
-rw-r--r--. 1 root root 0 Feb 21 01:17 ett
实例2:配置sudoers文件,对chensiqi进行授权,然后在实践上例的操作
[root@chensiqi1 ~]# whoami #查看当前用户
root
[root@chensiqi1 ~]# sed -n '92p' /etc/sudoers #读取授权信息
chensiqi ALL=(ALL) ALL
[root@chensiqi1 ~]# visudo -c #检查sudo配置文件是否有错误
/etc/sudoers: parsed OK
实例3:sudo与su两个命令结合使用的案例
特别说明:这个案例操作,再生产环境中经常用到
[chensiqi@chensiqi1 ~]$ whoami
chensiqi
[chensiqi@chensiqi1 ~]$ sudo su - #切换root
[sudo] password for chensiqi: #输入当前用户密码
[root@chensiqi1 ~]# whoami
root
[root@chensiqi1 ~]# exit
logout
[chensiqi@chensiqi1 ~]$ sudo su - chensiqi2 #切换chensiqi2用户,因为是基于root进行切换,所以不需要密码了
[chensiqi2@chensiqi1 ~]$ whoami
chensiqi2
实例4:chensiqi用户通过sudo切换到chensiqi2用户下创建目录
[chensiqi@chensiqi1 ~]$ whoami
chensiqi
[chensiqi@chensiqi1 ~]$ sudo -u chensiqi2 mkdir /home/chensiqi2/tmpdir #临时用chensiqi2的身份在其家目录下创建一个文件夹
[chensiqi@chensiqi1 ~]$ ls -l /home/chensiqi2 #直接查看是不被允许的
ls: cannot open directory /home/chensiqi2: Permission denied
[chensiqi@chensiqi1 ~]$ sudo -u chensiqi2 ls -l /home/chensiqi2 #申请临时切换chensiqi2查看
total 4
-rw-r--r--. 1 chensiqi2 chensiqi2 0 Feb 11 02:21 readme
drwxr-xr-x. 2 chensiqi2 chensiqi2 4096 Feb 21 01:51 tmpdir
[chensiqi@chensiqi1 ~]$ whoami #当前用户还是chensiqi
chensiqi
3.2 更改授权/etc/sudoers文件的几个方法:
1)方法一:执行visudo命令直接编辑/etc/sudoers文件(推荐)
## user MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
chensiqi ALL=(ALL) ALL
#前面sudo实例2的授权,同样可以设置。当然,位置未必非要在原有的配置文件root这里。
特别说明:在没有特殊需求的前提下,请大家一定要使用这个方法,这也是我建议同学们使用的方法,这种授权方法,缺点就是必须和系统交互才能完成授权。
2)方法二:直接修改/etc/sudoers文件方法(不推荐)
[root@chensiqi1 ~]# echo "chensiqi ALL=(ALL) ALL" >> /etc/sudoers
#通过echo命令追加一行授权规则,让chensiqi用户对所有的主机,可以切换所有用户,执行所有命令。
#特别提示:对于新手,请不要使用这个命令,如果配置出错,会导致所有普通用户无法使用;
#下面的很多命令做法实际上都是在为我们前面的不规范的操作再检查处理,看看是不是有些得不偿失?
[root@chensiqi1 ~]# tail -1 /etc/sudoers
chensiqi ALL=(ALL) ALL
[root@chensiqi1 ~]# visudo -c #检测sudo配置文件语法错误
/etc/sudoers: parsed OK
[root@chensiqi1 ~]# ls -l /etc/sudoers
-r--r-----. 1 root root 3756 Feb 21 02:40 /etc/sudoers
提示:查看sudoers文件的权限是否被更改了,权限必须为440(-r--r----)否则会出现问题。
Centos5.8 sudoers有权限属性问题:
[root@C58 ~]# ll /etc/sudoers
-rw-r--r-- 1 root root 3403 Aug 30 02:41 /etc/sudoers
[root@C58 ~]# sudo su -
sudo:/etc/sudoers is mode 0644 ,should be 0440
sudo:no valid sudoers sources found,quitting
Centos6.4 sudoers 权限不对也可以登录:
[root@C64 ~]# ll /etc/sudoers
-rw-r--r-- 1 root root 4089 Aug 23 01:26 /etc/sudoers
[root@C64 ~]# su - chensiqi
[chensiqi@C64 ~]$ sudo su -
为什么我在这里提出并强调这个配置方法呢?就是因为这个方法虽然比较危险,但是也有优点,最主要的优点就是不需要和系统做交互,可以通过shell等脚本批量快速的添加,修改授权。
3.2.1 但以上直接修改sudoers的配置文件方法有以下需要注意的几点:
1,echo命令是追加“>>”,不是重定向“>”,除了echo外,可以用cat,sed等命令实现类似的功能。
2,修改操作完成一定要执行visudo -c进行语法检查,这弥补了直接修改没有语法检查的不足。
3,确保/etc/sudoers权限是正确的(-r--r----),权限不对会导致sudo功能异常(Centos6权限不对也可以登录,但是/etc/sudoers是440是最安全的)
4,及时对授权的操作进行测试,验证是否正确(最好不要退出当权授权窗口,以便发现问题及时恢复)。
5,确保知道正确的root用户密码,以便在sudo出现问题时可以通过普通用户等执行su - 命令切换到root进行恢复
看到了吧,有这么多需要注意的问题,如果不注意,很可能会带来灾难性后果,因此没有特殊紧急批量增加sudoers文件内容的需求,建议通过visudo来编辑修改,毕竟系统安全是相当重要的。
3)方法三:使用用户组的方式实现sudo授权
通过授权一个用户组的方式来配置/etc/sudoers,如:授权sa组具备以上所有主机的管理权限,这样以后有增加用户需要相同权限时,直接将用户加入到sa组就可以享受sa组的sudo授权了,是不是更简单了呢。
#这是个单用户授权
root ALL=(ALL) ALL
#这是组授权
# %wheel ALL=(ALL) ALL
%sa ALL=(ALL) ALL
#注意用户组授权和普通用户的区别,开头为“%”百分号。sa组同用户一样必须是已经存在的,是系统用户组。
使用用户组实际授权的操作过程如下:
[root@chensiqi1 ~]# echo "%sa ALL=(ALL) ALL" >> /etc/sudoers
[root@chensiqi1 ~]# visudo -c #检查语法
/etc/sudoers: parsed OK
[root@chensiqi1 ~]# tail -1 /etc/sudoers #查看一下
%sa ALL=(ALL) ALL
3.3 /etc/sudoers的规则大致可分为两类:
1,别名定义
2,授权规则
别名定义并不是必须的,只是在授权规则多的时候更方便授权,但授权规则是必须的。
|用户名|主机别名=(身份别名)|授权命令|
|--|--|--|
|root|ALL=(ALL)|ALL|
|User Aliases|HOST_Alias=(Runas_Alias)|cmd_Alias|
3.3.1 HOST_Alias 定义主机别名
实际语法为:
## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhap using)
## wildcards for entire domains or IP addresses instead.
Host_Alias FILESERVERS = fs1,fs2 #请注意定义范围,‘=’号两边有空格
Host_Alias MAILSERVERS = smtp,smtp2 #请注意定义规范,每个成员用逗号分隔,逗号后面有空格。
说明:
1,在生产场景中,一般情况下不需要设置主机别名,在定义授权规则时可以通过ALL来匹配所有的主机。
2,请注意上面定义的规范,有些规范虽然不是必须的,但我们还是要求能够按照系统的标准来配置,这样可以避免意外的问题发生。
3,以上Host Aliases内容截取自/etc/sudoers文件,最后两行取消了注释。
4,其实就是一个逻辑上的主机组,当多台服务器共享一个/etc/sudoers时候会用到这个主机别名。
=========================================
## user MACHINE=COMMANDS
## The COMMANDS section may have other options added to it
## Allow root to run any commands anywhere
root | ALL=(ALL) ALL #第一个ALL就是主机别名的应用位置
例:
chensiqi 192.168.0.101=(ALL) ALL #这个的意思就是只允许在192.168.0.108这台电脑远程登录的chensiqi用户才能需有root的所有权限。
3.3.2 User_Alias 定义用户别名
别名成员可以是用户,用户组(用户组前面要加%号)
实际语法为:
## User Aliases
## These aren't often neccessary,as you can use regular groups
## (ie,from files,LDAP,NIS,etc)in this file - just use #groupname
## rather than USERALIAS
User_Alias ADMINS = jsmith,mikem,%groupname
提示:
1,设置用户别名也不是必须的,更多的情况,我们可以通过%groupname的方式来作为成员。
2,以上User Aliases 内容截取自/etc/sudoer文件,最后一行取消了注释
===========================================
## user MACHINE=COMMANDS
## The COMMANDS section may have other options added to it
## Allow root to run any commands anywhere
## which machines (the sudoers file can be shared between multiple systems)
root ALL=(ALL) ALL #root用户的位置就是用户别名的应用位置
3.3.3 Runas_Alias 定义runas别名
这个别名指定的是“用户身份”,即sudo允许切换到的用户身份
实际语法为:
Runas_Alias OP = root
==========================================
## user MACHINE=COMMANDS
## The COMMANDS section may have other options added to it
## Allow root to run any commands anywhere
## which machines (the sudoers file can be shared between multiple systems)
root ALL=(ALL) ALL #小括号中得第二个ALL位置就是Runas_Alias别名的应用位置。
实例如下:
[chensiqi@chensiqi1 ~]$ whoami
chensiqi
[chensiqi@chensiqi1 ~]$ sudo -l
User chensiqi may run the following commands on this host:
(chensiqi2) /bin/mkdir, (chensiqi2) /bin/ls #小括号里是被授权的身份,也就是说可以sudo -u chensiqi2
[chensiqi@chensiqi1 ~]$ sudo -u root ls /root #root身份未被授权,因此被拒绝
Sorry, user chensiqi is not allowed to execute '/bin/ls /root' as root on chensiqi1.
[chensiqi@chensiqi1 ~]$ sudo -u chensiqi2 ls /home/chensiqi2 #申请以chensiqi2身份查看其家目录,成功
ccccc
[chensiqi@chensiqi1 ~]$ ls /home/chensiqi2 #直接查看失败
ls: cannot open directory /home/chensiqi2: Permission denied
[chensiqi@chensiqi1 ~]$
3.3.4 Cmd_Alias 定义命令别名
命令别名就是定义一个别名,包含一堆命令,即一组相关命令的集合。
提示:
1,命令别名就是设置用可以执行哪些命令。
2,以上Command Alias 内容截取自/etc/sudoer文件,最后一行取消了注释。
==========================================
## user MACHINE=COMMANDS
## The COMMANDS section may have other options added to it
## Allow root to run any commands anywhere
## which machines (the sudoers file can be shared between multiple systems)
root ALL=(ALL) ALL #最后一个ALL的位置就是cmd_Alias命令别名
3.3.5 回顾下别名和具体授权配置的关系
用户或组 | 主机(可以执行sudo的机器) | 可以切换的用户角色 | |
---|---|---|---|
root | ALL= | (ALL) | ALL |
User_Alias | Host_Alias | Runas_Alias | Cmd_Alias |
用户别名的位置 | 主机别名的位置(可以在哪个主机上执行sudo) | Runas别名的位置(以谁的身份执行sudo授权命令) | 命令别名的位置 |
什么情况下使用上述别名?
工作中一般有多个系统用户,需要分类,分层次管理用户的时候
定义别名的实践例子:
由于主机别名,在工作中使用的不多,这里我们就不讲解了,如果同学们感兴趣,可以查看man sudoers或less /etc/sudoers自行查看
生产环境实例:
实例1:定义用户别名
sa ===> system administrator
User_Alias ADMINS = chensiqi,chensiqi2,%sa #注意定义的规范
#定义系统管理用户别名ADMINS,包含成员chensiqi,chensiqi2及sa组成员
User_Alias NETADMINS = leo,maya
#定义用户别名NETADMINS来管理网络,包含成员leo,maya
User_Alias USERADMINS = zuma
#定义用户别名USERADMINS来管理用户,包含成员zuma
特别说明:为了方便管理,要尽可能使用有意义的名称作为别名。另外,所有包含成员都必须是系统中存在的用户或存在的组。
检查并创建上述用户及用户组
[root@chensiqi1 ~]# id chensiqi
uid=500(chensiqi) gid=802(chensiqi) groups=802(chensiqi)
[root@chensiqi1 ~]# grep "^sa:" /etc/group
sa:x:801:
[root@chensiqi1 ~]# useradd leo && echo 123|passwd --stdin leo
[root@chensiqi1 ~]# useradd maya && echo 123|passwd --stdin maya
[root@chensiqi1 ~]# useradd zuma && echo 123|passwd --stdin zuma
[root@chensiqi1 ~]# useradd chensiqi2 && echo 123|passwd --stdin chensiqi2
实例2:定义命令别名
Cmd_Alias USERCMD = /usr/sbin/useradd,/user/sbin/userdel,/user/bin/passwd [A-Za-z]*,/bin/chown,/bin/chmod, ! /usr/bin/passwd root
Cmd_Alias DISKCMD = /sbin/fdisk,/sbin/parted
Cmd_Alias NETMAGCMD = /sbin/ifconfig,/etc/init.d/network
Cmd_Alias CTRLCMD = /usr/sbin/reboot,/usr/sbin/halt
特别说明:
1)所有的命令别名下的成员必须是文件或目录的绝对路径
2)命令别名超过一行时,可以通过“\”号换行。
3)定义时,可以通过通配符,如/usr/bin/passwd [A-Za-z]*
上述用户和命令别名实际上就是整理如下对应关系:
实例3:定义runas别名
Runas_Alias OP = root,chensiqi
特别说明:runas别迷ing的定义不多见,不常用,了解即可
3.4 /etc/sudoers配置文件中的授权规则
- /etc/sudoers的授权规则就是分配权限的执行规则,前面我们讲到的定义别名主要为了更方便授权引用别名。如果系统中的普通用户不多,在授权时可以不用定义别名,而是针对系统用户直接授权,所以在授权规则中别名并不是必须的,这一点大家要知道下,毕竟别名的技术理解和配置还是有点难。
- 关于授权规则,通常我们可以man sudoers来查看/etc/sudoers文件的配置信息,配置文件中的例子其实已经演示的很清楚了,这里我仅给大家做一些必要的说明,如果想详细了解授权规则写法的,可执行man sudoers或man /etc/sudoers查询。
3.4.1 sudo授权规则实例
下面我们结合别名授权和用户授权规则举几个综合应用的例子
实例1:对chensiqi的授权规则如下:
chensiqi ALL=/usr/sbin/useradd,/usr/sbin/userdel
在测试之前,为了防止已有的配置干扰,我们把所有配置恢复到默认情况,我们通过比速冻命令在/etc/sudoers里的内容,表示chensiqi可以在所有系统中,切换到root用户下以root身份执行/usr/sbin/useradd和/usr/sbin/userdel命令,切换到chensiqi用户下查看授权的结果如下:
[chensiqi@chensiqi1 ~]$ sudo -l #查看授权结果
[sudo] password for chensiqi: #输入密码
User chensiqi may run the following commands on this host:
(root) /usr/sbin/useradd #授权的命令
(root) /usr/sbin/userdel #授权的命令
值得注意的是,本例省略了指定切换到哪个用户下执行/usr/sbin/useradd和/usr/sbin/userdel命令,根据之前所讲,User_Alias默认情况下是切换到root用户下执行:同时,授权时未加NOPASSWD:配置,因此默认情况下,第一次执行是需要密码的。
实例2:对chensiqi的授权规则更改为如下:
chensiqi ALL=(root) /usr/sbin/useradd,/usr/sbin/userdel
###上面一行表示chensiqi可以在所有的主机中,切换到root下执行useradd和userdel命令,和实例1的功能是等价的。
实例3:用户组的配置例子
在前面已经讲解过了,如果用户组出现在/etc/sudoers中,前面要加%sa%sa ALL=/usr/sbin/*,/sbin/*
如果我们在/etc/sudoers中间加入如上一行,表示sa用户组下的所有成员,在所有主机下,可切换到root执行/usr/sbin和/sbin目录下所有命令,*为正则表达式写法,表示所有。
实例4:禁止某个命令的执行
禁止某个命令的执行,要在命令动作前面加上!号:本例中也使用了通配符的*的用法:chensiqi ALL=(ALL) /usr/sbin/*,/sbin/*,!/sbin/fdisk
这个规则表示chensiqi用户在所有主机上可以切换到任何身份,可以运行/usr/sbin和/sbin目录下所有命令,但fdisk命令除外。
3.4.2 sudo配置文件/etc/sudoers授权规则注意事项总结:
1)授权规则中的所有ALL字符串必须为大写字母。
2)Cmd_ALias(命令别名):允许执行的命令是有顺序的。命令的顺序是从后向前,即把禁止执行的命令放在允许执行的命令的后边。再强调下,禁止的命令尽量放在后边
3)一行内容超长可以用“”斜线换行。
4)“!”叹号表示非,就是命令取反的意思,即禁止执行的命令
5)根据实际情况,来分类制作命令别名,用什么给什么。
3.4.3 [Centos6.7之前]关于远程执行sudo命令
在默认情况下,我们是无法通过ssh远程执行sudo命令的,这是因为,远程执行sudo,那么密码是明文的,这是被禁止的。可是在实际生产场景中我们经常需要这样的需求,怎么解决呢?
localhost:~ chensiqi$ ssh chensiqi@chensiqi cat /etc/redhat-release #用普通账号链接查看远程服务器系统版本
chensiqi@chensiqi's password:
CentOS release 6.8 (Final)
localhost:~ chensiqi$ ssh root@chensiqi sed -n '92p' /etc/sudoers #查看普通账户授权情况
root@chensiqi's password:
chensiqi ALL=(chensiqi2) /bin/mkdir,/bin/ls
localhost:~ chensiqi$ ssh chensiqi@chensiqi sudo ls /root #ssh远程执行sudo命令
chensiqi@chensiqi's password:
sudo:没有终端存在,且未指定 askpass 程序
提示:
为何会有这样的错误呢?我们之所以用ssh来执行sudo其实为的就是可以免交互方式来得到我们想得到的结果。但是普通用户sudo在申请授权的时候,是需要输入密码的,因此,我们想要成功,需要先进行免密码操作。
localhost:~ chensiqi$ ssh chensiqi@chensiqi cat /etc/redhat-release #查看版本
chensiqi@chensiqi's password:
CentOS release 6.8 (Final)
localhost:~ chensiqi$ ssh root@chensiqi "sed -n '92p' /etc/sudoers" #查看授权资料
root@chensiqi's password:
chensiqi ALL=(ALL) NOPASSWD: /bin/mkdir,/bin/ls #进行了免密码配置
localhost:~ chensiqi$ ssh chensiqi@chensiqi "sudo ls /root" #远程执行sudo。成功!
chensiqi@chensiqi's password:
111
anaconda-ks.cfg
chen
chen2017-02-20.tar.gz
chensiqi
dsfds
ett
gsdgdsfg
install.log
sdfsdf
stu1
stu2
stu3
stu4
stu5
ww.etiantian.org
zzzz
特别提示:
设置了免密码之后,之所以能成功,是因为linux系统版本为Centos6.8,如果是之前的系统版本。那么我们需要做特殊处理。我们可以通过“ssh -t hostname sudo ”的方式来执行,也就是加了个-t参数。通过man ssh查看-t参数的帮助可以得知,这是一个可以强制ssh远程执行本来需要屏幕的程序(免交互),会强制配置终端tty,即使本地没有。
4,项目实战经验:配置sudo命令用户行为日志审计
说明:所谓sudo命令日志审计,并不记录普通用户的普通操作。而是记录那些执行sudo命令的用户的操作。
项目实战:简历中的经验说明模版
服务器日志审计项目提出与实施 20xx.0x - 20xx.xx
1,权限方案实施后,权限得到了细化控制,接下来进一步实施对所有用户日志记录方案。
2,通过sudo和syslog(rsyslog)配合实现对所有用户进行日志审计并将记录集中管理(发送到中心日志服务器)
3,实施后让所有运维和开发的所有执行的sudo管理命令都有记录可查,杜绝了内部人员的操作安全隐患。
生产环境企业日志审计解决方案:
所谓日志审计,就是记录所有系统及相关用户行为信息,并且可以自动分析,处理,展示(包括文本或者录像)
方法一:通过环境变量命令及rsyslog服务进行所有用户的所有操作的全部日志审计(信息量太大,不推荐)。
方法二:sudo配合rsyslog服务,进行日志审计(审计信息较少,效果不错)
方法三:在bash解释器程序里嵌入一个监视器,让所有被审计的系统用户使用修改过的增加了监视器的特殊bash程序作为工作环境
方法四:齐治的堡垒机:商业产品
我们今天要学习的是:sudo日志审计:专门对使用sudo命令的系统用户记录其执行的命令相关信息。
方法五:python开发的开源产品
方法六:
方法七:
shell跳板机:
1)安装sudo命令,rsyslog服务
一般情况下系统都是默认安装了的。(Centos5为syslog)
2)配置/etc/sudoers
增加配置“Defaults logfile=/var/log/sudo.log”到/etc/sudoers中,注意:不包含引号。[root@chensiqi ~]# echo "Defaults logfile=/var/log/sudo.log">>/etc/sudoers
一行搞定sudo日志审计
[root@chensiqi1 ~]# tail -1 /etc/sudoers
Defaults logfile=/var/log/sudo.log
[root@chensiqi1 ~]# visudo -c #检查sudoers文件语法
/etc/sudoers: parsed OK
提示:下面的3),4)可以不执行,直接切换到普通操作,然后查看/var/log/sudo.log有无记录
[root@chensiqi1 ~]# cat /var/log/sudo.log
Feb 21 11:30:55 : chensiqi : TTY=pts/0 ; PWD=/home/chensiqi ; USER=root ;
COMMAND=/bin/ls /root
3)配置系统日志/etc/rsyslog.conf(这里可以不配)
增加配置local2.debug到/etc/rsyslog.conf中
[root@chensiqi1 ~]# echo "local2.debug /var/log/sudo.log" >> /etc/rsyslog.conf #这里可以不配
[root@chensiqi1 ~]# tail -1 /etc/rsyslog.conf #查看配置结果
local2.debug /var/log/sudo.log
提示:如果是Centos5系列,那么路径为/etc/syslog.conf
4)重启rsyslog内核日志记录器
[root@chensiqi1 ~]# /etc/init.d/rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
提示:
如果是Centos5系列,启动命令为/etc/init.d/syslog restart
此时,会自动建立一个/var/log/sudo.log文件并且文件权限为600,所有者和组均为root
[root@chensiqi1 ~]# ll /var/log/sudo.log #确保只有root才能查看
-rw-------. 1 root chensiqi 100 Feb 21 11:30 /var/log/sudo.log
5)测试sudo日志审计配置结果
[root@chensiqi1 ~]# whoami
root
[root@chensiqi1 ~]# su - chensiqi
[chensiqi@chensiqi1 ~]$ sudo -u chensiqi2 mkdir /home/chensiqi2/ggggg #执行sudo操作
[chensiqi@chensiqi1 ~]$ exit
logout
[root@chensiqi1 ~]# cat /var/log/sudo.log #查看日志记录
Feb 21 11:30:55 : chensiqi : TTY=pts/0 ; PWD=/home/chensiqi ; USER=root ;
COMMAND=/bin/ls /root
Feb 21 11:43:21 : chensiqi : TTY=pts/0 ; PWD=/home/chensiqi ; USER=chensiqi2 ;
COMMAND=/bin/mkdir /home/chensiqi2/ggggg
知识扩展:日志集中管理(了解)
- rsync + inotify或定时任务+rsync,推送到日志管理服务器上,10.0.0.7_20170201.sudo.log
- rsyslog服务来处理
- 日志收集解决方案:scribe,Flume,stom,logstash ELK