04.Linux用户管理
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 两个文件中,重点关注group
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用户
- 优点:安全,方便
- 缺点:需要预先定义规则.较为复杂
- 1.su switch user 身份切换.使用普通用户登录,然后使用su命令切换到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的由来
su 命令在用户身份切换时,需要拿到 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执行流程
-
sudo 命令执行流程如下
- 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
本文来自博客园,作者:GaoBeier,转载请注明原文链接:https://www.cnblogs.com/gao0722/p/15026507.html