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    #  编辑多用户权限

 

posted @ 2022-01-06 18:31  战斗小人  阅读(119)  评论(0编辑  收藏  举报