在 CentOS(一种基于Red Hat Enterprise Linux的Linux发行版)中,用户提权是指从一个普通用户的权限升级为超级用户(root)权限的过程。这可以通过不同的方式实现,下面列出了三种常见的用户提权方式以及它们之间的差异:
使用su命令:
- 差异:
su
(Switch User)命令允许普通用户切换到其他用户,通常是root用户。与sudo
不同,su
命令在执行后会打开一个新的shell会话,该会话具有切换到的用户的权限,包括root。 - 步骤:用户可以在终端中运行
su
命令,然后输入root密码(如果有密码)以切换到root用户。
使用sudo命令:
- 差异:在CentOS中,通常会将普通用户添加到sudoers文件中,以便使用sudo命令进行权限提升。sudo(Superuser Do)允许特定用户以root权限执行特定的命令。差异在于,用户只有在执行命令时才会临时获取root权限,而不是持久性地获得全部root权限。
- 步骤:管理员可以通过编辑
/etc/sudoers
文件,使用visudo
命令来授权普通用户执行特定命令时使用sudo。例如,可以在该文件中添加一行:username ALL=(ALL) NOPASSWD: /path/to/command
,其中username
是普通用户名,/path/to/command
是允许执行的命令路径。
使用setuid、setgid和sticky位:
- 差异:这种方法涉及更改文件或可执行程序的权限位,以便在执行时获得文件所有者或组的权限,而不需要用户提供密码或交互。
- setuid:如果一个文件的setuid位被设置,那么当普通用户执行该文件时,该文件将以文件所有者的权限(通常是root)运行。这样的文件在执行时暂时获得了文件所有者的权限。
- setgid:类似于setuid,但是应用于文件的组权限。当一个文件的setgid位被设置,执行该文件的用户将以文件所属组的权限运行。
- sticky位:主要用于目录,防止普通用户删除其他用户在该目录下创建的文件。
- 步骤:可以使用
chmod
命令设置setuid、setgid或sticky位,例如:chmod +s filename
。
CentOS使用Capability能力来满足场景需求
在传统的Unix权限模型中,进程要么是普通用户,要么是超级用户(root),而超级用户具有系统上所有资源的完全控制权。然而,这种二元的权限模型过于粗糙,可能会导致过多的权限被授予进程。"Capability" 是一种更细粒度的权限控制方式,它允许进程只获得执行特定操作所需的权限,而不需要完整的超级用户权限。
以下是一些常见的"capability"能力以及它们对应的场景和示例:
-
CAP_NET_BIND_SERVICE:允许进程绑定小于1024的端口,而无需root权限。
- 场景:Web服务器、数据库服务器、网络服务等。
- 示例:Apache HTTP服务器绑定80端口。
-
CAP_SYS_ADMIN:允许执行系统管理任务,但仍受到限制,不同于root权限。
- 场景:容器管理、挂载文件系统、系统资源管理等。
- 示例:Docker容器管理,挂载文件系统。
-
CAP_DAC_OVERRIDE:允许进程忽略文件访问权限限制。
- 场景:需要特定文件或目录的访问,但不需要完整的root权限。
- 示例:防火墙配置工具,需要读取/修改网络配置文件。
-
CAP_SETUID 和 CAP_SETGID:允许进程使用
setuid
和setgid
权限。- 场景:执行特定命令或任务,而不是整个进程都以超级用户运行。
- 示例:使用
ping
命令需要CAP_SETUID
来设置有效用户ID。
-
CAP_SYS_NICE:允许进程修改其他进程的优先级。
- 场景:进程调度控制、任务管理等。
- 示例:任务管理工具,调整进程优先级。
-
CAP_SYS_RESOURCE:允许进程管理资源限制,如文件句柄、进程数等。
- 场景:资源管理、限制。
- 示例:进程监控工具,资源管理工具。
-
CAP_NET_RAW:允许进程发送原始网络数据包。
- 场景:网络嗅探、网络协议开发等。
- 示例:Wireshark,用于捕获和分析网络数据包。
-
CAP_IPC_LOCK:允许进程锁定内存页面,以防止被交换到磁盘。
- 场景:实时系统、内存管理。
- 示例:实时应用程序,如音频处理应用。
-
CAP_KILL :终止其他进程。
场景:
-
容器管理:在容器环境中,可能需要容器管理器(如Docker)能够终止容器内的进程,以便进行管理和资源释放。
-
进程监控:监控工具可能需要有能力终止受监控进程,以处理异常情况或资源泄漏。
-
作业控制:作业控制系统(如调度器)可能需要能够终止作业或任务。
-
以下是Linux中内核的常用"capability"能力
在使用和实现时需要根据场景甄别。
- CAP_CHOWN:更改文件所有者。
- CAP_DAC_OVERRIDE:忽略文件权限限制。
- CAP_DAC_READ_SEARCH:读取和搜索任何文件,不考虑权限。
- CAP_FOWNER:忽略文件的所有权(只适用于文件的所有者)。
- CAP_FSETID:忽略文件设置ID位。
- CAP_KILL:终止其他进程。
- CAP_SETGID:设置进程的有效组ID。
- CAP_SETUID:设置进程的有效用户ID。
- CAP_SETPCAP:设置其他能力的进程能力。
- CAP_LINUX_IMMUTABLE:更改文件的"immutable"标志。
- 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:执行裸IO操作。
- CAP_SYS_CHROOT:更改根文件系统目录。
- CAP_SYS_PTRACE:跟踪/调试进程。
- CAP_SYS_PACCT:使用进程会计功能。
- CAP_SYS_ADMIN:执行系统管理操作。
- CAP_SYS_BOOT:重启系统。
- CAP_SYS_NICE:修改进程优先级。
- CAP_SYS_RESOURCE:操作系统资源管理。
- CAP_SYS_TIME:更改系统时间。
- CAP_SYS_TTY_CONFIG:更改TTY设备配置。
- CAP_MKNOD:创建特殊文件。
- CAP_LEASE:创建和删除文件锁定。
- CAP_AUDIT_WRITE:写入审计日志。
- CAP_AUDIT_CONTROL:审计配置。
- CAP_SETFCAP:设置文件的能力。
- CAP_MAC_OVERRIDE:覆盖强制访问控制(MAC)。
- CAP_MAC_ADMIN:管理强制访问控制(MAC)。
- CAP_SYSLOG:使用系统日志。
- CAP_WAKE_ALARM:允许使用RTC闹钟。
参考资料:
https://man7.org/linux/man-pages/man7/capabilities.7.html
How to start service on the privileged port as a regular user | sleeplessbeastie's notes