在Linux中创建仅能访问特定目录的受限用户
最近在服务器上遇到了一个需求:需要创建一个专门用于存放和共享日志文件的用户。这个用户应该被严格限制,只能在一个指定的目录下活动,同时又要允许其他授权用户通过SCP或SFTP来获取这些日志。这听起来像是一个简单的权限管理问题,但实际操作中,尤其是在结合SSH Chroot环境时,却有不少细节需要注意。今天就把我的配置过程和踩过的坑记录下来。
一、明确需求与目标
我需要创建一个名为 userdir 的用户,并为其设置一个强密码。这个用户的核心使命非常明确:
- 他的整个世界,就是
这个目录,不能越雷池一步。/mysoft/tempdir - 在这个目录下,有一个
文件夹,用来存放从其他地方复制过来的日志文件。logs - 虽然 userdir 被限制在此目录,但其他服务器用户(如同组用户)需要能够安全地获取这些日志文件。
这本质上是在构建一个安全的、基于SFTP的日志文件“保险箱”。
二、分步实施与配置
下面就是具体的命令行操作步骤,我会逐一解释每一条命令的意图。
1. 创建用户与基础目录
首先,创建用户并设置其密码。使用-m参数创建家目录,-s指定bash shell(虽然之后会被Chroot限制,但先按常规创建)。
# 1. 创建用户并设置密码
useradd -m -s /bin/bash userdir
echo "userdir:us5#di585" | chpasswd
# 2. 创建所需的目录结构
mkdir -p /mysoft/tempdir/logs
2. 设置所有权与基础权限
将目标目录及其子目录的所有者设置为新创建的用户,这是后续权限控制的基础。
# 3. 设置目录所有者
chown userdir:userdir /mysoft/tempdir
chown userdir:userdir /mysoft/tempdir/logs
# 4. 将用户的家目录指向限制目录(此步在Chroot环境下非必须,但可保持一致)
usermod -d /mysoft/tempdir userdir
3. 配置精细的目录权限
这是控制访问的核心。我们为不同目录设置不同的权限模式。
# 5. 设置目录权限
# /mysoft/tempdir: 用户自己可读、写、执行,同组用户可读和执行,其他用户无权限。
chmod 750 /mysoft/tempdir
# /mysoft/tempdir/logs: 权限同上,但额外设置了setgid位。
chmod 750 /mysoft/tempdir/logs
# 6. 设置setgid位,确保logs目录下新建的文件自动继承目录的组(userdir组)
# 这样,同组其他用户就能访问新复制进来的日志文件了。
chmod g+s /mysoft/tempdir/logs
4. 配置SSH以实现SFTP与Chroot隔离
为了让用户只能通过SFTP访问指定目录且无法跳出,需要修改SSH配置。这是实现安全隔离的关键。
# 7. 编辑SSH配置,通常使用 vi /etc/ssh/sshd_config
# 在文件末尾添加以下配置:
Match User userdir
ChrootDirectory /mysoft/tempdir # 将用户锁定在此目录
ForceCommand internal-sftp # 强制使用SFTP,禁止Shell登录
AllowTcpForwarding no
X11Forwarding no
PasswordAuthentication yes
PermitTTY no
# 编辑完成后,重启SSH服务使配置生效,例如:
# systemctl restart sshd
注意:ChrootDirectory指定的目录(这里是/mysoft/tempdir)及其所有上级目录(即/mysoft),其所有者必须是root,且其他用户不能有写权限。这是一个常见的坑,后面会讲到。
5. 处理日志文件的权限
当从其他地方复制日志文件到
logs
目录时,需要手动设置一下权限,确保userdir用户和同组用户可以读取。
# 在复制日志时设置
cp /path/to/source.log /mysoft/tempdir/logs/
chmod 644 /mysoft/tempdir/logs/*.log
chown userdir:userdir /mysoft/tempdir/logs/*.log
三、使用方法与故障排查
配置完成后,其他用户就可以使用以下命令通过SFTP下载日志了:
sftp userdir@210.41.218.176:logs/user-info-2026-03-22.0.log ./
遇到权限错误怎么办?
如果连接时出现“Permission denied”等错误,很大概率是
ChrootDirectory
的权限问题。请按以下步骤检查和修复:
# 检查当前权限
ls -ld /mysoft
ls -ld /mysoft/tempdir
# 修复权限(最关键步骤)
chown root:root /mysoft
chmod 755 /mysoft
chown root:root /mysoft/tempdir
chmod 755 /mysoft/tempdir
# 确认修复结果
ls -ld /mysoft
ls -ld /mysoft/tempdir
请牢记:Chroot监狱的“围墙”(目录)必须由root把守,且不可被普通用户写入。 我们的目标目录
/mysoft/tempdir/logs
在Chroot环境内,其权限(750)依然有效,不影响内部文件的访问控制。
四、总结与反思
通过这次配置,我深刻体会到Linux权限体系和SSH配置结合的强大与精细。整个过程可以总结为几个要点:
- 明确隔离边界: 使用
从文件系统层面将用户禁锢在指定目录。ChrootDirectory - 善用权限组合: 通过用户、组、以及精确的读写执行权限(如750),控制谁能在目录内做什么。
- 注意权限继承: 使用
位(g+s)让新建文件自动继承父目录的组,简化了后续的权限管理。setgid - 严守Chroot规则: Chroot目录及其父目录必须归root所有且权限为755,这是安全的前提,也是最容易出错的地方。
最终,我们得到了一个既安全又实用的解决方案:userdir用户被牢牢锁在自己的目录里,而需要日志的同事,只需被添加到userdir组,就能方便地通过SFTP获取文件,实现了安全与便利的平衡。
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情