什么是capabilities>?
capabilities是一种linux安全机制,用于细分和控制进程的权限。它们允许进程在不具备完全root权限的情况下执行特定的特权操作。
传统上,root用户具有完全的系统权限,包括读取、写入和执行任何文件,以及修改系统设置等。然而,这样的权限可能会过于宽松并存在安全风险。为了限制进程的权限,Linux引入了capabilities机制。
通过capabilities,可以将某些特权操作分离出来,赋予非root用户或特定进程组。这样,进程只能具备特定的权限,而不是完整的root权限。
这也是容器主要利用的linux特性之一,限制容器的某些权限来保证安全(容器本质是进程)
关于类型可以查看man手册,man 7 capabilities

下面是中文翻译版
CAP_AUDIT_CONTROL(自Linux 2.6.11起)
- 启用和禁用内核审计;
- 更改审计过滤规则;
- 检索审计状态和过滤规则。
CAP_AUDIT_READ(自Linux 3.16起)
CAP_AUDIT_WRITE(自Linux 2.6.11起)
CAP_BLOCK_SUSPEND(自Linux 3.5起)
- 使用可以阻止系统挂起的功能(epoll(7)的EPOLLWAKEUP,/proc/sys/wake_lock)。
CAP_BPF(自Linux 5.8起)
CAP_CHECKPOINT_RESTORE(自Linux 5.9起)
-
更新/proc/sys/kernel/ns_last_pid(参见pid_namespaces(7));
-
使用clone3(2)的set_tid功能;
-
读取其他进程中/proc/[pid]/map_files中符号链接的内容。
-
在Linux 5.9中添加了此Capability权限,将检查点/恢复功能从过载的CAP_SYS_ADMIN权限中分离出来。
CAP_CHOWN
- 对文件的用户标识符(UID)和组标识符(GID)进行任意更改(参见chown(2))。
CAP_DAC_OVERRIDE
- 绕过文件的读取、写入和执行权限检查。(DAC是"discretionary access control"的缩写,即"自主访问控制"。)
CAP_DAC_READ_SEARCH
- 绕过文件的读取权限检查和目录的读取和执行权限检查;
- 调用open_by_handle_at(2);
- 使用linkat(2)的AT_EMPTY_PATH标志来创建指向文件描述符所指的文件的链接。
CAP_FOWNER
- 绕过需要进程的文件系统UID与文件的UID匹配的操作的权限检查(例如chmod(2),utime(2)),但不包括CAP_DAC_OVERRIDE和CAP_DAC_READ_SEARCH权限涵盖的操作;
- 在任意文件上设置inode标志(参见ioctl_iflags(2));
- 在任意文件上设置访问控制列表(ACL);
- 在文件删除时忽略目录的粘滞位;
- 在任意用户拥有的粘滞目录上修改用户扩展属性;
- 在open(2)和fcntl(2)中为任意文件指定O_NOATIME。
CAP_FSETID
- 在文件修改时不清除设置用户ID和设置组ID模式位;
- 为文件设置设置组ID位,即使其GID与文件系统或调用进程的任何附加GID不匹配。
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起)
CAP_LINUX_IMMUTABLE
- 设置FS_APPEND_FL和FS_IMMUTABLE_FL inode标志(参见ioctl_iflags(2))。
CAP_MAC_ADMIN(自Linux 2.6.25起)
- 允许进行MAC配置或状态更改。用于Smack Linux安全模块(LSM)。
CAP_MAC_OVERRIDE(自Linux 2.6.25起)
- 覆盖强制访问控制(MAC)。用于Smack LSM。
CAP_MKNOD(自Linux 2.4起)
CAP_NET_ADMIN
- 执行各种与网络相关的操作:
- 接口配置;
- IP防火墙、伪装和计费管理;
- 修改路由表;
- 绑定到任意地址以进行透明代理;
- 设置服务类型(Type of Service,TOS);
- 清除驱动程序统计信息;
- 设置混杂模式(promiscuous mode);
- 启用组播(multicasting);
- 使用setsockopt(2)设置以下套接字选项:SO_DEBUG、SO_MARK、SO_PRIORITY(用于超出0到6范围的优先级)、SO_RCVBUFFORCE和SO_SNDBUFFORCE。
CAP_NET_BIND_SERVICE
- 将套接字绑定到Internet域特权端口(端口号小于1024)。
CAP_NET_BROADCAST
CAP_NET_RAW
- 使用RAW和PACKET套接字;
- 绑定到任意地址以进行透明代理。
CAP_PERFMON(自Linux 5.8起)
- 使用各种性能监控机制,包括:
- 调用perf_event_open(2);
- 使用具有性能影响的各种BPF操作。
该功能在Linux 5.8中添加,以将性能监控功能从过载的CAP_SYS_ADMIN功能中分离出来。另请参阅内核源文件Documentation/admin-guide/perf-security.rst。
CAP_SETGID
- 对进程GID和附加GID列表进行任意操作;
- 在通过UNIX域套接字传递套接字凭据时伪造GID;
- 在用户命名空间(参见user_namespaces(7))中写入组ID映射。
CAP_SETFCAP(自Linux 2.6.24起)
CAP_SETPCAP
- 如果支持文件Capabilities权限(即自Linux 2.6.24起):将调用线程的边界集中的任何Capability权限添加到其可继承集中;
- 从边界集中删除Capability权限(通过prctl(2)的PR_CAPBSET_DROP操作);对securebits标志进行更改。
如果不支持文件Capabilities权限(即Linux 2.6.24之前的内核):授予或从调用进程的permitted capability权限集中向任何其他进程授予或删除任意capability权限。(当内核配置为支持文件Capabilities权限时,CAP_SETPCAP的此属性不可用,因为对于此类内核,CAP_SETPCAP具有完全不同的语义。)
CAP_SETUID
- 对进程UID进行任意操作(setuid(2),setreuid(2),setresuid(2),setfsuid(2));
- 在通过UNIX域套接字传递套接字凭据时伪造UID;
- 在用户命名空间(参见user_namespaces(7))中写入用户ID映射。
CAP_SYS_ADMIN
注意:此Capability权限是超载的;请参阅下面的内核开发者注意事项。
- 执行一系列系统管理操作,包括:quotactl(2),mount(2),umount(2),pivot_root(2),swapon(2),swapoff(2),sethostname(2)和setdomainname(2);
- 执行特权syslog(2)操作(自Linux 2.6.37起,应使用CAP_SYSLOG来允许此类操作);
- 执行VM86_REQUEST_IRQ vm86(2)命令;
- 访问由CAP_CHECKPOINT_RESTORE管理的相同的检查点/恢复功能(但优先考虑较弱的capability权限来访问该功能);
- 执行与CAP_BPF相同的BPF操作(但优先考虑较弱的capability权限来访问该功能);
- 使用与CAP_PERFMON相同的性能监控机制(但优先考虑较弱的capability权限来访问该功能);
- 对任意System V IPC对象执行IPC_SET和IPC_RMID操作;
- 覆盖RLIMIT_NPROC资源限制;
- 对可信和安全扩展属性执行操作(参见xattr(7));
- 使用lookup_dcookie(2);
- 使用ioprio_set(2)分配IOPRIO_CLASS_RT和(Linux 2.6.25之前)IOPRIO_CLASS_IDLE I/O调度类;
- 在通过UNIX域套接字传递套接字凭据时伪造PID;
- 在涉及打开文件的系统调用中超过/proc/sys/fs/file-max,即系统范围内的最大打开文件数限制(例如,accept(2),execve(2),open(2),pipe(2));
- 使用创建新命名空间的CLONE_*标志,使用clone(2)和unshare(2)(但自Linux 3.8起,创建用户命名空间不需要任何capability权限);
- 访问特权perf事件信息;
- 调用setns(2)(在目标命名空间中需要CAP_SYS_ADMIN);
- 调用fanotify_init(2);
- 执行特权KEYCTL_CHOWN和KEYCTL_SETPERM keyctl(2)操作;
- 执行madvise(2)的MADV_HWPOISON操作;
- 使用TIOCSTI ioctl(2)向调用者的控制终端之外的终端的输入队列插入字符;
- 使用已过时的nfsservctl(2)系统调用;
- 使用已过时的bdflush(2)系统调用;
- 执行各种特权块设备ioctl(2)操作;
- 执行各种特权文件系统ioctl(2)操作;
- 在/dev/random设备上执行特权ioctl(2)操作(参见random(4));
- 在不需要先设置no_new_privs线程属性的情况下安装seccomp(2)过滤器;
- 修改设备控制组的允许/拒绝规则;
- 使用ptrace(2)的PTRACE_SECCOMP_GET_FILTER操作来转储被跟踪进程的seccomp过滤器;
- 使用ptrace(2)的PTRACE_SETOPTIONS操作来挂起被跟踪进程的seccomp保护(即PTRACE_O_SUSPEND_SECCOMP标志);
- 对许多设备驱动程序执行管理员操作;
- 通过写入/proc/[pid]/autogroup修改autogroup的nice值(参见sched(7))。
CAP_SYS_BOOT
- 使用reboot(2)和kexec_load(2)。
CAP_SYS_CHROOT
- 使用chroot(2);
- 使用setns(2)更改mount命名空间。
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),sched_setattr(2));
- 为任意进程设置CPU亲和性(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
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特定模型寄存器(MSR,参见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文件系统上使用保留空间;
- 进行控制ext3日志记录的ioctl(2)调用;
- 覆盖磁盘配额限制;
- 增加资源限制(参见setrlimit(2));
- 覆盖RLIMIT_NPROC资源限制;
- 覆盖控制台分配上的最大控制台数限制;
- 覆盖最大按键映射数限制;
- 允许从实时时钟获得超过64Hz的中断;
- 将System V消息队列的msg_qbytes限制提高到/proc/sys/kernel/msgmnb中的限制之上(参见msgop(2)和msgctl(2));
- 允许在通过UNIX域套接字将文件描述符传递给另一个进程时,绕过"in-flight"文件描述符的RLIMIT_NOFILE资源限制(参见unix(7));
- 在使用F_SETPIPE_SZ fcntl(2)命令设置管道容量时,覆盖/proc/sys/fs/pipe-size-max限制;
- 使用F_SETPIPE_SZ将管道容量增加到超过/proc/sys/fs/pipe-max-size指定的限制;
- 在创建POSIX消息队列时覆盖/proc/sys/fs/mqueue/queues_max、/proc/sys/fs/mqueue/msg_max和/proc/sys/fs/mqueue/msgsize_max限制(参见mq_overview(7));
- 使用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和其他接口公开的内核地址。(有关kptr_restrict的讨论,请参见proc(5)。)
CAP_WAKE_ALARM(自Linux 3.0起)
- 触发会唤醒系统的事件(设置CLOCK_REALTIME_ALARM和CLOCK_BOOTTIME_ALARM定时器)。