背景与适用场景
Linux 是一个多用户操作系统,文件权限管理是系统安全的基石。正确的权限设置可以防止未授权访问、限制用户操作范围、保护敏感数据。无论是最简单的个人 VPS 还是大型企业服务器,权限管理都是运维工程师每天都要面对的问题。
权限设置错误的典型表现包括:网站无法正常访问、应用程序无法写入日志、数据库无法启动、敏感配置文件被普通用户读取、安全漏洞被利用等。这些问题往往看起来五花八门,但追根溯源,十有八九是权限配置不当。
本文面向初中级运维工程师,深入讲解 Linux 权限模型的核心概念、chmod 和 chown 的详细用法、特殊权限位、ACL 访问控制列表,以及生产环境中常见的权限问题和解决方案。
第一部分:Linux 权限模型核心概念
基本权限模型
Linux 的每个文件都有三组权限信息:
所有者权限(Owner):文件所属用户的权限
所属组权限(Group):文件所属组的成员的权限
其他用户权限(Others):除所有者和组成员之外的其他所有用户的权限
每组权限包含三个标志位:
读(r/4):查看文件内容 / 列出目录文件列表
写(w/2):修改文件内容 / 在目录中创建删除文件
执行(x/1):执行文件 / 进入目录
查看文件权限
使用ls -l可以看到详细的权限信息:
ls -l /var/log/syslog
输出示例:
-rw-r----- 1 syslog adm 12345 May 29 10:30 /var/log/syslog
逐字段解释:
- rw- r-- --- | | | | | | | +-- Others 权限(无任何权限) | | +------ Group 权限(只读) | +---------- Owner 权限(读写,无执行) +------------- 文件类型(- = 普通文件,d = 目录,l = 符号链接)
权限位还可以用数字表示:640
| 权限值 | 二进制 | 说明 |
|---|---|---|
| 0 | 000 | 没有任何权限 |
| 1 | 001 | 只有执行 |
| 2 | 010 | 只有写入 |
| 3 | 011 | 写入和执行 |
| 4 | 100 | 只有读取 |
| 5 | 101 | 读取和执行 |
| 6 | 110 | 读取和写入 |
| 7 | 111 | 读取、写入、执行 |
权限与目录的关系
权限对文件和目录的意义不同:
| 权限 | 对文件的意义 | 对目录的意义 |
|---|---|---|
| r(读) | 查看文件内容 | 列出目录中的文件名(ls) |
| w(写) | 修改文件内容 | 在目录中创建、删除、重命名文件 |
| x(执行) | 执行文件(脚本或程序) | 进入目录(cd) |
关键点:目录的写权限允许删除目录内的文件,不管文件本身的权限是什么。这就是为什么目录权限要单独注意。
默认权限与 umask
创建新文件或目录时,系统会设置默认权限。默认权限由umask值决定。
查看当前 umask:
umask
输出通常是0022或0002。
文件的默认权限:666 - umask
目录的默认权限:777 - umask
以 umask 0022 为例:
新建文件权限:666 - 022 = 644(rw-r--r--)
新建目录权限:777 - 022 = 755(rwxr-xr-x)
临时修改 umask(当前 shell 生效):
umask0027
永久修改 umask 需要在 shell 配置文件(如 ~/.bashrc 或 /etc/profile)中添加。
第二部分:chmod 详解
chmod 是 change mode 的缩写,用于修改文件或目录的权限。
数字权限法
最常用的权限设置方式:
chmod 755 /path/to/file # rwxr-xr-x chmod 644 /path/to/file # rw-r--r-- chmod 600 /path/to/file # rw------- chmod 700 /path/to/directory# rwx------
三组权限分别对应三个数字:
# chmod ABC path # A = 所有者权限 # B = 所属组权限 # C = 其他用户权限 # 755 含义: # 7 = rwx(所有者:读+写+执行) # 5 = r-x(所属组:读+执行) # 5 = r-x(其他用户:读+执行)
符号权限法
更精细的权限控制方式:
# 语法:chmod [who][operator][permission] file # who: u (所有者), g (所属组), o (其他用户), a (所有人) # operator: + (添加), - (移除), = (设置) # permission: r, w, x
常用操作示例:
# 给所有者添加执行权限 chmod u+x script.sh # 移除所属组的写权限 chmod g-w file.txt # 设置其他用户只有读权限 chmod o=r file.txt # 给所有人添加读和执行权限 chmod a+rx program # 设置所有者有所有权限,组和其他用户只有读和执行 chmod u=rwx,go=rx file
组合操作
一次性修改多组权限:
# 同时修改所有者和所属组权限 chmod ug+rw file.txt # 设置所有者=读写执行,所属组=读执行,其他=读 chmod u=rwx,g=rx,o=r file
递归修改
修改目录及其所有内容:
# 递归修改目录权限
chmod -R 755 /var/www/html
# 递归修改,但只修改文件
find /var/www/html -typef -execchmod 644 {} ;
# 递归修改,但只修改目录
find /var/www/html -typed -execchmod 755 {} ;
常用权限值参考
| 权限值 | 权限字 | 典型用途 |
|---|---|---|
| 777 | rwxrwxrwx | 所有人可读写执行(危险) |
| 755 | rwxr-xr-x | 可执行程序、公开目录 |
| 750 | rwxr-x--- | 私有目录,所有者和组可访问 |
| 700 | rwx------ | 私有文件,只有所有者可访问 |
| 644 | rw-r--r-- | 公开文件,配置文件 |
| 600 | rw------- | 私有文件,只有所有者可读写 |
| 500 | r-x------ | 所有者可读执行 |
| 400 | r-------- | 只读文件,密码文件 |
特殊权限位
除了基本的 rwx 权限,Linux 还有三个特殊权限位:
SUID(Set User ID)
作用:执行文件时,以文件所有者的身份运行
设置:chmod u+s file或chmod 4755 file
典型应用:/usr/bin/passwd(修改密码时需要访问 /etc/shadow)
-rwsr-xr-x 1 root root 12345 May 29 10:30 /usr/bin/passwd # 注意所有者权限位的 s,表示 SUID 已设置
SGID(Set Group ID)
作用:执行文件时,以文件所属组的身份运行;目录中新创建的文件继承目录的组
设置:chmod g+s dir或chmod 2755 dir
典型应用:共享目录,团队成员创建的文件都属于同一个组
drwxrwsr-x 2 root root 4096 May 29 10:30 /shared/project # 注意所属组权限位的 s,表示 SGID 已设置
Sticky Bit
作用:目录中只有文件所有者可以删除或重命名自己的文件
设置:chmod +t /shared或chmod 1777 /shared
典型应用:/tmp目录,所有用户都可以在 /tmp 中创建文件,但不能删除他人文件
drwxrwxrwt 10 root root 4096 May 29 10:30 /tmp # 注意其他用户权限位的 t,表示 Sticky Bit 已设置
权限修改示例
让脚本可执行:
chmod +x /usr/local/bin/myscript.sh chmod u+x /usr/local/bin/myscript.sh # 效果相同 chmod 755 /usr/local/bin/myscript.sh # 效果相同,但更明确
设置 Web 目录权限(常见场景):
# 目录需要 755(所有者读写执行,组和其他人读执行) chmod 755 /var/www/html # 文件需要 644(所有者读写,其他人只读) chmod 644 /var/www/html/*.html # 允许 PHP 写入的上传目录 chmod 775 /var/www/html/uploads
设置数据库文件权限(MySQL 为例):
# 数据目录 chown -R mysql:mysql /var/lib/mysql chmod -R 700 /var/lib/mysql # 配置文件 chown mysql:mysql /etc/mysql/my.cnf chmod 640 /etc/mysql/my.cnf
权限检查与诊断
查看文件权限:
ls -la /path/to/file stat/path/to/file
查看目录权限:
ls -ld /path/to/directory
使用 getfacl 查看 ACL 权限(如果配置了 ACL):
getfacl /path/to/file
第三部分:chown 详解
chown 是 change owner 的缩写,用于修改文件或目录的所有者和所属组。
基本用法
只修改所有者:
chown user /path/to/file
同时修改所有者和所属组:
chown user:group /path/to/file
使用冒号分隔,冒号前是用户,冒号后是组。
只修改所属组:
chown :group /path/to/file
递归修改
递归修改目录及其所有内容:
chown -R user:group /path/to/directory
使用参考文件
使用另一个文件的权限作为参考:
chown --reference=/etc/passwd /etc/shadow
这会把 /etc/shadow 的所有者和所属组设置成和 /etc/passwd 一样。
常用场景
Web 应用权限设置
Nginx + PHP-FPM 场景(两者使用相同用户):
chown -R www-data:www-data /var/www/html
Nginx 和 PHP-FPM 使用不同用户(推荐生产使用):
# 网站目录所有者设为 nginx(nginx 运行用户) chown -R nginx:nginx /var/www/html # 上传目录所有者设为 php-fpm(PHP-FPM 运行用户) chown -R php-fpm:php-fpm /var/www/html/uploads # 或者使用 ACL 给两组用户不同权限 setfacl -R -m urx /var/www/html/uploads setfacl -R -m urw /var/www/html/uploads
数据库权限设置
MySQL 数据目录:
chown -R mysql:mysql /var/lib/mysql chmod -R 700 /var/lib/mysql
PostgreSQL 数据目录:
chown -R postgres:postgres /var/lib/postgresql chmod -R 700 /var/lib/postgresql
日志目录权限
应用日志目录:
chown -R myapp:adm /var/log/myapp chmod -R 750 /var/log/myapp
服务配置权限
Nginx 配置目录:
chown -R root:root /etc/nginx chmod -R 640 /etc/nginx/*.conf chmod 755 /etc/nginx
用户和组的创建
创建新用户:
# 创建用户(自动创建同名组) useradd -m -s /bin/bash deploy # 创建用户并指定组 useradd -m -g www-data -s /bin/bash deploy # 创建系统用户(不创建家目录,不能登录) useradd -r -s /sbin/nologin nginx
创建新组:
groupadd developers
将用户添加到组:
# 添加用户到附加组 usermod -aG developers user1 # 查看用户所属的组 groups user1 id user1
查看用户和组信息
# 查看用户信息 id username # 查看所有用户 cat /etc/passwd # 查看所有组 cat /etc/group # 查看当前用户 whoami # 查看当前用户详细信息 who am i
第四部分:ACL 访问控制列表
ACL(Access Control List)提供了比传统权限模型更细粒度的控制。
检查 ACL 支持
大多数现代 Linux 文件系统(ext4、xfs、btrfs)都支持 ACL。检查文件系统是否支持:
# 临时启用 ACL(如果文件系统默认未启用) tune2fs -o acl /dev/sda1 mount -o acl /dev/sda1 /mnt
查看 ACL 权限
getfacl /path/to/file
输出示例:
# file: file.txt # owner: root # group: root user::rw- userrw- group::r-- grouprw- mask::rw- other::r--
设置 ACL 权限
给特定用户设置权限:
setfacl -m urw /path/to/file
给特定组设置权限:
setfacl -m grx /path/to/directory
ACL 权限格式
upermission # 特定用户的权限 gpermission# 特定组的权限 o:permission # 其他用户权限(相当于 chmod o:) m:permission # 掩码权限
常用 ACL 操作
设置默认 ACL
目录可以设置默认 ACL,新创建的文件和子目录会自动继承:
# 为目录设置默认 ACL setfacl -m dwww-data:rw /var/www/html/uploads # 查看默认 ACL getfacl /var/www/html/uploads
删除 ACL 条目
# 删除特定用户的 ACL setfacl -x u:username /path/to/file # 删除特定组的 ACL setfacl -x g:groupname /path/to/file # 删除所有 ACL(恢复传统权限) setfacl -b /path/to/file
递归设置 ACL
# 递归设置目录下所有文件和目录 setfacl -R -m urw /var/www/html/uploads # 设置默认 ACL(只影响新建的文件) setfacl -R -m dwww-data:rw /var/www/html/uploads
ACL 与传统权限的关系
传统权限是最基本的控制
ACL 在传统权限基础上添加更细粒度的控制
有效权限(Effective Permission)受 mask 限制
getfacl 输出中,mask::行显示当前生效的掩码
修改 mask:
setfacl -m m::rwx /path/to/file
Web 应用 ACL 配置示例
Nginx + PHP-FPM 分离用户的场景:
# /var/www/html 目录,nginx 用户需要读取,php-fpm 用户需要读写 chown nginx:nginx /var/www/html chmod 750 /var/www/html # 为 php-fpm 用户添加写权限 setfacl -R -m urw /var/www/html/uploads # 为 nginx 用户添加读权限 setfacl -R -m urx /var/www/html/uploads # 设置默认 ACL,新文件自动继承 setfacl -R -m dphp-fpm:rw /var/www/html/uploads setfacl -R -m dnginx:rx /var/www/html/uploads # 验证 getfacl /var/www/html/uploads
备份和恢复 ACL
备份:
getfacl -R /path/to/directory > acl_backup.txt
恢复:
setfacl --restore=acl_backup.txt
第五部分:生产环境权限问题排查
问题一:Web 应用无法读取文件
现象
Nginx 返回 403 Forbidden。
排查步骤
查看 Nginx 错误日志
tail -20 /var/log/nginx/error.log
查看文件权限
ls -la /var/www/html/index.html
查看 Nginx 运行用户
ps aux | grep nginx
常见原因
文件所有者不是 Nginx 运行用户
目录缺少执行权限(无法 cd 进入)
SELinux 或 AppArmor 限制
解决方案
# 确保文件所有者正确 chown nginx:nginx /var/www/html/index.html # 确保目录有执行权限 chmod 755 /var/www/html # 确保文件有读权限 chmod 644 /var/www/html/index.html
问题二:Web 应用无法写入文件
现象
上传图片失败,或日志无法写入。
排查步骤
查看 PHP-FPM 或应用错误日志
检查目录权限
ls -ld /var/www/html/uploads
检查 PHP-FPM 运行用户
ps aux | grep php-fpm
检查目录所在文件系统是否可写
df -h /var/www/html/uploads mount | grep /var/www
解决方案
上传目录需要可写权限:
chown php-fpm:php-fpm /var/www/html/uploads chmod 775 /var/www/html/uploads
如果使用了 SELinux:
# 查看 SELinux 上下文 ls -Z /var/www/html/uploads # 修改 SELinux 上下文 chcon -R -t httpd_sys_rw_content_t /var/www/html/uploads # 永久修改(下次 restorecon 不会重置) semanage fcontext -a -t httpd_sys_rw_content_t"/var/www/html/uploads(/.*)?"
问题三:数据库无法启动
现象
MySQL 或 PostgreSQL 启动失败。
排查步骤
查看数据库错误日志
# MySQL tail -50 /var/log/mysql/error.log # PostgreSQL tail -50 /var/log/postgresql/postgresql-XX-main.log
检查数据目录权限
# MySQL ls -la /var/lib/mysql # PostgreSQL ls -la /var/lib/postgresql
检查配置文件权限
# MySQL ls -la /etc/mysql/my.cnf # PostgreSQL ls -la /etc/postgresql/*/main/postgresql.conf
解决方案
MySQL 数据目录权限修复:
# 停止 MySQL systemctl stop mysql # 修复权限 chown -R mysql:mysql /var/lib/mysql chmod -R 700 /var/lib/mysql # 重启 MySQL systemctl start mysql
PostgreSQL 数据目录权限修复:
# 停止 PostgreSQL systemctl stop postgresql # 修复权限 chown -R postgres:postgres /var/lib/postgresql chmod -R 700 /var/lib/postgresql # 重启 PostgreSQL systemctl start postgresql
问题四:SSH 密钥登录失败
现象
使用 SSH 公钥认证失败。
排查步骤
检查用户家目录权限
ls -la ~user/
检查 .ssh 目录权限
ls -la ~user/.ssh/
检查 authorized_keys 文件权限
ls -la ~user/.ssh/authorized_keys
正确权限要求
/home/username -> 700 或 755 /home/username/.ssh -> 700 /home/username/.ssh/authorized_keys -> 600
修复权限
chmod 700 ~user/.ssh chmod 600 ~user/.ssh/authorized_keys chmod 755 ~user
问题五:脚本执行报错 "Permission denied"
现象
执行 shell 脚本报错:bash: ./script.sh: Permission denied
排查步骤
检查脚本权限
ls -la script.sh
检查脚本是否有 shebang 行
head -1 script.sh
解决方案
添加执行权限:
chmod +x script.sh # 或 chmod 755 script.sh
如果脚本使用#!/bin/bash,确保 /bin/bash 有执行权限:
ls -la /bin/bash
问题六:共享目录中用户无法访问他人文件
现象
团队成员在共享目录中无法读取他人创建的文件。
排查步骤
检查目录权限
ls -ld /shared
检查文件默认权限
umask
解决方案
使用 SGID 确保文件继承目录的组:
# 设置目录 SGID chmod 2775 /shared # 设置目录所有者和组 chown :developers /shared # 设置 umask 让新建文件自动有组写权限 # 在 /etc/profile 或 ~/.bashrc 中添加: umask002
验证:
# 用户 A 创建文件 touch /shared/file_a.txt ls -la /shared/file_a.txt # 应该是 -rw-rw-r-- (664) # 用户 B 可以读取和修改
第六部分:安全最佳实践
最小权限原则
只授予完成任务所需的最小权限,不要过度授权。
# 不推荐:所有文件都用 777
chmod -R 777 /var/www/html
# 推荐:目录 755,文件 644
find /var/www/html -typed -execchmod 755 {} ;
find /var/www/html -typef -execchmod 644 {} ;
# 需要写入的目录单独设置
chmod 775 /var/www/html/uploads
chown www-data:www-data /var/www/html/uploads
敏感文件保护
敏感文件要严格控制访问权限:
# 用户密码文件 chmod 640 /etc/passwd chmod 600 /etc/shadow # SSH 私钥 chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub # 数据库配置文件 chmod 640 /etc/mysql/my.cnf chmod 640 /etc/postgresql/*/main/pg_hba.conf # 应用密钥文件 chmod 600 /var/www/html/.env
服务专用用户
每个服务使用独立的系统用户:
# 创建 Nginx 用户(如默认不存在) useradd -r -s /sbin/nologin nginx # 创建 PHP-FPM 用户 useradd -r -s /sbin/nologin php-fpm # 创建数据库用户 useradd -r -s /sbin/nologin mysql useradd -r -s /sbin/nologin postgres # 创建应用用户 useradd -m -s /bin/bash myapp
定期权限审计
建立权限检查机制:
#!/bin/bash # 权限审计脚本 echo"=== 权限审计报告 ===" echo"时间:$(date)" echo"" # 检查敏感文件权限 echo"--- 敏感文件权限检查 ---" forfilein/etc/passwd /etc/shadow /etc/group;do perms=$(stat-c"%a"$file) owner=$(stat-c"%U:%G"$file) echo"$file:$owner$perms" done echo"" # 检查是否存在 777 权限的文件或目录 echo"--- 检查 777 权限(危险)---" find /var/www -perm -007 -typef 2>/dev/null | head -10 find /var/www -perm -007 -typed 2>/dev/null | head -10 echo"" # 检查未授权的可执行文件 echo"--- 检查可疑的可执行文件 ---" find /tmp -perm /111 -typef 2>/dev/null | head -10
目录权限规范
常见目录的推荐权限:
| 目录 | 推荐权限 | 说明 |
|---|---|---|
| /home/user | 755 | 家目录 |
| /home/user/.ssh | 700 | SSH 密钥目录 |
| /var/www/html | 755 | 网站根目录 |
| /var/www/html/uploads | 775 | 上传目录 |
| /var/log/app | 750 | 应用日志 |
| /data/shared | 2775 | 共享目录(带 SGID) |
| /tmp | 1777 | 临时目录(带 Sticky Bit) |
| /etc/nginx | 750 | Nginx 配置 |
| /var/lib/mysql | 700 | MySQL 数据 |
umask 设置建议
根据应用场景设置合适的 umask:
# 系统级默认 umask(/etc/profile) umask0027 # 团队共享目录(在 ~/.bashrc 中针对特定用户) if["$(id -gn)"="developers"];then umask002 fi # Web 应用用户 su - www-data -c"umask 002"
第七部分:权限操作的风险与回滚
高风险操作识别
以下操作具有破坏性,执行前务必确认:
| 操作 | 风险等级 | 防范措施 |
|---|---|---|
| chmod -R 777 | 高 | 确认目录用途,避免用于系统目录 |
| chmod -R 000 | 高 | 绝对不能在系统目录执行 |
| chown -R root:root / | 极高 | 绝对不能执行 |
| chmod -x /bin/* | 极高 | 会导致系统无法启动 |
| 修改 /etc/shadow 权限 | 高 | 备份原权限 |
权限备份
修改权限前备份当前权限:
# 使用 getfacl 备份目录权限 getfacl -R /etc/nginx > /backup/nginx_acl_$(date +%Y%m%d).txt # 使用 getfacl 备份单个文件权限 getfacl /etc/passwd > /backup/passwd_acl.txt
权限恢复
# 恢复目录权限 setfacl --restore=/backup/nginx_acl_20260529.txt # 恢复单个文件权限 setfacl --restore=/backup/passwd_acl.txt
误操作回滚
如果误修改了权限,按以下步骤恢复:
查看文件原权限(如果有版本控制或备份)
# 从备份恢复 getfacl --restore=/path/to/backup.txt
常见权限的默认值
# 普通文件 chmod 644 file # 可执行文件 chmod 755 file # 目录 chmod 755 directory # 系统配置文件 chmod 640 /etc/passwd chmod 600 /etc/shadow
权限修改的验证
修改权限后验证:
# 查看文件权限 ls -la /path/to/file # 测试应用是否正常 systemctl restart nginx curl -I http://localhost # 测试文件是否可访问 sudo -u www-data cat /var/www/html/index.html
补充部分:特殊权限深度应用
SUID 实战应用
SUID(Set User ID)是一个特殊的权限位,允许程序以文件所有者的身份运行。这在需要临时提升权限的场景中很有用,但也会带来安全风险。
典型应用场景:ping 命令
ping 命令需要发送 ICMP 网络包,这需要 root 权限。但普通用户也需要能 ping 其他主机。解决方案就是给 ping 设置 SUID:
ls -la /bin/ping # -rwsr-xr-x 1 root root 4096 May 29 10:30 /bin/ping # ^ s 表示 SUID 已设置
普通用户执行 ping 时,实际是以 root 身份运行的。
查找所有 SUID 文件
# 查找系统中的 SUID 文件
find /usr -perm /4000 -typef 2>/dev/null
# 查找 SUID 文件并显示详细信息
find /usr -perm /4000 -typef -execls -la {} ; 2>/dev/null
# 查找 SUID 文件(排除已知的)
find / -perm -4000 -typef 2>/dev/null | grep -vE"^/(usr|bin|sbin)/"
安全风险
SUID 文件是潜在的安全风险点,攻击者可能利用 SUID 程序提权。需要定期检查:
#!/bin/bash # 检查新增的 SUID 文件(需要建立基线) KNOWN_SUID_FILE="/root/.known_suid_$(date +%Y%m)" # 如果没有基线文件,创建基线 if[ ! -f"$KNOWN_SUID_FILE"];then find / -perm -4000 -typef 2>/dev/null >"$KNOWN_SUID_FILE" echo"已创建 SUID 基线文件:$KNOWN_SUID_FILE" exit0 fi # 检查新增的 SUID 文件 CURRENT_SUID=$(mktemp) find / -perm -4000 -typef 2>/dev/null >"$CURRENT_SUID" echo"=== SUID 变更检查 ===" echo"基线文件:$KNOWN_SUID_FILE" NEW_SUID=$(comm -13"$KNOWN_SUID_FILE""$CURRENT_SUID") if[ -n"$NEW_SUID"];then echo"发现新增 SUID 文件:" echo"$NEW_SUID" else echo"未发现新增 SUID 文件" fi # 删除临时文件 rm -f"$CURRENT_SUID"
移除 SUID 权限
如果某个 SUID 文件不需要 SUID,应该移除:
# 移除 SUID(保留所有者权限) chmod u-s/usr/bin/someprogram # 或 chmod 755 /usr/bin/someprogram
SGID 实战应用
SGID(Set Group ID)有两种用法:
对文件:执行时以文件所属组身份运行
对目录:目录中新建的文件继承目录的组
团队共享目录实战
# 创建一个团队共享目录 mkdir /opt/shared groupadd developers chown :developers /opt/shared chmod 2775 /opt/shared # 2 = SGID # 添加团队成员 usermod -aG developers alice usermod -aG developers bob # 验证 SGID 效果 # alice 创建文件 su - alice -c"touch /opt/shared/alice_file.txt" ls -la /opt/shared/alice_file.txt # 应该显示 -rw-rw-r-- 和 developers 组 # bob 创建文件 su - bob -c"touch /opt/shared/bob_file.txt" ls -la /opt/shared/bob_file.txt # 应该显示 -rw-rw-r-- 和 developers 组
多个团队共享目录
如果一个目录需要多个组都能读写:
# 创建目录 mkdir /data/project groupadd dev groupadd qa # 设置所有者为 dev 组 chown :dev /data/project chmod 2770 /data/project # 使用 ACL 给 qa 组添加写权限 setfacl -m grw /data/project setfacl -m dqa:rw /data/project # 验证 getfacl /data/project
Sticky Bit 实战应用
Sticky Bit 主要用于公共目录,确保用户只能删除自己的文件。
典型应用:/tmp 目录
ls -ld /tmp # drwxrwxrwt 10 root root 4096 May 29 10:30 /tmp # ^ t 表示 Sticky Bit
即使 /tmp 目录权限是 777,任何用户都可以在里面创建文件,但只能删除自己的文件。
创建带 Sticky Bit 的目录
# 创建公共目录 mkdir /opt/public chmod 1777 /opt/public chown root:root /opt/public # 任何用户都可以在里面创建文件 # 但只有文件所有者能删除自己的文件
权限与 SELinux/AppArmor 的关系
在启用了 SELinux 或 AppArmor 的系统(如 CentOS/RHEL、Ubuntu)中,权限管理还需要考虑安全模块策略。
检查 SELinux 状态
# 查看 SELinux 状态 getenforce # 查看详细状态 sestatus # 查看文件 SELinux 上下文 ls -Z /var/www/html
查看文件 SELinux 上下文
# 查看单个文件的 SELinux 上下文 ls -Z /var/www/html/index.html # 查看目录的 SELinux 上下文 ls -Zd /var/www/html # 查看进程 SELinux 上下文 ps auxZ | grep nginx
修改 SELinux 上下文
# 修改目录的 SELinux 上下文 chcon -R -t httpd_sys_content_t /var/www/html # 修改文件类型的 SELinux 上下文 chcon -t httpd_sys_rw_content_t /var/www/html/uploads # 永久修改(下次 restorecon 不会重置) semanage fcontext -a -t httpd_sys_content_t"/var/www/html(/.*)?"
恢复默认 SELinux 上下文
# 恢复目录的默认 SELinux 上下文 restorecon -R /var/www/html # 查看默认上下文规则 semanage fcontext -l | grep /var/www
AppArmor 简介(Ubuntu)
Ubuntu 使用 AppArmor 作为安全模块:
# 查看 AppArmor 状态 aa-status # 查看 nginx 的 AppArmor 配置文件 cat /etc/apparmor.d/usr.sbin.nginx # 重新加载 AppArmor 配置 systemctl reload apparmor
总结
核心概念速记
三组权限:所有者(u)、所属组(g)、其他用户(o)
三个权限位:读(r=4)、写(w=2)、执行(x=1)
目录的写权限:控制文件创建和删除,与文件本身权限无关
umask:从全权限中减去的值,控制新建文件默认权限
特殊权限:SUID(4)、SGID(2)、Sticky Bit(1)
ACL:比传统权限更细粒度的控制机制
常用命令速查
# 修改权限 chmod 755 file # 数字方式 chmod u+x file # 符号方式 chmod -R 755 directory # 递归 # 修改所有者和所属组 chown user:group file # 同时修改 chown user file # 只改所有者 chown :group file # 只改所属组 chown -R user:group directory # 递归 # 查看权限 ls -la file # 查看文件权限 getfacl file # 查看 ACL 权限 # 设置 ACL setfacl -m urw file # 给用户设置权限 setfacl -m grx directory# 给组设置权限 setfacl -m duser:rw directory# 设置默认 ACL setfacl -b file # 删除所有 ACL
学习建议
理解概念比死记硬背重要:权限模型是 Linux 安全的基础
多动手实验:在测试环境尝试不同权限组合,观察效果
关注报错信息:权限问题通常会给出明确的错误提示
遵循最小权限原则:只授予必需的最小权限
记录和备份:修改权限前记录原值,便于回滚
权限管理看似简单,实际上是 Linux 运维中最需要细心和经验的领域之一。养成正确的权限管理习惯,能避免大部分生产环境安全事故。
-
Linux
+关注
关注
88文章
11871浏览量
219966 -
操作系统
+关注
关注
37文章
7464浏览量
129763 -
文件
+关注
关注
1文章
601浏览量
26201
原文标题:一文搞懂 Linux 文件权限:chmod、chown 到底怎么用
文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
LINUX修改文件权限
Linux系统文件权限细节分析
浅谈Linux权限管理的ACL权限
嵌入式linux学习之基础知识(一) linux文件权限
Linux系统如何修改文件属性与权限
Linux文件权限及Makefile
一文搞懂Linux文件权限
评论