无法使用带有 Atmoz/SFTP (SSH) 的 ARM 模板挂载 /home 目录

Posted

技术标签:

【中文标题】无法使用带有 Atmoz/SFTP (SSH) 的 ARM 模板挂载 /home 目录【英文标题】:Unable to mount /home directory using ARM template with Atmoz/SFTP (SSH) 【发布时间】:2020-09-24 23:58:51 【问题描述】:

我正在使用https://charbelnemnom.com/2019/06/how-to-deploy-sftp-service-on-microsoft-azure/ 提供的模板在该示例中,他安装了一个特定于用户的卷。这完美地工作。我想将挂载更改为仅挂载“/home”目录,以便 FTP 服务器将自动在挂载的主目录下创建用户文件夹。启动容器时,启动容器时会为每个用户创建用户文件夹,但是,在登录时,我得到

chroot 目录组件“/home/”的所有权或模式错误

我看到其他帖子表明 root 必须有权访问这些目录,但我很困惑,因为它显然有足够的权限在挂载的主目录中创建用户文件夹。那么为什么当用户尝试登录时我会收到错误消息?如何修改资源模板以允许 FTP 服务器自动创建用户文件夹,同时还允许用户对其进行 CHRoot?

以下部分有效:

                "volumeMounts": [
                  
                    "mountPath": "/home/user1",
                    "name": "sftpvolume",
                    "readOnly": false
                  
                ]

这不起作用:

                "volumeMounts": [
                  
                    "mountPath": "/home",
                    "name": "sftpvolume",
                    "readOnly": false
                  
                ]

我认为上述两种方法的主要区别在于,在第一种可行的方法中,部署脚本创建用户目录(root 可能有权访问),而如果 FTP 服务器在启动时创建用户目录,它不得。但我不知道如何解决它。

【问题讨论】:

【参考方案1】:

我认为您观察到的行为与底层 docker 映像 atmoz/sftp 有关。他们自述文件的“使用”部分的注释说:

请记住,用户不能直接在自己的主目录下创建新文件,因此如果您希望他们上传文件,请确保至少有一个子目录

编辑:Azure 文件共享不能与此 docker 映像的自动创建用户文件夹功能一起使用。

您收到的错误消息是因为/home 文件夹的权限不正确(chroot 需要 755,以 root 作为所有者)。您可以通过使用az container exec -g RESOURCE_GROUP -n sftp-group --exec-command /bin/bash 在容器中启动一个shell 然后运行ls -la 来确认这一点。你会看到:

# ls -la
total 80
drwxr-xr-x   1 root root 4096 Jun  6 13:57 .
drwxr-xr-x   1 root root 4096 Jun  6 13:57 ..
-rwxr-xr-x   1 root root    0 Jun  6 13:57 .dockerenv
drwxr-xr-x   1 root root 4096 Dec 28  2018 bin
drwxr-xr-x   2 root root 4096 Oct 20  2018 boot
drwxr-xr-x   5 root root  360 Jun  6 13:57 dev
-rwxr-xr-x   1 root root 2665 Dec 28  2018 entrypoint
drwxr-xr-x   1 root root 4096 Jun  6 13:57 etc
drwxrwxrwx   2 root root    0 Jun  6 13:57 home

很遗憾,您将无法实现将不同用户的主文件夹用作chroot 目标所需的特定所有权和权限结构。

Azure 文件共享卷是使用单一所有权 + 权限组合装载的。您不能更改此技术所需的子文件夹的所有权或权限。

【讨论】:

是的,我这样做了,但没有解决它。 FTP 服务器确实创建了我在每个用户下指定的所有目录,但由于该错误,他们无法登录。在这种情况下,他们没有上传任何文件,因为他们甚至无法登录。 ioiUser1:pwUser1:1001:100:上传/phi,下载 我刚试了一下,我明白你的意思 - 文件夹已创建,用户无法登录。 如果我们在容器中添加一个启动脚本会循环遍历所有用户目录并应用适当的权限会怎样? 权限不会因为卷的挂载方式而改变。我相信这是 CIFS 协议的限制 (sysadmins.tech/linux-and-cifs-files-permissions) 您是否碰巧知道将卷挂载到允许其工作的原始部署脚本中的用户目录上传文件夹时有什么不同?只是想知道为什么不能在脚本中复制它。

以上是关于无法使用带有 Atmoz/SFTP (SSH) 的 ARM 模板挂载 /home 目录的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 PHP 函数 ssh2_tunnel 创建 SSH 隧道

Gitlab - 无法通过 SSH 克隆,但 SSH 可以自己工作

XAMPP 无法启动:SSH 无法访问

我无法使用 java 通过 ssh-tunnel 连接到数据库。

创建支持带有ssh服务镜像的两种方法

TortiseSVN svn+ssh 错误:无法连接到 URL 上的存储库...网络连接意外关闭