内容目录

用户基本概述

什么是用户

用户指的是能够正常登录linuxwindows系统,比如:登录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获取帮助

file

shadow文件
  • /etc/shadow配置文件解释如下图,或者使用命令man shadow获取帮助

file

用户相关命令

添加用户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
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配置文件解释如下:
    file

    gshadow文件
  • /etc/gshadow配置文件解释如下:
    file

用户组相关命令

添加组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.创建devops两个组
  • 2.创建bob用户,设定基本组为dev,密码为123
  • 3.创建alice用户,设定基本组为ops,密码为123
  • 4.创建/opt/resource文件,然后修改属组为ops、权限为664
  • 5.测试发现alice用户可以读写,而bob用户仅可以查看
  • 6.现在希望bob也能够对文件进行读写,如何快速实现(为bob添加ops附加组)
  1. 创建组与用户

    groupadd dev
    groupadd ops
    useradd bob -g dev
    useradd alice -g ops
  2. 为用户设定登录密码

    echo "123" | passwd --stdin bob
    echo "123" | passwd --stdin alice
  3. 建立文件,然后分配好权限

    echo "data" > /opt/resource
    chgrp ops /opt/resource
    chmod 664 /opt/resource
  4. 使用ops组的alice用户测试读和写权限,没有任何问题

    echo "alice-data" >> /opt/resource
    cat /opt/resource
    data
    alice-data
  5. 使用dev组的bob用户测试读和写权限,发现只有读权限,没有写权限

    echo "bob-data" >> /opt/resource
    -bash: /opt/resource:权限不够
    cat /opt/resource
    data
    alice-data
  6. bob用户添加ops附加组,这样bob用户就能借助ops组权限,实现读写操作

    usermod bob -G ops
    id bob
    uid=1002(bob) gid=2020(dev) groups=2020(dev),2021(ops)
  7. 再次测试,发现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
      1. 优点:简单
      2. 缺点:需要知道root密码
    • sudo提权,当需要使用root权限进行提权,而无需切换至root用户
      1. 优点:安全、方便
      2. 缺点:需要预先定义规则,较为复杂

su命令身份切换

  • 使用su命令可以实现身份的快速切换
    su切换身份
  • su - username切换身份【属于登录式shell
  • su username切换身份【属于非登录式shell
  1. 普通用户使用su切换到root用户,需要输入root超级管理员密码

    [test@wordpress ~]$ su - root
    密码:
    [root@wordpress ~]# pwd
    /root
  2. 以某个用户的身份执行某个服务,使用命令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方式
    1. 将用户加入wheel组,默认wheel组有sudo权限
      usermod xxx -G wheel
  1. 切换到普通用户身份
    su - xxx

  2. 普通用户正常情况下无法删除/opt目录

    rm -rf /opt/
    rm:cannot remove /opt:Permission denied
  3. 使用sudo提权,然后输入普通用户密码,会发现能正常删除无权限的/opt目录
    sudo rm -rf /opt/

  4. 后期可以通过审计日志查看普通用户提权都执行了什么操作
    tail -f /var/log/secure

sudo权限分配
  • 通过快速提权的方式,我们会发现通过sudo什么操作都可以执行,能否有办法限制仅开启某个命令的使用权限,其他命令不允许
  • 实现架构图如下
    • 用户-->组-->命令集
  1. 创建用户,并为用户设定对应的密码

    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
  2. /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
  3. 然后登录对应的用户检查相应的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是否存在时间戳缓存
    • 如果存在则不需要输入密码,否则需要输入用户与密码
    • 输入密码会检测该用户是否有该权限
    • 如果有则执行,否则报错退出

file
sudo不支持系统内置命令

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. 授权blue用户,sudo执行passwd命令修改任何用户的密码,但唯独不能修改root用户的密码
    blue ALL=(ALL) /bin/passwd [a-z]*,!/bin/passwd root

最后修改日期: 2024年9月30日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。