proftpd 将 %u 保存到 var 并在之后重写它

proftpd saving %u to var and rewrite it afterwards

目前正在与 ProFTPD 一起开发 ftp 代理。

我们的设置与 issue 中的设置几乎相同。

但是,我们很难使用用户名。 因为我们想要 hide/transport 用户名中的目标服务器,所以我们 重写用户名以清理它。

到目前为止一切顺利,我们可以使用干净的用户名了。 要进行 LDAP 身份验证。

但是我们仍然需要重写前用户名中的目标服务器字符串。

关于如何:

的任何信息

非常欢迎。

也许我们确实以错误的方式使用了某种技术,或者到目前为止我们未能使用的技术。

编辑:

关于@Castaglia

据说我们在原始用户名中确实有 2 个信息。 ADuser@RemoteServer.

我们希望通过 ADuser 建立 LDAP 身份验证。通过 RemoteServer 信息,我们希望使用从 MySQL.

查询的凭据连接到远程服务器

我们现在努力解决的问题是如何利用这两种信息。通过重写,我们得到了一个干净的用户,但失去了服务器。

所以我们正在寻找的是某种将原始字符串保存到 var 的选项。并重写 2 次。一次输入用户字符串以进行身份​​验证,一次输入服务器名称以了解用户想要连接到哪个服务器。

我认为要达到你想要的效果,你可以尝试以下方法。

首先,稍微修改 RewriteRule,以捕获 USER 命令的 second 部分(例如 "RemoteServer"), 因此:

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCondition %m USER
  RewriteRule ^(.*#)?([0-9A-Za-z]+)(@)?(.*)? 
</IfModule>

接下来,在您的 SQL 查询配置中,使用 note 引用来检索该正则表达式组:

<IfModule mod_sql.c>
  ...
  SQLConnectInfo ... PERCONNECTION
  ...
  SQLNamedQuery get-url SELECT "concat('ftp://',ftp_username, ':', ftp_password, '@', ftp_servername) FROM users ... WHERE concat(username, '@', token) = '%{note:mod_rewrite.}'"
  ...
</IfModule>

%{note:mod_rewrite.} 表示法表示 "interpolate the value of the session note stored under the key 'mod_rewrite.'"。 mod_rewrite stashes/records groups 在那些 session 注释中匹配的 RewriteRule$N 使用基于 1 的索引,因此第一组为 </code>, <code> 用于第二组(这将是您示例 USER 命令中的 "ADuser" 值),</code> 用于第三组,<em>etc</em>.</p> <p>我已经更新了对 <em> 的回答,</em> 也包括 "PERCONNECTION" <a href="http://www.proftpd.org/docs/contrib/mod_sql.html#SQLConnectInfo" rel="nofollow noreferrer"><code>SQLConnectInfo 政策的使用。为什么?这告诉 mod_sql 模块在客户端连接 时连接到 SQL 数据库 ,而不是等到客户端提供了所有必要的凭据。由于 mod_rewrite 存储有关捕获的正则表达式组的注释的方式,这是必要的:这些注释仅在 仅在该命令的持续时间内捕获 在你的情况下,只有 USER 命令)。因此,我们希望在处理 USER 命令时 使用 配置的 SQL 语句,因为那时 %{note:mod_rewrite.} 引用将有效。

希望对您有所帮助!

对于感兴趣的人,这就是我们(我和丹尼尔)解决它的方式。

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCondition %m USER
  RewriteRule ^(.*#)?([0-9A-Za-z]+)(@)?(.*)? 
</IfModule>

<IfModule mod_ldap.c>
  LDAPServer ...
  ...
</ifModule>

<IfModule mod_sql.c>
  SQLBackend mysql
  SQLConnectInfo ...
  SQLLog USER server_token
  SQLNamedQuery server_token UPDATE "buffer_token='%{note:mod_rewrite.}' WHERE username = '%U'" users
  SQLAuthenticate off
  SQLNamedQuery get-url  SELECT "concat('ftp://',ftp_username, ':', ftp_password, '@', ftp_servername) FROM users inner join server_user on users.id = user_id inner join servers on servers.id = server_id WHERE username = '%U' and token = buffer_token"
</IfModule>

<IfModule mod_proxy.c>
...
</IfModule>
ProxyReverseServers sql:/get-url