Mod rewrite proftpd将%u保存到var并在以后重写

Mod rewrite proftpd将%u保存到var并在以后重写,mod-rewrite,reverse-proxy,proftpd,Mod Rewrite,Reverse Proxy,Proftpd,当前正在使用的ftp代理上工作 我们的设置与此基本相同 然而,我们很难使用用户名。 由于我们希望在用户名中隐藏/传输目标服务器,因此 对用户名进行重写以将其清除 到目前为止还不错,我们可以使用干净的用户名。 执行LDAP身份验证 但是,我们仍然需要重写之前用户名中的targetserver字符串 有关如何: 在重写环境变量之前,将原始用户名保存到环境变量,并防止重写环境变量 使用ProFTPD注释阅读相关信息,但不知何故未能找到其中的文档 访问原始用户名,而不是重写的用户名 如何在连接中隐藏用户

当前正在使用的ftp代理上工作

我们的设置与此基本相同

然而,我们很难使用用户名。 由于我们希望在用户名中隐藏/传输目标服务器,因此 对用户名进行重写以将其清除

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

但是,我们仍然需要重写之前用户名中的targetserver字符串

有关如何:

在重写环境变量之前,将原始用户名保存到环境变量,并防止重写环境变量 使用ProFTPD注释阅读相关信息,但不知何故未能找到其中的文档 访问原始用户名,而不是重写的用户名 如何在连接中隐藏用户名和targetserver并使用它的任何其他信息 我们非常欢迎

也许有一种技术我们用错了,或者是一种到目前为止我们还没用过的技术

编辑:

关于@Castaglia

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

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

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


因此,我们要寻找的是某种选项,将原始字符串保存到一个变量,并重写它2次。一次输入一个用户字符串以验证ans,一次输入一个服务器名称以了解用户要连接到哪个服务器。

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

首先,稍微修改RewriteRule,以便捕获用户命令的第二部分,例如RemoteServer,因此:

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCondition %m USER
  RewriteRule ^(.*#)?([0-9A-Za-z]+)(@)?(.*)? $2
</IfModule>
接下来,在SQL查询配置中,使用注释引用检索该正则表达式组:

<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将匹配的重写规则组隐藏/记录在这些会话笔记中;$N使用基于1的索引,因此第一组为$1, 第二组为$2,这将是示例用户命令中的ADuser值,第三组为$3,以此类推

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


希望这有帮助

我认为,为了实现你想要的目标,你可以尝试以下方法

首先,稍微修改RewriteRule,以便捕获用户命令的第二部分,例如RemoteServer,因此:

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCondition %m USER
  RewriteRule ^(.*#)?([0-9A-Za-z]+)(@)?(.*)? $2
</IfModule>
接下来,在SQL查询配置中,使用注释引用检索该正则表达式组:

<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将匹配的重写规则组隐藏/记录在这些会话笔记中;$N使用基于1的索引,因此第一组为$1, 第二组为$2,这将是示例用户命令中的ADuser值,第三组为$3,以此类推

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


希望这有帮助

对于相关方,这就是我和丹尼尔解决问题的方式

<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

对于感兴趣的一方来说,这就是我和丹尼尔解决问题的方式

<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

您究竟在何处/如何使用原始用户名?在SQL查询中,或在ExtendedLog中,或…?标记将在SQL查询中使用它。我们去掉了用户名部分,使用的targetserver仍然是原始用户名。变量%U应提供客户端发送的用户命令的原始值;如果这不起作用,请更新您的帖子以显示conf
你的配置也在使用mod_rewrite来重写/修改发送的用户命令;您是否希望/希望在那里获得未修改的值?感谢您抽出时间,我更新了问题,希望它澄清了我们试图做的事情。您究竟在哪里/如何使用原始用户名?在SQL查询中,或在ExtendedLog中,或…?标记将在SQL查询中使用它。我们去掉了用户名部分,使用的targetserver仍然是原始用户名。变量%U应提供客户端发送的用户命令的原始值;如果这不起作用,请更新您的帖子以显示使用此选项的配置以及结果。您的配置还使用mod_rewrite来重写/修改发送的用户命令;您是否希望/希望在那里获得未修改的值?感谢您抽出时间,我更新了问题,希望它澄清了我们的尝试。我的同事解决了问题:我们现在可以通过LDAP连接用户,并将信息转发到SQL查询。然而,上面的尝试在很大程度上帮助了找到正确的解决方案,但并没有“按原样”起作用。这是因为在构建/执行mysql查询时,注释再次为空。因此,我们使用命名查询在登录时写入日志,并在以后使用此信息确定正确的“会话”。我的同事解决了这个问题:我们现在可以通过LDAP连接用户,并将信息转发到SQL查询。然而,上面的尝试在很大程度上帮助了找到正确的解决方案,但并没有“按原样”起作用。这是因为在构建/执行mysql查询时,注释再次为空。因此,我们使用命名查询在登录时写入日志,并在以后使用此信息确定正确的“会话”。并最终获得凭据和服务器地址。您好,请避免粘贴整个代码/配置,但更喜欢突出显示有用的部分,并解释如何解决itHello@Arount,谢谢您的建议。Fabian据此编辑了答案。您好,请避免粘贴整个代码/配置,但更喜欢突出显示有用的部分,并解释如何解决itHello@Arount,谢谢您的建议。费边据此编辑了答案。