前言:
Linux系统是多任务,多用户的系统。
每个文件和进程,都需要对应一个用户和用户组。
linux系统通过uid和gid来是识别用户和组。
uid和gid相当于身份证号,用户名和组名相当于名字,给人方便查看和管理的。
用户和组的关系:
- 一对一
- 一对多
- 多对一
- 多对多
用户分类:
- 超级用户 UID=0,root
- 普通用户 UID:500-65535 由超级用户或具有超级用户权限的用户创建的用户
- 虚拟用户 UID:1-499 存在满足文件或者服务启动的需要。一般都不能登录,只能傀儡。
用户关联的四个文件:
/etc/passwd, /etc/shadow, /etc/group, /etc/gshadow
以上文件内容是由":"冒号分隔,其中/etc/passwd内容需要比较熟悉,其他的了解。
用户管理的命令
- useradd 添加用户(更改4个用户文件)
- userdel 删除用户(更改4个用户文件)
- passwd 设置或修改密码(更改/etc/passwd文件)
- chage 修改用户密码有效期限(修改用户密码属性)(管理/etc/shadow文件)
- usermod 修改用户信息,可以修改登录名,用户的家目录等
- id 查看用户的UID,GID以及所归属的用户组
- su 用户角色切换工具
- sudo 通过另一个用户来执行命令:
- su是用来切换用户,然后通过切换到的用户来完成相应的任务。
- sudo能在命令后面直接接命令执行,比如:su ls /root,不需要root密码就可以执行只有root才能执行相应的命令或具备的目录权限。
- sudo权限需要通过visudu命令或者直接编辑/etc/sudoers来实现。
- visudo 配置sudo的编辑命令;也可以不用这个命令,直接用vi编辑
用户组管理的命令
- groupadd 添加用户组
- groupdel 删除用户组
- groupmod 修改用户组信息
1. 用户创建相关配置文件
/etc/skel目录, /etc/login.defs文件, /etc/default/useradd文件
1.1 /etc/skel 目录
/etc/skel 目录是用来存放新用户配置文件(环境变量)的目录,当我们添加新用户时,这个目录下的所有文件会自动被复制到新添加的用户的家目录下。
默认情况下,/etc/skel 目录下的所有文件都是隐藏文件(以. 点开头的文件):通过修改、添加、删除/etc/skel 目录下的文件,我们可为新创建的用户提供统一的、标准的、初始化用户环境。
相当于,在用useradd创建用户时,将/etc/skel下的所有文件(均是隐藏文件)复制到/home/下的(家目录)。
演示:创建新用户
创建新用户时,系统自动将/etc/skel/目录下的所有文件(包含隐藏文件)都拷贝到了新用户的家目录下。
# 在/etc/skel/ 目录下常见可见文件,用以判断系统确实复制了目录 [root@oldboy ~]# cd /etc/skel [root@oldboy skel]# ll -a total 20 drwxr-xr-x. 2 root root 4096 Sep 13 19:17 . drwxr-xr-x. 83 root root 4096 Sep 13 19:50 .. -rw-r--r--. 1 root root 18 Jul 24 2015 .bash_logout -rw-r--r--. 1 root root 176 Jul 24 2015 .bash_profile -rw-r--r--. 1 root root 124 Jul 24 2015 .bashrc [root@oldboy skel]# touch readme.txt # 添加用户 [root@oldboy skel]# useradd usr1 # 切换到/home/usr1/ 新用户的家目录下 [root@oldboy skel]# cd /home/usr1 # 确实复制了隐藏文件以及readme.txt可见文件 [root@oldboy usr1]# ll -a total 20 drwx------ 2 usr1 usr1 4096 Sep 13 19:52 . drwxr-xr-x. 9 root root 4096 Sep 13 19:52 .. -rw-r--r-- 1 usr1 usr1 18 Jul 24 2015 .bash_logout -rw-r--r-- 1 usr1 usr1 176 Jul 24 2015 .bash_profile -rw-r--r-- 1 usr1 usr1 124 Jul 24 2015 .bashrc -rw-r--r-- 1 usr1 usr1 0 Sep 13 19:50 readme.txt
/etc/skel 的企业场景作用:
- 可以把通知的内容放到skel,让登陆的人去看
- 可以统一初始化新用户的环境变量
- 比如:可以编辑.bash_profile文件,设置别名
- 面试题:出现-bash-4.1$ 问题原因及解决方法。
企业面试题:请问如下登录环境故障的原理和解决办法?
-bash-4.1$
解答:
问题模拟:
# 切换到用户家目录下,删除.bash的隐藏文件 # 删除了.bashrc .bash_history, .bash_profile, .bash_logout [oldgirl@oldboy ~]$ cd /home/oldgirl [oldgirl@oldboy ~]$ rm .bash* # 退出当前用户,再次登陆,问题出现。 [root@oldboy ~]# su - oldgirl -bash-4.1$
解决方案:
root用户,将/etc/skel的文件(隐藏文件)全部拷贝到该用户的家目录下,即可。
[root@oldboy usr1]# cp /etc/skel/.* /home/oldgirl/
【拓展】不同用户的显示的符号,由系统全局变量PS1控制:
[root@oldboy usr1]# echo $PS1 [u@h W]$
1.2 /etc/login.defs 配置文件
需要了解的内容。
/etc/login.defs 文件是用来定义创建用户时需要的一些用户的配置信息。
如:
创建用户时,是否需要家目录,UID和GID的范围,用户及密码的有效期限等等。
下面是CentOS中查看/etc/login.defs配置文件的部分一些关键的常量:
# 下面是该配置文件的一些关键的常量: # 密码的过期时间 PASS_MAX_DAYS 99999 PASS_MIN_DAYS 0 PASS_MIN_LEN 5 PASS_WARN_AGE 7 UID_MIN 500 UID_MAX 60000 GID_MIN 500 GID_MAX 60000 # 是否创建家目录 CREATE_HOME yes UMASK 077 USERGROUPS_ENAB yes ENCRYPT_METHOD SHA512
1.3 /etc/default/useradd 文件
/etc/default/useradd 文件是在使用useradd 添加用户时的一个需要调用的一个默认的配置文件,可以使用"useradd -D 参数",这样的命令格式来修改文件里面的内容。
[root@oldboy oldgirl]# cat /etc/default/useradd # useradd defaults file GROUP=100 # 依赖于/etc/login.defs 的USERGROUP_ENAB 参数,如果为no,则此处控制。 HOME=/home # 把用户的家目录建在/home中 INACTIVE=-1 # 是否启用账号过期停权,-1表示不启用 EXPIRE= # 账号中止日期,不设置表示不启用 SHELL=/bin/bash # 新用户默认所有的shell类型 SKEL=/etc/skel # 配置新用户家目录的默认文件存放路径 CREATE_MAIL_SPOOL=yes # 创建mail文件
用useradd -D 参数 修改示例:
[root@oldboy oldgirl]# useradd -D -s /bin/nologin [root@oldboy oldgirl]# cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/nologin SKEL=/etc/skel CREATE_MAIL_SPOOL=yes # 再改回来 [root@oldboy oldgirl]# useradd -D -s /bin/bash
修改还是用vi比较方便。
2. 用户创建命令、修改、查询命令
- useradd (/etc/passwd, /etc/shadow, /etc/group, /etc/gshadow)
- passwd ( /etc/shadow)
- groupadd (/etc/group)
- chage (/etc/shadow)
- usermod, userdel, groupdel , id , w, who, last, lastlog, users, groups等
2.1 useradd 命令
useradd - create a new user or update default new user information
语法:
useradd [-c comment] [-d home_dir][-e expire_date] [-f inactive_time]
[-g initial_group] [-G group[,...]]
[-m [-k skeleton_dir] | -M] [-s shell]
[-u uid [ -o]] [-n] [-r] login
当使用useradd命令不加参数选项,后面直接跟所添加的用户名时,系统会首先读取配置文件/etc/login.defs和/etc/default/useradd中所定义的参数或规则,根据设置的规则添加用户,同时会向/etc/passwd和/etc/group文件内添加新建用户和用户组的记录,并同步/etc/shadows和/etc/gshadows,同时系统还会根据/etc/default/useradd文件中所配置的信息建立用户家目录,并复制/etc/skel中的所有文件(包括隐藏的系统环境配置文件)到新用户的家目录中。
参数:
- -c comment 新账号password档的说明档
- -d home_dir 新账号每次登入时所使用的home_dir。预设值为default_home内login名称,并当成登入时目录名称。
- -e expire_date 账号终止日期,日期的指定格式为MM/DD/YY
- -f inactive_days 账号过期几日后永久停权。当值为0时账号则立刻被停权。而当值为-1时,则关闭此功能,预设值为-1。
- -g initial_group group名称或以数字来作为用户登入起始用户组(group)。用户组名须为系统现有存在的名称。用户组数字也须为现有存在的用户组。预设的用户组数字为1。
- -G group,|...| 定义此用户为多个不同groups的成员。每个用户组使用','逗号分隔。用户组名同-g选项的限制。默认值为用户的起始用户组。
- -M 不建立用户家目录,优先于/etc/login.defs 文件的设定。一般创建虚拟用户时不建立家目录,部署服务时需要创建虚拟用户。
- -s shell 用户登入后使用的shell名称。默认值为不填写,这样系统会帮你指定预设的登入shell(根据/etc/default/useradd预设的值)
- -u uid 用户的ID值。这个值必须是唯一的,除非用-o选项。数字不可为负值。
- -m 使用者目录如不存在则自动建立。如使用-k选项skeleton_dir内的档案将复制至使用者目录下。然而在/etc/skel目录下的档案也会复制过去取代。任何在skeleton_dir or /etc/skel 的目录也相同会在使用者目录下意义建立。The -k 同 -m 不建立目录以及不复制任何档案为预设值。
- -n 预设值使用者群组与使用者名称会相同。此选项将取消此去设置
- -r 此参数是用来建立系统账号。系统账号的UID会比定义在系统档上/etc/login.defs 的UID_MIN来的小。注意,useradd此用户所建立的账号不会建立使用者目录,也不会在乎记录在/etc/login.defs 的定一只。如果想要使用者目录须额外指定-m参数来建立系统账号。这是redhat额外增设的选项。
用户名 | 密码 | uid | gid | 注释信息 | 家目录 | 默认shell |
---|---|---|---|---|---|---|
-u | -g | -c | -d | -s | ||
root | x | 0 | 0 | root | /root | /bin/bash |
usr1 | x | 505 | 506 | /home/usr1 | /bin/bash |
[root@oldboy /]# head -1 /etc/passwd root:x:0:0:root:/root:/bin/bash [root@oldboy /]# tail -1 /etc/passwd usr1:x:505:506::/home/usr1:/bin/bash
例子:useradd -c -u -G -s -d 多个参数组合例子
自定义用户的家目录,shell类型,所归属的用户组等:
- 添加用户oldboy6, 并设置其用户注释信息为HandsomeBoy,UID指定为806,归属为用户组root、oldboy、sa成员,其shell类型为/bin/sh,设置家目录为/oldboy6
[root@oldboy /]# groupadd sa [root@oldboy /]# useradd -c HandsomBoy -u 806 -G root,oldboy,sa -s /bin/sh -d /oldboy6 oldboy6 # 查看 [root@oldboy /]# tail -1 /etc/passwd oldboy6:x:806:806:HandsomBoy:/oldboy6:/bin/sh [root@oldboy /]# id oldboy6 uid=806(oldboy6) gid=806(oldboy6) groups=806(oldboy6),0(root),500(oldboy),507(sa)
例子:账号过期时间示例
[root@oldboy /]# date +%F 2019-09-13 [root@oldboy /]# useradd -e 09/14/19 usr2 [root@oldboy ~]# tail -1 /etc/passwd usr2:x:807:807::/home/usr2:/bin/bash [root@oldboy ~]# id usr2 uid=807(usr2) gid=807(usr2) groups=807(usr2) [root@oldboy ~]# chage -l usr2 Last password change : Sep 13, 2019 Password expires : never Password inactive : never Account expires : Sep 14, 2019 Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7 [root@oldboy ~]# date -s '20191001' Tue Oct 1 00:00:00 CST 2019
远程用usr2登录,会出现用户过期的信息。
通过-e设置无法远程连接,但是可以su切换,账户并未被锁定
账户过期时间和系统时间,需要相差2天。
useradd -D [参数] 修改/etc/default/useradd文件
useradd -D 接参数修改/etc/default/useradd文件。
语法:
useradd -D [-g default_group] [-b default_home]
[-f default_inactive] [-e default_expire_date] [-s default_shell]
[root@oldboy ~]# useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
与其记参数用useradd -D用命令行修改,不如直接用vi修改。更方便直接。
useradd -D参数选项 | 说明 |
---|---|
-b default_home | 定义使用者所属目录的前一个目录使用者名称会附加在 default_home后面用来建立新使用的目录。当然使用-d后则此选项无效 。 |
-e default_expire_date | 使用者帐号停止日期 |
-f default_inactive | 帐号过期 日后停权 |
-g default_group | 新帐号起始群组名或ID。群组名须为现有存在的名称。群组I D也须为现有存在的群组 |
-s default_shell | 使用者登入后使用的shell名称。往后新加入的帐号都将使用此 |
2.2 添加用户组命令groupadd
与groupadd命令相关的文件有
- /etc/group 用户组相关文件
- /etc/gshadow 用户组加密相关文件
语法:
groupadd [-g gid [-o]] [-r] [-f] group
参数说明:
- -g gid 指定用户组GID。除非接-o参数,否则ID值必须是唯一的数字(不能为负数)。如果不指定-g参数,则预备值会从500开始。
- r 建立系统用户组。GID会比/etc/login.defs中定义的UID_MIN值小
- f 新增一个账户,强制覆盖一个已经存在的用户组账号
示例:
groupadd添加组,删除组
[root@oldboy ~]# groupadd -g 10086 mm [root@oldboy ~]# tail -1 /etc/group mm:x:10086: [root@oldboy ~]# groupdel mm [root@oldboy ~]# tail -1 /etc/group usr2:x:807:
2.3 用户密码passwd命令
普通用户和超级用户都可以运行passwd命令,但普通用户只能更改自身的用户密码,超级用户root则可以设置或修改所有用户的密码。
当直接执行passwd命令后面不接任何参数或用户名时,则表示修改当前登录用户的密码。
命令参数 | 说明 |
---|---|
-k, --keep-tokens | 保留即将过期的用户在期满后仍能使用 |
-d,--delete | 删除用户密码,仅能以root权限操作 |
-l,--lock | 锁住用户无权更改其密码,仅能通过root权限操作 |
-u,--unlock | 解除锁定 |
-f,--force | 强制操作,仅root权限操作 |
-x,--maximum=DAYS | 两次密码修改的最大天数,后面接数字;仅能root权限操作 |
-n,--minimin=DAYS | 两次密码修改的最小天数,后面接数字,仅能root权限操作 |
-w,--waring=DAYS | 在距多少天提醒用户修改密码;仅能root权限操作 |
-I,--inactive=DAYS | 在密码过期多少天后,用户被禁掉,仅能以root操作 |
-S,--status | 查询用户的密码状态,仅能root用户操作 |
--stdin | 从stdin读入密码 |
其中,最重要的也是一定要记住的是:--stdin 从stdin读入密码
echo "12345678"|passwd --stdin oldboy # 给oldboy用户将字符串作为密码标准输入给passwd命令执行
这个非交互式的设置密码使得批量创建用户密码成为可能。
passwd命令有suid,其他用户在执行passwd命令时拥有属主的所有权限:
[root@oldboy ~]# ls -l `which passwd` -rwsr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd
示例:
- 批量创建10个用户stu01-stu10,并设置随机8位密码,不用shell循环,只用命令和管道。
解答:
[root@oldboy home]# echo stu{01..10}|xargs -n1|awk '{print "useradd",$1";echo",$1"|md5sum|cut -c 10-17|passwd --stdin",$1}' useradd stu01;echo stu01|md5sum|cut -c 10-17|passwd --stdin stu01 useradd stu02;echo stu02|md5sum|cut -c 10-17|passwd --stdin stu02 useradd stu03;echo stu03|md5sum|cut -c 10-17|passwd --stdin stu03 useradd stu04;echo stu04|md5sum|cut -c 10-17|passwd --stdin stu04 useradd stu05;echo stu05|md5sum|cut -c 10-17|passwd --stdin stu05 useradd stu06;echo stu06|md5sum|cut -c 10-17|passwd --stdin stu06 useradd stu07;echo stu07|md5sum|cut -c 10-17|passwd --stdin stu07 useradd stu08;echo stu08|md5sum|cut -c 10-17|passwd --stdin stu08 useradd stu09;echo stu09|md5sum|cut -c 10-17|passwd --stdin stu09 useradd stu10;echo stu10|md5sum|cut -c 10-17|passwd --stdin stu10 [root@oldboy home]# echo stu{01..10}|xargs -n1|awk '{print "useradd",$1";echo",$1"|md5sum|cut -c 10-17|passwd --stdin",$1}'|bash Changing password for user stu01. passwd: all authentication tokens updated successfully. Changing password for user stu02. passwd: all authentication tokens updated successfully. Changing password for user stu03. passwd: all authentication tokens updated successfully. Changing password for user stu04. passwd: all authentication tokens updated successfully. Changing password for user stu05. passwd: all authentication tokens updated successfully. Changing password for user stu06. passwd: all authentication tokens updated successfully. Changing password for user stu07. passwd: all authentication tokens updated successfully. Changing password for user stu08. passwd: all authentication tokens updated successfully. Changing password for user stu09. passwd: all authentication tokens updated successfully. Changing password for user stu10. passwd: all authentication tokens updated successfully. [root@oldboy home]#
- 要求oldboy用户7天内不能更改密码,60天以后必须更改密码,过期前10天通知oldboy用户,过期后30天后禁止用户登录。
# min max warning inactive [root@oldboy ~]# passwd -n 7 -x 60 -w 10 -i 30 oldboy Adjusting aging data for user oldboy. passwd: Success # chage -m 7 -M 60 -W 10 -I 30 oldboy命令可以实现同样功能,只是参数的写法不同。 # 查看修改后的结果 [root@oldboy ~]# chage -l oldboy Last password change : Sep 10, 2019 # 上次密码修改时间 Password expires : Nov 09, 2019 # 密码过期时间 Password inactive : Dec 09, 2019 # 密码被禁用时间 Account expires : never Minimum number of days between password change : 7 # 7天内禁止修改密码 Maximum number of days between password change : 60 # 60天以后必须修改新密码 Number of days of warning before password expires : 10 # 密码过期前10天开始提醒
总结:
在实际工作中,最常用的用法就是直接使用passwd加用户名设置和修改密码,其次是加--stdin参数批量无交互设置密码,其他参数用的很少(包括-l,-u,-S等)。
企业场景,用户及密码管理:
- 密码要复杂,8位以上字母数字特殊字符
- 大的企业用户和密码统一管理(相当于活动目录,openldap)
- 动态密码:动态口令,第三方提供,自己开发也很简单。
2.4 修改用户密码有效期相关命令chage
chage说明:
chage和passwd等命令功能有不少是重复的,用来修改用户密码。
chage语法
用法:chage [选项] 用户名
chage参数选项 | 注释说明 |
---|---|
-d,--lastday 最近日期 | 将最近一次密码设置时间设为“最近日期” |
-E,--expiredate 过期日期 | 将账户过期时间设为“过期时间”,日期格式为mm/dd/YY |
-h,--help | 显示帮助信息,并退出 |
-I,--inactive 失效密码 | 将因过期而失效的密码设为“失效密码” |
-l.--list | 显示账户年龄信息 |
-m,--mindays 最小天数 | 将两次改变密码之间相距最小天数设为“最小天数” |
-M,--maxdays 最大天数 | 将两次改变密码之间相距最大天数设为“最大天数” |
-W,--warndays 警告天数 | 将过期警告天数设为“警告天数” |
有关用户密码失效:
passwd, chage等均可设置或更改指定账户密码的安全信息(有效期等),我们也可以通过/etc/login.defs 配置文件或 /etc/default/useradd 针对所有账户全局修改。
设置用户密码时效有利有弊:
优点:
- 可以防止离职人员离职一段时间后发现用户还可以登陆。设置了账户有效期,即使用户未被清理,那么,一段时间内也会因为密码时效而被自动锁定。
- 强制定期修改密码,提升系统安全性。
缺点:
- 有一些本应该保留的用户过期无法登录
- 在服务器数量很大的情况下,修改密码是很大的工作量。在大规模的运维环境中,使用LDAP服务(微软活动目录)对linux账户统一认证,批量修改,是不错的方法。
2.5 删除用户相关命令userdel
从userdel 命令名称就可以知道,它的功能时删除用户及用户相关的信息,与这个命令相关的文件有:
- /etc/passwd 用户账号资料文件
- /etc/shadow 用户账号资讯加密文件
- /etc/group 用户组资讯文件
- /etc/gshadow 用户组资讯加密文件
userdel语法:
userdel [-r] 用户名
参数:
- -r 删除家目录和邮件队列
总结:
使用“userdel 用户名”删除用户时,仅会删除用户本身,其家目录及相关文件并不会被删除。
我们可以直接使用vi编辑/etc/passwd,找到要处理的用户吗,先注释一段时间,确认真的没问题,然后再清理其家目录,注释的作用和userdel命令删除的效果是一样的。注释取消注释之后,还可以恢复。对/etc/passwd这样重要的文件进行修改,最好先备份。
企业场景处理方法: 一般不能确认用户相关目录有没有重要数据,就不能用-r。
删除经验:
- vi /etc/passwd 注释掉用户,观察一个月,出问题还原,相当于操作前备份
- 把登录shell 改成 /sbin/nologin
- openldap(类似活动目录)账号统一管理的,ldap库里干掉用户,所有服务器全部都没了。
提示:只要是删除和修改都要小心谨慎。
2.6 用户信息修改相关命令 usermod
usermod 命令功能十分强大,在生产场景中使用频率虽然不是很多,但还是比较重要的。
它不仅能更改用户的shell类型,所归属的用户组,还能改用户密码的有效期、登录名等很多用户的信息。
与usermod命令有关的文件有:
- /etc/passwd 用户账号资料文件
- /etc/shadow 用户账号咨询加密文件
- /etc/group 用户组咨询文件
- /etc/gshadow 用户组密码文件
语法:
usermod [options] LOGIN
usermod参数选项 | 注释说明 |
---|---|
-c comment | 增加用户账户/etc/passwd中的注解说明 |
-d home_dir | 更新家目录,如果给定-m选项,用户旧的家目录会搬到新的家目录中去 |
-e expire_date | 加上用户账号停止日期,格式为mm/dd/yy |
-f inactive_days | 账户过期几日后永久停权,当值为-1时,则关闭此功能 |
-g install_group | 更新用户新的起始登入用户组,用户组名须已存在 |
-G group […] | 定义用户为一堆groups成员 |
-l login_name | 变更用户login时的名称为login_name。其余信息不变 |
-s shell | 指定新登入shell |
-u uid | 指定用户的UID,除非接-o参数,否则ID值必须唯一 |
-L | 冻结用户的密码,使之无法登陆,实际就是间接修改/etc/passwd的密码栏,在密码栏的开头加上“!” |
-U | 取消冻结用户的密码,使之恢复登陆,取消/etc/passwd中的“!”。 |
-l,-L,-U这三个参数useradd没有,其余的参数和useradd都一样。
2.7 用户查询相关命令
用户查询工具的原理也是读取与用户和用户组有关的配置文件以及相关的用户日志记录信息,然后按照一定的规则和条件输出。
2.7.1 id
print real and effective user and group IDs
id命令语法:
id [参数] [用户名]
2.7.2 w
Show who is logged on and what they are doing.
显示已经登录的用户,并且都做了什么的信息,查看信息与/var/run/utmp文件相关
[root@oldboy ~]# w 14:48:19 up 2:00, 2 users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 - 13:19 1:28m 0.00s 0.00s -bash root pts/0 192.168.0.102 00:13 0.00s 0.05s 0.00s w
2.7.3 who 显示哪些用户在登录,终端以及登录时间,来源主机
show who is logged on
[root@oldboy ~]# who root tty1 2019-09-14 13:19 root pts/0 2019-09-14 00:13 (192.168.0.102)
2.7.4 last 显示已登录的用户列表以及登录时间等
show listing of last logged in users
查看的信息与/var/log/wtmp文件有关
[root@oldboy ~]# last|tail -5 root tty1 Fri Aug 30 08:10 - crash (01:50) reboot system boot 2.6.32-573.el6.x Fri Aug 30 08:08 - 19:01 (2+10:53) reboot system boot 2.6.32-573.el6.x Fri Aug 30 07:40 - 19:01 (2+11:21) wtmp begins Fri Aug 30 07:40:12 2019
2.7.5 lastlog
reports the most recent login of all users or of a given user
对应的数据文件:/var/log/lastlog
[root@oldboy ~]# lastlog|tail -5 oldgirl **Never logged in** test **Never logged in** usr1 **Never logged in** oldboy6 **Never logged in** usr2 **Never logged in**
2.7.6 groups 显示登录用户的组
print the groups a user is in
[root@oldboy ~]# groups root
2.7.7 users 显示哪些用户在登录
print the user names of users currently logged in to the current host
[root@oldboy ~]# users root root
3. Linux用户身份切换命令
超级用户root具有超级管理权限。由于权限太大,如果管理不好,就会对系统安全带来严重隐患。在工作场景中,我们只在必要时才使用超级用户root的权限。
一般的临时性处理工作,都是以普通用户的身份完成的,那么,当普通用户需要超级用户的权限时,是怎么进行切换管理的呢?
主要通过两个重要的用户身份切换命令 su和 sudo。
在Linux系统中,每个文件、目录和进程,都是归属于某一个用户的,没有其用户的许可,其它的普通用户是无法操作的,root除外。
root用户的特权还表现在root
- 可以超越任何用户和用户组来对文件或目录进行读取、修改或删除(在系统正常的许可范围内):
- 对可执行程序的执行、中止;
- 对硬件设备的添加、创建和移除等;
- 也可以对文件和目录进行属主和权限进行修改。
3.1 su 命令
3.1.1 su 命令介绍
简单的说,su命令就是切换用户身份的命令。
比如,我们以普通用户oldboy登录到系统后,当要在系统中执行useradd添加用户时,会发现oldboy用户没有这个权限,这个权限只能由root权限执行。
解决办法:
- 一是退出oldboy用户,重新以root用户登录。
- 二是我们直接在oldboy用户下,使用 su 命令来切换到 root下进行添加用户的工作,等工作完成后再退出root用户。
毫无疑问,上面两个方法,通过su命令切换是一种比较好的办法。
通过su命令可以在用户之间切换,超级权限用户root向普通或虚拟用户切换不需要密码验证(这就是超级权限所在),其他普通用户之间或者普通用户切换到root,都需要切换用户的密码验证。
3.1.2 su 命令参数
su参数 | 注释说明(带标记的表示很重要) |
---|---|
-,-l,–login | 使一个shell成为登录的shell,如执行su - oldboy时,表示该用户想改变身份为oldboy,并且使用oldboy用户的环境变量,如:/home/oldboy/.bash_profile |
-c,–command=COMMAND | 切换到一个shell下,执行一个命令,然后退出所切换的用户环境 |
-m,–preserve-environment | 切换用户时,不重置用户环境变量,-p的功能同-m,这个参数为su的默认值,一般很少使用 |
-s,–shell=SHELL | 如果/etc/shells允许,则运行指定的shell |
在生产场景中,su命令比较常用的参数为-和-c,其他的参数很少用到。
su命令示例:
当不加任何参数执行su命令时,表示要切换到root用户,但这样执行,会遇到一些问题。
因为,虽然是切换到root用户了,但并没有改变为root用户登录环境,用户默认的登录环境,可以在/etc/passwd中查得到,包括家目录,shell类型等。
比较规范的操作方法是"su -"。
示例1:从普通用户oldboy切换到root用户
# 确认当前用户为oldboy [oldboy@oldboy root]$ whoami oldboy # 不带-切换到root用户 [oldboy@oldboy root]$ su Password: # 查看环境变量,发现环境变量没有重新加载/root下面的.bash_profile还是oldboy的环境变量。 [root@oldboy oldboy]# env|grep root HOME=/root [root@oldboy oldboy]# env|grep oldboy HOSTNAME=oldboy USER=oldboy PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oldboy/bin MAIL=/var/spool/mail/oldboy PWD=/home/oldboy LOGNAME=oldboy [root@oldboy oldboy]# env|grep -E "USER|PWD|LOGNAME" USER=oldboy PWD=/home/oldboy LOGNAME=oldboy [root@oldboy oldboy]# pwd /home/oldboy
使用su而不加上“-”这个参数,那么,切换前的用户的相关信息还是会存在,这会引起很多麻烦,甚至会出现意想不到的结果。
因此,切换用户时,最好是"su - 用户名"。
这是生产场景中标准的切换用户的操作方法。
示例2:通过-c参数,不切换用户,以某用户的角色执行命令
[root@oldboy ~]# su - oldboy -c pwd /home/oldboy
企业应用场景:以指定用户身份开机自启动服务
su - oldboy -c '/bin/sh /home/oldboy/bin/deploy.sh'
总结:
- 普通用户切换到root用户,可使用“su - ”或“su - root”,必须输入root密码才能完成切换
- root用户切换到普通用户,可使用“su - 普通用户名”的写法。不需要输入任何密码就能完成切换。切换到普通用户后,在执行一些命令,如ifconfig时,可能会遭遇到环境变量PATH路径问题而找不到某些系统命令(一般是/sbin, /usr/sbin等下面的命令),这时就需要将普通用户的PATH,配置成root的PATH内容。(提示,CentOS 6不会有这个问题)
- 如果仅希望以某用户的角色执行命令,而不直接切换到该用户下操作,可以使用"su - 用户名 -c 命令"的方式。
su命令的优缺点:
优点:
- 毫无疑问,切换用户身份的su命令为我们管理linux 系统带来了很多方便,通过切换到root下,可以完成各种系统管理工作,只要任何一个普通用户知道了root用户的密码,都能以普通用户的身份切换到root来完成本来无法完成的系统管理的工作。
但是,这样通过su命令切换到root后,也带来了很大安全管理问题;
缺点:
- 比如系统有8个普通用户,都可以通过切换到root身份进行系统管理,甚至还可以改掉root的密码,让其他的普通用户无法再实现系统管理,还有,这么多用户中,有任何一人对系统操作的重大失误,都可能导致整个系统崩溃或数据损失。这样的非集权式管理,在一定程度上就对系统的安全造成了较大的威协。在工作中几乎有一半的问题来自于内部。
所以使用su命令切换身份在多个系统管理员共同管理的场合,并不是最好的选择,如果是一般的中小公司不超过3个管理员时,为了管理方便,使用su来共同管理是可以接受的。如果我们既希望超级用户root密码掌握在少数或唯一的管理员手中,又希望多个系统管理员能够完成更多更复杂的系统管理的工作。
那么,如何解决多个系统管理员都能管理系统的而又不让超级权限泛滥的需求,这就需要用到sudo命令来替代或结合su命令来完成要求了。
3.2 sudo 命令
使用su命令切换用户身份虽然简单,但是,也有一些致命的缺点:
- 普通用户必须知道root密码才可以切换到root,这样root密码就泄露了。相当于把“刀把”交给了别人。
- 使用su命令切换身份,无法对切换后的身份做精细的控制,拿到超级权限的人可以为所欲为。甚至可以改掉root密码,让真正的管理员无法在拥有root权限。
那么,怎么来解决最高管理员不泄露root密码,而又能让普通用户拥有一定的超级权限来管理系统并且能让超级特权可控呢?
这就要引出sudo命令。
通过sudo命令,我们可以把某些超级用户权限分类有针对性(精细),授权给指定的普通用户,并且普通用户不需要知道root密码就可以使用得到的授权(管理员真正允许的root权限)。因此,毫不夸张的说,sudo命令相对于su命令来说,在系统用户的分权管理方面进步了很多,使得集权式管理在理论上得到了保证,从而使系统的安全性方面加强了很多。
3.2.1 sudo命令执行的大概流程:
3.2.2 sudo命令演示:visudo管理sudo授权
示例:
[root@oldboy zoe]# su - oldboy [oldboy@oldboy ~]$ useradd all -bash: /usr/sbin/useradd: Permission denied [oldboy@oldboy ~]$ whoami oldboy
下面通过visudo编辑useradd的命令权限:
[root@oldboy zoe]# visudo # 通过:n98 到到达指定行,98行 # root ALL=(ALL) ALL # 此处为原有值,第98行的内容 # 添加 oldboy ALL=(ALL) /usr/sbin/useradd # 命令必须是全路径,通过which useradd查询 # 编辑完成,保存退出
visudo 与 vim /etc/sudoers 等价,一般情况下,都使用visudo。
# 切换到oldboy下 [root@oldboy zoe]# su - oldboy # 查看sudo,只需要输入当前用户(即oldboy)的密码 [oldboy@oldboy ~]$ sudo -l [sudo] password for oldboy: Matching Defaults entries for oldboy on this host: requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin:/bin:/usr/sbin:/usr/bin User oldboy may run the following commands on this host: (ALL) /usr/sbin/useradd
用户oldboy可以在该主机上运行命令/usr/sbin/useradd。
[oldboy@oldboy ~]$ useradd oldboyson -bash: /usr/sbin/useradd: Permission denied [oldboy@oldboy ~]$ sudo useradd oldboyson [oldboy@oldboy ~]$ tail -1 /etc/passwd oldboyson:x:808:808::/home/oldboyson:/bin/bash
3.2.3 sudo 提权配置说明
用户或组 | 机器=(授权角色) | 可以执行的命令 |
---|---|---|
user | MACHINE= | COMMANDS |
oldboy | ALL=(ALL) | /usr/sbin/useradd, /usr/sbin/userdel |
如果oldboy用户被授予上述权限,那么它可在所有的机器上以所有的角色运行useradd、userdel命令。
如果是针对用户组,则对应的授权命令如下:
%用户组 机器=(授权使用哪个角色的权限) /usr/sbin/useradd
3.2.4 通过sudo 进行授权管理系统的目的
既能让运维人员干活,又不能让其威胁系统安全,其实就是前面讲的用户权限最小化原则,还可以审计用户使用sudo的提权操作命令。
3.2.5 授权all演示
为了管理方便,这里暂时给oldboy授权all权限,即可以管理整个系统。
详细操作为:输入visudo,找到第98行,并在该行下面放入如下内容:
oldboy ALL=(ALL) NOPASSWD:ALL
这个配置结尾的ALL表示oldboy可拥有完全的系统管理权限,NOPASSWD表示提权执行命令时不提示密码。
配置完成后要进行检查:
[root@oldboy ~]# grep oldboy /etc/sudoers oldboy ALL=(ALL) NOPASSWD:ALL oldboy ALL=(ALL) /usr/sbin/useradd
例子:
通过sudo切换到root用户下,可以不需要密码。
[root@oldboy ~]# su - oldboy [oldboy@oldboy ~]$ sudo su - [root@oldboy ~]# whoami root
可以直接sudo useradd ,sudo userdel,添加和删除用户;sudo passwd zoe 重置用户zoe的密码等超级管理员root才能操作的权限。
3.2.6 批量管理增加sudo授权
也可以使用过如下快速操作命令增加sudo授权,仅限于批量管理的情况:
cp /etc/sudoers /etc/sudoers.ori echo "oldboy ALL=(ALL) NOPASSWD:ALL">>/etc/sudoers tail -1 /etc/sudoers visudo -c # 直接追加内容没有语法检查,因此要单独执行语法检查命令
检查语法的效果:
[root@oldboy ~]# visudo -c /etc/sudoers: parsed OK
将信息修改保存退出后。
此时再以oldboy用户登录系统时,就可以通过执行类似 sudo ls -l /root (sudo加正常命令)的命令以root 用户的权限管理系统了。
# oldboy用户是无法直接访问/root家目录的 [oldboy@oldboy ~]$ ls /root ls: cannot open directory /root: Permission denied # 通过sudo命令,使得oldboy用户具备了访问/root目录的权限 [oldboy@oldboy ~]$ sudo ls /root anaconda-ks.cfg install.log install.log.syslog message.txt test.sh
以上直接修改sudoers 配置文件方法有有以下需要注意的几点:
-
echo命令是追加“>>”,不是重定向“>”,除了echo外,可以用cat,sed等命令实现类似的功能。
-
修改操作完成一定要执行 visudo -c 进行语法检查,这弥补了直接修改没有语法检查的不足。
-
确保 /etc/sudoers权限是正确的(-r–r—–),权限不对会导致sudo功能异常(Centos6权限不对也可以登录,但是/etc/sudoers权限是440是最安全的)。
-
及时对授权的操作进行测试,验证是否正确(最好不要退出当前授权窗口,以便发现问题及时恢复)。
-
确保知道正确的root用户密码,以便在sudo出现问题时可以通过普通用户等执行su -命令切换到root进行恢复。
-
授权时注意大小写。
没有特殊紧急批量增加sudoers文件内容的需求,建议通过visudo来编辑修改,毕竟系统安全是相当重要的。
3.2.7 生产环境使用sudo授权注意点
-
注意sudo授权不要授权ALL
-
在实际工作场景中授权时要仔细考虑所授权的命令是否具有危险性,会威胁到root用户。如给一普通用户授予sed命令的权限,感觉没什么危险,但是sed有个参数-i可以修改源文件,虽然/etc/sudoers文件的权限是-r–r—–,即普通用户没有任何权限,但是一旦赋予sed权限,那么就可以在/etc/sudoers配置文件中添加下面一行内容,就等于可以使用root的所有权限了。
- sudo sed -i '91a oldboy ALL=(ALL) NOPASSWD:ALL' /etc/sudoers
-
sudo授权对于bash的内置命令处理,是个难题,因为内置命令没有实体文件和路径,不过一般都有解决方法例如可以使sudo ls 替代sudo cd,有的人使用sudo bash后在使用内置命令,这是很危险的,不推荐。
- 若授权一用户某些权限之后,若不授权不输入密码,在第一次用sudo输入密码执行完命令之后后会有5分钟时间不用再次输入密码,此时会在这个目录下生成时间戳/var/db/sudo
3.2.8 sudo授权说明
- 通过 sudo 授权管理后,所有用户执行授权的特殊权限格式为“sudo 命令”
- 如果需要切换到root 执行相关操作,可以通过“sudo su -”命令,注意,此命令提示的密码为当前用户的密码,而不是root的密码(NOPASSWD可以使得切换也不需要密码)
- 执行"sudo -l" 命令可以查看当前用户被授予的 sudo 权限集合。
- 对于Linux 系统 bash 的内置命令,一般无法进行 sudo 授权,例如:cd命令。
[oldboy@oldboy ~]$ sudo -l
...
User oldboy may run the following commands on this host:
(ALL) NOPASSWD: ALL
(ALL) /usr/sbin/useradd
sudo 授权与 su 切换 的原理示意图:
在生产环境中,通常会禁止root远程登录,不过,会为每个运维人员建立一个普通账号,然后根据运维人员的需求,通过sudo控制登录系统的权限,事实证明这是一个不错的权限管理方式。
解决办法:先对比root和oldboy用户下默认的PATH环境变量。
[oldboy@oldboy ~]$ echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oldboy/bin [root@oldboy ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
经过对比,可发现普通用户上几个关键的环境变量(/usr/local/sbin; /sbin; /usr/sbin) 是导致找不到执行命令的原因(除非带全路径执行)。
3.2.9 sudo 授权参数
sudo参数选项 | 注释说明(带标记的表示很重要) |
---|---|
-l | 列出用户在主机上可用的和被禁止的命令;当配置好sudo授权规则后,可用这个参数来查看授权情况。 |
-v | 验证用户的时间戳;当用户运行sudo,输入用户的密码后,在短时间内可以不用输入口令直接进行sudo操作;用-v可以跟踪最新的时间戳。 |
-u | 指定以某个用户身份执行特定的命令操作。 oldboy ALL=(ALL) /bin/cp |
-k | 删除时间戳,下一个sudo命令要求提供密码。前提是该用户授权中不能有NOPASSWD:参数。时间戳默认为5分钟 |
3.2.10 更改授权/etc/sudoers 文件的几个方法
- 执行visudo 命令自动编辑/etc/sudoers文件(推荐)
- 在没有特殊需求的前提下,请一定使用这个方法。
- 最安全的授权方法
- 缺点是必须和系统交互才能完成
- 直接修改/etc/sudoers 文件方法(不推荐)
- echo "oldboy ALL=(ALL) ALL">>/etc/sudoers
- 通过echo命令追加一行授权规则,让oldboy对所有的主机,可以切换所有用户,执行所有的权限
- 可以批量操作管理
- 新手不要使用
- 要用visudo -c 检查语法
3.2.11 sudo配置文件/etc/sudoers中的别名设置
从编写 sudo 配置文件/etc/sudoers开始;
sudo的配置文件是/etc/sudoers ,我们可以用他的专用编辑工具visudo ,此工具的好处是在添加规则不太准确时,保存退出时会提示给我们错误信息;配置好后,可以用切换到您授权的用户下,通过sudo -l 来查看哪些命令是可以执行或禁止的;
/etc/sudoers 文件中每行算一个规则,前面带有#号可以当作是说明的内容,并不执行;如果规则很长,一行列不下时,可以用号来续行,这样看来一个规则也可以拥有多个行;
/etc/sudoers 的规则可分为两类:
- 一类是别名定义
- 另一类是授权规则
别名定义并不是必须的,但授权规则是必须的;
sudo 授权之 主机别名设定 Host_Alias
说明:
- 在生产场景中,一般情况不需要设置主机别名,在定义授权规则时可以通过ALL 来匹配所有的主机
- 请注意上面定义的规范,有些规范虽然不是必须的,但我们还是要求能够按照系统的标准来配置,这样可以避免意外的问题发生
- 以上 Host Alias 内容截取自 /etc/sudoers 文件,最后两行取消了注释
- 其实就是一个逻辑上的主机组,当多台服务器共享一个/etc/sudoers 时候会用到这个主机别名。
sudo 授权之 用户别名设定 User_Alias ADMINS
别名成员可以是用户,用户组(用户组前面要加%号)
## User Aliases ## These aren't often necessary, 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
User_Alias ADMINS = jsmith, mikem, %groupname
提示:
- 设置用户别名也不是必须的,更多的情况,我们可以通过 %groupname 的方式来作为成员
- 以上 User Aliases 内容截取自/etc/sudoers文件
sudo 授权之 用户身份别名 Runas_Alias
这个别名指定的是“用户身份”,即sudo允许切换到用户身份。
Runas_Alias 定义的是用户可以执行 sudo 切换身份到 Runas_Alias 下包含的成员身份。
实际语法为:
Runas_Alias OP = root
sudo 授权之 命令别名 Command Alias
命令别名就是定义一个别名,包含一堆命令,即一组相关命令的集合。
## Command Aliases ## These are groups of related commands... ## Networking # Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /s bin/mii-tool ## Installation and management of software # Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum ## Services # Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig ## Updating the locate database # Cmnd_Alias LOCATE = /usr/bin/updatedb ## Storage # Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, / bin/mount, /bin/umount ## Delegating permissions # Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp ## Processes # Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall ## Drivers # Cmnd_Alias DRIVERS = /sbin/modprobe
提示:
- 命令别名就是设置可以执行哪些命令
- 以上Command Alias 内容截取自/etc/sudoers文件。
回顾下别名和具体授权配置的关系,sudo授权:
用户或组 | 机器= | 可以切换的用户角色(授权角色) | 可以执行的命令 |
---|---|---|---|
user | MACHINE= | COMMANDS | |
root | ALL= | (ALL) | ALL |
oldboy | ALL= | (ALL) | /usr/sbin/useradd, /usr/sbin/userdel |
User_Alias ADMINS = jsmith, mikem, %groupname | Host_Alias FILESERVERS = fs1, fs2 | Runas_Alias OP = root | Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig |
什么情况下使用上述别名?
工作中一般有多个系统用户,需要分类,分层次管理用户的时候。
定义别名的实践例子:
由于主机别名,在工作中使用的不多,这里我们就不多讲了。
示例1:定义用户别名
User_Alias ADMINS = oldboy,ett,%sa #一注意定义的规范。 # 定义系统管理用户别名ADMINS,包含成员oldboy,ett 及sa 组的成员。 User_Alias NETADMINS = leo,maya # 定义用户别名NETADMINS 来管理网络,包含成员leo,maya。 User_Alias USERADMINS = zuma # 定义用户别名USERA[MINS 来管理用户,包含成员zuma。
特别说明:
为了方便管理,要尽可能使用有意义的名称作为别名。
另外,所有包含成员都必须是系统中存在的用户或存在的组。
检查并创建上述用户及用户组:
- id username 检查用户是否存在
- 通过grep -w sa /etc/group 检查sa组是否存在
示例2:定义命令别名
Cmnd_Alias USERCMD = /usr/sbin/useradd, /usr/sbin/userdel, /usr/bin/passwd [A-Za-z]*, /bin/chown, /bin/chmod Cmnd_Alias DISKCMD = /sbin/fdisk, /sbin/parted Cmnd_Alias NETMAGCMD = /sbin/ifconfig, /etc/init.d/network Cmnd_Alias CTRLCMD = /usr/sbin/reboot, /usr/bin/halt
说明:
-
所有命令别名下的成员必须是文件或目录的绝对路径。
-
命令别名超过一行时,可以通过“”号换行。
-
在定义时,可以使用正则表达式,如/usr/bin/passwd [A-Za-z]*
-
上述用户和命令别名实际上就是如下关系:
- 系统管理:USERCMD、DISKCMD、NETMAGCMD、CTRLCMD
- 网络管理:NETMAGCMD
- 用户管理:USERCMD
示例3:定义runas 别名
Runas_Alias OP = root, oldboy
特别说明:runas 别名的定义不多见,不常用,了解即可。
3.2.12 /etc/sudoers 配置文件中的授权规则
/etc/sudoers 的授权规则就是分配权限的执行规则。
前面我们讲到的定义别名主要是为了更方便授权引用别名。
如果系统中的普通用户不多,在授权时可以不用别名,而是针对系统用户直接授权,所以,在授权规则中别名并不是必须的。
关于授权规则,通常我们可以 man sudoers 来查看 /etc/sudoers 文件的配置信息,配置文件中的例子其实已经演示的很清楚了。
如果想详细了解授权规则写法的,可以执行 man sudoers或man /etc/sudoers查询。 注意:两者的帮助信息是不一样的。
前面的讲解中,我们曾使用这样的规则进行了授权:
### Allow oldboy to run any commands anywhere oldboy ALL=(ALL) ALL ADMINS ALL=(OP) USERCMD, CTRLCMD
-
授权规则中的所有ALL字符串必须为大写字母,若不为大写,则visudo会报语法错误。
-
Cmnd_Alias USERCMD = /usr/sbin/useradd,/usr/sbin/userdel, !/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,/bin/chown, /bin/chmod,!/usr/bin/passwd root oldboy ALL=/usr/sbin/,/sbin/,!/usr/sbin/visudo,!/sbin/fdisk, /usr/sbin/useradd,/usr/sbin/userdel,!/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*,/bin/chown,/bin/chmod, !/usr/bin/passwd root
-
允许执行的命令是有顺序的。
命令的顺序是从后向前,即把禁止执行的命令放在允许命令的后面.
如:/usr/sbin/*,/sbin/*,!/usr/sbin/visudo,!/sbin/fdisk,前面的为允许,后面的为禁止,禁止的命令尽量放在后面。
-
一行内容超长可以用“”斜线换行。
-
“!”叹号表示非,就是命令取反的意思,即禁止执行的命令。
3.2.13 远程sudo
默认情况下,我们是无法通过ssh远程执行sudo命令的,可是在生产场景中我们却经常有这样的需求,类似如下
在/etc/sudoers配置文件把 Defaults requiretty 这一行内容注释掉即可:
根据注释我们可以知道,这个"Defaults requiretty"就是禁止我们通过ssh远程执行sudo命令的明确配置,但是禁止执行的远程ssh sudo命令格式为"ssh hostname sudo ",禁止的原因是因为会显示明文密码。但是我们可以通过"ssh -t hostname sudo "的方式来执行,也就是加了一个 -t 的参数。 (-t参数可以强制ssh远程执行本来需要屏蔽的程序,会强制执行终端tty,即使本地没有。)
3.2.14 sudo 命令日志审计
说明:
所谓sudo命令日志审计,并不记录普通用户的普通操作。而是记录,那些执行sudo命令的用户的操作。
服务器日志审计项目提出与实施:
1. 权限权限方案实施后,权限得到了细化控制,接下来进一步实施对所有用户日志记录方案。
2. 通过sudo和syslog(rsyslog)配合实现对所有用户进行日志审计并将记录集中管理(发送到中心日志服务器)。
3. 实施后让所有运维和开发的所有执行的sudo管理命令都有记录可查,杜绝了内部人员的操作安全隐患。
企业生产环境日志审计解决方案:
-
通过环境变量命令及rsyslog服务进行全部日志审计(信息太大,不推荐)。
-
sudo配合rsyslog服务,进行日志审计(审计信息较少,效果不错)
-
在bash解释器程序里嵌入一个监视器,让所有被审计的系统用户使用修改过的增加了监视器的特殊bash程序作为解释程序。
-
齐治的堡垒机: 商业产品
- 现在说的是: sudo 日志审计: 专门对使用sudo命令的系统用户记录其执行的命令相关信息。
-
python开发的开源产品
开源跳板相l( 堡垒杪l)Jumpserver音署详解
CrazyEye
http://3060674.blog.51cto.com/3050674/1700814
若是没有sudo和rsyslog要先安装,可yum直接安装
yum install sudo syslog -y
修改/etc/sudoers 配置文件
(增加配置“Defaults logfile=/var/log/sudo.log”)从而使任何用户在使用sudo提权时都能给记录到日志文件
[root@oldboy ~]# echo "Defaults logfile=/var/log/sudo.log" >> /etc/sudoers [root@oldboy ~]# tail -1 /etc/sudoers Defaults logfile=/var/log/sudo.log [root@oldboy ~]# visudo -c # 检测配置文件语法 /etc/sudoers: parsed OK 1
一行搞定 sudo 日志审计。
日志集中管理(了解):
- rsysnc+inotify 或 定时任务+rsync,推到日志管理服务器上
- rsyslog 服务来处理
- echo "10.0.2.164 logserver">>/etc/hosts
- 日志服务器地址
- 日志收集解决方案 scribe, Flume, stom, logstash ELK