Linux基础08 组的基本管理, 组的增删改, shell的分类, 环境变量的加载顺序, 登录显示动画, 切换用户su -, 用户提权sudo, sudo企业案例, bash退出任务
1.组的基本管理
/etc/group 组的信息
/etc/gshadow 组的密码信息
[root@zls ~]# head -2 /etc/group root:x:0: bin:x:1:bin,daemon // /etc/group由':' 分割, 分割为4个字段,每个字段的具体含义如下: 字段名称 1.组的名称 2.组的密码(存在/etc/gshadow) 3.组GID信息 4.仅显示附加成员,基本成员不显示 [root@zls ~]# head -2 /etc/gshadow root::: bin:::bin,daemon // /etc/gshadow由 ':' 分割, 分割为4个字段,每个字段的具体含义如下: 字段名称 1.组名称 2.组密码 !:没有密码 3.组管理员 4.仅显示附加成员,基本成员不显示 组的分类 1.基本组 2.附加组
创建组,修改组,删除组,组创建密码,切换组身份
#添加组 groupadd -g:指定GID # groupadd zls_e -g 60000 #创建zls_e, gid为60000 #修改组 groupmod -g:修改GID # groupmod zls_e -g 5237 #删除组 groupdel 注意:如果组内有其他成员,则无法删除
删除用户:会把与其同ID的主组也给删了,前提是该组下没有其它用户 #组创建密码(了解即可) gpasswd [root@oldboyedu ~]# gpasswd zls_a Changing the password for group zls_a New Password: 1 Re-enter new password: 1 #切换组的身份(了解即可,没什么用) newgrp (切换用户的组身份后,创建的文件通过ll查看,用户组权限会变为切换的组)
2.shell的分类
1.登录式shell
2.非登录式shell
3.交互式shell
4.非交互式shell
3.环境变量加载顺序
1)登录式shell /etc/profile age=10 /etc/profile.d/*.sh age=11 ~/.bash_profile age=12 ~/.bashrc age=13 /etc/bashrc age=14 2)非登录式shell (像输入bash命令) .bashrc /etc/bashrc /etc/profile.d/*.sh (所有的sh都加载一遍)
如果有需求,所有用户都需要加载的环境变量,和登录式shell 非登录式shell都支持,把环境变量放在:
/etc/bashrc
/etc/profile.d/*.sh
总结:
1.登录式shell,会加载5个地方的环境变量
2.非登录式shell,会加载3个地方的环境变量
2.如果环境变量中配置冲突,最后一个加载的会把之前的冲突的配置覆盖
个人的配置文件 ~/.bashrc ~/.bash_profile 全局 /etc/profile /etc/profile.d*.sh /etc/bashrc
bash退出任务
#因为放在家目录,所以只针对root生效 保存在~/.bash_logout文件中(用户),在退出登录shell时运行
4. 登录显示动画
vim /etc/motd 开机动画,登录界面(可以用来提示文件在哪里) _oo0oo_ 088888880 88" . "88 (| -_- |) 0\ = /0 ___/'---'\___ .' \\\\| |// '. / \\\\||| : |||// \\ /_ ||||| -:- |||||- \\ | | \\\\\\ - /// | | | \_| ''\---/'' |_/ | \ .-\__ '-' __/-. / ___'. .' /--.--\ '. .'___ ."" '< '.___\_<|>_/___.' >' "". | | : '- \'.;'\ _ /';.'/ - ' : | | \ \ '_. \_ __\ /__ _/ .-' / / ====='-.____'.___ \_____/___.-'____.-'===== '=---=' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 佛祖保佑 iii 永不死机
5.切换用户(登录式shell)
su - (加上-登录式shell,不加-非登陆式shell且不会进家目录,最好加上所有环境变量加载一遍) [root@localhost ~]# su - ldc
-c: 不切换用户的情况下,使用其他用户执行命令
[ldc@localhost ~]$ su -root -c 'rm -fr /root/.bashrc' # 会要求输入root密码,用root执行该命令
su: 即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令
#注意不能一直切,会变成套娃,要用exit退出 [root@ubuntu ~]#pstree -p systemd(1)─┬─ModemManager(879)─┬─{ModemManager}(918) │ └─{ModemManager}(926) ... ├─sshd(891)───sshd(1178)───bash(1284)───su(1425)───bash(1426)───su(1432)───bash(1433)───pstree(1446) ├─systemd(1181)───(sd-pam)(1182) #显示当前的bash pid号 [root@ubuntu ~]#echo $BASHPID 1284
su [options...] [-] [user [args...]] #常见选项 -m|-p|--preserve-environment #不重置环境变量 -g|--group group #指定主组,只有root 切普通用户才能指定此参数 -|-l|--login #完全切换 -c|--command command #不切换用户,而是临时使用该用户权限和环境执行命令 --session-command command #使用上同 -c 选项,但不会创建会话 -f|--fast #向shell 传递 -f 选项(csh 或 tcsh) -s|--shell shell #切换用户后,指定新环境的shell环境,必须在 /etc/shells 中存在 -P|--pty #开一个新的终端
切换用户的方式: su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完 全切换 su - UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换 说明:root su至其他用户无须密码;非root用户切换时需要密码 注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很 多的bash子进程,环境可能会混乱。 #直接以另一个用户执行命令,而不切换用户 [root@ubuntu2204 ~]# su - jose jose@ubuntu2204:~$ touch jose-1.txt jose@ubuntu2204:~$ exit logout #三步变一步 [root@ubuntu2204 ~]# su - jose -c "touch jose-2.txt"
6.用户提权(一般企业禁止root用户登录, 其他用户需要提权然后才能sudo)
1. sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系 管理员 2. sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服 务器 3. sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得 了一张存活期为5分钟的票 4. sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它 所存放的位置默认是在/etc/sudoers,属性必须为0440
#主配置文件 /etc/sudo.conf #授权规则配置文件(一般修改这个配置文件) /etc/sudoers /etc/sudoers.d/* (上面配置放不下了,写这里面) 审计文件 /var/db/sudo /var/log/auth.log
1)sudo (-l:查看sudo的权限 # sudo -l 查看当前用户权限)
下方方法为centos7提权方法:
usermod oldboy1 -G wheel # 添加附加组, 该组有sudu权限(oldboy1需要重连,就可使用sudo)
2) visudo 查看编辑用户权限
## Allow root to run any commands anywhere 用户 主机 身份 命令 root ALL=(ALL) ALL zls_a ALL=(ALL) ALL(该用户可以使用所有命令,非root要用sudo) ldc ALL=(ALL) /bin/vim(该用户只能执行vim命令,非root要用sudo) ## Allows people in group wheel to run all commands 允许在这个组里的人执行所有命令 %wheel ALL=(ALL) ALL
#可使用通配符 ? #任意单个字符 * #任意长度字符 [abc] #匹配abc中的一个字符 [!abc] #匹配任意一个除abc之外的字符 \x #转义 [[alpha]] #字母 #user 和 runnas userName #用户名 #uid #用户ID %groupName #组名 %#gid #组ID User_Alias #user别名 Runas_Alias #runas别名 #host ip #ip地址 hostname #主机名 network/netmask #网段/子网掩码 Host_Alias #别名 #command cmmand #具体命令 directory/* #某个目录下所有命令 sudoedit #sudoedit命令,有此命令就可以编辑sudo规则 Cmnd_Alias #命令别名
别名: #类型 User_Alias|Runas_Alias|Host_Alias|Cmnd_Alias #格式 Alias_Type NAME = item1, item2, ... #别名名称由大写字母开始,后面接大写字母,数字,下划线 NAME = [A-Z]([A-Z][0-9]_)* #配置范例 #指定IP或网段的写法,要求在对应主机上也有该配置 jose 10.0.0.158=(root) /bin/ls /root/ jose 10.0.0.0/24=(root) /bin/touch /root/from-jose jose 10.0.0.157=(root) /sbin/shutdown -h now #在10.0.0.158主机上查看配置 [root@ubuntu ~]# sudo -l #查看指定用户 jose@ubuntu:~$ sudo -l -U jose
#指定执行用户(不指定默认root执行,如果sudo配置里不是root权限就无法执行) jose@ubuntu:~$ sudo -u tom ls /home/tom/ sudo配置里可以指定默认切换用户 Defaults:jose runas_default=tom jose ALL=(tom,jerry) ALL jose@ubuntu:~$ sudo -l [sudo] password for jose: ...... ...... User jose may run the following commands on ubuntu: (tom, jerry) ALL #默认sudo 到 tom jose@ubuntu:~$ sudo touch /tmp/from-jose jose@ubuntu:~$ ll /tmp/from-jose -rw-r--r-- 1 tom tom 0 Sep 29 08:39 /tmp/from-jose
visudo修改的文件是/etc/sudoers, 如果有vim权限即可修改用户权限(最好使用visudo命令, 有检查语法错误, 防止同事修改问题)
visudo的一些配置
-c 检查语法
原来: ## These are groups of related commands... ## Networking (网络相关组) # Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool ## Installation and management of software (安装相关组) # Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
下方进行修改: ## Allow root to run any commands anywhere root ALL=(ALL) ALL oldboy1 ALL=(ALL) NOPASSWD: ALL(NOPASSWD: ALL就不用输入密码,否则sudo输完密码过几分钟还要输密码) oldboy1 ALL=STORAGE,SOFTWARE (该用户只能运行STORAGE和SOFTWARE组里的命令)
3)sudo配置免密码
#1.普通用户执行sudo不需要输入密码配置 [root@zls ~]# visudo zls ALL=(ALL) /bin/rm, /bin/cp #默认 zls ALL=(ALL) NOPASSWD:/bin/rm, /bin/cp #修改后,使用rm和cp不用输密码 #2.默认普通用户无权删除 [zls@zls ~]$ rm -f /root/002 rm: cannot remove `/root/002': Permission denied #3.验证sudo免密码执行权限 [zls@zls ~]$ sudo rm -f /root/002
4)sudo配置组
//如果每增加一个用户需配置一行sudo,这样设置非常麻烦。所以可以进行如下设置 %zls ALL=(ALL) NOPASSWD:/bin/rm, /bin/cp #新增组 //group1这个组的所有用户都拥有sudo的权力。接下来只需要将用户加入该组即可。 //创建用户加入该组 [root@zls ~]# groupadd zls [root@zls ~]# useradd zls1 -g zls [root@zls ~]# useradd zls2 -g zls //root用户建立目录 [root@zls ~]# mkdir /root/zls_sudo //切换用户并删除测试 [root@zls ~]# su - zls1 [zls1@zls ~]$ rm -rf /root/zls_sudo rm: cannot remove `/root/zls_sudo': Permission denied //使用sudo [zls1@zls ~]$ sudo rm -rf /root/zls_sudo
sudo配置排除规则
jose ALL=(root) /usr/sbin/,!/usr/sbin/useradd,!/usr/sbin/userdel jose@ubuntu:~$ sudo -l [sudo] password for jose: ...... ...... User jose may run the following commands on ubuntu: (root) /usr/sbin/, !/usr/sbin/useradd, !/usr/sbin/userdel #没有权限执行 jose@ubuntu:~$ sudo useradd user1 Sorry, user jose is not allowed to execute '/sbin/useradd user1' as root on ubuntu.
sudo配置bug
jose ALL=(root) NOPASSWD: /usr/bin/cat /var/log/message* #bug,能打开其它文件 jose@ubuntu:~$ sudo cat /var/log/messages /etc/shadow #解决方案 jose ALL=(root) NOPASSWD: /usr/bin/cat /var/log/syslog*, !/usr/bin/cat /var/log/syslog* *
7.sudo企业案例
1)优化ssh禁止root用户登录(提权,不要给vim,vi,visudo,su,echo,cat) [root@oldboyedu ~]# vim /etc/ssh/sshd_config 修改禁止root用户登录 原来: #PermitRootLogin yes 修改成: PermitRootLogin no 修改ssh的端口 原来: #Port 22 修改成: Port 52013 2)重启ssh服务 (无法ssh登录root,可以su切换root。其他用户可用sudo,但要先提权) [root@oldboyedu ~]# systemctl restart sshd 3)关闭防火墙 [root@oldboyedu ~]# systemctl stop firewalld 4)visudo (sudo配置文件) User_Alias USER_SU = zls1,zls2,zls # 用户别名, 用于多用户的设置(非同一群组用户) Cmnd_Alias SU = /bin/su # 命令别名, 可用于多命令设置 USER_SU ALL=(ALL) NOPASSWD:SU # 编辑多用户权限