proftpd сохраняет %u в var и потом переписывает его

в настоящее время работает с ftp-прокси с ProFTPD.

Наши настройки почти такие же, как и в этом проблеме.

Однако мы изо всех сил пытаемся использовать имя пользователя. Поскольку мы хотим скрыть/перенести целевой сервер в имени пользователя, мы переписываем имя пользователя, чтобы очистить его.

Пока все хорошо, мы можем использовать чистое имя пользователя. Чтобы выполнить аутентификацию LDAP.

Однако нам по-прежнему нужна строка targetserver, которая была в имени пользователя до перезаписи.

Любая информация о том, как:

  • сохраните исходное имя пользователя в переменной среды до его перезаписи (и также предотвратите перезапись переменной env)
  • используйте заметки ProFTPD (читал об этом, но почему-то не смог найти и документы по нему)
  • получить доступ к исходному имени пользователя (не переписанному)
  • любая другая информация, как скрыть имя пользователя и целевой сервер в соединении и использовать его

очень приветствуются.

Может быть, есть какая-то техника, которую мы используем неправильно, или техника, которую до сих пор не использовали.

Редактировать:

Относительно @Кастальи

Было сказано, что у нас есть 2 информации в исходном имени пользователя. ADuser@RemoteServer.

С ADuser мы хотим установить аутентификацию LDAP. С информацией RemoteServer мы хотим подключиться к удаленному серверу с учетными данными, которые мы запросили из MySQL.

С чем мы сейчас боремся, так это с использованием обеих данных. При перезаписи мы получаем чистого пользователя, но теряем сервер.

Итак, мы ищем какую-то возможность сохранить исходную строку в var. И переписать 2 раза. Один раз в строку пользователя для аутентификации и один раз в имя сервера, чтобы узнать, к какому серверу пользователь хочет подключиться.


person Daniel Böttner    schedule 01.08.2017    source источник
comment
Где и как именно вы пытаетесь использовать исходное имя пользователя? В запросе SQL, или в ExtendedLog, или...?   -  person Castaglia    schedule 01.08.2017
comment
Целью было бы использовать его в SQL-запросе. Где мы избавляемся от части имени пользователя и используем targetserver в исходном имени пользователя.   -  person Daniel Böttner    schedule 01.08.2017
comment
Переменная %U должна предоставлять исходное значение из команды USER, отправленной клиентом; если это не сработает, обновите свой пост, чтобы показать конфигурацию, использующую это, и результат.   -  person Castaglia    schedule 01.08.2017
comment
Ваша конфигурация также использует mod_rewrite для перезаписи/изменения отправленной команды USER; Вы надеетесь/хотите получить там значение немодифицированное?   -  person Castaglia    schedule 02.08.2017
comment
Спасибо за ваше время, я обновил вопрос и надеюсь, что он прояснит, что мы пытаемся сделать.   -  person Daniel Böttner    schedule 02.08.2017


Ответы (2)


Для заинтересованной стороны, вот как мы (я и Дэниел) решили это.

<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
person Fabian Mangelsdorf    schedule 04.08.2017
comment
Привет, пожалуйста, не вставляйте весь код / ​​конфигурацию, но предпочитайте выделять полезную часть и давать некоторые объяснения того, как вы ее решили. - person Arount; 04.08.2017
comment
Здравствуйте @Arount, спасибо за ваше предложение. Фабиан соответствующим образом отредактировал ответ. - person Daniel Böttner; 07.08.2017

Я думаю, что, чтобы получить то, чего вы хотите, вы можете попробовать следующее.

Сначала слегка измените RewriteRule, чтобы захватить вторую часть вашей команды USER (например, "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 для второй группы (которая будет значением "ADuser" в вашем примере команды USER), $3 для третьей группы, и т. д..

Я обновил свой ответ, чтобы также включить использование "PERCONNECTION" SQLConnectInfo. Почему? Это указывает модулю mod_sql подключаться к базе данных SQL когда подключается клиент, а не ждать, пока клиент предоставит все необходимые учетные данные. Из-за того, что mod_rewrite хранит свои заметки о захваченных группах регулярных выражений, это необходимо: эти заметки записываются только только на время выполнения этой команды (т.е. в вашем случае , только команда USER). Таким образом, мы хотим использовать сконфигурированный оператор SQL при обработке команды USER, поскольку именно тогда эта ссылка %{note:mod_rewrite.$4} будет действительной.

Надеюсь это поможет!

person Castaglia    schedule 03.08.2017
comment
Мой коллега решил проблему: теперь мы можем подключать пользователей через LDAP и пересылать информацию в SQL-запрос. Тем не менее, описанная выше попытка очень помогла найти правильное решение, но не работает «как есть». Это связано с тем, что заметка снова пуста к тому времени, когда запрос mysql будет построен/выполнен. Поэтому мы использовали именованный запрос для записи журнала к моменту входа в систему и использования этой информации позже для определения правильного «сеанса». И в конечном итоге получить учетные данные и адрес сервера. - person Daniel Böttner; 04.08.2017