proftpd 将 %u 保存到 var 并在之后重写它
proftpd saving %u to var and rewrite it afterwards
目前正在与 ProFTPD 一起开发 ftp 代理。
我们的设置与 issue 中的设置几乎相同。
但是,我们很难使用用户名。
因为我们想要 hide/transport 用户名中的目标服务器,所以我们
重写用户名以清理它。
到目前为止一切顺利,我们可以使用干净的用户名了。
要进行 LDAP 身份验证。
但是我们仍然需要重写前用户名中的目标服务器字符串。
关于如何:
的任何信息
- 在重写之前将原始用户名保存到环境变量中(并防止环境变量被重写)
- 使用 ProFTPD 注释(阅读它但不知何故未能找到它的文档)
- 访问原始用户名(不是重写的用户名)
- 关于如何在连接中隐藏用户名和目标服务器并使用它的任何其他信息
非常欢迎。
也许我们确实以错误的方式使用了某种技术,或者到目前为止我们未能使用的技术。
编辑:
关于@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
目前正在与 ProFTPD 一起开发 ftp 代理。
我们的设置与 issue 中的设置几乎相同。
但是,我们很难使用用户名。 因为我们想要 hide/transport 用户名中的目标服务器,所以我们 重写用户名以清理它。
到目前为止一切顺利,我们可以使用干净的用户名了。 要进行 LDAP 身份验证。
但是我们仍然需要重写前用户名中的目标服务器字符串。
关于如何:
的任何信息- 在重写之前将原始用户名保存到环境变量中(并防止环境变量被重写)
- 使用 ProFTPD 注释(阅读它但不知何故未能找到它的文档)
- 访问原始用户名(不是重写的用户名)
- 关于如何在连接中隐藏用户名和目标服务器并使用它的任何其他信息
非常欢迎。
也许我们确实以错误的方式使用了某种技术,或者到目前为止我们未能使用的技术。
编辑:
关于@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