Рейтинг:1

Аутентификация ftp в нескольких (postgres) базах данных

флаг iq

Текущее состояние

Дан хост с парой адресов IPv4 и доступом по HTTP и FTP для каждого адреса; каждый виртуальный хост имеет доступ к базе данных PostgreSQL. Web- и ftp-аутентификация осуществляется по соответствующей базе данных; для proftpd я использую эту настройку для каждого IP-адреса/виртуального хоста ($VALUES не являются переменными, но скрывают реальные значения):

SQLConnectInfo $VHOST@localhost $SQLUSER $SQLPASS
Логин SQLUserInfo Логин Пароль 33 33 "CONCAT('/var/www/$VHOST/upload/', id)" "'/bin/bash'"

Таким образом, в основном у каждого веб-пользователя есть учетная запись ftp на одном хосте с одинаковыми учетными данными; внутри они работают как www-data.www-data, и каждая учетная запись на каждом виртуальном хосте имеет отдельную папку. Работает отлично.

Задача и идея

Не нужно больше IPv4-адресов для дополнительных виртуальных хостов (и желательно избавиться от большинства существующих). Примите как данность, что клиенты требуют доступа к ftp(s) и IPv4 по крайней мере на ближайшие пару лет — иначе все было бы просто.

Ftp не имеет понятия vhosts, поэтому лучший подход, который я мог придумать, — это использовать имена учетных записей, такие как $VHOST.$LOGIN (должно быть приемлемо для клиентов). Затем я мог бы разделить имя входа на точку, использовать первую часть как имя базы данных, а вторую часть как имя входа. Больше ничего не нужно было бы менять.

Проблема

Я не могу найти какую-либо часть программного обеспечения, поддерживающего это. Я также не вижу способа интегрировать такую ​​настройку в конфигурацию proftpd и не нашел другого демона ftp, который был бы более гибким.

Отступление: есть является такая вещь, как SQLNamedConnectInfo/SQLNamedQuery, и я могу получить желаемый формат имени для входа, а также использование определенной базы данных с этим:

SQLNamedConnectInfo $VHOST postgres $VHOST@localhost $SQLUSER $SQLPASS
SQLNamedQuery $VHOST SELECT "Логин, Пароль, 33, 33, CONCAT('/var/www/$VHOST.epaxios.com/upload/', id), '/bin/bash' FROM login WHERE Login=substr('% U', strpos('%U', '.')+1) AND substr('%U', 1, strpos('%U', '.')-1)='$VHOST'" $VHOST
Обычай SQLUserInfo:/$VHOST

Но, к сожалению, это можно включить только один раз (в основном разделе есть только 1 IP-адрес) - при таком подходе мне нужно будет перебирать все виртуальные хосты/базы данных...

Следующим, на что я обратил внимание, был PAM — есть pam_pgsql, но нет такой вещи, как поддержка разных баз данных (независимо от того, зависит ли это от частей имени пользователя или нет).

Последнее, о чем я мог думать, это libnss.Есть libnss-pgsql, но опять же он поддерживает только одиночное подключение к выделенной таблице — конечно самый типичный вариант использования, но мне этого мало.

Есть ли что-то, о чем я не подумал? Или какой-нибудь способ вставить крошечный скрипт в одно из этих решений? В конце концов, я всего в нескольких строковых операциях от своей цели.

Castaglia avatar
флаг id
Более новые клиенты FTP поддерживают команду `HOST` (см. [RFC 7151](https://datatracker.ietf.org/doc/html/rfc7151)), которая реализует виртуальный хостинг на основе имени для FTP. Помимо поддержки `HOST` для FTPS, ProFTPD также поддерживает [TLS SNI](https://en.wikipedia.org/wiki/Server_Name_Indication) для виртуальных хостов FTPS на основе имени.
флаг iq
@Castaglia, к сожалению, это так же хорошо, как переход на IPv6: идеально, но не сработает. Я изменил тестовую среду и связался с ~ 10 наиболее технически осведомленными клиентами: две реакции типа «а?», молчание в противном случае и ни одного успешного соединения. Если я не найду решение, которое не требует каких-либо (технических) изменений у клиента, я не нашел вообще никакого решения :(
Castaglia avatar
флаг id
Я понимаю. Другой возможностью может быть использование прокси-сервера, такого как [`pgpool`](https://www.pgpool.net/), где прокси-сервер сопоставляет имя пользователя клиента с используемой серверной базой данных?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.