🐧 第02课:文件系统与权限

📚 核心概念

🎯 Linux文件系统层级

Linux采用单一目录树(Single Directory Hierarchy),一切皆文件。理解文件系统结构是Linux运维的基础,每个目录都有其特定用途。

📁 FHS(文件系统层级标准)

/                    ← 根目录,一切起点
├── bin/             ← 基础命令(ls, cp, mv, cat)
├── sbin/            ← 系统管理命令(mount, fdisk, iptables)
├── boot/            ← 启动文件(内核vmlinuz, initramfs, GRUB)
├── dev/             ← 设备文件(/dev/sda, /dev/null, /dev/tty)
├── etc/             ← 系统配置文件(nginx.conf, sshd_config)
├── home/            ← 用户主目录(/home/devops/)
├── root/            ← root用户主目录
├── lib/             ← 系统库文件(/lib/x86_64-linux-gnu/)
├── opt/             ← 第三方软件(/opt/google/chrome/)
├── proc/            ← 进程信息虚拟文件系统(/proc/cpuinfo)
├── sys/             ← 内核设备树虚拟文件系统
├── tmp/             ← 临时文件(重启可能清空)
├── usr/             ← 用户程序
│   ├── bin/         ← 用户命令(python3, gcc, git)
│   ├── lib/         ← 用户库
│   ├── local/       ← 本地编译安装
│   └── share/       ← 共享数据(man pages, icons)
├── var/             ← 可变数据
│   ├── log/         ← 系统日志
│   ├── lib/         ← 应用数据(MySQL, Docker)
│   ├── cache/       ← 缓存
│   └── www/         ← Web根目录
└── mnt/             ← 临时挂载点

🔐 权限模型深度解析

Linux权限基于UGO模型(User/Group/Other),每个文件有三组权限位:读(r=4)、写(w=2)、执行(x=1)。

权限位详解

  -rwxr-xr--  1 devops devops 4096 May 19 10:00 deploy.sh
  │├──┤├──┤├──┤
  │ │   │   │
  │ │   │   └── Other: r-- (4 = 只读)
  │ │   └────── Group: r-x (5 = 读+执行)
  │ └────────── User:  rwx (7 = 读+写+执行)
  └───────────── 文件类型: -普通 d目录 l链接

权限八进制速查:
7 = rwx (4+2+1)  6 = rw- (4+2)   5 = r-x (4+1)
4 = r-- (4)      3 = -wx (2+1)   2 = -w- (2)
1 = --x (1)      0 = --- (0)

常用权限组合:
755 (rwxr-xr-x) → 可执行脚本/程序
644 (rw-r--r--) → 普通文件
600 (rw-------) → 私密文件(密钥)
700 (rwx------) → 私密目录(.ssh/)

🔗 特殊权限位

除了基本rwx,Linux还有三个特殊权限位,在安全配置中非常重要:

🔐 ACL访问控制列表

当UGO模型不够用时(比如需要给特定用户单独授权),ACL提供了更精细的控制:

⌨️ 命令实操

⌨️ 实操命令

1. 目录与文件操作 ✅

文件操作
# 创建目录结构(DevOps项目标准布局)
mkdir -p /opt/devops-project/{src,config,logs,data,scripts}
tree /opt/devops-project
# /opt/devops-project
# ├── config
# ├── data
# ├── logs
# ├── scripts
# └── src

# 文件查找
find /etc -name "*.conf" -mtime -7    # 7天内修改的conf文件
find /var/log -size +100M              # 大于100M的日志
find / -perm -4000 2>/dev/null         # 查找SUID文件(安全审计!)

# 文件类型与编码
file /etc/passwd                        # ASCII text
file /usr/bin/ls                        # ELF 64-bit LSB executable
file deploy.tar.gz                      # gzip compressed data

# 软链接 vs 硬链接
ln -s /opt/app/current /opt/app/latest  # 软链接(跨文件系统)
ln /var/log/app.log /backup/app.log     # 硬链接(同文件系统)

# 查看磁盘使用
du -sh /var/*                           # 每个目录大小
df -hT                                  # 文件系统使用率
lsblk                                   # 块设备列表

2. 权限管理实操 ✅

权限管理
# 基本权限设置
chmod 755 deploy.sh          # rwxr-xr-x
chmod 644 config.yaml        # rw-r--r--
chmod 600 ~/.ssh/id_rsa      # rw------- (密钥文件必须)
chmod 700 ~/.ssh             # rwx------

# 符号模式修改
chmod u+x script.sh          # 给属主加执行权限
chmod g+w config/            # 给组加写权限
chmod o-r secrets.key        # 去掉其他人的读权限
chmod a+r README.md          # 所有人可读

# 递归修改权限(谨慎使用!)
chmod -R 755 /opt/app/bin/   # 所有目录和文件
# 推荐:分别设置目录和文件
find /opt/app -type d -exec chmod 755 {} \;
find /opt/app -type f -exec chmod 644 {} \;

# 属主和属组修改
chown devops:devops /opt/app/
chown -R www-data:www-data /var/www/html/
chgrp docker /var/run/docker.sock

# umask查看和设置
umask                         # 0022 → 新文件644,新目录755
umask 027                     # 更安全:新文件640,新目录750

3. ACL精细权限控制 ✅

ACL
# 查看ACL
getfacl /opt/app/config.yaml
# user::rw-
# user:deploy:r--      ← 额外用户权限
# group::r--
# mask::rw-
# other::r--

# 设置ACL
setfacl -m u:deploy:rx /opt/app/scripts/    # 给deploy用户rx权限
setfacl -m g:devops:rw /opt/app/config/     # 给devops组rw权限
setfacl -m d:u:deploy:rx /opt/app/scripts/  # 默认ACL(新建文件继承)

# 删除ACL
setfacl -x u:deploy /opt/app/scripts/
setfacl -b /opt/app/config.yaml              # 删除所有ACL

4. 磁盘分区与挂载 ✅

磁盘管理
# 查看块设备
lsblk
# NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
# sda      8:0    0   100G  0 disk
# ├─sda1   8:1    0     1G  0 part /boot
# └─sda2   8:2    0    99G  0 part /

# 创建分区
fdisk /dev/sdb
# n → 新建分区 → p → 主分区 → 1 → 回车 → 回车 → w

# 格式化
mkfs.ext4 -L data /dev/sdb1
mkfs.xfs -L logs /dev/sdc1

# 挂载
mkdir -p /mnt/data
mount /dev/sdb1 /mnt/data

# 永久挂载(/etc/fstab)
echo 'LABEL=data /mnt/data ext4 defaults,noatime 0 2' >> /etc/fstab
mount -a    # 验证fstab配置

# LVM逻辑卷管理(生产推荐)
pvcreate /dev/sdb1
vgcreate vg_data /dev/sdb1
lvcreate -L 50G -n lv_logs vg_data
mkfs.ext4 /dev/vg_data/lv_logs

5. 安全加固脚本 ✅

安全加固
#!/bin/bash
# 文件系统安全加固脚本
set -euo pipefail

echo "🔒 开始文件系统安全加固..."

# 1. 查找并报告SUID文件
echo "📋 SUID文件审计:"
find / -perm -4000 -type f 2>/dev/null | while read f; do
    rpm -qf "$f" 2>/dev/null || dpkg -S "$f" 2>/dev/null || echo "未知包: $f"
done

# 2. 查找世界可写文件
echo "📋 世界可写文件审计:"
find /etc -perm -o+w -type f 2>/dev/null

# 3. 设置关键目录权限
chmod 700 /root
chmod 755 /etc /var /usr
chmod 600 /etc/shadow /etc/gshadow

# 4. 禁用不常用的SUID
chmod u-s /usr/bin/chsh /usr/bin/chfn 2>/dev/null || true

# 5. 设置不可变位(保护关键配置)
chattr +i /etc/passwd /etc/shadow  # 慎用!需解锁时 chattr -i

echo "✅ 安全加固完成"

📐 架构图

📐 架构图:Linux文件系统与存储栈

应用层    ┌──────────┐ ┌──────────┐ ┌──────────┐
          │ 文件服务  │ │ 数据库   │ │ 日志采集  │
          └────┬─────┘ └────┬─────┘ └────┬─────┘
               │             │             │
VFS层    ┌─────▼─────────────▼─────────────▼──────┐
         │         虚拟文件系统 (VFS)              │
         └─────┬─────────────┬─────────────┬──────┘
               │             │             │
文件系统  ┌────▼────┐  ┌────▼────┐  ┌────▼────┐
         │  ext4   │  │  XFS    │  │  tmpfs  │
         └────┬────┘  └────┬────┘  └────┬────┘
              │             │             │
块层     ┌────▼─────────────▼─────────────▼──────┐
         │        块I/O调度器 (mq-deadline)      │
         └─────┬─────────────┬─────────────┬──────┘
               │             │             │
设备层   ┌────▼────┐  ┌────▼────┐  ┌────▼────┐
         │  SSD    │  │  HDD    │  │  NVMe   │
         │ /dev/sda│  │ /dev/sdb│  │/dev/nvme│
         └─────────┘  └─────────┘  └─────────┘

🔐 权限模型架构

                    访问请求
                       │
                       ▼
              ┌────────────────┐
              │  进程凭证检查    │
              │  uid/gid/groups │
              └───────┬────────┘
                      │
              ┌───────▼────────┐
              │  DAC检查       │
              │  UGO权限位匹配  │──── 匹配失败 ──→ 检查ACL
              └───────┬────────┘                  │
                      │                           ▼
                  匹配成功                   ACL规则匹配
                      │                      ┌───┴───┐
                      │                   允许    拒绝
                      ▼
              ┌───────────────┐
              │  MAC检查      │
              │  SELinux/AppArmor │
              └───────┬───────┘
                      │
                  允许访问 ✅

🔧 故障排查

🔧 故障排查

❌ 问题1:磁盘空间不足 No space left on device

# 1. 快速定位大文件
df -h                              # 查看哪个分区满
du -sh /* 2>/dev/null | sort -rh | head -10   # 找大目录

# 2. 查找被删除但未释放的文件(常见原因!)
lsof | grep deleted | sort -k7 -rn | head
# nginx  1234  root  5w  REG  8,1  10737418240  /var/log/access.log (deleted)

# 解决:重启占用进程
systemctl reload nginx

# 3. 清理日志
journalctl --vacuum-size=100M     # 清理systemd日志
find /var/log -name "*.gz" -mtime +30 -delete  # 删除旧压缩日志

# 4. 清理包缓存
apt clean                         # Ubuntu
dnf clean all                     # CentOS

💡 防患未然:配置logrotate自动轮转日志,设置磁盘告警阈值80%

❌ 问题2:Permission denied 但权限看起来正确

# 可能是SELinux/AppArmor阻断
# 检查SELinux状态
getenforce                        # Enforcing
ausearch -m avc -ts recent        # 查看拒绝日志

# 临时设置为Permissive排查
sudo setenforce 0

# 查看文件安全上下文
ls -Z /var/www/html/index.html
# unconfined_u:object_r:httpd_sys_content_t:s0

# 修复上下文
restorecon -Rv /var/www/html/

# 或者是挂载选项问题
mount | grep noexec               # 检查是否noexec挂载
# /dev/sdb1 on /mnt/data type ext4 (rw,noexec)
# 解决: mount -o remount,exec /mnt/data

❌ 问题3:inode耗尽

# 现象:df -h有空间,但无法创建文件
df -i                            # 查看inode使用率
# /dev/sda1  1310720  1310720  0  100% /

# 找到大量小文件
find / -xdev -type f | cut -d "/" -f 1-3 | sort | uniq -c | sort -rn | head
# 1200000 /var/log/someapp
# 解决:清理小文件
find /var/log/someapp -type f -mtime +7 -delete

🏆 成就解锁:文件系统守护者!

掌握Linux文件系统层级(FHS)、权限模型(UGO+ACL)、磁盘管理(LVM)、安全加固——这是安全运维的基础。