权限管理是任何多用户操作系统,尤其是服务器系统的核心与基石。Ubuntu Server 作为全球最流行的 Linux 服务器发行版之一,其强大、灵活且精细的权限控制系统是保障系统安全、稳定和数据保密性的关键。本文旨在对 Ubuntu Server 的权限管理体系进行一次全面、深入的剖析。我们将从最基础的 Linux 权限模型(用户、组、文件权限位)出发,逐步深入到高级主题,如访问控制列表(ACL)、特权管理(SUDO)、安全增强型 Linux(SELinux 和 AppArmor)、特权分离最佳实践,以及利用自动化工具(如 Ansible)进行大规模的权限配置管理。文章将包含大量实际命令、配置示例、安全考量和工作流,旨在为系统管理员、DevOps 工程师和安全专业人员提供一份详尽的参考指南。
在单用户桌面系统中,用户通常以管理员身份运行,权限问题往往被忽视。然而,在服务器环境中,情况截然不同。
Ubuntu Server 继承并发展了 Linux 的权限管理哲学,提供了一套从简单到复杂的完整工具链,本文将逐一解密。
这是 Linux 权限管理的传统模型,也称为 Discretionary Access Control (DAC)——自主访问控制。
/usr/sbin/nologin
),UID 通常在 1000 以下(/etc/login.defs
中 UID_MIN
定义)。/etc/passwd
:存储用户账户信息(用户名、密码占位符‘x’、UID、GID、描述、家目录、登录 shell)。/etc/shadow
:存储加密后的用户密码及密码策略信息(仅 root 可读)。/etc/passwd
中指定,通常与用户名相同。www-data
, developers
, admins
。/etc/group
:存储组信息(组名、密码占位符‘x’、GID、组成员列表)。/etc/gshadow
:存储组密码(较少使用)。sudo adduser <username>
(交互式) 或 sudo useradd -m -s /bin/bash <username>
(非交互式)。-m
:创建家目录。-s
:指定登录 shell。sudo deluser --remove-home <username>
。sudo usermod
。例如,将用户加入附加组: sudo usermod -aG <groupname> <username>
(-aG
表示追加到附加组,非常重要,避免覆盖原有附加组)。sudo addgroup <groupname>
。sudo delgroup <groupname>
。id <username>
显示 UID, GID 和所属组。su - <username>
(-
代表模拟登录,加载目标用户的环境变量)。使用 ls -l
命令查看文件或目录的详细信息时,会看到如下输出:
-rwxr-xr-- 1 alice developers 2048 Jun 12 10:30 script.sh
drwxr-x--- 2 bob www-data 4096 Jun 12 09:15 web_dir/
第一列(如 -rwxr-xr--
)就是权限字符串。
-
普通文件, d
目录, l
符号链接,等)。r
(read):对于文件,可读取内容;对于目录,可列出内容(如 ls
)。w
(write):对于文件,可修改内容;对于目录,可创建、删除、重命名目录内文件(注意:删除文件取决于对目录的写权限,而非文件本身的权限)。x
(execute):对于文件,可作为程序/脚本执行;对于目录,可“进入”该目录(如 cd
),并访问目录内的元信息。r
= 4w
= 2x
= 1
将所需权限的数字相加即可。例如:rwx
= 4+2+1 = 7rw-
= 4+2+0 = 6r-x
= 4+0+1 = 5r--
= 4+0+0 = 4---
= 0
因此,rwxr-xr--
表示为 754
。除了基本的 rwx,还有三个特殊权限位:
/usr/bin/passwd
。s
(如果原来有 x
)或 S
(如果原来无 x
)。4755
。s
或 S
。2770
。/tmp
目录。t
或 T
。1777
。sudo chown <owner>[:<group>] <file>
。sudo chown alice file.txt
, sudo chown alice:developers file.txt
。sudo chgrp <group> <file>
或 sudo chown :<group> <file>
。sudo chmod <mode> <file>
。u
(user), g
(group), o
(others), a
(all), +
(添加), -
(移除), =
(设置)。chmod u+x script.sh
, chmod go-w file.txt
, chmod a=r file.txt
。chmod 755 script.sh
。新创建的文件和目录不会拥有全权限(777
),其权限由默认权限减去 umask 值决定。
777
(drwxrwxrwx),文件为 666
(-rw-rw-rw-)(文件默认无执行权限)。022
。777 - umask
-> 777 - 022 = 755
(drwxr-xr-x)。666 - umask
-> 666 - 022 = 644
(-rw-r--r--)。umask
。umask 027
。~/.bashrc
, ~/.profile
或 /etc/profile
中配置。传统的权限位模型虽然简单,但不够灵活。它只能定义三类权限:所有者、组和其他。如果一个文件需要为多个用户或组设置不同的权限,传统模型就无能为力了。访问控制列表(ACL) 解决了这个痛点。
ACL 允许为单个文件或目录设置更精细的、针对特定用户和组的权限列表。它可以看作是传统权限位的超集。
在 Ubuntu Server 上,ACL 通常默认已启用,但文件系统必须在挂载时启用 acl
选项。检查 /etc/fstab
:
UUID=... /data ext4 defaults,acl 0 2
# 或者对于较新的内核和文件系统(如 ext4, xfs),'acl' 可能已是默认选项,无需显式指定。
setfacl
-m
(modify):修改 ACL 条目。-x
(remove):移除 ACL 条目。-b
(remove all):移除所有扩展 ACL 条目。setfacl -m u:charlie:rwx /shared/data
(为用户 charlie 添加 rwx 权限)setfacl -m g:project:r-x /shared/docs
(为组 project 添加 r-x 权限)setfacl -x u:charlie /shared/data
(移除用户 charlie 的 ACL 条目)getfacl
getfacl /shared/data
getfacl
也会显示传统的权限位信息。setfacl -d -m u:charlie:rwx /shared/dir
(-d
表示 default)。ACL 中存在一个 mask 条目。它并不指定权限给任何特定用户或组,而是作为一个有效权限掩码。任何命名用户、命名组和所属组的最大有效权限都不会超过 mask 的权限。当使用 chmod
更改传统组权限时,mask 也会被自动调整以匹配。
“最小权限原则”要求我们避免直接使用 root 账户。sudo
(Superuser DO) 是允许受信任的用户以另一个用户(通常是 root)的身份执行命令的标准机制。
sudo <command>
时,系统会检查 /etc/sudoers
文件以及 /etc/sudoers.d/
目录下的配置,判断该用户是否有权以 root 身份运行该命令。如果授权成功,系统会提示输入该用户自己的密码(可配置为不输入),然后以 root 权限执行命令。su
(switch user) 要求输入目标用户的密码(如 root 密码),而 sudo
要求输入当前用户的密码。sudo
提供了更细粒度的控制和更清晰的审计日志(记录了哪个普通用户执行了特权命令)。警告:永远不要直接用普通文本编辑器(如 vim
, nano
)直接编辑 /etc/sudoers
文件。语法错误可能导致所有用户都无法获得 sudo 权限,系统无法维护。必须使用 visudo
命令! visudo
会在保存时检查语法有效性。
基本语法结构:
<user/group> <hostlist>=(<runas_user>:<runas_group>) <tag_spec>: <command_list>
alice
)、组名(%developers
,注意 %
)、别名(User_Alias
)。ALL
,表示所有主机。在多主机环境中可以指定特定主机名。(ALL:ALL)
表示可以以任何用户和任何组的身份运行。NOPASSWD
(执行命令时不需输入密码)、PASSWD
(需要密码,默认)、SETENV
(允许设置环境变量)等。/usr/bin/apt
),可以使用通配符,也可以使用别名(Cmnd_Alias
)。%
表示组):%sysadmins ALL=(ALL:ALL) ALLCmnd_Alias
):Cmnd_Alias SOFTWARE = /usr/bin/apt, /usr/bin/dpkg, /usr/bin/snap
david ALL=(root) SOFTWARE最佳实践是避免直接修改 /etc/sudoers
,而是在 /etc/sudoers.d/
目录下创建独立的配置文件。/etc/sudoers
文件最后有一行 #includedir /etc/sudoers.d
,它会包含该目录下所有不以 ~
结尾且不含 .
的文件。
例如,为每个角色或项目创建单独的文件:
sudo visudo -f /etc/sudoers.d/developers
sudo visudo -f /etc/sudoers.d/nginx-admins
这样管理起来更加清晰,也便于通过配置管理工具(如 Ansible)进行自动化部署。
sudo
提供了强大的日志功能,所有通过 sudo 执行的命令都会被记录到 auth.log
(通常位于 /var/log/auth.log
)。每条记录包括:
这对于安全审计至关重要。可以使用工具如 journalctl
或 grep
来查看相关日志:
sudo grep sudo /var/log/auth.log
DAC(自主访问控制)模型有一个根本弱点:如果用户对其拥有的文件权限设置不当,攻击者或恶意软件就可能利用它。强制访问控制(MAC) 系统通过由管理员定义的、不可被用户覆盖的系统级安全策略来弥补这一缺陷。
Ubuntu Server 的默认 MAC 系统是 AppArmor。另一种常见的系统是 SELinux(常见于 RHEL/CentOS/Fedora)。
AppArmor 是一种基于路径的 MAC 系统。它的安全策略(称为“Profile”)为特定应用程序定义了其可以访问的文件、网络端口、能力等资源。
sudo apparmor_status
sudo systemctl stop apparmor
(不推荐,仅用于调试)sudo systemctl reload apparmor
sudo apparmor_parser -r /etc/apparmor.d/<profile_name>
(reload), sudo apparmor_parser -R /etc/apparmor.d/<profile_name>
(remove)。配置文件位于 /etc/apparmor.d/
。文件名通常与二进制路径相关,例如 /usr/sbin/nginx
的配置文件可能是 usr.sbin.nginx
。
配置文件语法示例(一个简化的 Nginx Profile):
#include <tunables/global>
/usr/sbin/nginx {
#include <abstractions/apache2-common> # 包含一些通用规则
#include <abstractions/base>
#include <abstractions/nis>
capability net_bind_service,
capability setgid,
capability setuid,
/etc/nginx/** r,
/usr/sbin/nginx mr,
/var/log/nginx/** rw,
/var/www/html/** r,
# 网络
network inet tcp,
network inet udp,
network inet6 tcp,
network inet6 udp,
}
r
:读w
:写x
:执行m
:在内存中映射可执行文件k
:文件锁定/var/log/syslog
或 /var/log/kern.log
)。这对于调试和生成新策略非常有用。设置模式:
/etc/apparmor.d/force-complain
或使用 aa-complain
。sudo aa-complain /usr/sbin/nginx
sudo aa-enforce /usr/sbin/nginx
AppArmor 的拒绝信息会记录在系统日志中。使用 dmesg
或 journalctl
查看:
sudo dmesg | grep apparmor
sudo journalctl -f -u apparmor --since today | grep DENIED
这些日志对于排除应用程序因被 AppArmor 限制而无法正常工作的问题至关重要。
虽然 Ubuntu 默认使用 AppArmor,但了解 SELinux 也很有价值,特别是在混合环境中。
sudo apt install selinux-basics selinux-policy-default auditd
sestatus
:查看状态。getenforce
:查看当前模式(Enforcing, Permissive, Disabled)。setenforce 0|1
:临时切换模式(0=Permissive, 1=Enforcing)。chcon
:更改文件的安全上下文。restorecon
:将文件的安全上下文恢复为默认值。audit2why
, audit2allow
:分析审计日志并生成策略模块。由于 Ubuntu 生态对 AppArmor 的支持更好,除非有特殊需求,否则建议坚持使用 AppArmor。
理论需要结合实践。本章介绍一些服务器权限管理和安全加固的最佳实践。
sudo adduser --system --no-create-home --group nginx
或使用已有的 www-data
用户。postgres
, redis
, mysql
)。/var/www/html
应属于 www-data
用户,且权限为 755
(目录)和 644
(文件)。/etc/shadow
:应仅为 root 可读 (400
或 600
)。~/.ssh/id_rsa
):应为用户本人可读可写,其他用户无任何权限 (600
)。~/.ssh/id_rsa.pub
, ~/.ssh/known_hosts
):通常为 644
。700
(drwx------
) 或 755
,防止其他用户随意浏览。ALL
。sudo
组或其他自定义管理组,而不是单独配置每个用户。/etc/sudoers
和 /etc/sudoers.d/
中的配置,移除不再需要的权限。对于需要多人协作的目录,结合 SetGID 和 ACL 是一个强大的组合:
# 1. 创建协作组和目录
sudo addgroup project-team
sudo mkdir /srv/project-x
# 2. 设置目录所有者和组,并设置 SetGID
sudo chown root:project-team /srv/project-x
sudo chmod 2770 /srv/project-x # rwxrws--- (SetGID 已设置)
# 3. 为团队成员设置 ACL 以确保他们有权限
sudo setfacl -m g:project-team:rwx /srv/project-x
# 4. 将用户加入组
sudo usermod -aG project-team alice
sudo usermod -aG project-team bob
现在,alice
和 bob
都可以在 /srv/project-x
中创建、修改和删除文件,并且这些文件会自动属于 project-team
组,方便其他组成员操作。
/var/log/auth.log
, sudo
日志,以及 AppArmor/SELinux 的拒绝日志。aide
或 tripwire
建立文件系统基线,并定期检查关键系统文件(如 /bin
, /sbin
, /usr/bin
, /etc
, /etc/shadow
)是否被篡改。auditd
框架可以记录非常细粒度的事件,如特定的系统调用、文件访问、用户命令等。虽然配置复杂,但对于高安全环境是必不可少的。在管理大量服务器时,手动配置权限是不现实的。使用配置管理工具如 Ansible 可以自动化、标准化和文档化权限管理任务。
Ansible 提供了丰富的模块来处理权限管理:
user
模块- name: Create a system user for Nginx
user:
name: nginx
system: yes
shell: /usr/sbin/nologin
state: present
create_home: nogroup
模块- name: Ensure the developers group exists
group:
name: developers
state: presentfile
模块- name: Set permissions on web directory
file:
path: /var/www/html
owner: www-data
group: www-data
mode: '0755'
state: directoryacl
模块- name: Grant ACL permissions to a user on a directory
acl:
path: /srv/shared
entity: charlie
etype: user
permissions: rwx
state: presentlineinfile
模块或专门的 sudo
角色- name: Allow developers group to sudo
lineinfile:
path: /etc/sudoers.d/developers
line: '%developers ALL=(ALL:ALL) ALL'
validate: 'visudo -cf %s'
state: present
create: yes
mode: '0440'注意:使用 validate
参数至关重要,它会在保存前用 visudo
检查语法。将权限管理任务组织成清晰的角色(Roles)和任务列表(Tasks)。例如,可以有一个 base-secure
角色来执行通用的安全加固,一个 nginx
角色来配置 Nginx 及其相关用户和权限。
whoami
)ls -l
)groups
, id
)getfacl
)dmesg | tail
, apparmor_status
, sudo aa-complain
后重试)/etc/hosts
文件。ls -ld
显示 drwxrws...
)。002
或 007
对于协作目录更合适)。Ubuntu Server 的权限管理系统是一个多层次、纵深防御的强大体系。从基础的用户/组和权限位,到灵活的 ACL,再到受控的特权提升工具 sudo,最后到强制的访问控制框架 AppArmor,每一层都为实现“最小权限原则”提供了关键工具。
一名优秀的系统管理员必须深刻理解这些概念和工具,并能够根据实际业务需求,灵活、恰当地组合运用它们。始终牢记安全是一个过程,而不是一个状态。定期审计、监控日志、及时更新策略,并利用自动化工具确保配置的一致性和可重复性,是维护一个安全、稳定、高效的 Ubuntu Server 环境的不二法门。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。