在对车机的Linux系统做用户最小化检查时遇到用户复杂、不好判断的情况。大部分系统中会运行着各种服务进程,这些服务会创建各种用户用来专门运行各自的进程。所以在判断系统是否存在多余用户的时候,没有一个明确的规则,判断模糊,效率低下。
在网上搜寻查阅了Linux用户相关的信息,了解了Linux用户类型、伪用户等知识,写了个命令方便以后测试时快速找出可疑用户。
Linux伪用户:实现访问控制的利器-猿码集 (yingnd.com)
1. Linux用户类型
1.1. 用户类型
超级用户(root用户):拥有对系统的完全控制权,用户ID(UID)为0,通常用于系统管理和维护任务。
系统用户:由系统进程和服务使用,而不是实际的用户。例如,Web服务器、数据库服务器等进程可能以特定系统用户的身份运行。
普通用户:大多数使用Linux系统的用户。对系统的访问权限受到限制,以保护系统免受意外或恶意操作的影响。
1.2. 用户组类型
私有用户组:默认情况下,当用户被创建时,系统会创建一个与之同名的私有用户组。该用户是其私有用户组的唯一成员。
系统用户组:用于系统进程和服务。例如,Web服务器进程可能属于www-data
用户组。
共享用户组:允许多个用户共享对特定文件或目录的访问权限。例如,一个项目团队可能共享一个用户组,以便共同访问项目文件。
特殊用户组:具有特殊权限或用途的用户组。例如,sudo
用户组允许其成员执行需要超级用户权限的命令。
2. Linux的etc目录
etc目录下一些与用户权限、安全配置相关的文件:
文件/目录路径 | 具体作用 |
---|---|
/etc/passwd | 包含系统上所有用户的基本信息,如用户名、用户ID、用户所属的主组ID、家目录和默认Shell等。 |
/etc/shadow | 存储用户的加密密码及与密码相关的安全策略,如密码的过期时间、密码更改间隔等。只有root用户才能读取。 |
/etc/group | 包含系统上所有用户组的信息,包括组名、组ID以及属于该组的用户列表。用于管理用户组及其成员。 |
/etc/sudoers | sudo程序的配置文件,用于定义哪些用户可以以何种权限执行哪些命令。用于精细控制用户对系统资源的访问权限。 |
/etc/hosts.allow | 用于配置TCP Wrappers的访问控制,定义了允许访问的规则。 |
/etc/hosts.deny | 用于配置TCP Wrappers的访问控制,定义了拒绝访问的规则。 |
/etc/ssh/sshd_config | SSH服务器的配置文件,用于设置SSH连接的参数和安全选项。 |
/etc/selinux/config | SELinux的配置文件,用于控制SELinux的安全策略模式。 |
/etc/pam.d/ | 包含PAM认证模块的配置文件。PAM提供了一种灵活的认证机制,用于控制对系统资源的访问。 |
/etc/login.defs | 包含系统登录时的默认设置,如密码策略、用户会话时间限制等。用于统一设置系统范围内的登录策略。 |
/etc/security/limits.conf | 用于设置系统资源的限制,如每个用户或进程可以打开的文件数、可以使用的CPU时间等。用于防止单个用户或进程消耗过多资源。 |
在做Linux用户最小权限检查时,主要关注以下几个文件:
/etc/passwd
/etc/shadow
/etc/group
/etc/sudoers
3. Linux伪用户(pseudo user)
Linux系统中的伪用户(pseudo user)是一种特殊的用户身份标识,它们并不对应于真实的个体用户,而是由系统创建并用于特定的目的。伪用户在系统资源访问控制、运行环境配置以及满足特定系统进程对文件、目录、设备等资源的属主和组信息要求方面发挥着重要作用。
3.1. 伪用户特征
没有登录权限和有效的shell:伪用户并不能像普通用户那样登录系统,它们也没有分配有效的shell。这意味着伪用户不能直接与系统交互或执行命令。 伪用户的登录Shell通常为空,或者设置为特定的值,如/usr/sbin/nologin
或/bin/false
。
用户名与特定系统进程或服务关联:如bin
(拥有可执行的用户命令文件)、sys
(拥有系统文件)、adm
(拥有账户文件)等。
伪用户名 | 简要说明 |
---|---|
bin | 拥有可执行的用户命令文件 |
daemon | 系统守护进程通常使用的伪用户身份 |
sys | 拥有系统文件,确保系统文件的安全性和正确性 |
adm | 拥有帐户文件,与系统的账户管理相关 |
uucp | UUCP(Unix-to-Unix Copy)服务使用 |
lp/lpd | 打印机守护进程使用,与打印服务相关 |
邮件守护进程使用,处理系统邮件 | |
news | 新闻守护进程使用,与新闻组服务相关 |
nobody | 不拥有任何文件访问权限,用于运行不需要特定用户权限的进程或服务 |
其他 | 如apache、ftp、mysql、sshd等,与特定的网络服务相关,用于隔离和限制服务权限 |
可以没有宿主目录:与普通用户不同,伪用户可能并没有分配宿主目录。这是因为伪用户通常不需要存储个人文件或配置信息,它们仅仅是为了满足系统进程的需求而存在的。
ID值范围:虽然这个特征与你提到的UID范围有些重叠,但值得注意的是,伪用户的ID值(包括UID和GID)通常会被分配在特定的范围内(如1~499),以便与普通用户(UID通常从500或1000开始)相区分。不过,具体的范围可能会因不同的Linux发行版和配置而有所不同。
3.2. 查找“真用户”
根据伪用户特征,可以写一条命令来自动输出所有非伪用户。
awk -F':' '($7 !~ /nologin|false/ || $1 == "root")' /etc/passwd
这条命令使用!~
操作符,它表示字段$7
(登录shell)不匹配正则表达式/nologin|false/
,即登录shell中不包含nologin
或false
。如果登录shell不包含这两个字符串之一,或者用户名是root
,则输出该用户的完整记录。
由于不同Linux发行版中伪用户的UID范围不一样,所以就没有把ID值加入判断条件。
以下是我在kali中运行的结果:
┌──(kali㉿kali)-[~]
└─$ awk -F':' '($7 !~ /nologin|false/ || $1 == "root")' /etc/passwd
root:x:0:0:root:/root:/usr/bin/zsh
sync:x:4:65534:sync:/bin:/bin/sync
postgres:x:130:132:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
kali:x:1000:1000:,,,:/home/kali:/usr/bin/zsh
cntlm:x:138:65534::/var/run/cntlm:/bin/sh
arpwatch:x:139:142:ARP Watcher,,,:/var/lib/arpwatch:/bin/sh
4. Linux用户权限最小化原则
Linux的用户最小化原则是指在Linux系统中,为了增强系统的安全性和管理效率,应尽量减少不必要的用户账户和权限分配。具体来说,这一原则包括但不限于以下几个方面:
- 登录用户最小化:平时应养成不使用root账号登录的好习惯,只有在必要时才使用root账户。普通用户应通过sudo等方式提升权限来执行需要高权限的操作。
- 用户授权最小化:为每个用户分配最小的必要权限,确保用户只能访问和修改其工作所必需的系统资源。避免为用户分配过多的权限,以减少潜在的安全风险。
- 系统服务最小化:无用的服务不开启,减少系统暴露的攻击面。只有必要的服务才应该运行,以降低系统被恶意利用的风险。
5. 提供一条参考用例
- 用例名称:系统用户管理
- 测试目的:测试系统是否存在不必要的用户
- 测试工具:ADB、SSH
- 测试步骤:
- 尝试通过ADB、SSH等远程调试工具连接进入样件系统;
- 通过查看/etc/passwd等相关文件判断系统是否存在非必要的用户,如果系统存在除伪用户以外的其它用户则进行步骤3,如果不存在其它用户则测试通过;
- 查看其它用户的权限,如果用户存在不必要权限,则测试不通过;如果用户权限为系统正常运行所必需权限,则测试通过。
0