day10——用户权限的提升、用户组的创建删除和修改

一.用户密码的设置和修改

1.为用户添加密码 [root才能执行]

1.为新用户添加密码{只能是root} {密码尽可能的复杂}

[root@oldboyedu ~]# passwd zy 
Changing password for user oldxu. 
New password: 
BAD PASSWORD: The password is a palindrome 
Retype new password: passwd: 
all authentication tokens updated 
successfully.

passwd --stdin 非交互式设定密码

[root@oldboyedu ~]# echo "123" | passwd --stdin oldxu 
Changing password for user oldxu. 
passwd: all authentication tokens updated 
successfully.

2.为用户变更密码

为用户变更密码
1).为自己修改密码 (ok) 直接使用passwd 注意密码需要复杂一点,并达到8位
2).为别人修改密码 (root) passwd username

3.密码怎么才算复杂

[root@oldboyedu ~]# echo $RANDOM | md5sum |cut -c 5-15 
9320a6f282d 
```
mkpasswd生成随机字符串, -l设定密码长度,-d数子,-c小写字母,- C大写字母,-s特殊字符 
```
[root@oldboyedu ~]# mkpasswd -l 10 -d 2 -c 3 -C 3 -s 2 
mQR1u^=q5Y

总结:
1.为新用户添加密码 只有root权限才可以
2.为用户变更密码也只有root才可以
3.普通用户只能修改自己的密码,..无法修改其他人的密码
4.密码的修改方式有两种,一种是交互式 非交互式

4.用户的创建流程

在用户创建的过程需要参考 /etc/login.defs 和/etc/default/useradd 这两 个文件,默认参考.
如果在创建用户时指定了参数,则会覆盖 (默认 /etc/login.def和/etc/default/useradd)

[root@oldboyedu ~]# grep "^[a-Z]" /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 从1000开始 
UID_MAX 60000 #uid从6w结束 
SYS_UID_MIN 201 #系统用户的uid 从201 开始
SYS_UID_MAX 999 #系统用户的uid最大到 999 
GID_MIN 1000 
GID_MAX 60000 
SYS_GID_MIN 201 
SYS_GID_MAX 999 
CREATE_HOME yes #给用户创建家目录,创建 在/home 
UMASK 077 
USERGROUPS_ENAB yes 
ENCRYPT_METHOD SHA512 
[root@oldboyedu ~]# cat /etc/default/useradd # useradd defaults file
GROUP=100 #当用户创建用户时不指定组,并且/etc/login.defs中USERGROUPS_ENAB为no时, 用户默认创建给分 配一个gid为100的组. 
HOME=/home #用户默认的家目录 INACTIVE=-1 #用户不失效 
EXPIRE= #过期时间 
SHELL=/bin/bash #默认登录shell 
SKEL=/etc/skel #默认用户拷贝的环境变量 
CREATE_MAIL_SPOOL=yes #创建邮箱

二、用户组的管理

1.什么是用户组?

其实就是一种逻辑层面的定义,逻辑上将多个用户归纳至一个组,当我们对组操作,其实就相当于对组中的所有用户操作。

2.对于用户来说,组有几种类别?

基本组,用户只能有一个基本组,创建时可通过-g指定,如未指定则创建一个默认的组(与用户同名)
附加组,基本组不能满足授权要求,创建附加组,将用户加入该组,用户可以属于多个附加组


image

3.组账户信息保存在/etc/group和/etc/gshadow两个文件中。重点关注group

/etc/group 配置文件解释如下图

image

/etc/gshadow 配置文件解释如下图

image

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

创建基本组, 不指定gid

[root@bgx ~]# groupadd no_gid
[root@bgx ~]# tail -n1 /etc/group
no_gid:x:1000:

创建基本组, 指定gid为5555

[root@oldboyedu ~]# groupadd -g 5555 yes_gid
[root@oldboyedu ~]# tail -n1 /etc/group
yes_gid:x:5555:

创建系统组,gid从201-999

[root@oldboyedu ~]# groupadd -r sys_group
[root@oldboyedu ~]# tail -n1 /etc/group
sys_group:x:990:

2.使用groupmod命令新增组

-g 修改组gid

[root@oldboyedu ~]# groupmod -g 1111 no_gid
[root@oldboyedu ~]# tail -1 /etc/group
no_gid:x:1111:

-n 修改组名称

[root@oldboyedu ~]# groupmod -n active_group yes_gid
[root@oldboyedu ~]# tail -1 /etc/group
active_group:x:5555:

3.groupdel删除组,删除时需要注意,如果用户存在基本组则无法直接删除该组,如果删除用户则会移除默认的私有组,而不会移除基本组。

删除组

[root@oldboyedu ~]# groupdel active_group

删除用户附加组

[root@oldboyedu ~]# id oldboy
uid=1069(oldboy) gid=5005(oldboy) groups=5005(oldboy),5004(oldboy)
[root@oldboyedu ~]# groupdel devops
[root@oldboyedu ~]# id oldboy
uid=1069(oldboy) gid=5005(oldboy) groups=5005(oldboy)

无法删除用户基本组

[root@oldboyedu ~]# groupdel network_sa
groupdel: cannot remove the primary group of user 'bgx_xuliangwei'
只有删除用户或者用户变更基本后,方可删除该组

4.使用gpasswd设置组密码

[root@oldboyedu ~]# groupadd devops
[root@oldboyedu ~]# gpasswd devops
Changing the password for group devops
New Password:
Re-enter new password:

5.使用newgrp命令切换基本组身份

1).检查账户信息

[root@oldboyedu ~]# useradd xuliangwei
[root@oldboyedu ~]# id xuliangwei
uid=1069(oldboy) gid=5005(oldboy) groups=5005(oldboy)

2).切换普通用户

[root@oldboyedu ~]# su - oldboy

3).创建新文件,查看文件的属主和属组

[oldboy@oldboyedu test]# touch file_roots
[oldboy@oldboyedu test]# ll
-rw-rw-r-- 1 oldboy oldboy 0 Jun 13 10:06 file_roots

4).使用newgrp切换到devops组

[root@oldboyedu test]# newgrp devops
Password:

5).创建文件,检查属主和属组

[oldboy@oldboyedu test]# touch abc
[oldboy@oldboyedu test]# ll abc
-rw-r--r--. 1 oldboy oldboy 0 Aug  6 18:55 abc

三.用户如何提权

我们可以使用如下两种方式: su、sudo

1.su切换用户,使用普通用户登录,然后使用su命令切换到root。优点:简单 缺点:需要知道root密码
2.sudo提权,当需要使用root权限时进行提权,而无需切换至root用户,优点:安全、方便 缺点:复杂

1.su身份切换

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

1.Linux Shell主要分为如下几类
交互式shell,等待用户输入执行的命令(终端操作,需要不断提示)
非交互式shell,执行shell脚本, 脚本执行结束后shell自动退出
登陆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->~/.bash_profile->~/.bashrc->/etc/bashrc
非登陆式shell配置文件执行顺序: ~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh
PS: 验证使用echo在每行添加一个输出即可
4.说了这么多预备知识,那这些和su命令切换用户有什么关系?
su - username属于登陆式shell,su username属于非登陆式shell,区别在于加载的环境变量不一样。
普通用户su -可以直接切换至root用户,但需要输入root用户的密码。
超级管理员root用户使用su - username切换普通用户不需要输入任何密码。
1.普通用户使用su切换root
[xuliangwei@node1 ~]$ su
密码:         #输入root的密码
[root@node1 xuliangwei]# pwd
/home/xuliangwei

2.普通用户使用su -切换到root,会加载root的环境变量
[xuliangwei@node1 ~]$ su -
密码:
[root@node1 ~]# pwd
/root

3.以某个用户的身份执行某个服务,使用命令su -c username
[root@bgx ~]# su - xuliangwei -c 'ifconfig'
[root@bgx ~]# su - xuliangwei -c 'ls ~'

2.sudo提权

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

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

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

1.快速配置sudo方式[先睹为快]
[root@node1 ~]# usermod bgx -G wheel
[root@node1 ~]$ sudo tail -f /var/log/secure    #sudo审计日志

2.一般正常配置sudo方式
[root@www ~]# #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@bgx ~]# su - xuliangwei

2.检查普通用户能提权的命令
[xuliangwei@xuliangwei ~]$ sudo -l
User xuliangwei may run the following commands on this host:
    (ALL) ALL

3.普通用户正常情况下是无法删除opt目录的
[xuliangwei@xuliangwei ~]$ rm -rf /opt/
rm: cannot remove `/opt: Permission denied

#4.使用sudo提权,需要输入普通用户的密码。
[xuliangwei@xuliangwei ~]$ sudo rm -rf /opt

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

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

[root@bgx ~]# visudo  #也可以使用vi /etc/sudoers来配置
 1.使用sudo定义分组,这个系统group没什么关系
User_Alias OPS = oldboy,alex
User_Alias DEV = bgx,py
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
DEV  ALL=(ALL) SOFTWARE,PROCESSES
4.登陆对应的用户使用 sudo -l 验证权限

第二种方式:使用groupadd添加组,然后给组分配sudo的权限,如果有新用户加入,直接将用户添加到该组.
1.添加两个真实的系统组,  group_dev group_op
[root@www ~]# groupadd group_dev
[root@www ~]# groupadd group_op
2.添加两个用户,      group_dev(user_a  user_b)   group_op(user_c  user_d)
[root@www ~]# useradd user_a -G group_dev
[root@www ~]# useradd user_b -G group_dev
[root@www ~]# useradd user_c -G group_op
[root@www ~]# useradd user_d -G group_op
3.记得添加密码
[root@www ~]# echo "1" | passwd --stdin user_a
[root@www ~]# echo "1" | passwd --stdin user_b
[root@www ~]# echo "1" | passwd --stdin user_c
[root@www ~]# echo "1" | passwd --stdin user_d
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

    %group_dev ALL=(ALL) SOFTWARE
    %group_op ALL=(ALL) SOFTWARE,PROCESSES
5.检查sudo是否配置有错
[root@www ~]# visudo -c
/etc/sudoers: parsed OK
6.检查user_a,和user_d的sudo权限
[user_a@www.oldboyedu.com ~]$ sudo -l
User user_a may run the following commands on www:
    (ALL) /bin/rpm, /usr/bin/yum

[user_d@www.oldboyedu.com ~]$ sudo -l
User user_d may run the following commands on www:
    (ALL) /bin/rpm, /usr/bin/yum, /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall

4.sudo命令的执行流程:

1) 普通用户执行sudo命令时, 会检查/var/db/sudo是否存在时间戳缓存
2) 如果存在则不需要输入密码, 否则需要输入用户与密码
3) 输入密码会检测是否该用户是否拥有该权限
4) 如果有则执行,否则报错退出
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容