Linux应用rootless化整理.md
背景
以一个应用为例,描述为一个应用不使用 root 用户在 运行
的生命周期需要进行的操作。
参考资料
Unix and Linux System Administration Handbook (Evi Nemeth, Garth Snyder, Trent R. Hein etc.) (Z-Library)
创建用户
当软件系统允许使用sudo
组用户运行时
- 提权能力:确实,如果软件系统允许使用属于
sudo
组的用户运行,那么这些用户可以通过sudo
命令暂时获得root
用户的权限。这意味着他们可以执行通常需要root
权限的操作,例如访问受保护的文件、修改系统设置、安装或卸载软件包等。 - 安全和控制:虽然这种方法提供了很大的灵活性和方便性,但也带来了潜在的安全风险。因为
sudo
允许用户执行任何命令,所以必须谨慎配置/etc/sudoers
文件,以限制用户可以执行的命令范围,遵循最小权限原则。
当软件系统不允许使用sudo
组用户运行时
- 权限规划:在这种情况下,确实需要事先规划和整理软件系统运行所需的所有权限。这包括文件访问权限、网络端口使用权限、特定系统资源的访问等。
- 安装时授权:在软件安装过程中,必须确保所有必要的资源和组件都被正确地授予给将要运行软件的用户账户。这可能包括设置文件和目录的所有权和权限、调整系统配置以允许非
root
用户访问特定的端口或服务等。 - 无提权手段:使用非
sudo
组用户运行的应用确实没有再次提权的手段。这就要求软件的安装、配置和运行必须在不需要进一步提权的情况下进行。这种方法有助于提高系统的安全性,因为它限制了软件在系统上可能造成的影响范围。
创建系统用户需用更高权限
1 |
|
1 |
|
应用的文件访问
从文件归属和访问需求角度进行分类
1. 应用程序文件
- 定义:这些是应用程序的核心文件,包括可执行文件、库文件等。
- 归属:通常归属于 root 或特定的应用用户。
- 访问需求:这些文件需要执行权限,但通常不需要写权限,以确保应用的完整性和安全性。
2. 配置文件
- 定义:包含应用程序运行所需的配置信息的文件。
- 归属:可能归属于 root、特定的应用用户或配置管理组。
- 访问需求:在应用启动或配置更改时需要读取权限,少数情况下(如通过应用内部功能更新配置)可能需要写权限。
3. 日志文件
- 定义:应用程序运行时产生的日志信息存储文件。
- 归属:通常归属于运行应用程序的用户或特定日志用户组。
- 访问需求:需要写权限以记录运行时信息;对于日志审计和故障排查,需要读权限。
4. 数据文件
- 定义:应用程序用于存储数据的文件,如数据库文件、用户上传的文件等。
- 归属:归属于特定的数据管理用户或组或应用程序用户。
- 访问需求:根据应用功能,可能需要读、写、创建和删除权限。
5. 临时文件
- 定义:应用程序运行时临时创建的文件,用于处理数据、缓存等。
- 归属:归属于运行应用程序的用户。
- 访问需求:通常需要读写权限,运行完毕后可能需要删除权限。
6. 外部设备和资源文件
定义:应用程序可能需要访问的外部设备(如USB设备)或网络资源(如通过网络共享访问的文件)。归属:这些文件的归属和权限由外部系统或网络协议定义。访问需求:根据外部资源的性质,可能需要特定的读写权限。
应用的网络管理
应用的虚拟化权限管理
docker 相关
Unix and Linux System Administration Handbook
Chapter 25 Containers
Container in practice 中有一个例子讲述关于 docker 权限过高导致的风险以及如何管理有 docker 的 Linux 系统的权限分配方案
未整理的提权操作
- 安装或卸载软件包:在系统级别安装或卸载软件,特别是使用包管理器(如APT、YUM或Pacman)时。
- 修改系统文件:编辑位于
/etc
、/var
等目录下的配置文件。这些文件通常控制系统的启动、网络配置、安全策略等。 - 管理用户和用户组:创建、修改或删除用户账户和用户组,以及修改用户权限。
- 更改文件所有权:使用
chown
命令更改文件或目录的所有者,特别是当这些文件属于其他用户或系统用户时。 - 配置网络设置:更改IP地址、路由表、防火墙规则等网络配置。
- 管理系统服务:启动、停止、重启系统服务或守护进程,如Web服务器、数据库服务等。
- 监听低编号端口:通常,只有
root
用户才能监听1024以下的端口,这些端口被认为是“特权”端口。 - 分配受保护的硬件资源:例如,配置新的硬盘、分区和文件系统,或者直接访问某些硬件设备。
- 设置系统时间和日期:更改系统的当前时间和日期,包括与网络时间协议(NTP)服务器的同步。
- 访问日志文件:查看位于
/var/log
目录下的系统日志文件,这些文件通常包含重要的系统运行和安全信息。 - 修改内核参数:使用
sysctl
或直接编辑/proc/sys/
目录下的文件来调整内核运行时参数。 - 配置定时任务:为系统级别的定时任务配置
cron
作业,需要编辑/etc/crontab
文件或在/etc/cron.*
目录下添加脚本。 - 管理持久性存储设备:格式化和分区硬盘,管理逻辑卷(使用LVM),或者修改文件系统(如使用
fsck
命令检查和修复文件系统)。 - 控制防火墙和安全设置:配置
iptables
或firewalld
规则,管理SELinux或AppArmor安全策略。 - 访问受限日志和数据文件:某些日志文件和数据文件因包含敏感信息而受到保护,只有
root
用户才能访问。 - 管理虚拟化资源:创建和管理虚拟机或容器(如使用KVM、Docker等),通常需要更高权限来访问和分配硬件资源。
- 备份和恢复操作:对系统文件进行备份和恢复时,尤其是使用工具直接访问原始设备或进行大范围文件系统操作。
- 修改引导加载器配置:配置GRUB或其他引导加载器的设置,如更改启动参数或管理多重启动设置。
- 加载或卸载内核模块:使用
modprobe
、insmod
或rmmod
命令加载或卸载内核模块。 - 直接访问设备文件:通过
/dev
目录下的设备文件直接与硬件通信,比如进行磁盘I/O操作或配置特定的硬件设备。
网络相关
- 修改网络接口配置:配置或更改网络接口的IP地址、子网掩码、网关等参数,通常通过
ifconfig
(已经较少使用)或ip
命令进行。 - 配置路由表:添加或删除路由规则,管理系统的路由表,这对于定制网络流量的路径非常重要,可以使用
route
或ip route
命令。 - 配置和管理防火墙:设置或更改
iptables
、nftables
或firewalld
等防火墙工具的规则,以控制进出网络流量的允许或禁止。 - 启动网络服务:在低于1024的端口启动网络服务,这些端口被认为是特权端口,很多基础网络服务(如HTTP、HTTPS、SSH)默认运行在这些端口上。
- 配置端口转发和NAT(网络地址转换):通过
iptables
或其他网络工具配置端口转发和NAT规则,这对于网络地址和端口的映射非常重要,特别是在多个网络之间进行通信时。 - 监控和捕获网络流量:使用
tcpdump
、wireshark
(在非图形界面环境中使用tshark
)等工具监控和捕获网络接口上的流量,通常需要更高权限来访问网络接口。 - 修改系统的网络设置:比如通过
sysctl
命令调整TCP/IP栈的行为,例如改变IP转发、TCP窗口缩放等参数。 - 管理VPN和其他隧道接口:设置和配置VPN连接或其他类型的网络隧道,如IPsec、OpenVPN或WireGuard等,这些操作需要访问网络配置和安全密钥。
- 绑定到特权端口:除了启动网络服务外,直接绑定到1024以下的特权端口进行监听也需要更高的权限。
- 配置动态主机配置协议(DHCP):设置和管理DHCP服务器或客户端,为网络设备动态分配IP地址。
问题
在如今虚拟化如此普及的今天,要么,应用都在容器中被隔离,要么,大厂商的软件都是独占机器的,机器和软件都是一家的,是否真的有收紧权限的必要性,是不是从找到漏洞的角度去做到安全更 “合理”。
解答
最小权限原则
- 安全最佳实践:即使在高度隔离的环境中,应用最小权限原则(Least Privilege Principle)仍然是安全最佳实践的核心。这个原则要求只授予完成特定任务所必需的最少权限,从而限制安全漏洞被利用的潜在影响。
容器与虚拟化环境的漏洞
- 隔离并非万无一失:虽然容器和虚拟机提供了隔离环境,但它们自身也可能包含漏洞,这些漏洞可能被利用来逃逸隔离或提升权限。例如,历史上曾经发现过多个容器逃逸漏洞。
内部威胁与配置错误
- 内部威胁:过宽的权限设置不仅增加了外部攻击者的攻击面,也增加了内部威胁的风险。一个内部人员或恶意软件可能利用不必要的高权限来进行数据泄露、破坏或其他恶意行为。
- 配置错误:权限设置过宽还可能导致配置错误,从而无意中暴露敏感数据或系统功能。随着环境变得更加复杂,这种风险也相应增加。
法规和合规性要求
- 合规性要求:许多行业和国际标准(如GDPR、HIPAA、PCI DSS)对数据保护和访问控制有严格要求。实施严格的权限控制是满足这些要求的关键组成部分。
安全与漏洞发现的平衡
- 漏洞发现重要,但不是唯一解决方案:虽然发现并修补安全漏洞是提高软件安全性的重要手段,但仅依赖于漏洞发现并不足以全面保障安全。权限管理是构建深度防御策略(Defense in Depth)的一个重要方面,能够在漏洞被发现并利用之前提供额外的保护层。
Linux应用rootless化整理.md
https://abrance.github.io/2024/02/27/mdstorage/domain/linux/Linux应用rootless化整理/