现在的情况

现在的情况

我想:

  • 为朋友提供 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

问题:

  1. friend现在不能出去/home/(这很好),但是他仍然可以去/home/me/并读取里面的文件!如何只给他访问权限/home/friend/而没有其他权限?这似乎不可能,因为:

    ChrootDirectory
    指定身份验证后 chroot(2) 的目录路径名。 路径名的所有组成部分必须是 root 拥有的目录任何其他用户或组都不可写入。

  2. 我是不是该

    • 将用户添加friend到组中www-data
    • 或将用户添加www-data到组中friend
    • 或其他用户/组设置?

      允许 Apache 提供文件服务,并允许 PHP 具有写入权限/home/friend/www/?假设他的网站上有一个文件上传器:PHP需要在这个目录中写入。授予/home/friendand哪些权限/home/me


链接主题:

处理 Apache 权限的最佳方法是什么?

我的网站文件/文件夹在 Linux 网络服务器上应具有哪些权限?

答案1

现在的情况

对于本节的警告,仅在您的情况下才建议这样做仅使用是网络托管,apache并不意味着有权访问家庭用户的文件夹(答案末尾的其他建议可能更合适)。


  1. Web/Apache 组(www-datagroup)必须包含所有使用服务的用户
  2. Apache 和用户需要访问各自的权限,www同时限制彼此之间的访问
    • 下每个目录都/home应该有www-data:user权限
        chown www-data:me /home/me

或者

  1. Web/Apache 组(www-datagroup)必须包含所有使用服务的用户
  2. Apache 和用户需要访问各自的权限www,同时限制彼此之间的访问
    • 家庭用户的文件夹应该有权限chown me:me /home/me
    • 使/home属于apachechown www-data:root /home

这样,apache 将有权访问必要的www目录,而用户将无权访问其他用户文件夹。

这里的关键是组权限在用户之间共享,而 apache 本身是一个不暴露给其他用户的用户,例如在授予 apache 和我访问权限时与其他用户chown www:me /home/me保持隔离(并且允许组 www 中的每个人访问文件夹) )mechown me:www /home/meme

该目录www需要存在于www-data当前配置设置中属于 apache (用户)的位置中/home/mewww-data:me或者/homewww-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......

相关内容