Текущее состояние
Дан хост с парой адресов 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, но опять же он поддерживает только одиночное подключение к выделенной таблице — конечно самый типичный вариант использования, но мне этого мало.
Есть ли что-то, о чем я не подумал? Или какой-нибудь способ вставить крошечный скрипт в одно из этих решений? В конце концов, я всего в нескольких строковых операциях от своей цели.