1、用户基本概述
1.1、什么是用户
用户指的是能够正常登录Linux或windows系统
那Linux与windows系统的用户有什么区别?
本质都是登录系统的,只不过Linux支持多用户同时登录,windows默认不支持,但是修改组策略的情况下也是可以多用户登录的。
1.2、Linux用户有什么作用?
- 系统上的每一个进程(运行的程序)都需要特定的用户运行
- 每一个文件都有特定的用户拥有,所以访问一个文件或目录受到用户的限制
- 进程能够以何种方式访问某一个文件或目录, 与进程所关联的用户有关。
1.3、如何查看系统中所存在的用户
- 查看当前系统用户信息
[root@sunedu ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@sunedu ~]# w
02:04:46 up 5:29, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 20:35 6.00s 0.13s 0.01s w
- 每一个文件都有所有者
[root@sunedu ~]# ll
total 4
-rw-------. 1 root root 1592 Feb 19 12:13 anaconda-ks.cfg
-rw-r--r--. 2 root root 0 Feb 19 20:45 soft_link
- 每一个进程都有用户运行
[root@sunedu ~]# ps -ef | less
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Feb19 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 Feb19 ? 00:00:00 [kthreadd]
root 4 2 0 Feb19 ? 00:00:00 [kworker/0:0H]
root 6 2 0 Feb19 ? 00:00:00 [ksoftirqd/0]
root 7 2 0 Feb19 ? 00:00:00 [migration/0]
root 8 2 0 Feb19 ? 00:00:00 [rcu_bh]
root 9 2 0 Feb19 ? 00:00:02 [rcu_sched]
root 10 2 0 Feb19 ? 00:00:00 [lru-add-drain]
root 11 2 0 Feb19 ? 00:00:00 [watchdog/0]
root 12 2 0 Feb19 ? 00:00:00 [watchdog/1]
root 13 2 0 Feb19 ? 00:00:00 [migration/1]
root 14 2 0 Feb19 ? 00:00:00 [ksoftirqd/1]
root 16 2 0 Feb19 ? 00:00:00 [kworker/1:0H]
root 18 2 0 Feb19 ? 00:00:00 [kdevtmpfs]
root 19 2 0 Feb19 ? 00:00:00 [netns]
root 20 2 0 Feb19 ? 00:00:00 [khungtaskd]
root 21 2 0 Feb19 ? 00:00:00 [writeback]
root 22 2 0 Feb19 ? 00:00:00 [kintegrityd]
root 23 2 0 Feb19 ? 00:00:00 [bioset]
root 24 2 0 Feb19 ? 00:00:00 [bioset]
root 25 2 0 Feb19 ? 00:00:00 [bioset]
1.4、用户相关配置文件
用户的信息存放在/etc/passwd用户的密码都保存在/etc/shadow这两个文件是linux系统中最重要的文件之一。
如果没有这两个文件或者这两个文件出问题,会导致无法正常登录linux系统。
- /etc/passwd 账户文件
[root@sunedu ~]# 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 用户密码文件
[root@sunedu ~]# tail -1 /etc/shadow
postfix:!!:18677::::::
// /etc/shadow由 ':' 为分割符, 分为9个字段,每个字段的具体含义如下:
字段名称 注释说明
1.用户登陆名 //用户的账号名称
2.加密后的密码 //用户密码,这是加密过的口令(未设密码时为!!)
3.最近一次密码更改时间 //从1970年到最近一次更改密码时间之间过了多少天
4.密码最少使用几天 //密码最少使用几天才可以更改密码(0表示无限制)
5.密码最长使用几天 //密码使用多少天需要修改密码(默认99999永不过期)
6.密码到期前警告期限 //密码过期前多少天提醒用户更改密码(默认过期提前7天警告)
7.密码到期后保持活动的天数 //在此期限内, 用户依然可以登陆系统并更改密码, 指定天数过后, 账户被锁定
8.账户到期时间 //从1970年起,账户在这个日期前可使用,到期后失效。
9.标志 //保留
1.4、用户分类(约定,规范)
用户UID |
系统中约定的含义 |
0 |
超级管理员(拥有最高权限) |
1-200 |
系统用户,由系统分配给系统进程使用 |
201-999 |
系统用户,用来运行服务账户,不需要登入系统(动态分配) |
1000+ |
常规铍铜用户 |
注意: 在CentOS7系统之前, UID1-499用于系统用户, 而UID 500+则用于普通用
1.5、使用chage更改用户密码密码使用情况(了解内容)
-d //设置最近一次更改密码时间, 0下次登陆系统强制修改密码
-m //设置用户两次改变密码之间使用"最小天数"
-M //设置用户两次改变密码之间使用"最大天数"
-W //设置密码更改警告时间 将过期警告天数设为"警告天数"
-I //设置密码过期天数后, 密码为失效状态
-E //设置用户过期时间, 账户失效后无法登陆
-l //显示用户信息
[root@sunedu ~]# date -s '20210219'
Fri Feb 19 00:00:00 CST 2021
[root@sunedu ~]# date
Fri Feb 19 00:00:05 CST 2021
[root@sunedu ~]# useradd sun
[root@sunedu ~]# echo "123" | passwd --stdin sun
Changing password for user sun.
passwd: all authentication tokens updated successfully.
[root@sunedu ~]# tail -1 /etc/shadow
sun:$6$JyibtMXr$TBfqHLzphLLxXcIi84cDn8q0V8ybKizpeyA7Bw7RPkkhWz0LOKrazGyRNdK5YnmFYhl/y.hegrSrRfWOqWgDB/:18676:0:99999:7:::
[root@sunedu ~]# chage -d "2021-02-19" sun
[root@sunedu ~]# tail -n1 /etc/shadow
sun:$6$JyibtMXr$TBfqHLzphLLxXcIi84cDn8q0V8ybKizpeyA7Bw7RPkkhWz0LOKrazGyRNdK5YnmFYhl/y.hegrSrRfWOqWgDB/:18677:0:99999:7:::
[root@sunedu ~]# chage -m 2 sun
[root@sunedu ~]# tail -n1 /etc/shadow
sun:$6$JyibtMXr$TBfqHLzphLLxXcIi84cDn8q0V8ybKizpeyA7Bw7RPkkhWz0LOKrazGyRNdK5YnmFYhl/y.hegrSrRfWOqWgDB/:18677:2:99999:7:::
[root@sunedu ~]# chage -M 2 sun
[root@sunedu ~]# tail -n1 /etc/shadow
sun:$6$JyibtMXr$TBfqHLzphLLxXcIi84cDn8q0V8ybKizpeyA7Bw7RPkkhWz0LOKrazGyRNdK5YnmFYhl/y.hegrSrRfWOqWgDB/:18677:2:2:7:::
[root@sunedu ~]# chage -W 6 sun
[root@sunedu ~]# tail -n1 /etc/shadow
sun:$6$JyibtMXr$TBfqHLzphLLxXcIi84cDn8q0V8ybKizpeyA7Bw7RPkkhWz0LOKrazGyRNdK5YnmFYhl/y.hegrSrRfWOqWgDB/:18677:2:2:6:::
[root@sunedu ~]# chage -W 7 sun
[root@sunedu ~]# tail -n1 /etc/shadow
sun:$6$JyibtMXr$TBfqHLzphLLxXcIi84cDn8q0V8ybKizpeyA7Bw7RPkkhWz0LOKrazGyRNdK5YnmFYhl/y.hegrSrRfWOqWgDB/:18677:2:2:7:::
[root@sunedu ~]# chage -I 5 sun
[root@sunedu ~]# tail -n1 /etc/shadow
sun:$6$JyibtMXr$TBfqHLzphLLxXcIi84cDn8q0V8ybKizpeyA7Bw7RPkkhWz0LOKrazGyRNdK5YnmFYhl/y.hegrSrRfWOqWgDB/:18677:2:2:7:5::
[root@sunedu ~]# chage -E "200000-08-31" sun
[root@sunedu ~]# tail -n1 /etc/shadow
sun:$6$JyibtMXr$TBfqHLzphLLxXcIi84cDn8q0V8ybKizpeyA7Bw7RPkkhWz0LOKrazGyRNdK5YnmFYhl/y.hegrSrRfWOqWgDB/:18677:2:2:7:5:72329215:
[root@sunedu ~]# chage -l sun
Last password change : Feb 19, 2021
Password expires : Feb 21, 2021
Password inactive : Feb 26, 2021
Account expires : Aug 31, 200000
Minimum number of days between password change : 2
Maximum number of days between password change : 2
Number of days of warning before password expires : 7
2、用户相关命令
2.1、useradd
使用useradd和adduser这两个命令,来创建用户
- 添加用户前需要确定
确定用户的默认组是否有特殊要求
确定用户是否允许登陆
确定用户的密码策略
确定用户的有效期
确定用户的uid是否有特殊要求
- 使用useradd命令新增用户, 注意: adduser命令软链接指向useradd命令
'-u' 指定用户的UID,不能和现有ID冲突
'-g' 指定用户用户默认基本组
'-G' 指定用户附加组,用逗号隔开添加多个附加组
'-d' 指定用户家目录
'-c' 指定用户注释信息
'-M' 不建立家目录
'-s' 指定用户默认shell
'-r' 创建系统账户, 没有家目录
'-a' 附加组,都留下,配合-G,追加
//创建zls用户,指定UID5001,基本组students 附加组sa,dba 注释信息:one newB user, 登陆的shell:/bin/bash
[root@sunedu ~]# groupadd sa
[root@sunedu ~]# groupadd dba
[root@sunedu ~]# groupadd students
[root@sunedu ~]# useradd -u 5001 -g students -G sa,dba -c "one newB user" -d /home/sun -s /bin/bash sun
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists
[root@sunedu ~]# tail -1 /etc/passwd
sun:x:5001:1003:one newB user:/home/sun:/bin/bash
//创建系统用户,不建立用户家目录 指定nologin使其用户无法登陆系统
[root@sunedu ~]# useradd yu -M -s /sbin/nologin
[root@sunedu ~]# useradd -r dbc -s /sbin/nologin
2.2使用usermod命令修改用户组
'-u' 修改用户的UID
'-g' 修改用户所属的基本组GID
'-G' 修改用户附加组, 使用逗号隔开多个附加组, 覆盖原有的附加组
'-a' 追加更多的附加组, 必须和-G使用: -aG 追加附加组
'-m' 家目录迁移, 必须和-d一起使用, 移动用户的家目录到新的位置
'-d' 指定用户的家目录新位置
'-c' 修改用户的注释信息
'-s' 更改用户使用的shell
'-l' 更改用户登录名
'-L' 锁定用户
'-U' 解锁用户
[root@sunedu ~]# grep "sun" /etc/passwd
sun:x:5001:1003:one newB user:/home/sun:/bin/bash
//修改用户uid,gid, 附加组, 注释信息, 用户家目录, 登录shell, 登录名
//建立组,指定组gid
[root@sunedu ~]# groupadd -g 5008 network_sa
[root@sunedu ~]# groupadd -g 5009 network_sb
//修改用户属性
[root@sunedu ~]# usermod -u 6001 -g5008 -a -G 5009 -c "2019 new student" -md /sun -s /bin/sh -l sun_sun sun
[root@sunedu ~]# grep "sun" /etc/passwd
sun_sun:x:6001:5008:2019 new student:/sun:/bin/sh
[root@sunedu ~]# id sun_sun
uid=6001(sun_sun) gid=5008(network_sa) groups=5008(network_sa),1001(sa),1002(dba),5009(network_sb)
//验证家目录
[root@sunedu ~]# ll -d /sun/
drwx------. 2 1000 1000 62 Feb 19 00:00 /sun/
锁定用户
[root@sunedu ~]# echo "123" | passwd --stdin sun_sun
Changing password for user sun_sun.
passwd: all authentication tokens updated successfully.
[root@sunedu ~]# usermod -L sun_sun
[root@sunedu ~]# ssh sun_sun@10.0.0.200
The authenticity of host '10.0.0.200 (10.0.0.200)' can't be established.
ECDSA key fingerprint is SHA256:IaeFfmdsNZ2KR0fq8U5vuJEqZLDiDYaQFZlBqtCOtjY.
ECDSA key fingerprint is MD5:a5:55:2a:6c:9b:5f:19:0a:01:15:85:7e:aa:4e:de:52.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.200' (ECDSA) to the list of known hosts.
sun_sun@10.0.0.200's password:
Permission denied, please try again.
解锁用户
[root@sunedu ~]# usermod -U sun_sun
正常登入系统
[root@sunedu ~]# ssh sun_sun@10.0.0.200
sun_sun@10.0.0.200's password:
Last failed login: Fri Feb 19 00:23:10 CST 2021 from 10.0.0.200 on ssh:notty
There were 3 failed login attempts since the last successful login.
Could not chdir to home directory /sun: Permission denied
-sh: /sun/.profile: Permission denied
-sh-4.2$
当然还有很多命令可以查看用户的信息,以下简单列举一些,都是我们压根不用的,了解即可
- 使用finger命令查询永辉信息以及登录信息
[root@sunedu ~]# yum -y install finger
[root@sunedu ~]# finger sun_sun
Login: sun_sun Name: 2019 new student
Directory: /sun Shell: /bin/sh
Last login Fri Feb 19 00:23 (CST) on pts/1 from 10.0.0.200
No mail.
No Plan.
- 使用chfn命令修改用户信息
#修改用户信息
[root@sunedu ~]# chfn sun_sun
Changing finger information for sun_sun.
Name [2019 new student]: sun
Office []: 123
Office Phone []: 8888
Home Phone []: ssss
Finger information changed.
#再次查看
[root@sunedu ~]# finger sun_sun
Login: sun_sun Name: sun
Directory: /sun Shell: /bin/sh
Office: 123, x8888 Home Phone: ssss
Last login Fri Feb 19 00:23 (CST) on pts/1 from 10.0.0.200
No mail.
No Plan
- 使用chsh命令修改用户登录bash shell
[root@sunedu ~]# chsh yu
Changing shell for yu.
New shell [/sbin/nologin]: /bin/sh
Shell changed.
- 使用who,whoami,w检查用户登录情况
[root@sunedu ~]# who
root pts/0 2021-02-19 20:35 (10.0.0.1)
[root@sunedu ~]# whoami
root
[root@sunedu ~]# w
00:29:32 up 6:11, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 20:35 ? 0.45s 0.02s w
2.3、使用userdel删除用户
语法 : userdel [-r] username //-r 同时删除家目录
[root@sunedu ~]# userdel sun_sun
3、用户的拓展知识
3.1、用户的创建流程
- useradd创建用户时,系统会以/etc/login.defs、/etc/defaults/useradd两个配置文件作为参照物,如果在创建用户时指定了参数则会覆盖/etc/login.defs、/etc/defaults/useradd文件的默认配置,如果未指定则使用默认
[root@sunedu ~]# less /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
UID_MIN 1000
#普通用户最大uid
UID_MAX 60000
#系统用户最小uid
SYS_UID_MIN 201
#系统用户最大uid
SYS_UID_MAX 999
#普通用户组最小gid
GID_MIN 1000
#普通用户组最大gid
GID_MAX 60000
#系统组最小gid
SYS_GID_MIN 201
#系统组最大gid
SYS_GID_MAX 999
#是否创建家目录
CREATE_HOME yes
#权限
UMASK 077
#删除用户时,是否要移除用户组
USERGROUPS_ENAB yes
#密码加密算法
ENCRYPT_METHOD SHA512
#查看useradd配置文件
[root@sunedu ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100 //依赖于/etc/login.defs的USE RGRUUPS_ENAB参数,如果为no,则在此处控制
HOME=/home //把用户的家目录建在/home中。
INACTIVE=-1 //是否启用账号过期停权,-1表示不启用。
EXPIRE= //账号终止日期,不设置表示不启用。
SHELL=/bin/bash //新用户默认所有的shell类型。
SKEL=/etc/skel //配置新用户家目录的默认文件存放路径。
CREATE_MAIL_SPOOL=yes //创建mail文件。
- 当使用useradd创建用户时,创建的用户家目录下会存在.bash_*环境变量相关的文件,这些环境变量默认文件在/etc/skel目录中拷贝。这个默认拷贝环境变量位置是由/etc/defaults/useradd配置文件中定义
企业故障案例
#在当前用户的家目录下,想要删除所有文件,执行了如下命令
[root@db04 ~]# rm -fr .*
#结果再次登录时
-bash-4.1#
#解决办法
-bash-4.1# cp /etc/skel/.bash* .
#再次登录 即可恢复
[root@db04 ~]#
4、用户密码管理
创建完账户后,默认是没有设置密码的,所以该账户是没有办法登陆操作系统。只有使用passwd设置好密码后方可登录系统。
使用passwd为用户创建密码时,为了安全起见,请尽量设置复杂一些。可以按照如下规则设置密码:
1.密码的长度最好大于10位字符
2.密码中包含大小写字母数字以及特殊字符 ! @ # $
3.不规则性(不要出现自己名字、公司名字、自己电话、等等简单的密码
需要注意:
1.普通用户只能更改自己的密码(密码必须满足8位字符)
2.管理员用户能更改任何人的密码(密码长度无限制)
4.1、使用passwd命令修改用户密码
语法: passwd [username]
//'passwd'后面不加[username]则是修改当前登陆终端用户的密码。
//如果你登陆的是root管理员用户,后面可以指定要修改的用户。
//只有root管理员才可以修该其他用户的密码,普通账户只能修改自己的密码,并且普通用户没有修改其他用户密码的权限
//root管理员用户登陆,修改root用户密码
[root@sunedu ~]# passwd
更改用户 root 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
//root用户登陆,修改其他用户的密码
[root@sunedu ~]# passwd yu
更改用户 yu 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
//普通用户修改root管理员密码
[root@sunedu ~]# su - sun
[sun@sunedu ~]$ passwd root
passwd:只有根用户才能指定用户名。
//无需用户交互修改密码, 将前者的输出结果, 成为后者的输入
[root@sunedu ~]# echo "123" | passwd --stdin sun
更改用户 sun 的密码 。
passwd:所有的身份验证令牌已经成功更新。
4.2、随机复杂密码生成的方式
- 系统内置变量生成随机密码
[root@sunedu ~]# echo $RANDOM | md5sum | cut -c 1-10
3e4b368d5d
[root@sunedu ~]# echo $(echo $RANDOM | md5sum | cut -c 1-10) | tee pass.txt | passwd --stdin sun
更改用户 sun 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@sunedu ~]# cat pass.txt
3044e58f92
- mkpasswd密码生成工具, -l设定密码长度,-d数子,-c小写字母,-C大写字母,-s特殊字符
[root@sunedu ~]# yum install -y expect
[root@sunedu ~]# echo $(mkpasswd -l 10 -d 2 -c 2 -s 4) | tee pass.txt | passwd --stdin sun
更改用户 sun 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@sunedu ~]# cat pass.txt
W)t:!83D!w
5、组的基本管理
组账户信息保存在/etc/group和/etc/gshadow两个文件中。
- /etc/group 组账户信息
[root@sunedu ~]# head -2 /etc/group
root:x:0:
bin:x:1:
// /etc/group由':' 分割, 分割为4个字段,每个字段的具体含义如下:
字段名称
1.组的名称
2.组的密码(存在/etc/gshadow)
3.组GID信息
4.仅显示附加成员,基本成员不显示
- /etc/gshadow 组密码信息
[root@sunedu ~]# head -2 /etc/gshadow
root:::
bin:::
// /etc/gshadow由 ':' 分割, 分割为4个字段,每个字段的具体含义如下:
字段名称
1.组名称
2.组密码
3.组管理员
4.仅显示附加成员,基本成员不显示
5.1、使用groupadd命令新增组groupadd [-g GID] groupname
//创建基本组, 不指定gid
[root@sunedu ~]# groupadd yh
[root@sunedu ~]# tail -n1 /etc/group
yh:x:5010:
//创建基本组, 指定gid为5555
[root@sunedu ~]# groupadd -g 4444 yh
[root@sunedu ~]# tail -n1 /etc/group
yh:x:4444:
//创建系统组,gid从201-999
[root@sunedu ~]# groupadd -r zh
[root@sunedu ~]# tail -n1 /etc/group
zh:x:995:
5.2、使用groupmod命令新增组
//-g 修改组gid
[root@sunedu ~]# groupmod -g 1111 zh
[root@sunedu ~]# tail -1 /etc/group
zh:x:1111:
//-n 修改组名称
[root@sunedu ~]# groupmod -n uu zh
[root@sunedu ~]# tail -1 /etc/group
uu:x:1111:
5.3、使用groupdel删除组
该命令没有特殊选项,如果一个用户有基本组和附加组,只能删除附加组,不能删除基本组
#删除组
[root@sunedu ~]# groupdel uu
#删除用户附加组
[root@sunedu ~]# id sun
uid=5001(sun) gid=1003(students) 组=1003(students),1001(sa),1002(dba)
[root@sunedu ~]# groupdel sa
[root@sunedu ~]# id sun
uid=5001(sun) gid=1003(students) 组=1003(students),1002(dba)
#无法删除用户基本组
[root@sunedu ~]# id sun
uid=5001(sun) gid=1003(students) 组=1003(students),1002(dba)
[root@sunedu ~]# groupdel students
groupdel:不能移除用户"sun"的主组
#只有删除用户或者用户变更基本组后,方可删除该组
5.4、使用gpasswd设置组密码[了解即可]
[root@sunedu ~]# groupadd yytu
[root@sunedu ~]# gpasswd yytu
正在修改 yytu 组的密码
新密码:
请重新输入新密码:
5.5、使用newgrp命令切换基本组身份[了解即可]
//检查账户信息
[root@sunedu ~]# useradd oouu
[root@sunedu ~]# id oouu
uid=5003(oouu) gid=5004(oouu) 组=5004(oouu)
//切换普通用户
[root@sunedu ~]# su - oouu
//创建新文件,并验证权限
[oouu@sunedu ~]$ touch file_oouu
[oouu@sunedu ~]$ ll
总用量 0
-rw-rw-r--. 1 oouu oouu 0 2月 19 01:10 file_oouu
//切换组信息
[oouu@sunedu ~]$ newgrp yytu
密码: #输入组密码
//建立文件,检查权限
[oouu@sunedu ~]$ touch file_test
[oouu@sunedu ~]$ ll
总用量 0
-rw-rw-r--. 1 oouu oouu 0 2月 19 01:10 file_oouu
-rw-r--r--. 1 oouu yytu 0 2月 19 01:14 file_test
6、用户切换身份
Linux系统中,有时候普通用户有些事情是没办法操作,除非是root管理员用户才能做到。这时就需要临时切换到root管理员身份来做事了。那么在学习如何切换用户之前,我们先来了解下用户工作环境。
如何在普通用户的情况下,完成日常工作
- su 切换用户,使用普通用户登录,然后使用su命令切换到root。
优点:简单,方便
缺点:需要知道root密码,不安全,切换到root没有日志审计功能
- sudo 提权,当需要使用root权限时,进行提权,而无需切换至root用户
优点:安全,方便
缺点:复杂
6.1、Shell分类
交互式shell //等待用户输入执行的命令(终端操作,需要不断提示)
非交互式shell //执行shell脚本, 脚本执行结束后shell自动退出
登陆shell //需要输入用户名和密码才能进入shell su - zls
非登陆shell //不需要输入用户和密码就能进入,比如执行sh, bash, su username
//临时设置,永久设置需要写配置文件
[root@sunedu ~]# export PS1='[\h@\u \t]# '
[sunedu@root 01:19:53]#
6.2、bash shell 配置文件
Bash的配置文件保存用户的工作环境
个人配置文件: ~/.bash_profile ~/.bashrc
全局配置文件:/etc/profile /etc/profile.d/*.sh /etc/bashrc
profile类文件, 设定环境变量, 登陆前运行的脚本和命令
bashrc 类文件, 设定本地变量, 定义命令别名
全局配置和个人配置设置冲突, 优先使用个人配置准
6.3、shell配置文件应用顺序
//登录式shell配置文件执行顺序
/etc/profile->/etc/profile.d/*.sh->~/.bash_profile->~/.bashrc->/etc/bashrc
//非登陆式shell配置文件执行顺序
~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh
#验证登陆shell和非登陆shell配置文件执行顺序, 在每个配置文件加入一段 "echo"即可。
#最后通过登陆shell和非登录shell方式登陆linux, 即可验证执行顺序。
扩展登录提示信息
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
.' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
佛祖保佑 永不宕机
// _ooOoo_
// o8888888o
// 88" . "88
// (| -_- |)
// O\ = /O
// ____/`---'\____
// . ' \\| |// `.
// / \\||| : |||// \
// / _||||| -:- |||||- \
// | | \\\ - /// | |
// | \_| ''\---/'' | |
// \ .-\__ `-` ___/-. /
// ___`. .' /--.--\ `. . __
// ."" '< `.___\_<|>_/___.' >'"".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `-. \_ __\ /__ _/ .-` / /
// ======`-.____`-.___\_____/___.-`____.-'======
// `=---='
//
// .............................................
// 佛祖镇楼 BUG辟易
// 佛曰:
// 写字楼里写字间,写字间里程序员;
// 程序人员写程序,又拿程序换酒钱。
// 酒醒只在网上坐,酒醉还来网下眠;
// 酒醉酒醒日复日,网上网下年复年。
// 但愿老死电脑间,不愿鞠躬老板前;
// 奔驰宝马贵者趣,公交自行程序员。
// 别人笑我忒疯癫,我笑自己命太贱;
// 不见满街漂亮妹,哪个归得程序员?
/**
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████ ┃+
* ┃ ┃ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃
* ┃ ┃ + + + +
* ┃ ┃ Code is far away from bug with the animal protecting
* ┃ ┃ + 神兽保佑,代码无bug
* ┃ ┃
* ┃ ┃ +
* ┃ ┗━━━┓ + +
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/
6.4、如果全局配置和个人配置出现冲突, 那么如何验证呢?
编辑全局配置 /etc/profile 新增一行: PS1='[\h@\u \t]#'
编辑个人配置 ~/.bash_profile 新增一行: PS1='[\u@\H]#'
6.5、创建用户,并登录系统
[root@sunedu ~]# useradd sunedu
[root@sunedu ~]# echo "123"|passwd --stdin sunedu
//使用sunedu用户登录当前Linux系统
~ ssh sunedu@192.168.56.111
sunedu@192.168.56.111's password:
[sunedu@sunedu ~]$
//可以使用whoami查看当前登录用户
[sunedu@sunedu ~]$ whoami
Sunedu
6.6、切换用户,使用命令su [-] username
su命令后面跟-代表进入登陆式shell 如果su命令后不加-代表进入非登陆式shell,他们之间的区别在于加载的环境变量不一样。
普通用户su -代表直接切换至root用户身份, 但需要输入root用户密码。
超级管理员root用户使用su - username切换普通用户不需要输入任何密码
[sunedu@sunedu ~]$ pwd
/home/sunedu
//不加 '-' 切换到root账户下时,当前目录没有变化
[sunedu@sunedu ~]$ su
密码:
[root@sunedu sunedu]# pwd
/home/sunedu
[root@sunedu sunedu]# exit
exit
//加 '-'切换到root账户,当前目录为root账户的家目录。
[sunedu@sunedu ~]$ su -
密码:
[root@sunedu ~]# pwd
/root
6.7、以某个用户的身份执行某个服务,使用命令su -c username
[root@sunedu ~]# su - sunedu -c 'ifconfig'
[root@sunedu ~]# su - sunedu -c 'ls ~'
7、用户身份提权
su命令在切换用户身份时,如果每个普通用户都能拿到root用户的密码,当其中某个用户不小心泄漏了root的密码,那系统会变得非常不安全。
为了改进这个问题,从而产生了sudo这个命令。
sudo执行一个仅有root身份才能执行的命令是可以办到的,但是需要输入密码,这个密码并不是root的密码而是用户自己的密码。
默认只有root用户能使用sudo命令,普通用户想要使用sudo需要root预先设定,即使用 visudo命令去编辑相关的配置文件/etc/sudoers
- Centos7提权
[root@sunedu ~]# usermod sunedu -G wheel
//日志审计
[root@sunedu ~]$ sudo tail -f /var/log/secure
- CentOS6提权
#1.系统安装后就有sudo命令,如果没有sudo命令,可通过如下方式安装
[root@sunedu ~]# yum install -y sudo
#2.使用`visudo`命令编辑sudo配置文件, 相当于 vim /etc/sudoers`配置文件
[root@sunedu ~]# visudo #会对配置进行验证
sunedu ALL=(ALL) /bin/rm, /bin/cp #新增
#3.配置选项详解
1.用户名 2.主机名 3.角色名 4.命令名
root ALL= (ALL) ALL
sunedu ALL 使用最高角色执行 /bin/rm, /bin/cp #允许使用sudo执行命令
sunedu ALL=(ALL) NOPASSWD:/bin/cp, /bin/rm //不需要密码使用rm、cp命令
#4.使用visudo -c检查配置文件
[root@sunedu ~]# visudo -c
/etc/sudoers: parsed OK
7.1、普通用户验证sudo权限
#1.切换普通用户
[root@sunedu ~]# su - sunedu
#2.检查普通用户sudo权限明细
[sunedu@sunedu ~]$ sudo -l
...
User sunedu may run the following commands on this host:
(ALL) /bin/rm, (ALL) /bin/cp
#3.普通用户删除opt目录,删除失败
[sunedu@sunedu ~]$ rm -rf /opt/
rm: cannot remove `/opt': Permission denied
#4.使用sudo提权,验证用户权限是否可用,需要输入普通用户的密码
[sunedu@sunedu ~]$ sudo rm -rf /opt
7.2、sudo免密码配置选项
#1.普通用户执行sudo不需要输入密码配置
[root@sunedu ~]# visudo
sunedu ALL=(ALL) /bin/rm, /bin/cp #默认
sunedu ALL=(ALL) NOPASSWD:/bin/rm, /bin/cp #修改后
#2.默认普通用户无权删除
[sunedu@sunedu ~]$ rm -f /root/002
rm: cannot remove `/root/002': Permission denied
#3.验证sudo免密码执行权限
[sunedu@sunedu ~]$ sudo rm -f /root/002
7.3、sudo配置组
//如果每增加一个用户需配置一行sudo,这样设置非常麻烦。所以可以进行如下设置
%sunedu ALL=(ALL) NOPASSWD:/bin/rm, /bin/cp #新增组
//group1这个组的所有用户都拥有sudo的权力。接下来只需要将用户加入该组即可。
//创建用户加入该组
[root@sunedu ~]# groupadd sunedu
[root@sunedu ~]# useradd sunedu1 -g sunedu
[root@sunedu ~]# useradd sunedu2 -g sunedu
//root用户建立目录
[root@sunedu ~]# mkdir /root/sunedu_sudo
//切换用户并删除测试
[root@sunedu ~]# su - sunedu1
[sunedu1@sunedu ~]$ rm -rf /root/sunedu_sudo
rm: cannot remove `/root/sunedu_sudo': Permission denied
//使用sudo
[sunedu1@sunedu ~]$ sudo rm -rf /root/sunedu_sud
当然配置文件/etc/sudoers包含了诸多配置项,可以使用命令man sudoers来获得帮助信息。
下面介绍一个很实用的案例,我们的需求是将Linux服务器设置成如下:
1.仅允许使用普通账户登陆Linux服务器,禁止root直接登录
2.可以让普通用户不输入密码就能sudo su -切换到root账户
//禁止root用户登陆
[root@sunedu ~]# sed -i 's@#PermitRootLogin yes@PermitRootLogin no@g' /etc/ssh/sshd_config
[root@sunedu ~]# systemctl restart sshd
//配置sudo权限
[root@sunedu ~]# visudo
User_Alias USER_SU = sunedu1,sunedu2,sunedu
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 sunedu@192.168.56.11
sunedu@192.168.56.11's password:
Last login: Mon Oct 30 09:28:21 2017 from 192.168.56.2
//使用sudo提权至root用户
[sunedu@sunedu ~]$ sudo su -
[root@sunedu ~]#
7.4、sudo执行流程
1.普通用户执行sudo命令, 会检查/var/db/sudo是否存在时间戳缓存
2.如果存在则不需要输入密码, 否则需要输入用户与密码
3.输入密码会检测是否该用户是否拥有该权限
4.如果有则执行,否则报错退出