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用户
      • 优点:安全,方便
      • 缺点:需要预先定义规则.较为复杂

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

posted @ 2021-07-18 14:29  GaoBeier  阅读(123)  评论(0编辑  收藏  举报