Linux用户管理(下)

 

1用户创建流程

1.前面我们学习如何创建、修改、删除用户,接下来了解下用户的创建流程?

1.useradd创建用户时,系统会以/etc/login.defs、/etc/default/useradd 两个配置文件作为参照物,如果在创建用户时指定了参数则会覆盖etc/login.defs、/etc/default/useradd文件默认配置,如未指定则使用默认。

[root@test01 ~]# grep -E -v "^#|^$" /etc/login.defs 
MAIL_DIR        /var/spool/mail         创建邮箱的位置
PASS_MAX_DAYS   99999                   密码最长使用的天数
PASS_MIN_DAYS   0                       密码最短使用的天数
PASS_MIN_LEN    5                       密码长度
PASS_WARN_AGE   7                       密码到期前7天警告
UID_MIN                  1000           用户uid最小值
UID_MAX                 60000           用户uid最大值
SYS_UID_MIN               201           系统uid最小值
SYS_UID_MAX               999           系统uid最大值
GID_MIN                  1000           组id最小值
GID_MAX                 60000           组id最大值
SYS_GID_MIN               201           系统GID最大值
SYS_GID_MAX               999           系统GID最大值
CREATE_HOME yes                         是否创建加目录开关
UMASK           077                     权限位
USERGROUPS_ENAB yes                     创建用户默认组开关
ENCRYPT_METHOD SHA512                   密码加密算法
[root@test01 ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100                   关闭默认创建组开关后,默认分配GID100的组
HOME=/home                  默认家目录
INACTIVE=-1                 用户失效时间,-1永久不失效
EXPIRE=                     过期时间
SHELL=/bin/bash             默认登录shell
SKEL=/etc/skel              默认用户拷贝的环境变量(命令提示符)
CREATE_MAIL_SPOOL=yes       是否开启邮箱开关

ps:在我们创建一个用户时,如果创建时指定了参数,以指定参数为准,如果没有指定参数,那么就以系统中默认的两个配置文件(/etc/login.defs /etc/default/useradd)作为参照.

2、用户组的概念

2.1、什么是用户组?

组的概念:

组就是一个逻辑概念。逻辑上将多个用户捆绑成一个组,当我们操作组的时候就相当于在操作组下的所有用户。

2.2、对于用户来说,组有几种分类?

基本组:创建时指定组,就叫基本组,创建时可通过-g指定,如未指定则创建一个默认的组与用户同名  (只能有1个)
私有组:创建时没有指定组,默认创建与用户同名的组        (只有有1个)
附加组:基本组如果无法满足授权要求,可以将用户加入有权限的附加组,用户顺势继承该组的权限。当然附加组可以(有N多个)
​
    ps:
        1.首先得有组。
        2.在进行加入。

2.3、组的信息存放文件

Linux系统会将用户的信息存放在/etc/passwd,记录了用户的信息,但没有密码信息,密码被存放在/etc/shadow中。也就是说这两个文件非常的重要,不要轻易删除与修改。

1./etc/passwd 配置文件解释如下图,或者man 5 passwd

2./etc/shadow 配置文件解释如下图,或者man 5 shadow PS: 使用change修改密码过期时间示例

img

用户UID 系统中约定的含义
0 超级管理员,最高权限,有着极强的破坏能力
1~200 系统用户,用来运行系统自带的进程,默认已创建
201~999 系统用户,用来运行用户安装的程序,所以此类用户无需登录系统
1000+ 普通用户,正常可以登陆系统的用户,权限比较小,能执行的任务有限

PS:在CentOS7系统之前, UID1-499用于系统用户, 而UID 500+则用于普通用户

2.4、组相关命令(创建修改删除)

用户的创建、变更、删除等涉及到的命令: useradd、usermod、userdel

1.使用groupadd命令新增组,groupadd [-g GID] groupname

#选项
# -u 指定要创建用户的UID,不允许冲突
# -g 指定要创建用户默认组
# -G 指定要创建用户附加组,逗号隔开可添加多个附加组
# -d 指定要创建用户家目录
# -s 指定要创建用户的bash shell
# -c 指定要创建用户注释信息
# -M 给创建的用户不创建家目录
# -r 创建系统账户,默认无家目录
​
#创建基本组, 不指定gid
[root@bgx ~]# groupadd no_gid
[root@bgx ~]# tail -n1 /etc/group
no_gid:x:1000:
​
#创建基本组, 指定gid为5555
[root@bgx ~]# groupadd -g 5555 yes_gid
[root@bgx ~]# tail -n1 /etc/group
yes_gid:x:5555:
​
#创建系统组,gid从201-999
[root@bgx ~]# groupadd -r sys_group
[root@bgx ~]# tail -n1 /etc/group
sys_group:x:990:

2.使用groupmod命令修改组

#选项
# -u 指定要修改用户的UID
# -g 指定要修改用户基本组
# -G 指定要修改用户附加组,使用逗号隔开多个附加组, 覆盖原有的附加组
# -d 指定要修改用户家目录
# -s 指定要修改用户的bash shell
# -c 指定要修改用户注释信息
# -l 指定要修改用户的登陆名
# -L 指定要锁定的用户
# -U 指定要解锁的用户
​
#-g 修改组gid
[root@bgx ~]# groupmod -g 1111 no_gid
[root@bgx ~]# tail -1 /etc/group
no_gid:x:1111:
​
#-n 修改组名称
[root@bgx ~]# groupmod -n active_group yes_gid
[root@bgx ~]# tail -1 /etc/group
active_group:x:5555:

3.groupdel删除组,默认删除私有组。如果要删除基本组,需要先删除基本组中的用户才可以删除该组。

#选项 -r 删除用户同时删除它的家目录
​
[root@oldboy ~]# useradd ttboy -g active_gid
[root@oldboy ~]# useradd ggboy -G active_gid
​
[root@oldboy ~]# grep "active_gid" /etc/group
active_gid:x:12345:ggboy
​
​
[root@oldboy ~]# groupdel active_gid
groupdel:不能移除用户“ttboy”的主组
​
#移除主要的成员,就能删除该组
[root@oldboy ~]# userdel ttboy
[root@oldboy ~]# groupdel active_gid
​
[root@oldboy ~]# id ggboy
uid=6009(ggboy) gid=12346(ggboy) 组=12346(ggboy)
​
#1.删除user1用户,但不删除用户家目录和 mail spool
[root@bgx ~]# userdel user1
​
#2.-r参数可以连同用户家目录一起删除(慎用)
[root@bgx ~]# userdel -r user1
​
注意:删除一个组,必须确保该组的主要成员已经移除该组,就可以正常删除。(附加进来的成员无需考虑在内。)

ps:当然还有很多命令可以查看用户的信息,以下简单列举一些,但都是我们常用,所以了解即可

1) 使用finger命名查询用户信息以及登录信息,示例: finger UserName
2) 使用chfn命令修改用户信息,示例: chfn UserName
3) 使用chsh命令修改用户登录Bash Shell,示例: chsh UserName
4) 使用who、whoami、w检查用户登陆情况

3、用户如何提权

往往公司的服务器对外都是禁止root用户直接登录,所以我们通常使用的都是普通用户,那么问题来了?

当我们使用普通用户执行/sbin目录下的命令时,会发现没有权限运行,这种情况下我们无法正常的管理服务器,那如何才能不使用root用户直接登录系统,同时又保证普通用户能完成日常工作?

PS:我们可以使用如下两种方式: su sudo 1.su切换用户,使用普通用户登录,然后使用su命令切换到root。优点:简单 缺点:需要知道root密码

2.sudo提权,当需要使用root权限时进行提权,而无需切换至root用户,优点:安全、方便缺点:复杂

3.0、shell分类、bash环境变量

在使用su切换前,我们需要了解一些预备知识,比如shell分类、环境变量配置文件有哪些

1.linux shell 主要分为以下几类

交互式shell,等待用户输入执行的命令(终端操作,需要不断提示)
非交互式shell,执行shell脚本,脚本执行结束后shel自动退出
登陆shell,需要输入用户名和密码才能进入Shell,日常接触的最多的一种
非登陆shell,不需要输入用户和密码就能进入Shell,比如运行bash会开启一个新的会话窗口

2.bash shell 配置文件介绍(文件主要保存用户的工作环境)

个人配置文件: ~/.bash_profile  ~/.bashrc  
全局配置文件:/etc/profile /etc/profile.d/*.sh /etc/bashrc 
profile类文件,设定环境变量,登陆前运行的脚本和命令。
bashrc类文件,设定本地变量,定义命令别名
PS:如果全局配置和个人配置产生冲突,以个人配置为准。

3.登陆系统后,环境变量配置文件的应用顺序是?

登陆式shell配置文件执行顺序:/etc/profile->/etc/profile.d/*.sh->/root/.bash_profile->/etc/bashrc
非登录shelll配置文件执行顺序:/root/.bashrc->/etc/bashrc->/etc/profile.d/*.sh

ps:验证使用echo在每行添加一个文件名输出即可

3.1、su身份切换

su - username属于登陆式shell,su username属于非登陆式shell,区别在于加载的环境变量不一样。 普通用户su -可以直接切换至root用户,但需要输入root用户的密码。 超级管理员root用户使用su - username切换普通用户不需要输入任何密码。

#1.普通用户使用su切换root
[root@test01 home]# su kk
[kk@test01 home]$ su
Password:       #输入root密码
[root@test01 home]# pwd
/home
​
#2.普通用户使用su -切换到root,会加载root的环境变量
[kk@test01 home]$ su -
Password: 
Last login: Thu Sep 23 19:13:23 CST 2021 on pts/6
[root@test01 ~]# pwd
/root
​
#3.以某个用户的身份执行某个服务,使用命令su -c username
[root@test01 ~]# su - kk -c 'ls /home'
kk  wyk

3.2、sudo提权

su命令在切换用户身份时,如果每个普通用户都能拿到root用户的密码,当其中某个用户不小心泄漏了root的密码,那系统会变得非常不安全。为了改进这个问题,从而产生了sudo这个命令。

其实sudo就相当于给某个普通用户埋下了浩克(hulk)的种子,当需要执行一些高级操作时,进行发怒,但正常情况下还是普通人,还是会受到限制。

1.如何快速埋下hulk的种子呢?

#1.快速配置sudo方式[先睹为快]wheel组
[root@test01 ~]# usermod kk -G wheel
[root@test01 ~]# id kk
uid=1005(kk) gid=1005(kk) groups=1005(kk),10(wheel)
[root@test01 ~]# gpasswd -d kk wheel   #删除附加组
Removing user kk from group wheel
[root@test01 ~]# id kk
uid=1005(kk) gid=1005(kk) groups=1005(kk)
​
[root@node1 ~]$ sudo tail -f /var/log/secure    #sudo审计日志
​
#2.一般正常配置sudo方式
[root@test01 ~]# #visudo => vim /etc/sudoers
#1.用户名  2.主机名=(角色名)       4.命令名
bgx       ALL=(ALL)         /usr/bin/yum,/usr/sbin/useradd   #允许使用sudo执行命令
oldboy   ALL=(ALL)          NOPASSWD:/bin/cp, /bin/rm   #NOPASSWD不需要使用密码

2.埋下了hulk种子后又如何提权使用呢?

#1.切换普通用户
[root@test01 ~]# su - kk
​
#2.检查普通用户能提权的命令
[root@test01 ~]$ sudo -l
User kk may run the following commands on this host:
    (ALL) ALL
​
#3.普通用户正常情况下是无法删除opt目录的
[root@test01 ~]$ rm -rf /opt/
rm: cannot remove `/opt: Permission denied
​
#4.使用sudo提权,需要输入普通用户的密码。
[root@test01 ~]$ sudo rm -rf /opt

3.提升的权限太大,能否有办法限制仅开启某个命令的使用权限?其他命令不允许?

第一种方式:使用sudo中自带的别名操作,将多个用户定义成一个组,这个组只有sudo认可

qq ww    = ops
kk gg    = dba
​
0.需要真实创建这四个用户
[root@test01 ~]# useradd qq
[root@test01 ~]# useradd ww
[root@test01 ~]# useradd kk
[root@test01 ~]# useradd gg
​
#记得添加密码
[root@test01 ~]# echo "1" | passwd --stdin qq
[root@test01 ~]# echo "1" | passwd --stdin ww
[root@test01 ~]# echo "1" | passwd --stdin kk
[root@test01 ~]# echo "1" | passwd --stdin gg
​
#编辑sudo配置
[root@test01 ~]# visudo 
​
# 1.使用sudo定义分组,这个系统group没什么关系
User_Alias OPS = qq,ww
User_Alias DBA = kk,gg
​
# 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.使用sudo开始分配权限
OPS  ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,STORAGE,DELEGATING,PROCESSES
DBA  ALL=(ALL) SOFTWARE,PROCESSES
​
#4.登陆对应的用户使用 sudo -l 验证权限

方式二:针对系统中真实的组来进行操作

使用groupadd添加组,然后给组分配sudo的权限,如果有新用户加入,直接将用户添加到该组.

oldxu oldqiang  = 运维
oldli oldguo    = dba
​
​
#1.添加两个真实的系统组,  OPS DBA
​
[root@test01 ~]# groupadd OPS
[root@test01 ~]# groupadd DBA
​
#2.添加两个用户,      OPS(qq ww)   DBA(kk gg)
[root@test01 ~]# usermod qq -G OPS
[root@test01 ~]# usermod ww -G OPS
[root@test01 ~]# usermod kk -G DBA
[root@test01 ~]# usermod gg -G DBA
​
#3.记得添加密码
[root@test01 ~]# echo "1" | passwd --stdin qq
[root@test01 ~]# echo "1" | passwd --stdin ww
[root@test01 ~]# echo "1" | passwd --stdin kk
[root@test01 ~]# echo "1" | passwd --stdin gg
​
​
#4.在sudo中配置规则
[root@www ~]# visudo
​
    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 ALL=(ALL) SOFTWARE
    %DBA ALL=(ALL) SOFTWARE,PROCESSES
​
#5.检查sudo是否配置有错
[root@www ~]# visudo -c
/etc/sudoers: parsed OK
​
​
#6.检查qq,和kk的sudo权限
[qq@test01 root]$ sudo -l
User qq may run the following commands on test01:
    (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
​
​
[kk@test01 root]$ sudo -l
User kk may run the following commands on test01:
    (ALL) /bin/rpm, /usr/bin/yum, /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
​

3.3、sudo执行流程

1) 普通用户执行sudo命令时, 会检查/var/db/sudo是否存在时间戳缓存
2) 如果存在则不需要输入密码, 否则需要输入用户与密码
3) 输入密码会检测是否该用户是否拥有该权限
4) 如果有则执行,否则报错退出

案例

当使用useradd创建用户时,创建的用户家目录下会存在 .bash_* 环境变量相关的文件,这些环境变量文件默认从/etc/skel目录中拷贝。这个默认拷贝环境变量位置是由/etc/defaults/useradd配置文件中定义的。

#故障案例,在当前用户家目录执行了rm -rf .*,下次登录系统时出现-bash-4.1$,如何解决!
-bash-4.1$ cp -a /etc/skel/.bash* ./
-bash-4.1$ exit
[root@text01 ~]#   #重新连接即可恢复
posted @ 2021-09-23 21:23  小迷茫c  阅读(80)  评论(0)    收藏  举报