用户基本概述
什么是用户
用户指的是能够正常登录linux
或windows
系统,比如:登录QQ
的用户、登录华为的用户等等
为什么需要用户
- 系统上的每一个进程(运行的程序),都需要一个特定的用户运行
- 通常在公司是使用普通用户管理服务器,因为
root
权限过大,容易造成故障
用户有哪些分类
- 系统对用户有一个约定
用户UID | |
---|---|
0 | 超级管理员,最高权限,有着极强的破坏能力 |
1~200 | 系统用户,用来运行系统自带的进程,默认已创建 |
201~999 | 系统用户,用来运行用户安装的进程,所以此类用户无需登录系统 |
1000+ | 普通用户,正常可以登录系统的用户,权限比较小,能执行的任务有限 |
查询用户ID信息
- 使用
id
命令查询当前登录用户的信息
# id # 查看当前所登录的用户信息
uid=0(root) gid=0(root) 组=0(root)
# id www # 查看其他用户的信息
uid=666(www) gid=666(www) 组=666(www)
用户相关配置环境
- 当我们创建一个新的用户,系统会将用户的信息存放在
/etc/passwd
中,而密码单独存储在/etc/shadow
中,也就是说这两个文件非常的重要,不要轻易删除与修改
passwd文件
/etc/passwd
配置文件解释如下图,或者使用命令man passwd
获取帮助
shadow文件
/etc/shadow
配置文件解释如下图,或者使用命令man shadow
获取帮助
用户相关命令
添加用户useradd
若想要添加linux
系统普通用户,可以使用useradd
命令,使用root
账户登录linux
之后就可以添加系统普通用户了
选项 | 功能描述 |
---|---|
-u | 指定要创建用户的UID,不允许冲突 |
-g | 指定要创建用户基本组 |
-G | 指定要创建用户附加组,逗号隔开可添加多个附加组 |
-d | 指定要创建用户家目录 |
-s | 指定要创建用户的bash shell |
-c | 指定要创建用户的注释信息 |
-M | 给创建的用户不创建家目录 |
-r | 创建系统账户,默认无家目录 |
添加用户示例1
- 创建
blue
用户- 用户ID为
6969
- 基本组为
ops
,附加组dev
- 注释信息
2000 new student
,登录shell:/bin/bash
- 用户ID为
groupadd ops
groupadd dev
useradd -u 6969 -g ops -G dev -c "2000 new student" -s /bin/bash/ bule
添加用户示例2
- 创建一个
mysql
系统用户- 该用户不需要家目录
- 该用户不需要登录系统
useradd -r mysql -M -s /sbin/nologin
修改用户usermod
若要修改linux
系统普通用户,可以使用usermod
命令,使用root
账号登录linux
系统之后就可以修改系统普通用户了。
选项 | 功能描述 |
---|---|
-u | 指定要修改用户的UID |
-g | 指定要修改用户基本组 |
-G | 指定要修改用户附加组,逗号隔开可添加多个附加组,覆盖原有的附加组 |
-d | 指定要修改用户家目录 |
-s | 指定要修改用户的bash shell |
-c | 指定要修改用户的注释信息 |
-l | 指定要修改用户的登录名 |
-L | 指定要锁定的用户 |
-U | 指定要解锁的用户 |
修改用户示例1
- 修改
blue
用户uid
为5008,- 基本组为
network
,附加组为ops,dev,sa
- 注释信息为
student
,登录名称为new_bule
groupadd network
usermod blue -c "student" -g network -G ops,dev,sa -l new_bule
修改用户示例2
- 修改
new_blue
用户- 为
new_blue
配置密码 - 锁定该用户,然后测试远程连接登录
- 解锁该用户然后再次测试远程连接登录
awk -F : '$3>=1000 {print $1}' /etc/passwd | sed -r 's#(.*)#userdel -r \1#g' | bash
- 为
echo "123" | passwd --stdin new_blue
usermod -L new_blue
usermod -U new_blue
删除用户userdel
若想要删除linux
系统普通用户,可以使用userdel
命令,使用root
账号登录linux
系统之后就可以删除系统普通用户了
删除用户示例1
- 删除
new_bule
用户- 连同家目录一起删除
userdel -r new_blue
删除用户示例2
- 批量删除系统中此前创建过的所有无用的用户
- 使用
awk
提取无用的用户名称 - 使用
sed
拼接删除用户的命令 - 调用
userdel
命令,连同家目录一起全部删除
- 使用
awk -F : '$3>=1000 {print $1}' /etc/passwd | sed 's/^/userdel -r /' | bash
设定密码passwd
- 创建用户后,如需要使用该用户进行远程登录系统则需要为用户设定密码,设定密码使用
passwd
- 普通用户只允许变更自己的密码,无法修改其他人密码,并且密码长度必须8位字符
- 管理员用户允许修改任何人的密码,无论密码长度多长或多短
- 注意:为普通用户设定密码,普通用户才可以正常登录系统
- 普通用户不可以变更系统的状态;(权限不够)
- 如果将软件|系统的权限分配给该普通用户,普通用户才可以变更相应配置状态
交互设定密码
- 通过交互方式为用户设定密码
password # 给当前用户修改密码
passwd root # 给root用户修改密码
passwd blue # 给blue用户修改密码,普通用户只能修改自己的
非交互设定密码
- 非交互设定简单密码
echo "123" | passwd --stdin root
- 非交互式设定随机密码
yum install expect
echo $(mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4) | tee pass.txt | passwd --stdin blue
系统创建用户流程
- 系统在创建用户时,会参考如下两个配置文件
/etc/login.defs
/etc/default/useradd
- 如果在创建用户时指定了参数则会覆盖系统默认的配置,如果没有指定参数则遵循默认配置建立用户
/etc/login.defs
/etc/login.defs
主要定义了创建用户时UID
划分规则,密码加密类型,是否创建家目录等
grep -Ev "^#|^$" /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
/etc/default/useradd
主要定义- 创建家目录位置
- 默认用户的
shell
类型 - 默认从哪个位置拷贝环境变量
- 是否创建用户同名邮箱等
cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home # 把用户的家目录建在/home
INACTIVE=-1 # 是否启用账号过期停权,-1表示不启用
EXPIRE= # 账号终止日期,不设置表示不启用
SHELL=/bin/bash # 新用户默认所用的shell类型
SKEL=/etc/skel # 配置新用户家目录的默认文件存放路径
CREATE_MAIL_SPOOL=yes # 创建mail文件
用户环境变量丢失案例
当我们不小心在当前用户家目录下执行rm -rf .*
后,再次登录系统会发现提示符变成了-bash-4.1$
,那是因为我们删除了当前用户的环境变量造成的现象,通过如下方式则可恢复
-bash-4.1$ cp -a /etc/skel/.bash* ./
-bash-4.1$ exit
默认linux
创建用户,会从/etc/skel
目录中拷贝对应的环境变量,由/etc/default/useradd
配置文件定义,所以只需从该目录中拷贝相应的环境变量文件即可恢复故障
用户组基本概述
什么是用户组
- 组是一种逻辑层面的定义
- 逻辑上将多个用户归纳至一个组,当我们对组操作,其实就相当于对组中的所有用户进行操作
组有几种类别
- 对于用户来说,组分为如下几类
- 默认组:创建用户不指定组,则默认创建与用户同名的组
- 基本组:用户有且只能有一个基本组,创建时可通过
-g
指定(亲爹) - 附加组:用户可以有多个附加组,创建时通过
-G
指定(干爹)
group文件
/etc/group
配置文件解释如下:
gshadow文件
/etc/gshadow
配置文件解释如下:
用户组相关命令
添加组groupadd
若想要添加linux
用户组,可以使用groupadd
命令,使用root
账号登录linux
系统之后就可以添加用户组了
选项 | 功能描述 |
---|---|
-f | 如果组已经存在,会提示成功创建的状态 |
-g | 为新组设置GID,若GID已经存在会提示GID已经存在 |
-r | 创建一个系统组 |
添加组示例1
- 添加一个
salary
的组- 为组设定
gid
为10000
- 为组设定
groupadd salary -g 10000
tail -1 /etc/group
salary:x:10000:
添加组示例2
- 添加一个
salary_2
的组- 添加为系统组
groupadd -r salary_2
tail -1 /etc/group
salary_2:x:988:
修改组groupmod
若想要修改linux
用户组,可以使用groupmod
命令,使用root
账号登录linux
系统之后就可以修改用户组了
选项 | 功能描述 |
---|---|
-f | 如果组已经存在,会提示成功创建的状态 |
-g | 为新组设置GID,若GID已经存在会提示GID已经存在 |
-r | 创建一个系统组 |
-n | 改名为新的组 |
修改组示例1
- 修改
salary
用户组组名为system
groupmod -n system salary
tail -1 /etc/group
system:x:10000:
修改组示例2
- 修改
system
用户组GID
为5000
groupmod system -g 5000
tail -1 /etc/group
system:x:5000:
删除组groupdel
若想要删除linux
用户组,可以使用groupdel
命令,使用root
账号登录linux
系统之后就可以删除用户组了
删除组示例1
- 删除
salary_2
系统用户组
groupdel salary_2
删除组示例2
- 创建
tom
用户,设置基本组为system
,然后测试删除system
组
useradd tom -g system
groupdel system
groudel:cannot remove the primary group of user 'tom'
# 如果组中存在用户是无法删除该组的,必须先删除用户后再删除组
userdel -r tom # -r选项表示在删除用户的同时删除用户的家目录。
groupdel system
用户与用户组场景
- 1.创建
dev
与ops
两个组 - 2.创建
bob
用户,设定基本组为dev
,密码为123 - 3.创建
alice
用户,设定基本组为ops
,密码为123 - 4.创建
/opt/resource
文件,然后修改属组为ops
、权限为664 - 5.测试发现
alice
用户可以读写,而bob
用户仅可以查看 - 6.现在希望
bob
也能够对文件进行读写,如何快速实现(为bob
添加ops
附加组)
-
创建组与用户
groupadd dev groupadd ops useradd bob -g dev useradd alice -g ops
-
为用户设定登录密码
echo "123" | passwd --stdin bob echo "123" | passwd --stdin alice
-
建立文件,然后分配好权限
echo "data" > /opt/resource chgrp ops /opt/resource chmod 664 /opt/resource
-
使用
ops
组的alice
用户测试读和写权限,没有任何问题echo "alice-data" >> /opt/resource cat /opt/resource data alice-data
-
使用
dev
组的bob
用户测试读和写权限,发现只有读权限,没有写权限echo "bob-data" >> /opt/resource -bash: /opt/resource:权限不够 cat /opt/resource data alice-data
-
为
bob
用户添加ops
附加组,这样bob
用户就能借助ops
组权限,实现读写操作usermod bob -G ops id bob uid=1002(bob) gid=2020(dev) groups=2020(dev),2021(ops)
-
再次测试,发现
bob
用户能借助ops
组实现读和写操作echo "bob-data" >> /opt/resource cat /opt/resource data alice-data bob-data
普通用户无权限如何提权
往往公司的服务器对外都是禁止root
用户直接登录,所有我们通常使用的都是普通用户,那么问题来了,当我们使用普通用户执行/sbin
目录下的命令时,会发现没有权限,这种情况会造成无法正常管理服务器,那如何才能不使用root
用户直接登录系统,同时又保证普通用户能完成日常工作呢?
- 我们可以使用如下两种方式:
su、sudo
su switch user
身份切换,使用普通用户登录,然后使用su
命令切换到root
- 优点:简单
- 缺点:需要知道
root
密码
sudo
提权,当需要使用root
权限进行提权,而无需切换至root
用户- 优点:安全、方便
- 缺点:需要预先定义规则,较为复杂
su命令身份切换
- 使用
su
命令可以实现身份的快速切换
su切换身份
su - username
切换身份【属于登录式shell
】su username
切换身份【属于非登录式shell
】
-
普通用户使用
su
切换到root
用户,需要输入root
超级管理员密码[test@wordpress ~]$ su - root 密码: [root@wordpress ~]# pwd /root
-
以某个用户的身份执行某个服务,使用命令
su -c username
[root@wordpress ~]# su - test -c 'ls ~ -a' . .. .bash_history .bash_logout .bash_profile .bashrc
Shell登录分类
- 登录
shell
:需要输入用户名和密码才能进入 - 非登录
shell
:不需要输入用户名和密码就能进入shell
,比如运行bash
会开启一个新的会话 - 登录式
shell
与非登录式shell
,它们最大的区别就在于加载的环境变量不一样- 登录式
shell
配置文件加载顺序:/etc/profile->/etc/profile.d/*.sh->~/.bash_profile->~/.bashrc->/etc/bashrc
- 非登录式
shell
配置文件加载顺序:/.bashrc->/etc/bashrc->/etc/profile.d/*.sh
- 登录式
环境变量配置文件
profile
类文件:设定环境变量,登录前运行的脚本和命令bashrc
类文件:设定本地变量,定义命令别名- 用户配置文件:
~/.bash_profile
~/.bashrc
- 全局环境变量:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
sudo命令提权
sudo的由来
su
命令在用户身份切换时,需要拿到root
管理员密码,在多人协作时,如果当中某个用户不小心泄露了root
密码,那系统会变得非常不安全,为了改进这个问题,从而就有了sudo
其实sudo
就是给某个普通用户埋下了浩克hulk
的种子,当需要执行一些特权操作时,进行发怒,获取最高权限,但正常情况下还是普通用户,仍然会收到系统的约束以及限制
sudo快速起步
- 快速配置
sudo
方式- 将用户加入
wheel
组,默认wheel
组有sudo
权限
usermod xxx -G wheel
- 将用户加入
-
切换到普通用户身份
su - xxx
-
普通用户正常情况下无法删除
/opt
目录rm -rf /opt/ rm:cannot remove /opt:Permission denied
-
使用
sudo
提权,然后输入普通用户密码,会发现能正常删除无权限的/opt
目录
sudo rm -rf /opt/
-
后期可以通过审计日志查看普通用户提权都执行了什么操作
tail -f /var/log/secure
sudo权限分配
- 通过快速提权的方式,我们会发现通过
sudo
什么操作都可以执行,能否有办法限制仅开启某个命令的使用权限,其他命令不允许 - 实现架构图如下
- 用户-->组-->命令集
-
创建用户,并为用户设定对应的密码
useradd ops1 useradd ops2 useradd dev1 useradd dev2 echo "1" | passwd --stdin ops1 echo "2" | passwd --stdin ops2 echo "1" | passwd --stdin dev1 echo "1" | passwd --stdin dev2
-
在
/etc/sudoers
文件中配置规则visudo # vim /etc/sudoers # 使用sudo定义的逻辑分组,则个和系统group没关系 User_Alias OPS = ops1,ops2 User_Alias DEV = dev1,dev2 # 将相同命令逻辑上划分为一个命令集 Cmnd_Alias NETWORKING = /sbin/ifconfig,/bin/ping Cmnd_Alias SOFTWARE = /bin/rpm,/usr/bin/yum Cmnd_Alias SERVICES = /sbin/service,/usr/bin/systemctl start Cmnd_Alias STORAGE = /bin/mount,/bin/umount Cmnd_Alias DELEGATING = /bin/chown,/bin/chmod,/bin/chgrp Cmnd_Alias PROCESSES = /bin/nice,/bin/kill,/usr/bin/kill,/usr/bin/killall # 进行权限划分,为OPS/DEV组分配对应的命令集名称 OPS ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,STORAGE,DELEGATING,PROCESSES DEV ALL=(ALL) SOFTWARE,PROCESSES
-
然后登录对应的用户检查相应的
sudo
权限# 检查ops1用户sudo权限 sudo -l password for osp1: user ops1 may run the following commands on wordpress: (ALL) /sbin/ifconfig,/bin/ping,/bin/rpm,/usr/bin/yum,/sbin/service,/usr/bin/systemctl start,/bin/mount,/bin/umount,/bin/chown,/bin/chmod,/bin/chgrp,/bin/nice,/bin/kill,/usr/bin/kill,/usr/bin/killall
sudo执行流程
sudo
命令执行流程如下- 普通用户执行
sudo
命令时,会检查/var/db/sudo
是否存在时间戳缓存 - 如果存在则不需要输入密码,否则需要输入用户与密码
- 输入密码会检测该用户是否有该权限
- 如果有则执行,否则报错退出
- 普通用户执行
sudo
不支持系统内置命令
sudo相关练习
-
授予
jack
用户能通过sudo
执行ls,sed,awk
命令权限
jack All=(ALL) /bin/ls,/bin/sed,/bin/awk
-
授予
alice
用户sudo
执行linux
所有命令并且不用输入密码
alice ALL=(ALL) NOPASSWD:ALL
-
授权
blue
用户,sudo
执行passwd
命令修改任何用户的密码,但唯独不能修改root
用户的密码
blue ALL=(ALL) /bin/passwd [a-z]*,!/bin/passwd root
留言