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

时间:2017-08-01 13:58:20

标签: mod-rewrite reverse-proxy proftpd

目前使用ProFTPD处理ftp代理。

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

但是,我们很难使用用户名。 因为我们想要在用户名中隐藏/传输目标服务器 重写用户名以清理它。

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

然而我们仍然需要重写之前用户名中的targetserver字符串。

有关如何:

的任何信息
  • 在重写之前将原始用户名保存到环境变量中(并防止env变量也被重写)
  • 使用ProFTPD备注(阅读相关内容,但无论如何都找不到它和文档)
  • 访问原始用户名(不是重写的用户名)
  • 如何在连接中隐藏用户名和目标服务器并使用它的任何其他信息

非常欢迎。

也许有某种技术我们以错误的方式使用或者我们迄今未能使用的技术。

编辑:

关于@Castaglia

据说我们在原始用户名中有2个信息。 ADUser便有@ REMOTESERVER。

与ADuser一起,我们要建立LDAP身份验证。使用RemoteServer信息,我们希望使用从MySQL查询的凭据连接到远程服务器。

我们现在正在努力的是利用这两个信息。通过重写,我们得到一个干净的用户,但松散了服务器。

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

2 个答案:

答案 0 :(得分:1)

我认为要获得您想要实现的目标,您可以尝试以下方法。

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

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCondition %m USER
  RewriteRule ^(.*#)?([0-9A-Za-z]+)(@)?(.*)? $2
</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.$4}'"
  ...
</IfModule>

%{note:mod_rewrite.$4}符号表示“插入存储在键'mod_rewrite。$ 4'下的会话注释的值”。并mod_rewrite在这些会话记录中存储/记录匹配的RewriteRule; $N使用基于1的索引,因此第一组使用$1,  $2表示第二组(在示例USER命令中为“ADuser”值),$3表示第三组, etc

我已更新的答案包括使用“PERCONNECTION”SQLConnectInfo政策。为什么?这告诉mod_sql模块在​​客户端连接时连接到SQL数据库,而不是等到客户端提供了所有必要的凭据。由于mod_rewrite隐藏其关于捕获的正则表达式组的注释的方式,这是必要的:这些注释仅在该命令的持续时间内捕获 ie 在您的情况下,只有USER命令。因此,我们希望在处理USER命令时使用配置的SQL语句,因为那时%{note:mod_rewrite.$4}引用有效。

希望这有帮助!

答案 1 :(得分:1)

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

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCondition %m USER
  RewriteRule ^(.*#)?([0-9A-Za-z]+)(@)?(.*)? $2
</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.$4}' 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