2

我想:

  • 授予朋友 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/friend和的哪些权限/home/me


相关主题:

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

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

  • 2
    为什么你需要一个 chroot 监狱?如果权限正确,普通用户就足够了。 
    – 潘奇
     2020 年 1 月 10 日 9:19 
  • @Panki 权限可能很棘手,因为我们希望 Apache+PHP 具有读+写访问权限,但我们不希望每个用户都可以访问其他用户的主页。也许你会对 2 有答案?(没有 chroot 监狱)提前致谢。 
    – 船尾
     2020 年 1 月 10 日 9:35 
  • 您是否考虑过运行两个 apache 实例,作为不同的组运行。然后使用 nginx 作为反向代理来执行虚拟主机。(它还将保护 apache 免受慢懒猴的侵害)。  2020 年 1 月 17 日 21:46

2 个回答

3
+50

现在的情况

此部分的警告,仅当您的唯一用途是网络托管时才建议这样做,apache 无意访问家庭用户的文件夹(答案末尾的其他建议可能更合适)。


  1. Web/Apache 组(www-data组)必须有所有使用该服务的用户

  2. Apache 和用户需要访问各自的权限www,同时限制彼此之间的访问

  • 下的每个目录都/home应该有www-data:user权限

        chown www-data:me /home/me

或者

  1. Web/Apache 组(www-data组)必须有所有使用该服务的用户

  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/metowww-data:me/hometowww-data:root是一种解决方法,因为您位于www用户目录内。

这就是为什么默认www位置在/var主目录下而不是在主目录下,让 apache 和用户可以 w/r 而不www给 apache 不必要的访问权限(比如在这种情况下访问整个用户的文件夹)

如果您的主文件夹用于www(网络使用),那么您可以接受当前的建议/配置,现在如果您将该系统用于网络托管以外的其他目的;然后www不应驻留在/home文件夹中,而应驻留在另一个位置,例如/var在这种情况下,您将需要删除ChrootDirectory使用情况,而是选择经典配置,其中文件访问权限仅由文件访问权限管理,这里有一些关于对经典用户的限制的读物......

如果你想为每个用户提供安全、分离、网络托管以及其他 Linux/服务器使用,你将需要实施一个不同的解决方案,不断发展虚拟化和/或沙盒。

请注意,还有许多其他可能性可以实现您的要求,但就您的配置而言,这是最快的,请阅读下面的最终建议部分以获得更合适的实现。

配置

实施取决于目标安全级别和目标用途。因此,一个配置可能对一种情况很好,同时对另一种情况不好。

您当前的配置与经典配置相差无几,其中ChrootDirectory将使用经典文件权限、组和用户访问级别来管理每个 ssh 用户之间的分离。我猜你只是缺少配置中的用户访问级别来实现这一点。以下是有关如何在此处此处此处ChrootDirectory实施的一些详细信息(除此之外使用是一种很好的安全做法)

替代方案(强化安全性)

PermitRootLogin yes永远不应该使用First ,而是将me用户添加到 suders。me然后可以通过用户使用sudo su访问根目录su

user space如果您的目标是加强安全性,则可以使用内核功能,这将完全分离每个用户,但这是一个完整的其他配置。这可以通过本机 Linux 工具和/或firejail来分离文件/网络等来实现。

同样在强化安全性的相同范围内,应使用私钥/公钥进行身份验证而不是PasswordAuthentication yes

SSHFS也可能是分离托管文件的替代方法。

这里还有一些关于该主题的有趣链接:

最后的建议

最后,关于你的配置,我只是建议

  • 停用PermitRootLogin

  • 审查用户和/home权利。

  • 在独特的虚拟主机使用 情况下

    • 应用建议的权限,不是针对/home目录,而是使用类似/var/apache/user1,user2,etc然后使用ChrootDirectory /var/apache/

  • 在多用途系统的情况下

    • 这里可以使用许多可能性,其中之一是应用建议的权限,而不是针对目录,而是使用类似使用的/home结构,然后使用文件访问权限管理权限。/var/apache/user1,user2,etc ChrootDirectory

  • 感谢您的评论。(小错别字:“servie”)。您能否在这种共享托管情况下添加有关推荐权限的详细信息? 
    – 船尾
     2020 年 1 月 12 日 12:47
  • 我尝试了您的解决方案:(drwxrwx---  5 me     me       4096 Feb 26  2019 www 即me:me所有权和 770 权限www)+ adduser me www-data(即添加用户mewww-data)。但是即使我现在是组的成员,Apache 也无法访问这些文件www-data任何想法? 
    – 船尾
     2020 年 1 月 12 日 21:01 
  • @Basj 我的错,我确实忘记了您将 www 定位在主文件夹下...遍历权限是用户/apache 访问子文件夹所必需的...我完全重写了我的答案,现在是 en-globing整个情况都很享受;)  2020 年 1 月 12 日 23:31
  • @jeff-schaller 感谢您的编辑 :)  2020 年 1 月 19 日 17:10 
0

这篇文章给出了一个不错的简单解决方案:

  • 创建一个 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......

您的答案


来自  https://unix.stackexchange.com/questions/561353/how-to-setup-user-access-control-for-apache-ssh-sftp