Linux权限完全详解:从原理到实战

Linux权限完全详解:从原理到实战

一、Linux权限概述

1.1 什么是Linux权限?

Linux权限是Linux系统安全的核心机制,用于控制用户对文件和目录的访问权限。每个文件和目录都有三组权限:所有者(Owner)、所属组(Group)、其他用户(Others)。

1.2 为什么要理解Linux权限?

  • 安全性:防止未授权访问
  • 多用户环境:支持多用户协同工作
  • 资源管理:合理分配系统资源
  • 故障排查:解决"Permission denied"错误

二、权限的基本概念

2.1 文件类型

在Linux中,文件类型通过第一个字符标识:

字符 类型 说明
`-` 普通文件 文本、图片、压缩包等
`d` 目录 文件夹
`l` 符号链接 快捷方式
`c` 字符设备 键盘、鼠标等
`b` 块设备 硬盘、光驱等
`s` 套接字 网络套接字
`p` 管道 进程间通信

示例:


$ ls -la /home
drwxr-xr-x  10 root root  4096 Feb  7 10:00 /home
lrwxrwxrwx   1 root root    12 Feb  7 09:00 link -> target
-rw-r--r--   1 user user  1234 Feb  7 10:00 file.txt

2.2 权限表示方法

#### 字符表示法


r = read(读取)     数值:4
w = write(写入)    数值:2
x = execute(执行)   数值:1
- = 无权限          数值:0

#### 权限位置


rwx rwx rwx
│   │   │
│   │   └── 其他用户权限(Others)
│   └─────── 所属组权限(Group)
└─────────── 文件所有者权限(Owner)

#### 示例说明


-rwxr-xr-x  1 root root  1234 Feb  7 10:00 script.sh
││││││││
││││││││└─ 其他用户:r-x(读+执行)
│││││││└─── 所属组:r-x(读+执行)
││││││└──── 所有者:rwx(读+写+执行)
│││││└───── 文件类型:普通文件(-)

#### 权限详解

权限 对文件的影响 对目录的影响
r(读) 可以读取文件内容 可以列出目录内容(ls)
w(写) 可以修改文件内容 可以在目录中创建/删除文件
x(执行) 可以执行文件 可以进入目录(cd)

三、 chmod - 修改权限

3.1 符号模式

使用字符来添加、移除或设置权限:


# 语法
chmod [who][operator][permission] file

# who: u(所有者) g(所属组) o(其他用户) a(所有用户)
# operator: +(添加) -(移除) =(设置)
# permission: r(读) w(写) x(执行)

示例:


# 为脚本添加执行权限
chmod +x script.sh

# 为所有者添加写权限
chmod u+w file.txt

# 移除所属组的写权限
chmod g-w project

# 为所有用户设置只读权限
chmod a=r file.txt

# 同时修改多组权限
chmod u=rwx,g=rx,o=r file.txt

# 递归修改目录权限
chmod -R 755 /var/www/html

3.2 数字模式

使用八进制数字表示权限:


# 语法
chmod [mode] file

# 权限计算
rwx = 4+2+1 = 7
rw- = 4+2+0 = 6
r-x = 4+0+1 = 5
r-- = 4+0+0 = 4

常用权限对照表:

数字 权限 说明
0 `---` 无任何权限
1 `--x` 只有执行权限
2 `-w-` 只有写权限
3 `-wx` 写+执行权限
4 `r--` 只有读权限
5 `r-x` 读+执行权限
6 `rw-` 读+写权限
7 `rwx` 读+写+执行权限

常用组合:


# 755 - 所有者全权限,组和其他读+执行
chmod 755 file.sh

# 644 - 所有者读写,组和其他只读
chmod 644 document.txt

# 777 - 所有人全权限(不安全!)
chmod 777 shared_folder

# 600 - 只有所有者可读写
chmod 600 private_key

# 700 - 只有所有者可读写执行
chmod 700 secret_folder

3.3 特殊权限

#### SetUID(SUID)

当文件设置了SUID权限时,普通用户执行该文件时会临时获得文件所有者的权限。


# 设置SUID
chmod u+s /usr/bin/passwd

# 查看SUID(文件权限最后一位变为s)
-rwsr-xr-x  1 root root  68208 Jan 15  2024 /usr/bin/passwd

典型应用:

  • `/usr/bin/passwd` - 允许普通用户修改自己的密码
  • `/usr/bin/su` - 允许切换用户
  • #### SetGID(SGID)

    在目录上设置SGID时,新创建的文件会继承目录的所属组。


# 设置SGID
chmod g+s /project/team

# 查看SGID(组权限最后一位变为s)
drwxr-sr-x  2 root root  4096 Feb  7 10:00 /project/team

#### Sticky Bit(粘滞位)

防止用户删除其他用户的文件,常用于共享目录。


# 设置Sticky Bit
chmod +t /tmp

# 查看Sticky Bit(其他用户权限最后一位变为t)
drwxrwxrwt  10 root root  4096 Feb  7 10:00 /tmp

数字形式设置特殊权限:


# 设置SUID + SGID + Sticky Bit
chmod 4777 file     # 4=SUID
chmod 2777 file     # 2=SGID
chmod 1777 file     # 1=Sticky Bit
chmod 7777 file     # 全部特殊权限

四、 chown - 修改所有者和所属组

4.1 基本语法


# 修改文件所有者
chown user file

# 修改文件所属组
chown :group file

# 同时修改所有者和所属组
chown user:group file

4.2 常用示例


# 将文件所有权转移给www-data用户
chown www-data /var/www/html

# 将目录及其内容的所有者改为www-data
chown -R www-data:www-data /var/www/html

# 改变所属组
chown :developers project

# 同时改变所有者和所属组
chown alice:developers report.txt

# 只改变所有者
chown root file

# 只改变所属组
chown :wheel file

4.3 使用参考


# 查看当前用户
whoami
id

# 查看用户所属组
id username
groups username

# 创建新用户
useradd -m -s /bin/bash username

# 创建新组
groupadd groupname

五、ACL - 访问控制列表

5.1 什么是ACL?

ACL提供更细粒度的权限控制,可以为单个用户或组设置权限。

5.2 检查ACL支持


# 检查文件系统是否支持ACL
mount | grep acl

# 如果没有挂载ACL,添加
mount -o remount,acl /dev/sda1

5.3 基本ACL操作


# 查看ACL权限
getfacl file.txt

# 设置用户ACL
setfacl -m u:alice:rw file.txt

# 设置组ACL
setfacl -m g:developers:rw project

# 移除ACL
setfacl -x u:alice file.txt

# 递归设置ACL
setfacl -R -m u:alice:rw /var/www/html

# 设置默认ACL(对新文件生效)
setfacl -d -m u:alice:rw /shared/folder

5.4 ACL示例


# 为特定用户设置权限
setfacl -m u:john:rw- /var/log/app.log

# 为多个用户/组设置权限
setfacl -m u:alice:rw,u:bob:r--,g:devs:r-x file

# 复制ACL到另一个文件
getfacl file1 | setfacl --set-file=- file2

六、 权限掩码(umask)

6.1 什么是umask?

umask决定创建文件或目录时的默认权限。


# 查看当前umask
umask

# 典型umask值
# 文件:666 - umask = 默认权限
# 目录:777 - umask = 默认权限

6.2 常用umask设置


# 设置umask为022(文件644,目录755)
umask 022

# 严格模式(文件640,目录750)
umask 027

# 最严格(文件600,目录700)
umask 077

# 永久设置(添加到.bashrc)
echo "umask 022" >> ~/.bashrc

6.3 umask原理


目录默认权限:777 - umask = 实际权限
文件默认权限:666 - umask = 实际权限

umask 022:
目录:777 - 022 = 755 (rwxr-xr-x)
文件:666 - 022 = 644 (rw-r--r--)

umask 077:
目录:777 - 077 = 700 (rwx------)
文件:666 - 077 = 600 (rw-------)

七、 常见权限问题排查

7.1 Permission Denied错误


# 问题1:没有执行权限
$ cd /var/www
bash: cd: /var/www: Permission denied

# 解决:添加执行权限
sudo chmod +x /var/www

# 问题2:没有读权限
$ cat /etc/shadow
cat: /etc/shadow: Permission denied

# 解决:需要root权限或sudo
sudo cat /etc/shadow

# 问题3:没有写权限
$ touch /opt/app/config
touch: /opt/app/config: Permission denied

# 解决:修改文件所有者或添加写权限
sudo chown $USER:$USER /opt/app

7.2 无法删除文件


# 检查文件属性
ls -la /path/to/file

# 原因1:目录没有写权限
# 解决:修改目录权限
sudo chmod +w /path/to

# 原因2:文件被锁定(Immutable属性)
lsattr /path/to/file
# 如果有 i 属性
sudo chattr -i /path/to/file

# 原因3:属于root的文件
sudo rm /path/to/file

7.3 无法执行脚本


# 检查文件权限
ls -la script.sh

# 解决:添加执行权限
chmod +x script.sh

# 如果仍然无法执行,检查脚本解释器
head -1 script.sh
# 应该类似:#!/bin/bash

# 执行脚本
./script.sh
# 或
bash script.sh

7.4 sudo权限问题


# 检查当前用户是否在sudo组
groups $USER

# 临时获取root权限
sudo -i

# 查看sudoers配置
sudo cat /etc/sudoers
sudo visudo

# 将用户添加到sudo组(需要root)
usermod -aG sudo username

八、 最佳实践

8.1 文件权限建议

场景 推荐权限 说明
脚本文件 755 所有者可执行,组和其他可读
配置文件 644 所有者可读写,组和其他只读
私钥文件 600 只有所有者可读写
网站目录 755 可读可执行,但不可写
上传目录 775 组可写
临时文件 600 私有

8.2 目录权限建议

场景 推荐权限 说明
系统目录 755 只有root可写
共享目录 777 所有人可访问
项目目录 775 组成员可写
私有目录 700 只有所有者可访问

8.3 安全建议

1. 最小权限原则:只授予必要的最小权限 2. 避免777:永远不要使用777权限 3. 定期检查:定期检查敏感文件权限 4. 使用ACL:需要细粒度控制时使用ACL 5. 日志审计:监控权限变更 6. 特殊权限谨慎使用:SUID/SGID可能带来安全风险

8.4 权限检查脚本


#!/bin/bash
# 检查不安全的文件权限

echo "=== 检查全世界的文件 ==="
find / -perm 777 2>/dev/null | head -20

echo "=== 检查SUID文件 ==="
find / -perm /4000 2>/dev/null | head -20

echo "=== 检查SGID文件 ==="
find / -perm /2000 2>/dev/null | head -20

echo "=== 检查可写目录 ==="
find / -type d -perm -002 2>/dev/null | head -20

九、 实战案例

案例1:配置Web服务器


# 创建Web用户和组
sudo groupadd www-data
sudo useradd -r -s /usr/sbin/nologin -g www-data www-data

# 设置网站目录权限
sudo chown -R www-data:www-data /var/www/html
sudo chmod -R 755 /var/www/html

# 上传目录需要可写
sudo chmod 775 /var/www/html/uploads
sudo setfacl -m u:www-data:rwx /var/www/html/uploads

# 配置文件需要特殊权限
sudo chown root:www-data /var/www/html/config.php
sudo chmod 640 /var/www/html/config.php

# 日志目录
sudo chown -R www-data:www-data /var/log/myapp
sudo chmod -R 750 /var/log/myapp

案例2:配置共享目录


# 创建项目目录
sudo mkdir /project/team
sudo groupadd developers
sudo chown root:developers /project/team
sudo chmod 2775 /project/team

# 添加用户到组
sudo usermod -aG developers alice
sudo usermod -aG developers bob

# 设置ACL实现精细控制
setfacl -R -m g:marketing:rx /project/team
setfacl -R -m u:bob:rwx /project/team/bob-project
setfacl -R -m d:u:bob:rwx /project/team/bob-project

案例3:配置SSH密钥


# 生成密钥对
ssh-keygen -t ed25519 -C "user@host"

# 创建.ssh目录
mkdir -p ~/.ssh
chmod 700 ~/.ssh

# 创建authorized_keys
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

# 导入公钥
cat id_ed25519.pub >> ~/.ssh/authorized_keys

# 私钥权限(非常重要!)
chmod 600 ~/.ssh/id_ed25519

十、 总结

核心要点

1. 理解三组权限:所有者(u)、所属组(g)、其他用户(o) 2. 掌握chmod用法:符号模式和数字模式 3. 学会chown:修改所有者和所属组 4. 了解特殊权限:SUID、SGID、Sticky Bit 5. 使用ACL:实现细粒度权限控制 6. umask:理解默认权限的来源

常用命令速查


# 查看权限
ls -la file

# 修改权限
chmod 755 file
chmod +x file

# 修改所有者和所属组
chown user:group file

# ACL操作
getfacl file
setfacl -m u:alice:rw file

# 检查特殊权限
find / -perm 4777

进一步学习

  • 深入理解Linux用户和组管理
  • 学习SELinux和AppArmor强制访问控制
  • 掌握Linux文件系统安全
  • 了解容器环境下的权限管理

相关阅读:

  • Linux用户和组管理
  • SELinux安全机制
  • Docker容器权限
  • SSH安全配置

发表回复

后才能评论