用户权限 - Linux系统用户管理

1. 用户基本概述

Linux用户属于多用户操作系统,在windows中,可以创建多个用户,但不允许同一时间多个用户进行系统登陆,但是Linux可以同时支持多个用户同时登陆操作系统,登陆后互相之间并不影响。

1.1 用户和组存在的意义

  • 1.系统上的每一个进程(运行的程序)都需要特定的用户运行
  • 2.每一个文件都有特定的用户拥有
  • 3.访问一个文件或目录受到用户的限制
  • 4.进程能够以何种方式访问某一个文件或目录, 与进程所关联的用户有关

1.2 查看当前登录的用户信息

1
2
[root@liyanzhao-node1 /]# id
uid=0(root) gid=0(root) groups=0(root)

1.3 用户分类

UID范围 用户类型 说明
0 超级管理员 拥有最高权限
1-200 系统用户 由系统分配给系统进程使用
201-999 系统用户 用来运行服务账户,不需要登陆系统(动态分配)
1000+ 常规普通用户 普通用户账户

注意: 在CentOS7系统之前, UID1-499用于系统用户, 而UID 500+则用于普通用户。

1.4 组的类别

组类型 说明
基本组 优先使用基本组, 用户只能属于一个基本组, 用户默认基本组
附加组 基本组不能满足授权要求, 创建附加组, 用户可以属于多个附加组
私有组 私有组, 创建用户时如果没有指定基本组, 系统会创建和用户同名的组

1.5 用户相关配置文件

用户的信息存放在/etc/passwd,用户的密码都保存在/etc/shadow,这两个文件是linux系统中最重要的文件之一。

如果没有这两个文件或者这两个文件出问题,会导致无法正常登录linux系统。

/etc/passwd 账户文件

1
2
[root@node1 ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash

/etc/passwd: 为分割符, 分为7个字段,每个字段的具体含义如下:

字段名称 注释说明
1.用户名称 用户的账号名称
2.密码占位符 存放账户的口令,暂用x表示,密码保存在/etc/shadow
3.用户的UID 用户标识号
4.用户基本组GID 组标识号
5.用户注释 用户详细信息
6.用户家目录 root家目录是/root普通用户家目录存在/home/username(可自定义)
7.用户登录Shell 用户登录Linux使用的shell #cat /etc/shells

/etc/shadow 用户密码文件

1
2
[root@liyanzhao ~]# tail -1 /etc/shadow
bgx1:!!:16312:0:99999:7:::

/etc/shadow: 为分割符, 分为9个字段,每个字段的具体含义如下:

字段名称 注释说明
1.用户登陆名 用户的账号名称
2.加密后的密码 用户密码,这是加密过的口令(未设密码时为!!)
3.最近一次密码更改时间 从1970年到最近一次更改密码时间之间过了多少天
4.密码最少使用几天 密码最少使用几天才可以更改密码(0表示无限制)
5.密码最长使用几天 密码使用多少天需要修改密码(默认99999永不过期)
6.密码到期前警告期限 密码过期前多少天提醒用户更改密码(默认过期提前7天警告)
7.密码到期后保持活动的天数 在此期限内, 用户依然可以登陆系统并更改密码, 指定天数过后, 账户被锁定
8.账户到期时间 从1970年起,账户在这个日期前可使用,到期后失效
9.标志 保留

1.6 使用chage更改用户密码使用情况

1
2
3
4
5
6
7
-d  # 设置最近一次更改密码时间, 0下次登陆系统强制修改密码
-m # 设置用户两次改变密码之间使用"最小天数"
-M # 设置用户两次改变密码之间使用"最大天数"
-W # 设置密码更改警告时间 将过期警告天数设为"警告天数"
-I # 设置密码过期天数后, 密码为失效状态
-E # 设置用户过期时间, 账户失效后无法登陆
-l # 显示用户信息

配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 修改时间为2014年08月31日,和图中时间匹配,方便后续验证
[root@liyanzhao ~]# date -s '20140831'
Sun Aug 31 00:00:00 CST 2014
[root@liyanzhao ~]# date
Sun Aug 31 00:00:01 CST 2014

# 创建用户
[root@liyanzhao ~]# useradd bgx1
[root@liyanzhao ~]# echo "123" |passwd --stdin bgx1
[root@liyanzhao ~]# tail -1 /etc/shadow
bgx1:!!:16312:0:99999:7:::

# 设置最近一次修改密码时间
[root@liyanzhao ~]# chage -d "2014-09-01" bgx1
[root@liyanzhao ~]# tail -n1 /etc/shadow
bgx1:!!:16314:0:99999:7:::

# 设置最短使用密码时间
[root@liyanzhao ~]# chage -m 2 bgx1
[root@liyanzhao ~]# tail -n1 /etc/shadow
bgx1:!!:16314:2:99999:7:::

# 设置密码最长使用时间
[root@liyanzhao ~]# chage -M 15 bgx1
[root@liyanzhao ~]# tail -n1 /etc/shadow
bgx1:!!:16314:2:15:7:::

# 设置密码警告时间
[root@liyanzhao ~]# chage -W 6 bgx1
[root@liyanzhao ~]# tail -n1 /etc/shadow
bgx1:!!:16314:2:15:6:::
[root@liyanzhao ~]# chage -W 7 bgx1
[root@liyanzhao ~]# tail -n1 /etc/shadow
bgx1:!!:16314:2:15:7:::

# 设置密码过期时间
[root@liyanzhao ~]# chage -I 5 bgx1
[root@liyanzhao ~]# tail -n1 /etc/shadow
bgx1:!!:16314:2:15:6:5::

# 设置用户过期时间
[root@liyanzhao ~]# chage -E "20115-08-31" bgx1
[root@liyanzhao ~]# tail -n1 /etc/shadow
bgx1:!!:16314:2:15:6:5:6627567:

# 查看用户密码信息
[root@liyanzhao ~]# chage -l bgx1
Last password change : Sep 01, 2014 # 最近一次更改密码时间
Password expires : Sep 16, 2014 # 密码过期时间
Password inactive : Sep 21, 2014 # 密码失效时间
Account expires : Aug 31, 2015 # 用户失效时间
Minimum number of days between password change : 2 # 密码最短使用时间
Maximum number of days between password change : 15 # 密码最长使用时间
Number of days of warning before password expires : 7 # 密码过期前警告天数

验证步骤:

1
2
3
4
5
6
7
8
9
10
# 1.验证普通用户是否能修改密码, 不需要调整时间

# 2.普通用户登陆系统后, 会提示警告密码还剩多少天过期
[root@liyanzhao ~]# date -s "2014-09-12"

# 3.普通用户登陆系统后, 强制要求修改密码
[root@liyanzhao ~]# date -s "2014-09-18"

# 4.普通用户登陆系统后, 提示账户已过期
[root@liyanzhao ~]# date -s "2014-09-23"

1.1 用户相关的命令

添加用户前需要确定:

  • 确定用户的默认组是否有特殊要求
  • 确定用户是否允许登陆
  • 确定用户的密码策略
  • 确定用户的有效期
  • 确定用户的uid是否有特殊要求

1.1.1 使用useradd命令新增用户

注意: adduser命令软链接指向useradd命令

常用选项:

选项 功能
-u 指定用户的UID,不能和现有ID冲突
-g 指定用户用户默认基本组
-G 指定用户附加组,用逗号隔开添加多个附加组
-d 指定用户家目录
-c 指定用户注释信息
-M 不建立家目录
-s 指定用户默认shell
-r 创建系统账户, 没有家目录

示例:

1
2
3
4
5
6
7
8
9
10
11
# 创建bgx用户,指定UID5001,基本组students 附加组sa,dba 注释信息:2018 new student, 登陆的shell:/bin/bash
[root@liyanzhao ~]# groupadd sa
[root@liyanzhao ~]# groupadd dba
[root@liyanzhao ~]# groupadd students
[root@liyanzhao ~]# useradd -u 5001 -g students -G sa,dba -c "2018new student" -d /home/bgx -s /bin/bash bgx
[root@liyanzhao ~]# tail -1 /etc/passwd
bgx:x:5001:505:2017 new student:/home/bgx:/bin/bash

# 创建系统用户,-M不建立用户家目录 -s指定nologin使其用户无法登陆系统
[root@node1 ~]# useradd mysql -M -s /sbin/nologin
[root@node1 ~]# useradd -r dba -s /sbin/nologin

1.1.2 使用usermod命令修改用户组

常用选项:

选项 功能
-u 修改用户的UID
-g 修改用户所属的基本组GID
-G 修改用户附加组, 使用逗号隔开多个附加组, 覆盖原有的附加组
-a 追加更多的附加组, 必须和-G使用: -aG 追加附加组
-m 家目录迁移, 必须和-d一起使用, 移动用户的家目录到新的位置
-d 指定用户的家目录新位置
-c 修改用户的注释信息
-s 更改用户使用的shell
-l 更改用户登录名
-L 锁定用户
-U 解锁用户

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@liyanzhao ~]# grep "bgx" /etc/passwd
bgx:x:5001:505:2018 new student:/home/bgx:/bin/bash

# 建立组,指定组gid
[root@liyanzhao ~]# groupadd -g 5008 network_sa
[root@liyanzhao ~]# groupadd -g 5009 devops

# 修改用户属性
[root@liyanzhao ~]# usermod -u 6001 -g5008 -a -G 5009 -c "2019 new student" -md /bgx -s /bin/sh -l bgx_liyanzhao bgx

# 检查是否修改成功
[root@liyanzhao ~]# grep "bgx" /etc/passwd
bgx_liyanzhao:x:6001:5008:2019 new student:/bgx:/bin/sh
[root@liyanzhao ~]# id bgx_liyanzhao
uid=6001(bgx_liyanzhao) gid=5008(network_sa) groups=5008(network_sa),503(sa),504(dba),5009(devops)

# 验证家目录
[root@liyanzhao ~]# ll -d /bgx
drwx------. 2 bgx_liyanzhao network_sa 4096 2014-09-23 00:13 /bgx

锁定和解锁用户:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 锁定用户
[root@liyanzhao ~]# echo "123" |passwd --stdin bgx_liyanzhao
[root@liyanzhao ~]# usermod -L bgx_liyanzhao
# 无法正常登录系统
➜ ~ ssh bgx_liyanzhao@192.168.56.11
bgx_liyanzhao@192.168.56.11's password:
Permission denied, please try again.

# 解锁用户
[root@liyanzhao ~]# usermod -U bgx_liyanzhao
# 正常登录系统
➜ ~ ssh bgx_liyanzhao@192.168.56.11
bgx_liyanzhao@192.168.56.11's password:
Welcome to Aliyun Esc Linux
-sh-4.1$

1.1.3 使用finger命名查询用户信息以及登录信息

1
2
3
4
5
6
7
8
9
# 安装finger命令
[root@liyanzhao ~]# yum install finger -y
[root@liyanzhao ~]# finger bgx_liyanzhao
Login: bgx_liyanzhao Name: 2019 new student
Directory: /bgx Shell: /bin/sh
On since Tue Sep 23 01:33 (CST) on pts/1 from 192.168.56.2
5 minutes 4 seconds idle
No mail.
No Plan.

1.1.4 使用chfn修改用户信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@liyanzhao ~]# chfn bgx_liyanzhao
Changing finger information for bgx_liyanzhao.
Name [2019 new student]: 2020 new student
Office []: 110
Office Phone []: 89270000
Home Phone []: 15210xxxxxx

# 使用finger再次检查
[root@liyanzhao ~]# finger bgx_liyanzhao
Login: bgx_liyanzhao Name: 2020 new student
Directory: /bgx Shell: /bin/sh
Office: 110, 89270000 Home Phone: 15210xxxxxx
On since Tue Sep 23 01:33 (CST) on pts/1 from 192.168.56.2
6 minutes 49 seconds idle
No mail.
No Plan.

1.1.5 使用chsh命令更改用户登录shell

1
2
3
4
5
6
7
[root@liyanzhao ~]# chsh bgx_liyanzhao
Changing shell for bgx_liyanzhao.
New shell [/bin/sh]: /bin/bash
Shell changed.

[root@liyanzhao ~]# grep "bgx_liyanzhao" /etc/passwd
bgx_liyanzhao:x:6001:5008:2020 new student,110,89270000,15210xxxxxx:/bgx:/bin/bash

1.1.6 检查用户登陆情况

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看当前登录用户
[root@liyanzhao ~]# who
liyanzhao pts/0 2017-10-30 09:30 (192.168.56.2)
bgx_liyanzhao pts/1 2014-09-23 01:33 (192.168.56.2)
root pts/2 2017-10-30 07:13 (192.168.56.2)

# 查看详细登录信息
[root@liyanzhao ~]# w
01:43:18 up 1 day, 15:00, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
xuliangw pts/0 192.168.56.2 09:30 ? 0.35s 0.18s sshd: xu
bgx_xuli pts/1 192.168.56.2 01:33 9:24 0.03s 0.00s bash
root pts/2 192.168.56.2 07:13 0.00s 1.49s 0.08s w

1.1.7 使用userdel删除账户

1
2
3
4
5
6
7
8
9
10
# 语法: userdel [-r] username
# -r 同时删除家目录

# 删除用户(保留家目录)
[root@liyanzhao ~]# userdel user1
[root@liyanzhao ~]# ll /home/user1/ -d
drwx------. 3 501 501 4096 2017-11-15 12:40 /home/user1/

# 连同家目录一起删除
[root@liyanzhao ~]# userdel -r user1

1.2 用户创建的原理

Linux创建用户默认会读取/etc/defaults/useradd的配置文件,如果当我指定参数时,使用指定参数,如果不指定参数,默认使用/etc/defaults/useradd中的配置。

当我们使用useradd命令新建用户时,用户家目录下会产生相应的.bash_*文件,这些文件默认是从/etc/skel目录中复制。如需变更环境拷贝目录站点可修改:/etc/defaults/useradd的配置文件。

注意:如果执行useradd命令新建用户时,指定了参数,就会覆盖/etc/default/useradd默认的配置。

配置文件说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# /etc/login.defs 用户创建默认配置
[root@student ~]# egrep -v "^#|^$" /etc/login.defs
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
UID_MIN 1000
UID_MAX 60000
SYS_UID_MIN 201
SYS_UID_MAX 999
GID_MIN 1000
GID_MAX 60000
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes
UMASK 077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512

# /etc/default/useradd 用户创建默认配置
[root@student ~]# cat /etc/default/useradd
GROUP=100
HOME=/home # 把用户的家目录建在/home中
INACTIVE=-1 # 是否启用账号过期停权,-1表示不启用
EXPIRE= # 账号终止日期,不设置表示不启用
SHELL=/bin/bash # 新用户默认所有的shell类型
SKEL=/etc/skel # 配置新用户家目录的默认文件存放路径
CREATE_MAIL_SPOOL=yes # 创建mail文件

环境变量恢复:

1
2
3
4
5
6
# 用户登录linux操作系统,环境变量被误删,出现-bash-4.1$,如何解决!
-bash-4.1$ cp -a /etc/skel/.bash* ./
-bash-4.1$ exit

[root@student ~]# su - liyanzhao
[liyanzhao@student ~]$

2. 用户密码管理

创建完账户后,默认是没有设置密码的,所以该账户是没有办法登陆操作系统。只有使用passwd设置好密码后方可登录系统。

使用passwd为用户创建密码时,为了安全起见,请尽量设置复杂一些。可以按照如下规则设置密码:

  1. 密码的长度最好大于10位字符
  2. 密码中包含大小写字母数字以及特殊字符 ! @ # $
  3. 不规则性(不要出现自己名字、公司名字、自己电话、等等简单的密码)

需要注意:

  1. 普通用户只能更改自己的密码(密码必须满足8位字符)
  2. 管理员用户能更改任何人的密码(密码长度无限制)

2.1 使用passwd命令修改用户密码

语法: passwd [username]

  • passwd后面不加[username]则是修改当前登陆终端用户的密码
  • 如果你登陆的是root管理员用户,后面可以指定要修改的用户
  • 只有root管理员才可以修该其他用户的密码,普通账户只能修改自己的密码,并且普通用户没有修改其他用户密码的权限

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# root管理员用户登陆,修改root用户密码
[root@localhost ~]# passwd
更改用户 root 的密码。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

# root用户登陆,修改其他用户的密码
[root@localhost ~]# passwd liyanzhao
更改用户 liyanzhao 的密码
新的 密码:
重新输入新的 密码:
passwd: 所有的身份验证令牌已经成功更新。

# 普通用户修改root管理员密码(失败)
[bgx_liyanzhao@liyanzhao ~]$ passwd root
passwd: Only root can specify a user name.

# 无需用户交互修改密码, 将前者的输出结果, 成为后者的输入
[root@liyanzhao ~]# echo "123" | passwd --stdin liyanzhao
Changing password for user liyanzhao.
passwd: all authentication tokens updated successfully.

2.2 随机复杂密码生成的方式

1
2
3
4
5
6
7
8
9
10
# 1.系统内置变量生成随机密码
[root@node1 ~]# echo $RANDOM|md5sum|cut -c 1-10
d09fe9b1xs

[root@node1 ~]# echo $(echo $RANDOM|md5sum |cut -c 5-14) |tee pass.txt| passwd --stdin liyanzhao

# 2.mkpasswd密码生成工具, -l设定密码长度,-d数子,-c小写字母,-C大写字母,-s特殊字符
[root@liyanzhao ~]# yum install -y expect # 需要安装扩展包
[root@liyanzhao ~]# mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4
|K&13bR)i/

2.3 推荐密码保存工具

Lastpass官方网站 - 支持windows、MacOS、Iphone以及浏览器插件


3. 组的基本管理

组账户信息保存在/etc/group/etc/gshadow两个文件中。

3.1 /etc/group 组账户信息

1
2
3
[root@node1 ~]# head -2 /etc/group
root:x:0:
bin:x:1:bin,daemon

/etc/group:分割, 分割为4个字段,每个字段的具体含义如下:

字段名称 说明
1.组的名称 组名
2.组的密码 存在/etc/gshadow
3.组GID信息 组标识号
4.仅显示附加成员 基本成员不显示

3.2 /etc/gshadow 组密码信息

1
2
3
[root@node1 ~]# head -2 /etc/gshadow
root:::
bin:::bin,daemon

/etc/gshadow: 分割, 分割为4个字段,每个字段的具体含义如下:

字段名称 说明
1.组名称 组名
2.组密码 组密码
3.组管理员 组管理员
4.仅显示附加成员 基本成员不显示

3.3 使用groupadd命令新增组

语法: groupadd [-g GID] groupname

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建基本组, 不指定gid
[root@node1 ~]# groupadd no_gid
[root@node1 ~]# tail -n1 /etc/group
no_gid:x:1000:

# 创建基本组, 指定gid为5555
[root@node1 ~]# groupadd -g 5555 yes_gid
[root@node1 ~]# tail -n1 /etc/group
yes_gid:x:5555:

# 创建系统组,gid从201-999
[root@liyanzhao ~]# groupadd -r sys_group
[root@liyanzhao ~]# tail -n1 /etc/group
sys_group:x:990:

3.4 使用groupmod命令修改组

1
2
3
4
5
6
7
8
9
# -g 修改组gid
[root@liyanzhao ~]# groupmod -g 1111 no_gid
[root@liyanzhao ~]# tail -1 /etc/group
no_gid:x:1111:

# -n 修改组名称
[root@liyanzhao ~]# groupmod -n active_group yes_gid
[root@liyanzhao ~]# tail -1 /etc/group
active_group:x:5555:

3.5 使用groupdel删除组

该命令没有特殊选项,如果一个用户有基本组和附加组,只能删除附加组,不能删除基本组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 删除组
[root@liyanzhao ~]# groupdel active_group

# 删除用户附加组
[root@docker ~]# id liyanzhao
uid=1069(liyanzhao) gid=5005(liyanzhao) groups=5005(liyanzhao),5004(devops)
[root@docker ~]# groupdel devops
[root@docker ~]# id liyanzhao
uid=1069(liyanzhao) gid=5005(liyanzhao) groups=5005(liyanzhao)

# 无法删除用户基本组
[root@liyanzhao ~]# tail -n1 /etc/group
network_sa:x:5008:
[root@liyanzhao ~]# groupdel network_sa
groupdel: cannot remove the primary group of user 'bgx_liyanzhao'

# 只有删除用户或者用户变更基本后,方可删除该组

3.6 使用gpasswd设置组密码

1
2
3
4
5
[root@liyanzhao ~]# groupadd devops
[root@liyanzhao ~]# gpasswd devops
Changing the password for group devops
New Password:
Re-enter new password:

3.7 使用newgrp命令切换基本组身份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 检查账户信息
[root@docker ~]# useradd liyanzhao
[root@docker ~]# id liyanzhao
uid=1069(liyanzhao) gid=5005(liyanzhao) groups=5005(liyanzhao)

# 切换普通用户
[root@docker ~]# su - liyanzhao

# 创建新文件,并验证权限
[liyanzhao@docker ~]$ touch file_roots
[liyanzhao@docker ~]$ ll
-rw-rw-r-- 1 liyanzhao liyanzhao 0 Jun 13 10:06 file_roots

# 切换组信息
[liyanzhao@docker ~]$ newgrp devops
Password:

# 建立文件,检查权限
[liyanzhao@docker ~]$ touch file_test
[liyanzhao@docker ~]$ ll
total 0
-rw-rw-r-- 1 liyanzhao liyanzhao 0 Jun 13 10:06 file_roots
-rw-r--r-- 1 liyanzhao devops 0 Jun 13 10:08 file_test

4. 用户身份切换

Linux系统中,有时候普通用户有些事情是没办法操作,除非是root管理员用户才能做到。这时就需要临时切换到root管理员身份来做事了。那么在学习如何切换用户之前,我们先来了解下用户工作环境。

4.1 Shell分类

Shell类型 说明 示例
交互式shell 等待用户输入执行的命令(终端操作,需要不断提示) 终端操作
非交互式shell 执行shell脚本, 脚本执行结束后shell自动退出 执行脚本
登陆shell 需要输入用户名和密码才能进入shell su - liyanzhao
非登陆shell 不需要输入用户和密码就能进入,比如执行sh, bash su username
1
2
3
4
5
6
# 查看登陆shell
[root@liyanzhao ~]# pstree

# 临时设置,永久设置需要写配置文件
[root@liyanzhao ~]# export PS1='[\h@\u \t]#'
[liyanzhao@root 02:06:28]#

4.2 bash shell配置文件

Bash的配置文件保存用户的工作环境

个人配置文件: ~/.bash_profile ~/.bashrc

全局配置文件: /etc/profile /etc/profile.d/*.sh /etc/bashrc

  • profile类文件: 设定环境变量, 登陆前运行的脚本和命令
  • bashrc 类文件: 设定本地变量, 定义命令别名

全局配置和个人配置设置冲突, 优先使用个人配置

4.3 shell配置文件应用顺序

1
2
3
4
5
# 登录式shell配置文件执行顺序
/etc/profile -> /etc/profile.d/*.sh -> ~/.bash_profile -> ~/.bashrc -> /etc/bashrc

# 非登陆式shell配置文件执行顺序
~/.bashrc -> /etc/bashrc -> /etc/profile.d/*.sh

验证方法: 在每个配置文件加入一段 “echo”即可。最后通过登陆shell和非登录shell方式登陆linux, 即可验证执行顺序。

4.4 配置冲突验证

1
2
3
4
5
6
7
8
9
# 编辑全局配置 /etc/profile     新增一行: PS1='[\h@\u \t]#'
[liyanzhao@root 02:16:57]# # 当前终端shell环境

# 编辑个人配置 ~/.bash_profile 新增一行: PS1='[\u@\H]#'
[liyanzhao@root 02:18:27]#su bgx_liyanzhao
[bgx_liyanzhao@liyanzhao root]$

[liyanzhao@root 02:18:34]# su - bgx_liyanzhao
[bgx_liyanzhao@liyanzhao.com]#

4.5 创建用户并登录系统

1
2
3
4
5
6
7
8
9
10
11
12
# 创建用户
[root@node1 ~]# useradd liyanzhao
[root@node1 ~]# echo "123"|passwd --stdin liyanzhao

# 使用liyanzhao用户登录当前Linux系统
➜ ~ ssh liyanzhao@192.168.56.111
liyanzhao@192.168.56.111's password:
[liyanzhao@node1 ~]$

# 可以使用whoami查看当前登录用户
[liyanzhao@node1 ~]$ whoami
liyanzhao

4.6 切换用户,使用命令su [-] username

su命令后面跟-代表进入登陆式shell,如果su命令后不加-代表进入非登陆式shell,他们之间的区别在于加载的环境变量不一样。

  • 普通用户su -代表直接切换至root用户身份, 但需要输入root用户密码
  • 超级管理员root用户使用su - username切换普通用户不需要输入任何密码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[liyanzhao@node1 ~]$ pwd
/home/liyanzhao

# 不加 '-' 切换到root账户下时,当前目录没有变化
[liyanzhao@node1 ~]$ su
密码:
[root@node1 liyanzhao]# pwd
/home/liyanzhao
[root@node1 liyanzhao]# exit
exit

# 加 '-'切换到root账户,当前目录为root账户的家目录
[liyanzhao@node1 ~]$ su -
密码:
[root@node1 ~]# pwd
/root

4.7 以某个用户的身份执行某个服务

使用命令su -c username

1
2
[root@liyanzhao ~]# su - liyanzhao -c 'ifconfig'
[root@liyanzhao ~]# su - liyanzhao -c 'ls ~'

5. 用户身份提权

su命令在切换用户身份时,如果每个普通用户都能拿到root用户的密码,当其中某个用户不小心泄漏了root的密码,那系统会变得非常不安全。

为了改进这个问题,从而产生了sudo这个命令。

sudo执行一个仅有root身份才能执行的命令是可以办到的,但是需要输入密码,这个密码并不是root的密码而是用户自己的密码。

默认只有root用户能使用sudo命令,普通用户想要使用sudo需要root预先设定,即使用 visudo命令去编辑相关的配置文件/etc/sudoers

5.1 CentOS7提权

1
2
3
4
[root@node1 ~]# usermod bgx -G wheel

# 日志审计
[root@node1 ~]$ sudo tail -f /var/log/secure

5.2 CentOS6提权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1.系统安装后就有sudo命令,如果没有sudo命令,可通过如下方式安装
[root@liyanzhao ~]# yum install -y sudo

# 2.使用`visudo`命令编辑sudo配置文件, 相当于 vim /etc/sudoers`配置文件
[root@liyanzhao ~]# visudo # 会对配置进行验证
liyanzhao ALL=(ALL) /bin/rm, /bin/cp # 新增

# 3.配置选项详解
# 1.用户名 2.主机名 3.角色名 4.命令名
root ALL= (ALL) ALL
liyanzhao ALL 使用最高角色执行 /bin/rm, /bin/cp # 允许使用sudo执行命令
liyanzhao ALL=(ALL) NOPASSWD:/bin/cp, /bin/rm # 不需要密码使用rm、cp命令

# 4.使用visudo -c检查配置文件
[root@liyanzhao ~]# visudo -c
/etc/sudoers: parsed OK

5.3 普通用户验证sudo权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1.切换普通用户
[root@liyanzhao ~]# su - liyanzhao

# 2.检查普通用户sudo权限明细
[liyanzhao@liyanzhao ~]$ sudo -l
...
User liyanzhao may run the following commands on this host:
(ALL) /bin/rm, (ALL) /bin/cp

# 3.普通用户删除opt目录,删除失败
[liyanzhao@liyanzhao ~]$ rm -rf /opt/
rm: cannot remove `/opt': Permission denied

# 4.使用sudo提权,验证用户权限是否可用,需要输入普通用户的密码
[liyanzhao@liyanzhao ~]$ sudo rm -rf /opt

5.4 sudo免密码配置选项

1
2
3
4
5
6
7
8
9
10
11
# 1.普通用户执行sudo不需要输入密码配置
[root@liyanzhao ~]# visudo
liyanzhao ALL=(ALL) /bin/rm, /bin/cp # 默认
liyanzhao ALL=(ALL) NOPASSWD:/bin/rm, /bin/cp # 修改后

# 2.默认普通用户无权删除
[liyanzhao@liyanzhao ~]$ rm -f /root/002
rm: cannot remove `/root/002': Permission denied

# 3.验证sudo免密码执行权限
[liyanzhao@liyanzhao ~]$ sudo rm -f /root/002

5.5 sudo配置组

如果每增加一个用户需配置一行sudo,这样设置非常麻烦。所以可以进行如下设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 如果每增加一个用户需配置一行sudo,这样设置非常麻烦。所以可以进行如下设置
%gbx ALL=(ALL) NOPASSWD:/bin/rm, /bin/cp # 新增组

# group1这个组的所有用户都拥有sudo的权力。接下来只需要将用户加入该组即可。
# 创建用户加入该组
[root@liyanzhao ~]# groupadd bgx
[root@liyanzhao ~]# useradd bgx1 -g bgx
[root@liyanzhao ~]# useradd bgx2 -g bgx

# root用户建立目录
[root@liyanzhao ~]# mkdir /root/bgx_sudo

# 切换用户并删除测试
[root@node1 ~]# su - bgx1
[bgx1@liyanzhao ~]$ rm -rf /root/bgx_sudo
rm: cannot remove `/root/bgx_sudo': Permission denied

# 使用sudo
[bgx1@liyanzhao ~]$ sudo rm -rf /root/bgx_sudo

5.6 实用案例:禁止root直接登录

需求:

  1. 仅允许使用普通账户登陆Linux服务器,禁止root直接登录
  2. 可以让普通用户不输入密码就能sudo su -切换到root账户

配置步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 禁止root用户登陆
[root@liyanzhao ~]# sed -i 's@#PermitRootLogin yes@PermitRootLogin no@g' /etc/ssh/sshd_config
[root@liyanzhao ~]# systemctl restart sshd

# 配置sudo权限
[root@liyanzhao ~]# visudo
User_Alias USER_SU = bgx1,bgx2,liyanzhao
Cmnd_Alias SU = /bin/su
USER_SU ALL=(ALL) NOPASSWD:SU

# 使用root登陆服务器失败
➜ ~ ssh root@192.168.56.11
root@192.168.56.11's password:
Permission denied, please try again.

# 使用普通用户登陆服务器
➜ ~ ssh liyanzhao@192.168.56.11
liyanzhao@192.168.56.11's password:
Last login: Mon Oct 30 09:28:21 2017 from 192.168.56.2

# 使用sudo提权至root用户
[liyanzhao@liyanzhao ~]$ sudo su -
[root@liyanzhao ~]#

5.7 sudo执行流程

  1. 普通用户执行sudo命令, 会检查/var/db/sudo是否存在时间戳缓存
  2. 如果存在则不需要输入密码, 否则需要输入用户与密码
  3. 输入密码会检测是否该用户是否拥有该权限
  4. 如果有则执行,否则报错退出

6. 日志相关审计

通过sudo和syslog配合实现对所有用户进行权限的日志审计并将记录日志集中管理,实施后让所有运维和开发执行的sudo命令都有记录可查,杜绝了内部人员的操作安全隐患。

sudo日志审计,专门针对sudo命令的系统用户记录其执行的命令相关信息,所谓sudo命令日志审计,并不记录普通用户的操作,而是记录执行sudo命令的用户操作。

6.1 安装sudo、rsyslog

1
2
3
4
5
6
[root@node1 ~]# yum install -y sudo rsyslog

# 检测是否安装成功
[root@node1 ~]# rpm -qa sudo rsyslog
rsyslog-5.8.10-10.el6_6.x86_64
sudo-1.8.6p3-19.el6.x86_64

6.2 配置/etc/sudoers记录日志路径

1
2
3
4
5
6
7
8
9
[root@node1 ~]# echo "Defaults  logfile=/var/log/sudo.log" >>/etc/sudoers

# 查看追加的日志配置
[root@node1 ~]# tail -1 /etc/sudoers
Defaults logfile=/var/log/sudo.log

# 检查语法
[root@node1 ~]# visudo -c
/etc/sudoers: parsed OK

6.3 配置rsyslog日志服务

1
2
3
4
5
6
[root@node1 ~]# echo "local2.debug /var/log/sudo.log" >>/etc/rsyslog.conf 

# 重启rsyslog服务
[root@node1 ~]# /etc/init.d/rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]

6.4 普通用户使用sudo权限验证日志记录

1
2
3
4
5
6
7
8
9
# 使用普通执行sudo命令
[liyanzhao@node1 ~]$ rm -rf /root/test/
rm: 无法删除"/root/test": 权限不够
[liyanzhao@node1 ~]$ sudo rm -rf /root/test/

# 检查用户在什么时间执行过什么操作
[liyanzhao@node1 ~]$ cat /var/log/sudo.log
Nov 7 07:56:58 : liyanzhao : TTY=pts/1 ; PWD=/home/liyanzhao ; USER=root ;
COMMAND=/bin/rm -rf /root/test/

7. 命令总结

7.1 用户管理命令

命令 功能
useradd 创建用户
usermod 修改用户属性
userdel 删除用户
passwd 修改用户密码
chage 修改用户密码策略
chfn 修改用户信息
chsh 修改用户shell
finger 查看用户信息
id 查看用户ID信息
who 查看当前登录用户
w 查看详细登录信息

7.2 组管理命令

命令 功能
groupadd 创建组
groupmod 修改组属性
groupdel 删除组
gpasswd 设置组密码
newgrp 切换基本组

7.3 用户切换和提权

命令 功能
su 切换用户(非登录shell)
su - 切换用户(登录shell)
su -c 以指定用户身份执行命令
sudo 提权执行命令
visudo 编辑sudo配置文件