标签(空格分隔): Linux 实战教学笔记 - 陈思齐
---
本节主要介绍在用户管理中,查询用户的几种常见工具 id,finger,w,who,last,lastlog,groups 的用法。
用户查询工具的原理:
在用户管理中,用户查询是通过几个常用的工具来完成的,比如 id,finger,groups,users....,我们都知道用户的配置文件是 / etc/passwd,用户组的配置文件是 / etc/group 文件,我们对用户的查询除了通过查询工具以外,我们还能直接查看用户和用户组的配置文件或相关的用户日志记录信息来达到查询的目的;
用户查询工具的原理也是读取与用户和用户组有关的配置文件以及相关的用户日志记录信息,然后按一定的规则和条件输出。
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" 的方法。
finger 命令侧重于用户信息的查询,查询的内容包括用户名,家目录,登录 shell 类型,用户真实的名字,办公地址,办公电话,也包括登录终端,写状态,时间等;
前文我们通过 useradd,chsh,chfn,usermod 等命令修改的信息,都可以通过 finger 命令查看
finger 参数选项 | 注释说明(带特殊颜色的,需要掌握) |
---|---|
-l |
|
-m | 禁止对用户真实名字进行匹配 |
-p | 把. plan 和 project 文件中内容省略 |
-s | 显示短格式信息 |
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 等几个命令的功能有很多相似的地方,具体细节,上文已经解释说明,这几个命令我们会经常用到,但使用的方法一般就是仅仅执行命令本身而已。
su 【选项参数】【用户】
为了方便查看,用表格的方式把 su 命令的常用参数选项列表显示,如下所示:
|su 参数选项 | 注释说明【带特殊颜色表示重要,需要掌握】|
|--|--|
|-|
| |-c|
- 使一个shell成为登录的shell,如执行su - chensiqi时,表示该用户想改变身份为chensiqi,并且使用chensiqi用户的环境变量配置,如,/home/chensiqi/.bash_profile等
| |-m | 切换用户时,不重置用户环境比纳凉,-p 的功能同 - m 这个参数为 su 默认值。| |-s | 如果 / etc/shells 允许,则运行指定的 shell|
- 临时切换到某一个用户,执行一个命令,执行完,自动返回到当前用户;切换到一个shell,执行一个命令,然后退出所切换的用户环境
实例 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,切换到其他用户也是一样。
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 命令参数生产环境应用案例
- [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
为了方便,我们用表格把 sudo 命令常用参数选项列表显示,如下所示:
|sudo 参数选项 | 注释说明(带特殊颜色的表示重要,需要掌握)|
|--|--|
|-l|
| |-v | 验证用户的时间戳,当用户运行 sudo,输入用户的密码后,在短时间内可以不用输入口令直接进行 sudo 操作;用 - v 可以跟踪最新的时间戳 | |-u | 指定以某个用户身份执行特定的命令操作,chensiqi ALL=(ALL) /bin/cp| |-k | 同 - K,删除时间戳,下一个 sudo 命令要求提供密码,前提是该用户授权中不能有 NOPASSWD 参数。时间戳默认 5 分钟也会时效。|
- 列出用户在主机上可用的和被禁止的命令:当配置好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
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 -
看到了吧,有这么多需要注意的问题,如果不注意,很可能会带来灾难性后果,因此没有特殊紧急批量增加 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
1,别名定义
2,授权规则
别名定义并不是必须的,只是在授权规则多的时候更方便授权,但授权规则是必须的。
| 用户名 | 主机别名 =(身份别名)| 授权命令 |
|--|--|--|
|root|ALL=(ALL)|ALL|
|User Aliases|HOST_Alias=(Runas_Alias)|cmd_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的所有权限。
别名成员可以是用户,用户组(用户组前面要加 % 号)
- 实际语法为:
- ## 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用户的位置就是用户别名的应用位置
这个别名指定的是 "用户身份",即 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 ~]$
命令别名就是定义一个别名,包含一堆命令,即一组相关命令的集合。
- 提示:
- 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命令别名
用户或组 | 主机(可以执行 sudo 的机器) | 可以切换的用户角色 | |
---|---|---|---|
root | ALL= | (ALL) | ALL |
User_Alias | Host_Alias | Runas_Alias | Cmd_Alias |
用户别名的位置 | 主机别名的位置(可以在哪个主机上执行 sudo) | Runas 别名的位置(以谁的身份执行 sudo 授权命令) | 命令别名的位置 |
什么情况下使用上述别名?
定义别名的实践例子:
生产环境实例:
实例 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的定义不多见,不常用,了解即可
下面我们结合别名授权和用户授权规则举几个综合应用的例子
实例 1: 对 chensiqi 的授权规则如下:
- chensiqi ALL=/usr/sbin/useradd,/usr/sbin/userdel
- [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
1)授权规则中的所有 ALL 字符串必须为大写字母。
2)Cmd_ALias(命令别名):允许执行的命令是有顺序的。命令的顺序是从后向前,即把禁止执行的命令放在允许执行的命令的后边。再强调下,禁止的命令尽量放在后边
3)一行内容超长可以用 "\" 斜线换行。
4)"!" 叹号表示非,就是命令取反的意思,即禁止执行的命令
5)根据实际情况,来分类制作命令别名,用什么给什么。
在默认情况下,我们是无法通过 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
说明:所谓 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 中,注意:不包含引号。
一行搞定 sudo 日志审计
- [root@chensiqi ~]# echo "Defaults logfile=/var/log/sudo.log">>/etc/sudoers
- [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
知识扩展: 日志集中管理(了解)
来源: http://www.cnblogs.com/chensiqiqi/p/6427140.html