:::tips setcap 是一个 Linux 命令,用于设置文件的 POSIX 能力。这些能力允许某些二进制文件在没有 root 权限的情况下执行特定操作,以提高系统安全性。该命令通常用于提供更少的特权访问,而不是将权限完全授予 root 用户。 :::

setcap 命令的语法如下:

  1. setcap [-q] <cap>|<cap>=<ep> <file> ...

其中, 表示一个或多个需要设置的 POSIX 能力, 表示需要设置的能力所需的权限。 是需要设置能力的二进制文件或命令的路径。

以下是一些常见的 POSIX 能力:

  • CAP_CHOWN:允许修改文件所有权
  • CAP_DAC_OVERRIDE:允许忽略文件和目录的访问权限
  • CAP_NET_BIND_SERVICE:允许绑定到低于1024的端口
  • CAP_NET_RAW:允许进行原始套接字操作
  • CAP_SYS_ADMIN:允许进行各种系统管理操作

    以下是一些 setcap 命令的示例:

  • 将 /usr/bin/ping 命令的 CAP_NET_RAW 能力设置为允许非 root 用户执行:

    1. sudo setcap cap_net_raw+ep /usr/bin/ping
  • 将 /usr/bin/traceroute6 命令的 CAP_NET_RAW 能力设置为允许非 root 用户执行:

    1. sudo setcap cap_net_raw+ep /usr/bin/traceroute6
  • 将 /usr/bin/sudo 命令的 CAP_SETUID 和 CAP_SETGID 能力设置为允许非 root 用户执行:

    1. sudo setcap cap_setuid,cap_setgid+ep /usr/bin/sudo

需要注意的是,使用 setcap 命令需要谨慎,因为它可以在没有 root 权限的情况下授予特权,从而可能会导致系统安全性问题。建议仅在确实需要时使用,并且应谨慎评估每个设置的影响。

POSIX 能力的完整列表

  • CAP_AUDIT_CONTROL:允许启用和禁用内核审计记录
  • CAP_AUDIT_READ:允许读取审计日志条目
  • CAP_AUDIT_WRITE:允许写入审计日志条目
  • CAP_BLOCK_SUSPEND:允许阻止挂起和恢复系统
  • CAP_CHOWN:允许修改文件所有权
  • CAP_DAC_OVERRIDE:允许忽略文件和目录的访问权限
  • CAP_DAC_READ_SEARCH:允许读取目录并执行文件
  • CAP_FOWNER:允许修改文件的所有者
  • CAP_FSETID:允许在文件上设置 SUID 和 SGID 位
  • CAP_IPC_LOCK:允许锁定共享内存段
  • CAP_IPC_OWNER:允许设置 IPC 对象的所有者
  • CAP_KILL:允许向任何进程发送信号
  • CAP_LEASE:允许设置文件租约
  • CAP_LINUX_IMMUTABLE:允许设置 Linux 不可变标志
  • CAP_MAC_ADMIN:允许管理 MAC 配置
  • CAP_MAC_OVERRIDE:允许覆盖 MAC 配置
  • CAP_MKNOD:允许创建设备文件和 FIFO
  • CAP_NET_ADMIN:允许进行各种网络管理操作
  • CAP_NET_BIND_SERVICE:允许绑定到低于 1024 的端口
  • CAP_NET_BROADCAST:允许广播网络消息
  • CAP_NET_RAW:允许进行原始套接字操作
  • CAP_SETFCAP:允许修改文件的能力
  • CAP_SETGID:允许修改组 ID
  • CAP_SETPCAP:允许修改进程的能力
  • CAP_SETUID:允许修改用户 ID
  • CAP_SYS_ADMIN:允许进行各种系统管理操作
  • CAP_SYS_BOOT:允许重启系统
  • CAP_SYS_CHROOT:允许在新根目录下启动进程
  • CAP_SYS_MODULE:允许加载和卸载内核模块
  • CAP_SYS_NICE:允许提高进程优先级
  • CAP_SYS_PACCT:允许查看系统帐户
  • CAP_SYS_PTRACE:允许使用 ptrace 进行调试
  • CAP_SYS_RAWIO:允许进行裸磁盘和网络 IO 操作
  • CAP_SYS_RESOURCE:允许修改系统资源限制
  • CAP_SYS_TIME:允许修改系统时钟
  • CAP_SYS_TTY_CONFIG:允许更改 tty 设备的设置
  • CAP_SYSLOG:允许读取和写入系统日志
  • CAP_WAKE_ALARM:允许唤醒系统 :::tips 除了上述列表中列出的 POSIX 能力,还有一些特定于某些系统或应用程序的额外能力。
    以下是一些特定能力的示例 :::

  • CAP_AUDIT_WRITE:在某些系统上用于写入审计记录

  • CAP_NET_ADMIN, CAP_NET_RAW:在某些系统上用于进行 DHCP 配置
  • CAP_SYS_PTRACE:在某些应用程序中用于调试进程
  • CAP_SYS_ADMIN:在某些应用程序中用于管理容器或虚拟机 :::tips 请注意,不是所有的 Linux 内核都支持所有的 POSIX 能力。如果在运行 setcap 命令时出现错误,可能是因为您正在尝试设置不受支持的能力。在使用 setcap 命令设置 POSIX 能力时,请务必仔细评估它们对系统安全性的影响,并且尽可能仅授予应用程序所需的最少特权。 :::

    capability

    +ep 和 +eip 的区别

    +ep和+eip是setcap命令中可用的两个选项,用于设置程序的能力。这两个选项之间的区别如下:

  • +ep表示“effective capability”和“permitted capability”的组合,即程序将拥有指定的能力,并且该能力将被视为程序的有效能力和允许能力。程序将能够使用这些能力来执行需要特权的操作,例如对网络接口进行更改等。但是,程序的访问权限将受到限制,因为程序的权限将基于其用户ID和组ID,以及当前进程的有效权限和组ID。

  • +eip表示“effective capability”、“permitted capability”和“inheritable capability”的组合,即程序将拥有指定的能力,并且该能力将被视为程序的有效能力、允许能力和可继承能力。程序将能够使用这些能力来执行需要特权的操作,并且可以继承这些能力,以便将它们传递给由程序启动的子进程。这使得子进程能够继承程序的特权,而无需再次运行setcap命令。

因此,如果您想要设置程序的能力,并确保子进程可以继承这些能力,那么应该使用+eip选项。如果您只想要设置程序的能力,并且不需要子进程继承这些能力,则可以使用+ep选项。请注意,为程序添加这些特权可能会带来潜在的安全风险,因此应该谨慎使用,并仅在确保了解其风险和影响的情况下使用。

所有 admin 的 cap 权限

在Linux中,有一些管理员权限可以授予给程序,以允许它们执行需要特权的操作。这些能力可以通过/usr/include/linux/capability.h头文件中定义的常量来标识。以下是与管理员权限相关的常用能力列表:

  • CAP_AUDIT_CONTROL:允许程序配置内核审计框架。
  • CAP_AUDIT_WRITE:允许程序写入审计日志。
  • CAP_BLOCK_SUSPEND:允许程序阻止系统挂起。
  • CAP_DAC_OVERRIDE:允许程序忽略文件和目录的权限设置。
  • CAP_DAC_READ_SEARCH:允许程序读取任何文件和目录,并在任何目录中搜索任何文件。
  • CAP_FOWNER:允许程序更改任何文件的所有者。
  • CAP_KILL:允许程序杀死任何进程。
  • CAP_NET_ADMIN:允许程序进行网络管理。
  • CAP_NET_BIND_SERVICE:允许程序绑定到低于1024的TCP/UDP端口。
  • CAP_SETGID:允许程序更改其组ID到任何可用的组ID。
  • CAP_SETUID:允许程序更改其用户ID到任何可用的用户ID。
  • CAP_SYS_ADMIN:允许程序执行各种系统管理任务,例如挂载文件系统和配置内核参数等。
  • CAP_SYS_CHROOT:允许程序在chroot环境中执行操作。
  • CAP_SYS_MODULE:允许程序加载和卸载内核模块。
  • CAP_SYS_RAWIO:允许程序对I/O端口和内存地址进行访问。
  • CAP_SYS_RESOURCE:允许程序更改系统资源限制。
  • CAP_SYS_TIME:允许程序更改系统时间。

要查看当前系统中所有可用的能力,请使用以下命令:

  1. grep -oP '^#define CAP_.*[^ ]' /usr/include/linux/capability.h | awk '{print $2}'

这将列出所有定义在/usr/include/linux/capability.h文件中的能力名称。请注意,为程序添加这些特权可能会带来潜在的安全风险,因此应该谨慎使用,并仅在确保了解其风险和影响的情况下使用。

cap 权限如何作用到 shell 脚本

要将cap权限应用于shell脚本,您可以使用setcap命令将其分配给shell解释器,例如/bin/bash或/bin/sh。这将允许您在shell脚本中执行需要特权的操作,例如对文件进行更改、网络配置等操作,而无需以root用户身份运行。
以下是将CAP_NET_ADMIN和CAP_NET_RAW权限分配给/bin/bash解释器的示例:

  1. sudo setcap cap_net_admin,cap_net_raw+ep /bin/bash

这将允许您在运行/bin/bash解释器时拥有CAP_NET_ADMIN和CAP_NET_RAW权限,以便在shell脚本中执行网络操作。请注意,为解释器分配cap权限可能会带来潜在的安全风险,因此应该谨慎使用,并仅在确保了解其风险和影响的情况下使用。此外,您应该将这些权限分配给最小化的解释器,以尽可能减少潜在的安全漏洞。

推荐阅读