Starea curenta
Dată este o gazdă cu câteva adrese IPv4 și acces HTTP și FTP pentru fiecare adresă; fiecare vhost are acces la o bază de date PostgreSQL. Autentificarea web și ftp se face față de baza de date respectivă; pentru proftpd folosesc această setare pentru fiecare adresă IP/vhost ($VALUES nu sunt variabile, dar ascund valori reale):
SQLConnectInfo $VHOST@localhost $SQLUSER $SQLPASS
Conectare SQLUserInfo Parola de conectare 33 33 "CONCAT('/var/www/$VHOST/upload/', id)" "'/bin/bash'"
Deci, practic, fiecare utilizator web are un cont ftp la aceeași gazdă cu aceleași acreditări; intern funcționează ca www-data.www-data și fiecare cont de pe fiecare vhost are un folder individual. Merge bine.
Sarcină și idee
Nu aveți nevoie de mai multe adrese IPv4 pentru vhost-uri suplimentare (și, de preferință, scăpați de majoritatea celor existente). Luați ca dat că clienții solicită acces ftp(e). și IPv4 pentru cel puțin următorii doi ani - altfel lucrurile ar fi ușoare.
Ftp nu are conceptul de vhosts, așa că cea mai bună abordare la care m-am putut gândi până acum este să folosesc nume de cont precum $VHOST.$LOGIN (ar trebui să fie acceptabilă pentru clienți). Apoi aș putea împărți numele de autentificare la punct, să folosesc prima parte ca nume de bază de date și a doua parte ca nume de autentificare. Nimic altceva nu ar trebui schimbat.
Problemă
Nu găsesc niciun program care să o susțină. Nici nu văd o modalitate de a integra o astfel de configurare în configurația proftpd și nici nu am găsit un alt daemon ftp mai flexibil.
Digresiune: Acolo este cum ar fi SQLNamedConnectInfo/SQLNamedQuery și pot obține formatul dorit al numelui de autentificare plus utilizarea unei baze de date specifice cu asta:
SQLNamedConnectInfo $VHOST postgres $VHOST@localhost $SQLUSER $SQLPASS
SQLNamedQuery $VHOST SELECT "Login, Password, 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 personalizat:/$VHOST
Dar, din păcate, aceasta poate fi inclusă o singură dată (în secțiunea principală, există doar 1 adresă IP) - cu o astfel de abordare, ar trebui să iterez prin toate vhost-urile/bazele de date, totuși...
Următorul lucru la care m-am uitat a fost PAM - există pam_pgsql, dar nu există suport pentru diferite baze de date (în funcție de părțile numelui de utilizator sau nu).
Ultimul lucru la care m-am putut gândi a fost libnss.Există libnss-pgsql, dar din nou acceptă doar o singură conexiune la un tabel dedicat - desigur, cel mai tipic caz de utilizare, dar nu suficient pentru mine.
Există ceva la care nu m-am gândit? Sau o modalitate de a insera un script mic într-una dintre aceste soluții? La urma urmei, sunt la doar câteva operații cu șir distanță de obiectivul meu.