使用ACL和Chroot Jail保护用户文件访问的逐步指南
引言
在最近的一个项目中,面临一个安全挑战:多个用户需要访问Linux服务器上的特定文件和文件夹,但不能拥有完整的系统访问权限。一些用户意外访问了其指定区域之外的文件,需要一个安全、可扩展的解决方案。不希望用户能够导航到其他文件系统或文件夹。
在评估了几种方法后,实施了访问控制列表(ACL)和chroot监狱的组合,完全解决了这个问题。以下是具体的实施方法。
挑战
问题: 管理的Redhat Linux版本8服务器面临以下情况:
- 多个用户需要访问不同的目录
- 每个用户应该只能看到和访问其特定文件夹
- 一些用户正在导航到他们不应该访问的父目录
- 传统的Linux权限(chmod/chown)不够精细
- 随着用户基础的增长,解决方案需要易于管理
最初尝试的方法:
- 基本Linux权限(chmod 750)- 过于严格;无法为多个用户提供不同的访问级别
- Linux组 - 当用户需要不同的访问组合时变得混乱
- 每个文件夹的单独用户账户 - 不可扩展且难以维护
这些方法都没有解决核心问题:用户仍然可以导航到其指定文件夹之外。
解决方案
实施了两层方法:
- ACL(访问控制列表)- 用于精细的文件权限
- Chroot监狱 - 将用户限制在特定目录
以下是逐步过程:
步骤1:设置目录结构
为便于ACL管理,组织了文件夹:
/home/
├── userdata/
│ ├── user1_folder/
│ ├── user2_folder/
│ └── shared_folder/
创建命令:
sudo mkdir -p /home/userdata/{user1_folder,user2_folder,shared_folder}
步骤2:实施ACL实现精细权限
使用ACL而不是传统的chmod来设置特定的用户权限。
验证ACL是否启用:
mount | grep acl
设置特定用户权限:
# 给user1读写访问权限
sudo setfacl -m u:user1:rwx /home/userdata/user1_folder
# 给user2对共享文件夹的只读访问权限
sudo setfacl -m u:user2:r-x /home/userdata/shared_folder
# 查看当前ACL设置
getfacl /home/userdata/user1_folder
优势: 可以在同一文件夹上为不同用户提供不同的权限级别 - 这是基本chmod无法实现的。
步骤3:实施Chroot监狱
ACL控制了权限,但用户仍然可以导航到父目录。Chroot监狱将每个用户限制在其指定文件夹。
为SFTP用户修改SSH配置:
sudo nano /etc/ssh/sshd_config
添加以下行:
Match User user1
ChrootDirectory /home/userdata/user1_folder
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
Match User user2
ChrootDirectory /home/userdata/user2_folder
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
重要: Chroot目录必须由root拥有:
sudo chown root:root /home/userdata/user1_folder
sudo chmod 755 /home/userdata/user1_folder
创建可写子目录:
sudo mkdir /home/userdata/user1_folder/files
sudo chown user1:user1 /home/userdata/user1_folder/files
步骤4:重启SSH并测试
sudo systemctl restart sshd
# 测试连接
sftp user1@server-ip
关键要点
- 在多用户环境中,ACL比chmod提供更多灵活性
- 对于SFTP/SSH访问,Chroot监狱是必需的 - 仅ACL不够
- 始终确保chroot目录由root拥有(755权限)
- 在部署前使用非特权账户进行测试
- 保持SSH日志启用以监控访问模式
- 记录ACL规则 - 它们在
ls -la输出中不可见
结论
结合ACL和chroot监狱有效解决了文件访问安全挑战。如果在管理需要受限访问的多个用户的Linux服务器,此方法将节省手动权限管理的时间。