zoukankan      html  css  js  c++  java
  • 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
    
    

    本文来自博客园,作者:GaoBeier,转载请注明原文链接:https://www.cnblogs.com/gao0722/p/15026507.html

  • 相关阅读:
    和为S的连续正数序列
    丑数
    整数中1出现的次数(从1到n整数中1出现的次数)
    数据库常见面试题(非DBA方向)
    两个链表的第一个公共结点
    最小的k个数
    常用的排序
    离散数学(第2版)课后习题答案
    Java入门基础正式汇总
    数学物理方程 课后习题答案 清华大学出版社出版 姜玉山、徐延钦、王晓敏、张庆灵、刘超、李明维版 第2章 课后题答案与解析 复习提纲
  • 原文地址:https://www.cnblogs.com/gao0722/p/15026507.html
Copyright © 2011-2022 走看看