04.Linux用户管理
目录04.Linux用户管理1.用户基本概述1.1什么是用户1.2 为什么需要用户1.3 查询用户ID信息1.4 用户相关配置文件1.4.1 passwd文件1.4.2 shadow文件2.用户相关命令2.1 添加用户useradd2.1.1 添加用户示例12.1.2 添加用户示例22.2 修改用户usermod2.2.1 修改用户示例12.2.2 修改用户示例22.3 删除用户userdel2.3.1 删除用户示例12.3.2 删除用户示例22.4 设定密码passwd2.4.1 交互设定密码2.4.2 非交互设定密码2.5 系统创建用户流程2.5.1 /etc/login.defs2.5.2 /etc/default/useradd2.5.3 用户环境变量丢失案例3.用户组基本概述3.1什么是用户组3.2 组有几种类别3.3 组相关配置文件3.3.1 group文件3.3.2 gshadow文件4.用户组相关命令4.1 添加组groupadd4.1.1 添加组示例14.1.2 添加组示例24.2 修改组groupmod4.2.1 修改组示例14.2.2 修改组示例24.3 删除组groupdel4.3.1 删除组示例14.3.2 删除组示例24.4 用户与用户组场景5.普通用户无权限如何提权5.1su命令身份切换5.1.1 Shell登录分类5.1.2 环境变量配置文件5.1.3 su与环境变量的关系5.2 sudo命令提权5.2.1 sudo的由来5.2.2 sudo快速起步5.2.3 sudo权限分配5.2.4 sudo执行流程5.2.5 sudo相关练习
04.Linux用户管理 1.用户基本概述 1.1什么是用户
用户指的是能够正常登录 Linux 或 Windows 系统,比
如:登陆QQ的用户、登陆荣耀的用户、等等
1.2 为什么需要用户 1.系统上的每一个进程(运行的程序),都需要一个特定的用户运行 2.通常在公司是使用普通用户管理服务器,因为root权限过大,容易造成故障 用户有哪些分类 用户UID(UserID) 系统中约定的含义 0 超级管理员,最高权限,有着极强的破坏能力 rm -rf /* 1~200 系统用户,用来运行系统自带的进程,默认已创建 201~999 系统用户,用来运行用户安装的程序,所以此类用户无需登录系统 1000+ 普通用户,正常可以登陆系统的用户,权限比较小,能执行的任务有限 1.3 查询用户ID信息 使用id命令查询当前登录用户的信息
[root@web ~]# id #查看当前所登陆的用户信息 uid=0(root) gid=0(root) groups=0(root) [root@web ~]# id xu #查看其它用户的信息 uid=1000(xu) gid=1000(xu) groups=1000(xu)
1.4 用户相关配置文件 当我们创建一个新的用户,系统会将用户的信息存放在/etc/passwd中,而密码单独存放在/etc/shadow中.这两个文件非常重要,不要轻易删除与修改 1.4.1 passwd文件
/etc/passwd配置文件解释如下图,或者使用命令man 5 passwd获取帮助
1.4.2 shadow文件 /etc/shadow配置文件解释如下图,或者使用命令man 5 shadow获取帮助
2.用户相关命令 2.1 添加用户useradd
若想要添加Linux系统普通用户,可以使用useradd命令,使用root账号登录Linux系统之后就可以添加系统普通用户了
选项 描述 -u 指定要创建用户的UID,不允许冲突 -g 指定要创建用户基本组 -G 指定要创建用户附加组,逗号隔开可添加多个附加组 -d 指定要创建用户家目录 -s 指定要创建用户的bash shell -c 指定要创建用户注释信息 -M 给创建的用户不创建家目录 -r 创建系统账户,默认无家目录 2.1.1 添加用户示例1
创建oldgao用户
用户id为7777 基本组为ops,附加组dev 注释信息new student,登录shell: /bin/bash
[root@web ~]# groupadd ops [root@web ~]# groupadd dev [root@web ~]# useradd -u 7777 -g ops -G dev -c "new student" -s /bin/bash oldgao
2.1.2 添加用户示例2
创建一个mysql系统用户[201~999]
该用户不需要家目录 该用户不需要登录系统
[root@web ~]# useradd -r mysql -M -s /sbin/nologin
2.2 修改用户usermod
若想修改linux系统普通用户,可以使用usermod命令,使用root账号登录linux系统之后就可以修改系统普通用户了
选项 功能描述 -u 指定修改用户的UID -g 指定要修改用户基本组 -G 指定要修改用户附加组,使用逗号隔开多个附加组,覆盖原有的附加组 -d 指定要修改用户家目录 -s 指定要修改用户的bash shell -c 指定要修改用户的注释信息 -l 指定要修改用户的登录名 -L 指定要锁定的用户(x) -U 指定要解锁的用户(x) 2.2.1 修改用户示例1
修改oldgao用户
uid为5008 基本组为network,附加组为 ops,dev,sa 注释信息为student,登录名为new_oldgao
[root@web ~]# groupadd network [root@web ~]# usermod oldgao -c "student" -g network -aG sa -l new_oldgao
2.2.2 修改用户示例2
修改new_oldgao用户
为new_oldgao 配置密码 锁定该用户,然后测试远程连接登录 解锁该用户然后再测试远程连接登录
# 锁定用户 [root@web ~]# echo "123" |passwd --stdin new_oldxu [root@web ~]# usermod -L new_oldxu # 解锁用户 [root@web ~]# usermod -U new_oldxu
2.3 删除用户userdel
若想要删除linux普通用户,可以使用userdel命令,使用root账号登录linux之后就可以删除普通用户了
2.3.1 删除用户示例1
删除 new_oldgao用户
连同家目录一起删除
[root@web ~]# userdel -r new_oldgao
2.3.2 删除用户示例2
批量系统中此前创建过的所有无用的用户
使用awk提取无用的用户名称 使用sed拼接删除用户的命令 调用userdel命令,连同家目录一起全部删除
[root@web ~]# awk -F \':\' \'$3>1000{print $1}\' /etc/passwd |sed -r \'s#(.*)#userdel -r \1#g\'|bash
2.4 设定密码passwd 创建用户后,如需要使用该用户进行远程登录系统则需要为用户设定密码,设定密码使用passwd 1.普通用户只允许变更自己的密码.无法修改其他人密码,并且密码长度必须8位字符 2.管理员用户允许修改任何人的密码,无论密码长度多长或多短 推荐密码保存套件工具,支持 windows、MacOS、
Iphone 以及浏览器插件 Lastpass官方网站 2.4.1 交互设定密码 通过交互方式为用户设定密码
[root@web ~]# passwd #给当前用户修改密 码 [root@web ~]# passwd root #给root用户修改密 码 [root@web ~]# passwd oldxu #给oldxu用户修改密 码,普通用户只能自己修改自己
2.4.2 非交互设定密码 非交互式设定简单密码
[root@web ~]# echo "123" | passwd --stdin oldxu
非交互式设定随机密码
[root@web ~]# yum install -y expect [root@web ~]# echo $(mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4) |tee pass.txt| passwd --stdin oldgao [root@node ~]# cat useradd_new.sh #!/bin/bash for i in mg bob alice do pass=$(mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4) useradd $i echo "$pass" | passwd --stdin $i &>/dev/null echo "User: $i Pass: $pass" echo "User: $i Pass: $pass" >> user_pass.txt done
2.5 系统创建用户流程 系统在创建用户时,会参考如下两个配置文件: /etc/login.defs /etc/dafault/useradd 如果在创建用户时指定了参数则会覆盖系统默认的配置,如果没有指定参数则遵循默认配置建立用户; 2.5.1 /etc/login.defs /etc/login.defs 主要定义了创建用户时UID划分规则,密码加密类型,是否创建家目录等
[root@web ~]# 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
2.5.2 /etc/default/useradd
/etc/default/useradd 主要定义
创建家目录位置 默认用户的Shell类型 默认从哪个位置拷贝环境变量 是否创建用户同名邮箱等
[root@web ~]# 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文件
2.5.3 用户环境变量丢失案例
当我们不小心在当前用户家目录下执行 rm -rf .* 后,
再次登陆系统会发现提示符变成了 -bash-4.1$ ,那是因
为我们删除了当前用户的环境变量造成的现象,通过如
下方式即可恢复;
-bash-4.1$ cp -a /etc/skel/.bash* ./ -bash-4.1$ exit [root@web ~]#
默认 linux 创建用户,会从 /etc/skel 目录中拷贝对
应的环境变量,由 /etc/defaults/useradd 配置文件
定义,所以只需要从该目录中拷贝相应的环境变量文件
即可恢复故障;
3.用户组基本概述 3.1什么是用户组 组是一种逻辑层面的定义 逻辑上将多个用户归纳至一个组,当我们对组操作,其实就相当于对组中的所有用户进行操作 3.2 组有几种类别 对于用户来说,组分为如下几类 默认组:创建用户时不指定组.则默认创建于用户同名的组 基本组:用户有且只能有一个基本组,创建时可通过-g指定 附加组:用户可以有多个附加组,创建时通过-G指定 3.3 组相关配置文件
组账户信息保存在/etc/group 和/etc/gshadow 两个文件中,重点关注grou
3.3.1 group文件 /etc/group 配置文件解释如下图
3.3.2 gshadow文件 /etc/gshadow 配置文件解释如下图
4.用户组相关命令 4.1 添加组groupadd
若想要添加linux用户组,可以使用groupadd命令,使用root账号登录linux系统之后就可以添加用户组了
选项 功能描述 -f 如果组已经存在.会提示成功创建状态. -g 为新组设置GID,若GID已经存在会提示GID已经存在 -r 创建一个系统组 4.1.1 添加组示例1 添加一个salary的组 为组设定gid为10000
[root@web ~]# groupadd salary -g 10000 [root@web ~]# tail -1 /etc/group salary:x:10000:
4.1.2 添加组示例2 添加一个salary_2 的组 添加为系统组
[root@web ~]# groupadd -r salary_2 [root@web ~]# tail -1 /etc/group salary_2:x:988:
4.2 修改组groupmod
若想要修改linux用户组,可以使用groupmod命令,使用root账号登录linux系统之后就可以修改用户组了
选项 功能描述 -f 如果存在,会提示成功创建状态 -g 为新组设置GID,若GID已经存在会提示已经存在 -r 创建一个系统组 -n 改名为新的组 4.2.1 修改组示例1 修改salary用户组组名为system
[root@web ~]# groupmod -n system salary [root@web ~]# tail -1 /etc/group system:x:10000:
4.2.2 修改组示例2 修改system 用户组GID 为5000
[root@web ~]# groupmod system -g 5000 [root@web ~]# tail -1 /etc/group system:x:5000:
4.3 删除组groupdel
若想要修改 Linux 用户组,可以使用 groupdel 命令,
使用 root 账号登录 Linux 系统之后就可以修改用户组
了
4.3.1 删除组示例1 删除salary_2系统用户组
[root@web ~]# groupdel salary_2
4.3.2 删除组示例2 创建tom用户,设置主组为system,然后测试删除system组
[root@web ~]# useradd tom -g system [root@web ~]# groupdel system groupdel: cannot remove the primary group of user \'tom\' # 如果组中存在用户是无法删除该组,必先删除用户后在删 除组 [root@web ~]# userdel -r tom [root@web ~]# groupdel system
4.4 用户与用户组场景 1.创建 dev 与 ops 两个组;
2.创建 bob 用户,设定基本为 dev ,密码为 123 ;
3.创建 alice 用户,设定基本为 ops ,密码为 123 ;
4.创建 /opt/reosurce 文件,【然后修改属组为
ops 、权限为 664 】
5.测试发现 alice 用户可以读写,而 bob 用户仅可
以查看;
6.现在希望 bob 也能够对文件进行读写,如何快速实
现(为 bob 添加 ops 附加组);
1.创建组与用户
[root@web ~]# groupadd dev [root@web ~]# groupadd ops [root@web ~]# useradd bob -g dev [root@web ~]# useradd alice -g ops
2.为用户设定登录密码
[root@web ~]# echo "123" | passwd --stdin bob [root@web ~]# echo "123" | passwd --stdin alice
3.建立文件.然后分配好权限
[root@web ~]# echo "data" > /opt/resource [root@web ~]# chgrp ops /opt/resource # 忽略 [root@web ~]# chmod 664 /opt/resource # 忽略
4.使用ops组的alice用户测试读和写权限.没有任何问题
[alice@web~]$ echo "alice-data" >> /opt/resource [alice@web ~]$ cat /opt/resource data alice-data
5.使用 dev 组的 bob 用户测试读和写权限,发现只有读
权限,没有写权限
[bob@web ~]$ echo "bob-data" >> /opt/resource -bash: /opt/resource: 权限不够 [bob@web ~]$ cat /opt/resource data alice-data
6.为 bob 用户添加 ops 附加组,这样 bob 用户就能借
助 ops 组权限,实现读写操作
[root@web ~]# usermod bob -G ops [root@web ~]# id bob uid=1002(bob) gid=2020(dev) groups=2020(dev),2021(ops)
7.再次测试,发现 bob 用户能借助 ops 组实现读和写操
作
[bob@web ~]$ echo "bob-data" >> /opt/resource [bob@web ~]$ cat /opt/resource data alice-data bob-data
5.普通用户无权限如何提权
往往公司的服务器对外都是禁止 root 用户直接登录,
所以我们通常使用的都是普通用户,那么问题来了?当
我们使用普通用户执行 /sbin 目录下的命令时,会发现
没有权限,这种情况会造成无法正常管理服务器,那如
何才能不使用 root 用户直接登录系统,同时又保证普
通用户能完成日常工作呢?
我们可以使用如下两种方式:su sudo 1.su switch user 身份切换.使用普通用户登录,然后使用su命令切换到root 优点:简单 缺点:需要知道root密码 2.sudo提权,当需要使用root权限时进行提权而无需切换至root用户 优点:安全,方便 缺点:需要预先定义规则.较为复杂 5.1su命令身份切换 在使用su切换身份前.我们需要shell登录分类.环境变量配置文件加载顺序 5.1.1 Shell登录分类 登录 shell 需要输入用户名和密码才能进入 shell 日常接触的最多 非登录 shell 不需要输入用户名和密码就能进入 shell 比如运行 bash 会开启一个新的会话窗口 5.1.2 环境变量配置文件 profile 类文件:设定环境变量.登录前运行的脚本和命令 bashrc 类文件:设定本地变量,定义命令的别名 用户配置文件: ~/.bash_profile ~/.bashrc 全局环境变量: /etc/profile /etc/profile.d/*.sh /etc/bashrc 登录式 shell 配置文件加载顺序: /etc/profile ->/etc/profile.d/*.sh->/.bash_profile->/.bashrc->/etc/bashrc 非登录式 shell 配置文件加载顺序: /.bashrc->/etc/bashrc->/etc/profile.d/*.sh 5.1.3 su与环境变量的关系 su - username 属于登录式 shell su username 属于非登录式 shell 他们最大的区别就在于加载的环境变量不一样
1.普通用使用 su 切换到 root 用户,需要输入 root 超
级管理员密码
[oldxu@web ~]$ su - root 密码: [root@node1 ~]# pwd /root
2.以某个用户的身份执行某个服务,使用命令 su -c
username
[root@web ~]# su - oldxu -c \'ifconfig\' [root@web ~]# su - oldxu -c \'ls ~\'
5.2 sudo命令提权 5.2.1 sudo的由来
u 命令在用户身份切换时,需要拿到 root 管理员密
码;在多人协作时,如果当中某个用户不小心泄露了
root 密码;那系统会变得非常不安全,为了改进这个问
题,从而就有了 sudo ;
其实 sudo 就是给某个普通用户埋下了 浩克hulk 的种
子,当需要执行一些特权操作时,进行发怒,获取最高
权限,但正常情况下还是普通用户,任然会受到系统的
约束以及限制;
5.2.2 sudo快速起步 快速配置 sudo 方式 [先睹为快]
1.将用户加入 whell 组.默认whell 组有 sudo 权限
[root@node1 ~]# usermod oldxu -G wheel
2.切换至普通用户身份
[root@web ~]# su - oldxu
3.普通用户正常情况下无法删除 /opt 目录
[oldxu@web ~]$ rm -rf /opt/ rm: cannot remove `/opt: Permission denied
4.使用 sudo 提权,然后输入普通用户密码,会发现能
正常删除无权限的 /opt 目录;
[oldxu@web ~]$ sudo rm -rf /opt
5.后期可以通过审计日志查看普通用户提权都执行了什
么操作;
[root@web ~]# tail -f /var/log/secure
5.2.3 sudo权限分配
通过快速提权的方式,我们会发现通过 sudo 什么操作都可以执行,能否有办法限制仅开启某个命令的使用权限,其他命令不允许
实现架构图如下:
1.创建用户,并为用户设定对应的密码
[root@www ~]# useradd ops1 [root@www ~]# useradd ops2 [root@www ~]# useradd dev1 [root@www ~]# useradd dev2 [root@www ~]# echo "1" | passwd --stdin ops1 [root@www ~]# echo "1" | passwd --stdin ops2 [root@www ~]# echo "1" | passwd --stdin dev1 [root@www ~]# echo "1" | passwd --stdin dev2
2.在/etc/sudoers 文件中配置规则
[root@web ~]# visudo # 1.使用sudo定义的逻辑分组,这个系统group没关系; User_Alias OPS = ops1,ops2 User_Alias DEV = dev1,dev2 # 2.将相同命令逻辑上划分为一个命令集; 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 # 3.进行权限划分;为OPS/DEV组分配对应的命令集名 称; OPS ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,STORAGE,DELEGA TING,PROCESSES DEV ALL=(ALL) SOFTWARE,PROCESSES
3.然后登陆对应的用户检查相应的 sudo 权限
# 检查ops用户sudo权限 [ops1@web ~]# sudo -l [sudo] password for ops1: User ops1 may run the following commands on web: (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 #检查dev用户sudo权限 [dev1@web ~]# sudo -l [sudo] password for dev1: User dev1 may run the following commands on web: (ALL) /bin/rpm, /usr/bin/yum, /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
5.2.4 sudo执行流程
udo 命令执行流程如下
1)普通用户执行sudo命令时,会检查/var/db/sudo 是否存在时间戳缓存 2).如果存在则不需要输入密码,否则需要用户输入密码 3).输入密码会检测是否该用户是否拥有权限 4).如果有则执行,否则报错退出
5.2.5 sudo相关练习
1.授予 jack 用户能通过 sudo 执行 ls,sed,awk 命令
权限如何书写
jack ALL=(ALL) /bin/ls,/bin/sed,/bin/awk
2.授予 alice 用户, sudo 执行 linux 所有命令并且不
用输入密码如何书写
alice ALL=(ALL) NOPASSWD:ALL
3.授权 oldxu 用户, sudo 执行 passwd 命令修改任何
用户的密码,但唯独不能修改 root 用户的密码;
oldxu ALL=(ALL) /bin/passwd [a-z]*, !/bin/passwd root