欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sudo-为普通用户提权

程序员文章站 2022-07-09 21:42:19
...

目录

sudo简介

Sudosubstitute user [或 superuser]do)是linux系统管理指令,允许系统管理员委派授权给某些用户(或用户组)以root用户或其他用户身份运行某些(或全部)命令的能力,同时提供命令及其参数的审计跟踪。

官网:https://www.sudo.ws

sudo特性

  • sudo能够授权指定用户在指定主机上运行某些命令。 如果未授权用户尝试使用 sudo,会提示联系管理员。
  • sudo可以提供日志,记录每个用户使用sudo操作。
  • sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机。
  • sudo使用时间戳文件来完成类似“检票”的系统,默认存活期为5分钟的“入场券” 。

相关文件

配置文件: /etc/sudoers,/etc/sudoers.d/ 可以修改/etc/sudoers也可以在/etc/sudoers.d/目录下新建配置文件

时间戳文件:/var/db/sudo

日志文件:/var/log/secure

配置文件

配置支持使用通配符glob
  • :任意单一字符
  • *:匹配任意长度字符
    • [wxc]:匹配其中一个字符
    • [!wxc]:除了这三个字符的其他字符
  • x:转义
    • [[alpha]]:字母:示例:/bin/ls [[alpha]]*
配置文件规则:
  1. 别名定义:不是必须的除了
  2. 授权规则:必须的
授权规则格式:
  • user host=(runas) command

用户 登入主机=(代表用户) 命令

示例:root ALL=(ALL) ALL

  • 格式说明:

    • user:运行命令者的身份
    • username:用户名
    • #uid:用户UID
    • %group_name:组名
    • %#gid:用户组GID
    • User_Alias:用户别名

    用户别名:格式User_Alias USER=用户1,用户2...。例:User_Alias DBA=haiyun,wang;其中DBA是别名,haiyun,wang是别名内的用户。注:别名必须为大写。

  • host:通过哪些主机

    • iphostnameIP或者主机名
    • network(/netmask):网段
    • Host_Alias:主机别名

    主机别名:格式Host_Alias HOST=主机1,主机2...。例:Host_Alias HOST=192.168.8.10,192.168.8.100。其中:HOST是别名,192.168.8.10,192.168.8.100是别名中的IP。注:别名必须大写。

  • (runas):以哪个用户的身份
    • username:用户名
  • #uid:用户UID
  • %group_name:组名
  • %#gid:用户组GID
  • Runas_Alias:用户别名

    用户别名:格式Runas_Alias USER=用户1,用户2...。用法同User_Alias。注:别名必须大写。

  • command:运行哪些命令
    • command name:命令名称,注:写绝对路径
    • directory:目录下的命令
    • sudoedit:有编辑sudoers文件的权限,授权的用户可以自定义权限
    • Cmnd_Alias:命令别名
      命令别名:格式Cmnd_Alias CMD=命令1,命令2...。例:Cmnd_Alias CMD=/bin/cat,/bin/mount。其中,CMD为别名,/bin/cat,/bin/mount为别名中的命令。注:别名必须大写。

      命令执行不需要密码,在Commands前可以加NOPASSWD:CMD例如:haiyun ALL=(ALL) NOPASSWD: ALL。代表haiyun用户可以执行所有命令,且不需要密码。注:这只是一个例子,并不建议这么做。
  • 范例

    范例1:使用户haiyun能够有权限挂载/dev/sr0/mnt/cdrom目录下
    [root@A ~]# vi /etc/sudoers            #修改文件/etc/sudoers
    root    ALL=(ALL)   ALL             #在此行后面添加,下面内容。注:命令要写绝对路径
    haiyun ALL=(ALL) /bin/mount /dev/sr0 /mnt/cdrom
    [root@A ~]# su - haiyun                # 切换到haiyun用户
    [haiyun@A ~]$ sudo /bin/mount /dev/sr0 /mnt/cdrom # 使用sudo执行挂载命令
    [sudo] password for haiyun:                 # 输入用户haiyun的密码
    mount: block device /dev/sr0 is write-protected, mounting read-only     #挂载成功
    [haiyun@A ~]$ df /dev/sr0         #确认挂载成功
    Filesystem     1K-blocks    Used Available Use% Mounted on
    /dev/sr0         3878870 3878870         0 100% /mnt/cdrom
    范例2:使用户haiyun能够有权限编辑/etc/sudoers文件
    [root@A ~]# sudoedit /etc/sudoers.d/test   #编辑文件/etc/sudoers.d/test
    haiyun ALL=(ALL) /usr/bin/sudoedit /etc/sudoers.d/test  #是用户haiyun可以编辑test文件
    [root@A ~]# su - haiyun
    [haiyun@A ~]$ sudo /usr/bin/sudoedit /etc/sudoers.d/test
    [sudo] password for haiyun: 
    #haiyun ALL=(ALL) /usr/bin/sudoedit /etc/sudoers.d/test     #haiyun用户可以编辑test文件
    [haiyun@A ~]$ sudo /usr/bin/sudoedit /etc/sudoers.d/test  # 注释后已经不能使用 
    Sorry, user haiyun is not allowed to execute '/usr/bin/sudoedit /etc/sudoers.d/test' as root on A.
    范例3:使wang用户和haiyun用户能够有权限修改IP,使用别名实现,且不需要输入密码
    [root@A ~]# sudoedit /etc/sudoers.d/test       # 
    User_Alias NETUSER=wang,haiyun      # 定义别名NETUSER,有两个用户wang,haiyun
    Cmnd_Alias IP=/sbin/ip      # 定义命令别名为 /sbin/ip
    NETUSER  ALL=(root)  NOPASSWD: IP       # NOPASSWD代表无需输入密码
    [haiyun@A ~]$ sudo ip add add 192.168.1.2/24 dev eth0         # 使用haiyun用户执行添加IP命令
    [haiyun@A ~]$ ip addr show dev eth0       # 查看eth0的iP,已经添加
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:de:d2:82 brd ff:ff:ff:ff:ff:ff
        inet 172.18.250.42/16 brd 172.18.255.255 scope global eth0
        inet 192.168.1.2/24 scope global eth0
        inet6 fe80::20c:29ff:fede:d282/64 scope link 
           valid_lft forever preferred_lft forever
    [root@A ~]# su - wang      # 切换到wang用户 
    [wang@A ~]$ ip add del 192.168.1.2/24 dev eth0    # 直接删除IP是没有权限的
    RTNETLINK answers: Operation not permitted
    [wang@A ~]$ sudo ip add del 192.168.1.2/24 dev eth0   # 使用sudo可以删除
    [wang@A ~]$ ip addr show eth0     # 查看eth0IP已经别删除
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:de:d2:82 brd ff:ff:ff:ff:ff:ff
        inet 172.18.250.42/16 brd 172.18.255.255 scope global eth0
        inet6 fe80::20c:29ff:fede:d282/64 scope link 
           valid_lft forever preferred_lft forever
    范例4:使wang用户和haiyun用户能够有权限查看/etc/shadow文件,默认为haiyun用户。
    [root@A ~]# sudoedit /etc/sudoers.d/test   # 编辑/etc/sudoers.d/test文件   
    Defaults:haiyun runas_default=wang
    haiyun ALL=(root) /bin/cat /etc/shadow
    [root@A ~]# sudo /bin/cat /etc/shadow  # 使用sudo查看/etc/shadow文件
    root:$6$SVxwnkSIO7UUYS71$Nga3eujjzHub.oIfdEY12TLdVwpbJ/WNDaLTrvl4.WkfMYiEGCfW85vX5vVWj08mWT2nkkFXHoge7SaZGIKcA.:17392:0:99999:7:::
    bin:*:17246:0:99999:7:::
    [root@A ~]# sudo -u wang /bin/cat /etc/shadow  # 使用wang用户查看shadow文件,无权限
    /bin/cat: /etc/shadow: Permission denied
    范例5:使haiyun用户能够有权限使用/usr/sbin/目录下的所有命令除了/usr/sbin/userdel命令
    [root@A ~]# sudoedit /etc/sudoers.d/test   # 添加规则使haiyun用户能够使用/usr/sbin/目录下的所有命令除了/usr/sbin/userdel命令
    haiyun ALL=(root) /usr/sbin/,!/usr/sbin/userdel
    [haiyun@A ~]$ useradd test        # 直接添加用户是没有权限的
    -bash: /usr/sbin/useradd: Permission denied
    [haiyun@A ~]$ sudo useradd test       # 使用sudo可以添加
    [haiyun@A ~]$ id test     # 查看test的UID等信息
    uid=514(test) gid=514(test) groups=514(test)
    [haiyun@A ~]$ sudo userdel -r test        # 删除test用户,是没有权限的
    Sorry, user haiyun is not allowed to execute '/usr/sbin/userdel -r test' as root on A.
    范例6:使用户haiyun能够有权限查看/var/log/message后的所有文件
    [[email protected] ~]# sudoedit /etc/sudoers.d/test   #编辑/etc/sudoer.d/test文件
    haiyun ALL=(root) /bin/cat /var/log/message*    #使haiyun用户能够查看/var/log/message文件
    [[email protected] ~]$ sudo /bin/cat /var/log/messages /etc/shadow #但这样又会有一个问题后面跟一个其他文件也能查看了
    Sep 13 09:30:29 centos6 xinetd[1391]: xinetd Version 2.3.14 started with libwrap loadavg labeled-networking options compiled in.
    Sep 13 09:30:29 centos6 xinetd[1391]: Started working: 0 available services
    Sep 13 12:52:37 centos6 yum[2876]: Installed: zlib-devel-1.2.3-29.el6.x86_64
    Sep 13 14:15:12 centos6 yum[7400]: Installed: aide-0.14-11.el6.x86_64
    Sep 13 19:16:39 centos6 dhclient[1114]: DHCPREQUEST on eth0 to 172.18.0.1 port 67 (xid=0x44c4eda2)
    Sep 13 19:16:40 centos6 dhclient[1114]: DHCPACK from 172.18.0.1 (xid=0x44c4eda2)
    Sep 13 19:16:42 centos6 dhclient[1114]: bound to 172.18.250.42 -- renewal in 41913 seconds.
    。。。省略后面内容
    root:$6$SVxwnkSIO7UUYS71$Nga3eujjzHub.oIfdEY12TLdVwpbJ/WNDaLTrvl4.WkfMYiEGCfW85vX5vVWj08mWT2nkkFXHoge7SaZGIKcA.:17392:0:99999:7:::
    bin:*:17246:0:99999:7:::
    。。。省略后面内容
    [[email protected] ~]# sudoedit /etc/sudoers.d/test   #再次编辑/etc/sudoer.d/test文件
    haiyun ALL=(root) /bin/cat /var/log/message*,!/bin/cat /var/log/messages* * #我们将后面跟空的文件排除了
    [[email protected] ~]$ sudo /bin/cat /var/log/messages-20170820 /etc/shadow  #这样是不可以看的
    Sorry, user haiyun is not allowed to execute '/bin/cat /var/log/messages-20170820 /etc/shadow' as root on centos6.haiyun.com.
    [[email protected] ~]$ sudo /bin/cat /var/log/messages-20170820  #跟一个文件就可以了
    Aug 20 09:26:49 centos6 kernel: type=1305 audit(1503192408.924:3): audit_pid=1238 old=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:auditd_t:s0 res=1
    Aug 20 09:27:00 centos6 automount[1319]: problem reading master map, maximum wait exceeded
    Aug 20 09:27:00 centos6 automount[1319]: automount: warning: could not read at least one map source after waiting, continuing ...
    Aug 20 09:27:01 centos6 kdump: kexec: loaded kdump kernel
    Aug 20 09:27:01 centos6 kdump: started up
    。。。后面内容省略

    sudo命令和参数

    • sudo –i –u wang 切换身份为wang用户
    • `sudo -u user 默认为root,使用指定的用户执行命令
    • sudo -l 列出用户在主机上可用的和被禁止的命令
    • sudo -v 再延长密码有效期限5分钟,更新时间戳
    • sudo -k 清除时间戳(1970-01-01),下次需要重新输密码
    • sudo -b 在后台执行指令

    su命令

    su命令用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。

    su - username:代表使用login-shell的变量文件读取方式来登陆系统

    su username -c command:仅进行一次命令

    注意事项:

    1. centos 7 将普通用户添加到wheel组因为whell组默认sudo有全部权限的。注意此行:%wheel ALL=(ALL) ALLcentos 7默认是开启的。
    2. 假设rootUID不是0的话,那么也可以利用sudo实现管理操作。可以考略将此行:root ALL=(ALL) ALL禁用掉。
    相关标签: 密码