编辑
2023-10-25
linux
00
请注意,本文编写于 563 天前,最后修改于 563 天前,其中某些信息可能已经过时。

什么是capabilities>?

capabilities是一种linux安全机制,用于细分和控制进程的权限。它们允许进程在不具备完全root权限的情况下执行特定的特权操作。

传统上,root用户具有完全的系统权限,包括读取、写入和执行任何文件,以及修改系统设置等。然而,这样的权限可能会过于宽松并存在安全风险。为了限制进程的权限,Linux引入了capabilities机制。

通过capabilities,可以将某些特权操作分离出来,赋予非root用户或特定进程组。这样,进程只能具备特定的权限,而不是完整的root权限。

这也是容器主要利用的linux特性之一,限制容器的某些权限来保证安全(容器本质是进程)

关于类型可以查看man手册,man 7 capabilities

image.png

下面是中文翻译版

CAP_AUDIT_CONTROL(自Linux 2.6.11起)

  • 启用和禁用内核审计;
  • 更改审计过滤规则;
  • 检索审计状态和过滤规则。

CAP_AUDIT_READ(自Linux 3.16起)

  • 通过多播Netlink套接字读取审计日志。

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起)

  • 使用特权的BPF操作;详见bpf(2)和bpf-helpers(7)。

  • 在Linux 5.8中添加了此Capability权限,将BPF功能从过载的CAP_SYS_ADMIN权限中分离出来。

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起)

  • 在任意文件上建立租约(参见fcntl(2))。

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起)

  • 使用mknod(2)创建特殊文件。

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起)

  • 在文件上设置任意Capability权限。

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

  • 使用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特定模型寄存器(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定时器)。

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!