Linux Capabilities 简介及使用
2019-04-13 18:12:05 阿炯

Linux是一种安全操作系统,它给普通用户尽可能低的权限,而把全部的系统权限赋予一个单一的帐户:root。root帐户用来管理系统、安装软件、管理帐户、运行某些服务、安装/卸载文件系统、管理用户、安装软件等。另外,普通用户的很多操作也需要root权限,这通过setuid实现。这种依赖单一帐户执行特权操作的方式加大了系统的面临风险,而需要root权限的程序可能只是为了一个单一的操作,例如:绑定到特权端口、打开一个只有root权限可以访问的文件。某些程序可能有安全漏洞,而如果程序不是以root的权限运行,其存在的漏洞就不可能对系统造成什么威胁。从2.1版开始,内核开发人员在Linux内核中加入了能力(capability)的概念。其目标是消除需要执行某些操作的程序对root帐户的依赖。从2.2版本的内核开始,这些代基本可以使用了,虽然还存在一些问题,但是方向是正确的。

传统UNIX的信任状模型非常简单,就是“超级用户对普通用户”模型。在这种模型中,一个进程要么什么都能做,要么几乎什么也不能做,这取决于进程的UID。如果一个进程需要执行绑定到私有端口、加载/卸载内核模块以及管理文件系统等操作时,就需要完全的root权限。很显然这样做对系统安全存在很大的威胁。UNIX系统中的SUID问题就是由这种信任状模型造成的。例如,一个普通用户需要使用ping命令。这是一个SUID命令,会以root的权限运行。而实际上这个程序只是需要RAW套接字建立必要ICMP数据包,除此之外的其它root权限对这个程序都是没有必要的。如果程序编写不好,就可能被攻击者利用,获得系统的控制权。使用能力(capability)可以减小这种风险。系统管理员为了系统的安全可以剥夺root用户的能力,这样即使root用户也将无法进行某些操作。而这个过程又是不可逆的,也就是说如果一种能力被删除,除非重新启动系统,否则即使root用户也无法重新添加被删除的能力。

Capability (POSIX 1003.1e, capabilities(7))用更小的粒度控制超级管理员权限,可以避免使用 root 权限。软件开发者应该为二进制文件赋予最小权限,而不是使用强大的setuid。很多软件包用了能力, 比如 iputils提供的ping 使用的CAP_NET_RAW(能力的一种) 。例如ping可以被普通用户执行(和setuid模式一样),同时减少了ping的潜在安全隐患。

Capabilities的主要思想在于分割root用户的特权,即将root的特权分割成不同的能力,每种能力代表一定的特权操作。例如:能力CAP_SYS_MODULE表示用户能够加载(或卸载)内核模块的特权操作,而CAP_SETUID表示用户能够修改进程用户身份的特权操作。在Capbilities中系统将根据进程拥有的能力来进行特权操作的访问控制。在Capilities中,只有进程和可执行文件才具有能力,每个进程拥有三组能力集,分别称为cap_effective, cap_inheritable,cap_permitted(分别简记为:pE,pI,pP),其中cap_permitted表示进程所拥有的最大能力集;cap_effective表示进程当前可用的能力集,可以看做是cap_permitted的一个子集;而cap_inheitable则表示进程可以传递给其子进程的能力集。

系统根据进程的cap_effective能力集进行访问控制,cap_effective为cap_permitted的子集,进程可以通过取消cap_effective中的某些能力来放弃进程的一些特权。可执行文件也拥有三组能力集,对应于进程的三组能力集,分别称为cap_effective, cap_allowed 和 cap_forced(分别简记为fE,fI,fP),其中,cap_allowed表示程序运行时可从原进程的cap_inheritable中集成的能力集,cap_forced表示运行文件时必须拥有才能完成其服务的能力集;而cap_effective则表示文件开始运行时可以使用的能力。

Linux内核中Capabilities的实现机制

Linux内核从2.2版本开始,就加进的Capabilities的概念与机制,并随着版本升高逐步得到改进。在linux中,root权限被分割成一下29项能力:
CAP_CHOWN:修改文件属主的权限
CAP_DAC_OVERRIDE:忽略文件的DAC访问限制
CAP_DAC_READ_SEARCH:忽略文件读及目录搜索的DAC访问限制
CAP_FOWNER:忽略文件属主ID必须和进程用户ID相匹配的限制
CAP_FSETID:允许设置文件的setuid位
CAP_KILL:允许对不属于自己的进程发送信号
CAP_SETGID:允许改变进程的组ID
CAP_SETUID:允许改变进程的用户ID
CAP_SETPCAP:允许向其他进程转移能力以及删除其他进程的能力
CAP_LINUX_IMMUTABLE:允许修改文件的IMMUTABLE和APPEND属性标志
CAP_NET_BIND_SERVICE:允许绑定到小于1024的端口
CAP_NET_BROADCAST:允许网络广播和多播访问
CAP_NET_ADMIN:允许执行网络管理任务
CAP_NET_RAW:允许使用原始套接字
CAP_IPC_LOCK:允许锁定共享内存片段
CAP_IPC_OWNER:忽略IPC所有权检查
CAP_SYS_MODULE:允许插入和删除内核模块
CAP_SYS_RAWIO:允许直接访问/devport,/dev/mem,/dev/kmem及原始块设备
CAP_SYS_CHROOT:允许使用chroot()系统调用
CAP_SYS_PTRACE:允许跟踪任何进程
CAP_SYS_PACCT:允许执行进程的BSD式审计
CAP_SYS_ADMIN:允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等
CAP_SYS_BOOT:允许重新启动系统
CAP_SYS_NICE:允许提升优先级及设置其他进程的优先级
CAP_SYS_RESOURCE:忽略资源限制
CAP_SYS_TIME:允许改变系统时钟
CAP_SYS_TTY_CONFIG:允许配置TTY设备
CAP_MKNOD:允许使用mknod()系统调用
CAP_LEASE:允许修改文件锁的FL_LEASE标志

比较详细的权能列表

下面的列表展示了 Linux 上实现的权能,以及每种权能允许的操作或行为:
CAP_AUDIT_CONTROL(自 Linux 2.6.11)
启用和禁用内核审计;修改审计过滤器规则;提取审计状态和过滤规则。
CAP_AUDIT_READ(自 Linux 3.16)
允许通过一个多播 netlink socket 读取审计日志。
CAP_AUDIT_WRITE(自 Linux 2.6.11)
向内核审计日志写记录。
CAP_BLOCK_SUSPEND(自 Linux 3.5)
可以阻塞系统挂起(epoll(7) EPOLLWAKEUP,/proc/sys/wake_lock)的特性。
CAP_CHOWN
对文件的 UIDs 和 GIDs 做任意的修改(参考 chown(2))。
CAP_DAC_OVERRIDE
绕过文件的读,写,和执行权限检查。(DAC 是 "discretionary access control" 的缩写。)
CAP_DAC_READ_SEARCH
    绕过文件的读权限检查和目录的读和执行权限检查;
    调用 open_by_handle_at(2)。
CAP_FOWNER
    对于通常要求进程的文件系统 UID 与文件的 UID 匹配的操作,绕过权限检查 (比如,chmod(2),utime(2)),除了那些包含在 CAP_DAC_OVERRIDE 和 CAP_DAC_READ_SEARCH 中的操作;
    为任意文件设置扩展文件属性(参考 chattr(1));
    为任意文件设置访问控制表(ACLs);
    对文件删除操作忽略目录的 sticky 位;
    在 open(2) 和 fcntl(2) 任意文件时设置 O_NOATIME。
CAP_FSETID
当文件修改时不清除 set-user-ID 和 set-group-ID 模式位;为文件 GID 与调用进程的文件系统或补充 GIDs 不匹配的文件设置 set-group-ID 位。
CAP_IPC_LOCK
锁定内存 (mlock(2),mlockall(2),mmap(2),shmctl(2))。
CAP_IPC_OWNER
绕过对 System V IPC 对象的操作的权限检查。
CAP_KILL
绕过发送信号 (参考 kill(2)) 时的权限检查。这包括使用 ioctl(2) KDSIGACCEPT 操作。
CAP_LEASE(自 Linux 2.4)
为任意文件建立租约 (参考 fcntl(2))。
CAP_LINUX_IMMUTABLE
设置FS_APPEND_FL 和 FS_IMMUTABLE_FL inode 标记 (参考 chattr(1))。
CAP_MAC_ADMIN(自 Linux 2.6.25)
覆盖强制访问控制 (Mandatory Access Control (MAC)). 为 Smack Linux 安全模块(Linux Security Module (LSM)) 而实现。
CAP_MAC_OVERRIDE(自 Linux 2.6.25)
允许 MAC 配置或状态改变。为 Smack LSM 而实现。
CAP_MKNOD(自 Linux 2.4)
使用 mknod(2) 创建特殊文件。
CAP_NET_ADMIN
执行多种网络有关的操作:
    接口配置;
    IP 防火墙,地址伪装,和账单管理;
    修改路由表;
    为透明代理绑定任何地址;
    设置服务类性 (type-of-service (TOS));
    清理驱动统计资料;
    设置混杂模式;
    启用组播;
    使用 setsockopt(2) 设置下列 socket 选项:SO_DEBUG,SO_MARK,SO_PRIORITY (在0到6范围之外的优先级),SO_RCVBUFFORCE,和 SO_SNDBUFFORCE。
CAP_NET_BIND_SERVICE
将一个 socket 绑定到一个互联网域特权端口 (端口号小于 1024)。
CAP_NET_BROADCAST
(未使用) 使 socket 发送组播,并监听组播。
CAP_NET_RAW
    使用 RAW 和 PACKET sockets;
    为透明代理绑定任何地址。
CAP_SETGID
执行任意的进程 GIDs 和补充 GID 列表管理;当通过 UNIX 域 sockets 传递 socket 认证信息时伪造 GID;在一个用户命名空间 (参考 user_namespaces(7)) 中写入组 ID 映射。
CAP_SYS_ADMIN
    执行一系列系统管理操作,包括:quotactl(2),mount(2),umount(2),swapon(2),swapoff(2),sethostname(2),和 setdomainname(2);
    执行特权 syslog(2) 操作 (自 Linux 2.6.37 开始,应该使用 CAP_SYSLOG 来允许这一操作);
    执行 VM86_REQUEST_IRQ vm86(2) 命令;
    对任意 System V IPC 对象执行 IPC_SET 和 IPC_RMID 操作;
    覆盖 RLIMIT_NPROC 资源限制;
    执行 trusted 和 security Extended Attributes (see xattr(7)) 操作;
    使用 lookup_dcookie(2);
    使用 ioprio_set(2) 来分配 IOPRIO_CLASS_RT 和 (Linux 2.6.25 之前) IOPRIO_CLASS_IDLE I/O 调度类别;
    当通过 UNIX 域 sockets 传递 socket 认证信息时伪装 PID;
    在系统调用打开文件 (比如,accept(2),execve(2),open(2),pipe(2)) 时,超出 /proc/sys/fs/file-max,系统范围内打开文件数的限制;
    通过 clone(2) 和 unshare(2) 使用 ** CLONE_* ** 标记创建新的命名空间(但是,自从 Linux 3.8 开始,创建命名空间不需要任何权能);
    调用 perf_event_open(2);
    访问特权 perf 事件信息;
    调用 setns(2) (在目标命名空间中需要 CAP_SYS_ADMIN);
    调用 fanotify_init(2);
    调用 bpf(2);
    执行 KEYCTL_CHOWN 和 KEYCTL_SETPERM keyctl(2) 操作;
    执行 madvise(2) MADV_HWPOISON 操作;
    使用 TIOCSTI ioctl(2) 向一个终端的输入队列中插入字符,而不是调用者的控制终端;
    使用废弃的 **nfsservctl **(2) 系统调用;
    使用废弃的 **bdflush **(2) 系统调用;
    执行各种特权的块设备 ioctl(2) 操作;
    执行各种特权的文件系统 ioctl(2) 操作;
    对许多设备驱动执行管理操作。
CAP_SYS_BOOT
使用 reboot(2) 和 kexec_load(2)。
CAP_SYS_CHROOT
使用 chroot(2)。
CAP_SYS_MODULE
加载和卸载内核模块(参考 init_module(2) 和 delete_module(2));在 2.6.25 之前的内核中:从系统范围内的权能边界集合中丢弃权能。
CAP_SYS_NICE
    触发进程 nice 值 (nice(2),setpriority(2)) 和为任意进程改变 nice 值;
    为调用进程设置实时调度策略,及为任意进程设置调度策略和优先级 (sched_setscheduler(2),sched_setparam(2),shed_setattr(2));
    为任意进程设置 CPU affinity (sched_setaffinity(2));
    为任意进程设置 I/O 调度类别和优先级 (ioprio_set(2));
    对任意进程应用 migrate_pages(2) 并允许进程被迁移到任意节点;
    对任意进程应用 move_pages(2);
    在 mbind(2) 和 move_pages(2) 中使用 MPOL_MF_MOVE_ALL 标记。
CAP_SYS_PACCT
使用 acct(2)。
CAP_SYS_PTRACE
    使用 ptrace(2) 追踪任意进程;
    对任意进程应用 get_robust_list(2);
    使用 process_vm_readv(2) 和 process_vm_writev(2) 同任意进程的内存传输数据;
    使用 kcmp(2) 检查进程。
CAP_SYS_RAWIO
    执行 I/O 端口操作 (iopl(2) 和 ioperm(2));
    访问 /proc/kcore;
    使用 FIBMAP ioctl(2) 操作;
    打开设备访问 x86 模式特有寄存器 (MSRs,参考 msr(4));
    更新 /proc/sys/vm/mmap_min_addr;
    在地址低于 /proc/sys/vm/mmap_min_addr 的位置创建内存映射;
    在 /proc/bus/pci 中映射文件;
    打开 /dev/mem 和 /dev/kmem;
    执行各种 SCSI 设备命令;
    在 hpsa(4) 和 cciss(4) 设备上执行某一操作;
    在其它设备上执行一系列设备特有操作。
CAP_SYS_RESOURCE
    使用 ext2 文件系统上的预留空间;
    执行 ioctl(2) 调用控制 ext3 日志;
    覆盖磁盘配额限制;
    增加资源限制 (参考 setrlimit(2));
    覆盖 RLIMIT_NPROC 资源限制;
    在终端分配上覆盖最大的终端数;
    覆盖最大的 keymaps 个数;
    允许实时时钟中断大于64 hz;
    触发一个 System V 消息队列的 msg_qbytes 限制超过 /proc/sys/kernel/msgmnb 中的限制 (参考 msgop(2) 和 msgctl(2));
    当使用 F_SETPIPE_SZ fcntl(2) 命令设置一个管道的容量时覆盖 /proc/sys/fs/pipe-size-max 的限制;
    使用 F_SETPIPE_SZ 增加管道的容量超出 /proc/sys/fs/pipe-max-size 指定的限制;
    当创建 POSIX 消息队列 (参考 mq_overview(7)) 时覆盖 /proc/sys/fs/mqueue/queues_max 的限制;
    使用 prctl(2) PR_SET_MM 操作;
    设置 /proc/PID/oom_score_adj 为一个小于由一个具有 CAP_SYS_RESOURCE 的进程最近设置的值的值。
CAP_SYS_TIME
设置系统时钟 (settimeofday(2),stime(2),adjtimex(2));设置实时 (硬件) 时钟。
CAP_SYS_TTY_CONFIG
使用 vhangup(2);对虚拟终端使用各种特权 ioctl(2) 操作。
CAP_SYSLOG (自 Linux 2.6.37)
    执行特权 syslog(2) 操作。参考 syslog(2) 来获取哪些操作需要特权的信息;
    当 /proc/sys/kernel/kptr_restrict 值为 1 时,查看通过 /proc 和其它接口暴露的内核地址。(参考 proc(5) 中 kptr_restrict 的讨论。)
CAP_WAKE_ALARM (自 Linux 3.0)
触发将唤醒系统的东西 (设置 CLOCK_REALTIME_ALARM 和 CLOCK_BOOTTIME_ALARM 定时器)。

过去和当前的实现

权能的完整实现需要:
    对于所有的特权操作,内核必须检查线程是否在其有效集合中具有要求的权能。
    内核必须提供系统调用以允许设置和提取一个线程的权能。
    文件系统必须支持为一个可执行文件附接权能,以使文件被执行时进程获得那些权能。

在内核 2.6.24 之前,只有前两个要求能够满足;自内核 2.6.24 开始,所有三个要求都能满足。


设置方法

在linux中,capability是通过命名空间security下的extended attributes (xattr(7))实现。主流linux都支持扩展属性,包括Ext2,Ext3,Ext4,Btrfs,JFS,XFS,和Reiserfs。下面的例子展示了用getcap显示ping命令的能力,然后通过使用getfattr显示相同的编码后的数据。

$ getcap /bin/ping
/bin/ping = cap_net_raw+ep
$ getfattr -d -m "^security\\." /bin/ping
# file: bin/ping
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=

扩展属性可以通过cp -a自动复制,但是其他的命令需要一个特别的参数,比如: rsync -X。

在Arch中, 能力可以通过包安装脚本iputils.install设置。

从Linux中第一次启动Wireshark的时候,可能会觉得奇怪,为什么看不到任何一个网卡,比如eth0之类的。这是因为,直接访问这些设备需要root权限。然后就用root权限去用了,当然这是一个不好的做法。比如Gentoo中就会提示:WIRESHARK CONTAINS OVER ONE POINT FIVE MILLION LINES OF SOURCE CODE. DO NOT RUN THEM AS ROOT. 那该怎么办呢?Wireshark的leader Gerald Combs指出,现在多数Linux发行版都开始实现对raw网络设备使用文件系统权限(能力) ,可以用这个途径从普通用户启动Wireshark。

安装 Wireshark 的时候,有一步是给 dumpcap 读网卡的权限,使得普通用户也可以使用 Wireshark 进行抓包。
# setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/sbin/dumpcap

以下是具体步骤:
1.安装setcap。setcap 是libcap2-bin包的一部分,一般来说,这个包默认会已经装好。 sudo apt-get install libcap2-bin

2.创建Wireshark组。这一步在安装Wireshark的时候,也会完成。 # groupadd -g wireshark # usermod -a -G wireshark <自己的用户名> # chgrp wireshark /usr/bin/dumpcap # chmod 4750 /usr/bin/dumpcap

3.赋予权限。#setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap 完成。 可以使用 getcap /usr/bin/dumpcap验证,输出应当是:/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip 现在就可以从自己的普通用户启动Wireshark抓包了

CAPABILITIES(7) 文档有一段:

For the purpose of performing permission checks, traditional UNIX
implementations distinguish two categories of processes: privileged
processes (whose effective user ID is 0, referred to as superuser or
root), and unprivileged processes (whose effective UID is nonzero).
Privileged processes bypass all kernel permission checks, while
unprivileged processes are subject to full permission checking based
on the process's credentials (usually: effective UID, effective GID,
and supplementary group list).

Starting with kernel 2.2, Linux divides the privileges traditionally
associated with superuser into distinct units, known as capabilities,
which can be independently enabled and disabled.  Capabilities are a
per-thread attribute.


从前,要使被普通用户执行的某个程序有特殊权限,一般我们会给这个程序设置suid,于是普通用户执行该程序时就会以root的身份来执行。比如,/usr/bin/passwd 这个可执行文件就带有suid,普通用户执行它时会以root身份执行,所以 passwd 才能读取并修改 /etc/shadow 文件。

# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 Feb 17  2012 /usr/bin/passwd

# ls -l /etc/shadow
----------. 1 root root 945 Sep 11 16:22 /etc/shadow

可以看到,使用 suid 有一个弊端,那就是以 root 身份执行的程序有了所有特权,这会带来安全风险。Kernel 从 2.2 版本开始,提供了 Capabilities 功能,它把特权划分成不同单元,可以只授权程序所需的权限,而非所有特权。

在 RHEL6 中,普通用户能执行 ping 命令是因为 /bin/ping 设置了 suid,将 /bin/ping 的 suid 去除,普通用户则无法执行 ping。在 root 用户下,用 setcap 命令给 /bin/ping 这个可执行文件加上 “cap_net_admin,cap_net_raw+ep” 权限,普通用户即可使用 ping。

Extended attributes

在 Linux 中的 Capabilities 是通过 extended attributes 中的 security 命名空间实现的。主流的 Linux 文件系统都支持 Extended attributes,包括 Ext2, Ext3, Ext4, Btrfs, JFS, XFS 和 Reiserfs。

注意:
1. setcap 一般用于二进制可执行文件。setcap 用于脚本文件时无效(比如以 #!/bin/perl 开头的脚本文件)

2. CAPABILITIES(7) 文档有较为详尽的说明,推荐阅读。

从capabilities受益的其他程序

下面软件包不包含 setuid 属性的文件,但是需要 root 权限才能执行。通过启用一些能力,一般用户就可以使用软件。

beep
# setcap cap_dac_override,cap_sys_tty_config+ep /usr/bin/beep

chvt
# setcap cap_dac_read_search,cap_sys_tty_config+ep /usr/bin/chvt

iftop
# setcap cap_net_raw+ep /usr/bin/iftop

mii-tool
# setcap cap_net_admin+ep /usr/bin/mii-tool

相关的命令

找到 setuid-root 文件:
$ find /usr/bin /usr/lib -perm /4000 -user root

找到 setgid-root 文件:
$ find /usr/bin /usr/lib -perm /2000 -group root


使用capability让普通用户使用1024以下的端口

linux对于非root权限用户不能使用1024以下的端口,对于一些服务,过高的权限,会带来一定的风险。那么对于低权限的用户如何对外开放1024以下的端口,这里总结了几种可行办法。

环境:centos7 账户nginx(无sudo权限)

1.nginx 等软件做反向代理
反向代理这里就不细说了。

2.iptables端口转发
首先程序绑定1024以上的端口,然后root权限下做转发注意有些系统需要手动开启IP FORWARD功能
vi /etc/sysctl.conf
#修改
net.ipv4.ip_forward = 1
#重新加载
sysctl -p /etc/sysctl.conf
#调用
iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080

或使用第三方的端口转发工具rinetd来实现也可以,不过在效率肯定不及iptables。

3. setuid
# chown root:root nginx && chmod 4755 nginx

nginx可以运行,但是主进程仍然是以root用户权限来运行的,这样并不安全。

4.CAP_NET_BIND_SERVICE

从 2.1 版本开始,Linux 内核有了能力的概念,这使得普通用户也能够做只有超级用户才能完成的工作,这就包括了使用端口。获取CAP_NET_BIND_SERVICE能力,即使服务程序运行在非root帐户下,也能够binding到低端口。使用的方法:
# setcap cap_net_bind_service=+eip /usr/local/nginx/sbin/nginx
# su - nginx
$ stat nginx
文件:"nginx"
大小:6054330         块:11832      IO 块:4096   普通文件
设备:fd00h/64768d      Inode:393036      硬链接:1
权限:(0755/-rwxr-xr-x)  Uid:(1001/ nginx)   Gid:(1001/ nginx)
最近访问:2017-10-11 18:43:05.402239835 +0800
最近更改:2017-10-11 18:25:47.273183401 +0800
最近改动:2017-10-11 18:48:23.084257104 +0800
创建时间:-

$ ./nginx
$ ps -aux| grep nginx
nginx  1802  0.0  0.1  45500  1124 ?        Ss   18:49   0:00 nginx: master process ./nginx
nginx  1805  0.0  0.1  45960  1596 ?        S    18:49   0:00 nginx: worker process



参考

capability集原文:

能力                                               作用                                                                                                        危险

CAP_AUDIT_CONTROL:         Control kernel auditing
CAP_AUDIT_READ:                 Read the audit log via a multicast netlink socket
CAP_AUDIT_WRITE:               Write records to kernel audit log
CAP_BLOCK_SUSPEND:       Can prevent the system from suspending

CAP_CHOWN:                        Change file user and group                                                                      Yes
CAP_DAC_OVERRIDE:         Bypass file permission checks                                                                Yes
CAP_DAC_READ_SEARCH: Read all files and directories                                                                    Yes
CAP_FOWNER:                      Perform operations on files owned by other users such as chmod, chattr or utime             Yes
CAP_FSETID:                         Keep suid and guid permissions when modifying a file                             Yes
CAP_IPC_LOCK:                    Lock memory (mlock, mlockall, mmap, shmctl)                       

CAP_IPC_OWNER:                Bypass shared memory permission checks                                             Yes
CAP_KILL:                               Send signals to any process

CAP_LEASE:                          Establish leases on any file
CAP_LINUX_IMMUTABLE:    Make files immutable and remove ability append to file using chattr
CAP_MAC_ADMIN:                Perform MAC administration (for Smack LSM)                                           Yes
CAP_MAC_OVERRIDE:        Override MAC (for Smack LSM)                                                                 Yes
CAP_MKNOD:                        Create files using mknod()
CAP_NET_ADMIN:                Perform network administration such as configuring interfaces or routing tables                   Yes
CAP_NET_BIND_SERVICE: Bind socket to privileged port (< 1024)
CAP_NET_BROADCAST:     Make socket broadcasts and listen to multicasts
CAP_NET_RAW:                    Use RAW and PACKET sockets
CAP_SETGID:                        Change to any Group ID
CAP_SETFCAP:                     Set file capabilities                                                                                        Yes
CAP_SETPCAP:                     Set capabilities if file capabilities not present
CAP_SETUID:                        Change to any User ID
CAP_SYS_ADMIN:                Perform privileged system administration operations such as mount, swapon, sethostname and keyctl.This capability in particular, can be used in multiple ways to gain additional privileges.                                           Yes
CAP_SYS_BOOT:                 Can reboot and kexec_load
CAP_SYS_CHROOT:           Can chroot
CAP_SYS_MODULE:           Can load and unload kernel modules
CAP_SYS_NICE:                  Change process priority levels and scheduling class (e.g. to real-time)
CAP_SYS_PACCT:              Can use acct

CAP_SYS_PTRACE:            ptrace any process                                                                                         Yes
CAP_SYS_RAWIO:               Perform I/O port operations and access /proc/kcore. Override zero mmap restrictions.
CAP_SYS_RESOURCE:      Set or override resource limits
CAP_SYS_TIME:                  Can set the system clock and real-time hardware clock
CAP_SYS_TTY_CONFIG:   Can hang up the current tty
CAP_SYSLOG:                    Can configure the behavior of printk() to affect the kernel’s syslog
CAP_WAKE_ALARM:          Can trigger something to wake the system

注意:不能版本内核可能会有些差异,有些是后面才增加的。