1.如何为用户设定密码,又如何修改密码(root才能执行)
普通用户只允许变更自己的密码,无法修改其他人密码,并且密码长度必须8位字符
管理员用户允许修改任何人的密码,无论密码长度多长或多短。
#①.使用passwd命令修改用户密码
passwd #给当前用户修改密码
passwd root #给root用户修改密码
passwd oldboy #给oldboy用户修改密码,普通用户只能自己修改自己
#②.验证如下几项指标
passwd #root管理员用户登陆,修改root用户密码
passwd xuliangwei #root用户登陆,修改其他用户的密码
$ passwd root #普通用户修改root管理员密码
echo "123" | passwd --stdin xuliangwei #非交互式修改密码
#③.系统内置变量生成随机字符串[root@bgx ~]# echo $RANDOM|md5sum|cut -c 1-10
d09fe9b1xs
[root@bgx ~]# echo $(echo $RANDOM|md5sum |cut -c 5-14) |tee pass.txt| passwd --stdin xuliangwei
#④.mkpasswd生成随机字符串, -l设定密码长度,-d数子,-c小写字母,-C大写字母,-s特殊字符
[root@bgx ~]# yum install -y expect //需要安装扩展包
[root@bgx ~]# mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4
|K&13bR)i/
2.用户的创建流程
①.useradd创建用户时,系统会以/etc/login.defs、/etc/defaults/useradd两个配置文件作为参照物,如果在创建用户时指定了参数则会覆盖/etc/login.defs、/etc/defaults/useradd文件默认配置,如未指定则使用默认。
[root@bgx ~]# 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 1000开始
UID_MAX 60000 60000结束
SYS_UID_MIN 201 系统用户的udi 201开始
SYS_UID_MAX 999 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
[root@bgx ~]# 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文件。
3.用户组如何管理
①.什么是用户组?其实就是一种逻辑层面的定义,逻辑上将多个用户归纳至一个组,当我们对组操作,其实就相当于对组中的所有用户操作
②.对于用户来说,组有几种类别?基本组,用户只能有一个基本组,创建时可通过-g指定,如未指定则创建一个默认的组(与用户同名)附加组,基本组不能满足授权要求,创建附加组,将用户加入该组,用户可以属于多个附加组
3.那组的信息保存在哪呢?组账户信息保存在/etc/group和/etc/gshadow两个文件中。重点关注group
1./etc/group 配置文件解释如下图
2./etc/gshadow 配置文件解释如下图
使用groupadd命令新增组,groupadd [-g GID] groupname
#创建基本组, 不指定gid
groupadd no_gid
检查tail -n1 /etc/group
#创建基本组, 指定gid为5555
groupadd -g 5555 yes_gid
检查tail -n1 /etc/group
#创建系统组,gid从201-999
groupadd -r sys_group
检查ail -n1 /etc/group
使用groupmod命令新增组
#-g 修改组gid groupmod -g 1111 no_gid
检查 tail -1 /etc/group
#-n 修改组名称
groupmod -n active_group yes_gid
检查 tail -1 /etc/group
groupdel删除组,删除时需要注意,如果用户存在基本组则无法直接删除该组,如果删除用户则会移除默认的私有组,而不会移除基本组。
#删除组 groupdel active_group
#删除用户附加组 id xuliangwei
uid=1069(xuliangwei) gid=5005(xuliangwei) groups=5005(xuliangwei),5004(devops)groupdel devops
id xuliangweiu
id=1069(xuliangwei) gid=5005(xuliangwei) groups=5005(xuliangwei)
#无法删除用户基本组
groupdel network_sa
groupdel: cannot remove the primary group of user 'bgx_xuliangwei'
#只有删除用户或者用户变更基本后,方可删除该组
4.普通用户无权限怎么办?切换身份or提权?
1.su切换用户,使用普通用户登录,然后使用su命令切换到root。优点:简单 缺点:需要知道root密码
2.sudo提权,当需要使用root权限时进行提权,而无需切换至root用户,优点:安全、方便 缺点:复杂
1.Linux Shell主要分为如下几类
交互式shell,需要不停地交互
非交互式shell,执行shell脚本, 脚本执行结束后shell自动退出
登陆shell,需要用户名和密码才能进入Shell
su -username
非登陆shell,不需要用户和密码就能进入Shell,比如运行bash会开启一个新的会话窗口
su username
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/*.shPS: 验证使用echo在每行添加一个输出即可
4.说了这么多预备知识,那这些和su命令切换用户有什么关系?
su - username属于登陆式shell,su username属于非登陆式shell,区别在于加载的环境变量不一样。
普通用户su -可以直接切换至root用户,但需要输入root用户的密码。
超级管理员root用户使用su - username切换普通用户不需要输入任何密码。
2.sudo提权su命令在切换用户身份时,如果每个普通用户都能拿到root用户的密码,当其中某个用户不小心泄漏了root的密码,那系统会变得非常不安全。为了改进这个问题,从而产生了sudo这个命令。
其实sudo就相当于给某个普通用户埋下了浩克(hulk)的种子,当需要执行一些高级操作时,进行发怒,但正常情况下还是普通人,还是会受到限制。
①埋下hulk的种子
1.快速配置sudo方式[先睹为快]
usermod bgx -G wheelsudo tail -f /var/log/secure #sudo审计日志
#2.一般正常配置sudo方式
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不需要使用密码
②提权使用
#1.切换普通用户 su - xuliangwei
#2.检查普通用户能提权的命令 sudo -lUser xuliangwei may run the following commands on this host: (ALL) ALL
#3.普通用户正常情况下是无法删除opt目录的 rm -rf /opt/rm: cannot remove `/opt: Permission denied
#4.使用sudo提权,需要输入普通用户的密码。 sudo rm -rf /opt
③.提升的权限太大,能否有办法限制仅开启某个命令的使用权限?其他命令不允许?
第一种方式:使用sudo中自带的别名操作,将多个用户定义成一个组,这个组只有sudo认可
visudo #也可以使用vi /etc/sudoers来配置
①.使用sudo定义分组,这个系统group没什么关系
User_Alias OPS = oldboy,alex
User_Alias DEV = bgx,py
②.定义可执行的命令组,便于后续调用
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
③.使用sudo开始分配权限
OPS ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,STORAGE,DELEGATING,PROCESSESDEV ALL=(ALL) SOFTWARE,PROCESSES
#④.登陆对应的用户使用 sudo -l 验证权限
第二种方式:使用groupadd添加组,然后给组分配sudo的权限,如果有新用户加入,直接将用户添加到该组.
#①.添加两个真实的系统组, group_dev group_op
groupadd group_dev
groupadd group_op
#②.添加两个用户, group_dev(user_a user_b) group_op(user_c user_d)
useradd user_a -G group_dev
useradd user_b -G group_dev
useradd user_c -G group_op
useradd user_d -G group_op
#③.记得添加密码
echo "1" | passwd --stdin user_a
echo "1" | passwd --stdin user_b
echo "1" | passwd --stdin user_c
echo "1" | passwd --stdin user_d
#④.在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
#⑤.检查sudo是否配置有错
[root@www ~]# visudo -c
#⑥.检查user_a,和user_d的sudo权限
sudo -l
*4.sudo命令的执行流程:
1) 普通用户执行sudo命令时, 会检查/var/db/sudo是否存在时间戳缓存
2) 如果存在则不需要输入密码, 否则需要输入用户与密码
3) 输入密码会检测是否该用户是否拥有该权限
4) 如果有则执行,否则报错退出