当前状态
给定一个主机,该主机有几个 IPv4 地址,每个地址都有 HTTP 和 FTP 访问权限;每个虚拟主机都可以访问 PostgreSQL 数据库。Web 和 ftp 身份验证是针对相应的数据库进行的;对于 proftpd,我对每个 IP 地址/虚拟主机使用此设置($VALUES 不是变量,但隐藏了实际值):
SQLConnectInfo $VHOST@localhost $SQLUSER $SQLPASS
SQLUserInfo login Login Password 33 33 "CONCAT('/var/www/$VHOST/upload/', id)" "'/bin/bash'"
因此基本上每个 Web 用户都在同一主机上拥有一个具有相同凭据的 ftp 帐户;在内部,它们以 www-data.www-data 的形式工作,并且每个虚拟主机上的每个帐户都有一个单独的文件夹。工作正常。
任务与理念
不需要为额外的虚拟主机提供更多 IPv4 地址(最好摆脱大多数现有地址)。假设客户需要 ftp(s) 访问和至少在未来几年内,IPv4 将会继续存在 - 否则事情就会变得简单。
Ftp 没有 vhost 的概念,因此到目前为止我能想到的最佳方法是使用 $VHOST.$LOGIN 之类的帐户名(客户应该可以接受)。然后我可以在点处拆分登录名,使用第一部分作为数据库名称,第二部分作为登录名。其他什么都不需要更改。
问题
我找不到任何支持它的软件。我既找不到将此类设置集成到 proftpd 配置中的方法,也没有找到其他更灵活的 ftp 守护程序。
题外话:是诸如 SQLNamedConnectInfo/SQLNamedQuery 之类的东西,我可以获得所需的登录名格式以及特定数据库的使用情况:
SQLNamedConnectInfo $VHOST postgres $VHOST@localhost $SQLUSER $SQLPASS
SQLNamedQuery $VHOST SELECT "Login, Password, 33, 33, CONCAT('/var/www/$VHOST.epaxios.com/upload/', id), '/bin/bash' FROM login WHERE Login=substr('%U', strpos('%U', '.')+1) AND substr('%U', 1, strpos('%U', '.')-1)='$VHOST'" $VHOST
SQLUserInfo custom:/$VHOST
但不幸的是,这只能包含一次(在主要部分,只有 1 个 IP 地址) - 但是使用这种方法我需要遍历所有 vhosts/databases...
我接下来研究的是 PAM - 有 pam_pgsql,但不支持不同的数据库(无论是否取决于用户名的各个部分)。
我最后想到的是 libnss。有 libnss-pgsql,但它同样只支持与专用表的单个连接 - 当然这是最典型的用例,但对我来说还不够。
有什么是我没想到的吗?或者有什么方法可以将一个小脚本插入到这些解决方案中?毕竟,我离目标只有几个字符串操作了。