我想:
- 为朋友提供 SFTP 访问权限,访问他
/home/friend
在我的服务器上的目录 - 给他一个带有 Apache 的虚拟主机
/home/friend/www/
- 不允许他访问
/etc/
和类似的目录(现已解决),并且不允许他访问我自己的用户的家/home/me
(暂时未解决)
去做这个:
我创建
adduser friend
我为他添加了一个 Apache VirtualHost:
<VirtualHost *:80> ServerName hiswebsite.com DocumentRoot /home/friend/www ... </VirtualHost>
和
service apache2 restart
。我“监禁”了 SFTP/SSH 访问:
PermitRootLogin yes ChallengeResponseAuthentication no UsePAM yes X11Forwarding yes PrintMotd no AcceptEnv LANG LC_* PasswordAuthentication yes GatewayPorts yes Subsystem sftp internal-sftp Match User friend ChrootDirectory /home/ ForceCommand internal-sftp
和
service sshd restart
。
问题:
friend
现在不能出去/home/
(这很好),但是他仍然可以去/home/me/
并读取里面的文件!如何只给他访问权限/home/friend/
而没有其他权限?这似乎不可能,因为:ChrootDirectory
指定身份验证后 chroot(2) 的目录路径名。 路径名的所有组成部分必须是 root 拥有的目录任何其他用户或组都不可写入。我是不是该
- 将用户添加
friend
到组中www-data
? - 或将用户添加
www-data
到组中friend
? 或其他用户/组设置?
允许 Apache 提供文件服务,并允许 PHP 具有写入权限
/home/friend/www/
?假设他的网站上有一个文件上传器:PHP需要在这个目录中写入。授予/home/friend
and哪些权限/home/me
?
- 将用户添加
链接主题:
答案1
现在的情况
对于本节的警告,仅在您的情况下才建议这样做仅使用是网络托管,apache并不意味着有权访问家庭用户的文件夹(答案末尾的其他建议可能更合适)。
- Web/Apache 组(
www-data
group)必须包含所有使用服务的用户 - Apache 和用户需要访问各自的权限,
www
同时限制彼此之间的访问- 下每个目录都
/home
应该有www-data:user
权限
- 下每个目录都
chown www-data:me /home/me
或者
- Web/Apache 组(
www-data
group)必须包含所有使用服务的用户 - Apache 和用户需要访问各自的权限
www
,同时限制彼此之间的访问- 家庭用户的文件夹应该有权限
chown me:me /home/me
- 使
/home
属于apachechown www-data:root /home
- 家庭用户的文件夹应该有权限
这样,apache 将有权访问必要的www
目录,而用户将无权访问其他用户文件夹。
这里的关键是组权限在用户之间共享,而 apache 本身是一个不暴露给其他用户的用户,例如在授予 apache 和我访问权限时与其他用户chown www:me /home/me
保持隔离(并且允许组 www 中的每个人访问文件夹) )me
chown me:www /home/me
me
该目录www
需要存在于www-data
当前配置设置中属于 apache (用户)的位置中/home/me
,www-data:me
或者/home
是www-data:root
一种解决方法,因为您位于www
用户目录内。
这就是为什么默认www
位置是在/var
主目录下而不是在主目录下,以便让 apache 和用户可以 w/rwww
而不给予 apache 不必要的访问权限(例如在本例中访问整个用户的文件夹)
如果您的主文件夹是仅有的意味着www
(网络使用)您对当前的建议/配置感到满意,现在如果您将该系统用于网络托管之外的其他目的; thenwww
不应驻留在/home
文件夹上,而应驻留在另一个位置,例如/var
;在这种情况下,您需要删除ChrootDirectory
使用情况,转而采用经典配置,其中文件访问仅由文件访问权限管理,这是一些关于对经典用户的限制的阅读......
如果您想要安全、隔离、网络托管以及其他 Linux/服务器使用对于每个用户,您需要实施不同的解决方案,不断发展虚拟化和/或沙箱。
请注意,还有许多其他可能性可以实现您所要求的目标,但就您的配置而言,这是最快的,请阅读 参考资料 部分最终建议下面是更合适的实现。
配置
实施取决于目标安全级别和目标用途。因此,一种配置可能适合一种情况,但同时不适合另一种情况。
您当前的配置与经典配置相差不远,其中将使用ChrootDirectory
组和用户访问级别来代替经典文件权限来管理每个 ssh 用户之间的分离。我猜您只是缺少配置上的用户访问级别来实现这一点。以下是有关如何实施的一些详细信息这里,这里和这里(也就是说,ChrootDirectory
除此之外使用是一个很好的安全实践)
替代方案(强化安全性)
PermitRootLogin yes
永远不要使用First ,而是将me
用户添加到 suders 中。然后,me
用户可以使用sudo su
或访问根目录su
如果您的目标是强化安全性,则user space
可以使用内核功能,这将完全分离每个用户,但这是一个完全不同的配置。这可以通过本机 Linux 工具和/或消防监狱分离文件/网络等。
同样在强化安全性的相同范围内,应使用私钥/公钥进行身份验证,而不是使用PasswordAuthentication yes
SSHFS也可以是分离托管文件的替代方法。
这里还有一些关于该主题的有趣链接:
最终建议
最后,关于你的配置我只是建议
- 禁用
PermitRootLogin
- 审查用户和
/home
权利。 - 如果是独特的网络托管使用情况
- 应用建议的权限,不是针对
/home
目录,而是使用类似/var/apache/user1,user2,etc
.然后使用ChrootDirectory /var/apache/
- 应用建议的权限,不是针对
- 多用途系统的情况下
- 这里可以使用多种可能性,其中之一是应用建议的权限,不是针对
/home
目录,而是使用类似的结构/var/apache/user1,user2,etc
没有然后使用ChrootDirectory
文件访问权限来管理权限。
- 这里可以使用多种可能性,其中之一是应用建议的权限,不是针对
答案2
这文章给出了一个很好的简单解决方案:
创建一个root拥有的目录
/friends/
,并使其/friends/alice/
成为用户的家alice
:usermod -m -d /friends/alice alice
在末尾添加此内容
/etc/ssh/sshd_config
:Subsystem sftp internal-sftp Match User alice ChrootDirectory /friends
然后
/etc/init.d/ssh restart
如果您将多个用户chroot到同一目录,但不希望这些用户浏览其他用户的主目录,您可以更改每个主目录的权限,如下所示:示例:
chmod 700 /home/alice
唯一的缺点:使用这个解决方案,Apache 将无法读入
/home/alice/www
......