Hosting · 3 min read · Dec 16, 2025
Virtuelles Hosting Mit vsftpd Und PostgreSQL
Virtuelles Hosting Mit vsftpd Und PostgreSQL
Dieses Dokument beschreibt, wie man einen vsftpd-Server installiert, der virtuelle Benutzer aus einer PostgreSQL-Datenbank anstelle von echten Systembenutzern verwendet. Ich konnte kein Tutorial dazu im Internet finden, also habe ich beschlossen, es zu veröffentlichen, als diese Konfiguration endlich für mich funktionierte. Die Dokumentation basiert auf FreeBSD 6.2, das ich kürzlich verwenden musste (normalerweise benutze ich Debian). Dennoch sollte das Dokument auch für fast jede Linux-Distribution geeignet sein (kann sehr kleine Änderungen erfordern).
OK, lass uns anfangen.
Erforderliche Pakete
- vsftpd
- PostgreSQL Server/Client 7.4+
- PAM_PGSQL
Installation
1. PostgreSQL
#cd /usr/ports/database/postgresql-server82
make install clean
Setze deine Postgres-Locale vor initdb:
#vi /usr/local/pgsql/.cshrc: setenv PGLIB /usr/local/lib
setenv PGDATA $HOME/data
#Du möchtest hier vielleicht einige Locale-Einstellungen vornehmen
setenv PGDATESTYLE ISO
setenv LC_ALL pl_PL.ISO_8859-2
Installiere den DB-Cluster mit der richtigen Kodierung (entnommen aus LC_ALL):
su - pgsql
initdb -E latin2
2. PAM-PGSQL
cd /usr/ports/security/pam-pgsql
make install clean
Stelle sicher, dass pam-pgsql.so in /usr/lib ist. Wenn du SEGFAULT bekommst, ist pam_pgsql wahrscheinlich nicht im richtigen Pfad (ich hatte dieses Problem, als ich pam_pwdfile ausprobierte).
ls /usr/lib/pam_pgsql.so
/usr/lib/pam_pgsql.so
3. vsftpd
cd /usr/ports/ftp/vsftpd
make install clean
echo “vsftpd_enable=\”YES\”” >> /etc/rc.conf
adduser vsftpd
4. Und Jetzt … Arbeitsbeispiele Für Konfigurationsdateien
vsftpd - ist der Name der pam-Konfigurationsdatei /etc/pam.d/vsftpd.
vsftpd - ist der Name des kürzlich hinzugefügten Benutzers (der Benutzer benötigt Schreibzugriffsrechte auf localroot aus dem Beispiel local_umask=0000 - ich wollte, dass Dateien mit chmod 77x gespeichert werden).
#vi /usr/local/etc/vsftpd.conf:
listen=YES
anonymous_enable=NO
local_enable=YES
virtual_use_local_privs=YES
write_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/usr/local/share/vsftpd/empty
pam_service_name=vsftpd
guess_enable=YES
user_sub_token=$USER
local_root=/usr/local/www/apache22/data/$USER
chroot_local_user=YES
hide_ids=YES
ftpd_banner=Willkommen beim FTP-Server
file_open_mode=0770
local_umask=0000
anon_mkdir_write_enable=NO
guess_username=vsftpd
Standardmäßig sucht pam_pgsql in der Datei /etc/pam_pgsql.conf nach der Konfiguration. Ich könnte mir eine Einrichtung vorstellen, bei der ich verschiedene Dienste gegen verschiedene Tabellen in der PostgreSQL-Datenbank authentifiziere.
Der config_file-Schalter erledigt die Arbeit - so sieht die Datei aus:
#vi /etc/pam.d/vsftpd:
auth required pam_pgsql.so config_file=/etc/pam_pgsql_vsftpd.conf
account required pam_pgsql.so config_file=/etc/pam_pgsql_vsftpd.conf
#vi /usr/local/pgsql/data/pg_hba.conf:
host system system 127.0.0.1 255.255.255.255 md5 local all pgsql ident sameuser
local all all ident sameuser
0.0.0.0 md5 host sameuser all 0.0.0.0 0.0.0.0 md5 host all all 0.0.0.0 0.0.0.0 reject
#vi/etc/pam_pgsql_vsftpd.conf:
debug
pw_type = md5
connect = hostaddr=127.0.0.1 port=5432 dbname=system user=system password=pass connect_timeout=15
auth_query = select s_password from accounts where s_username = %u
acct_query = select b_expired as acc_expired, 0 as acc_new_pwreq, (s_password ISNULL OR s_password = ‘’) as user_password from accounts where s_username = %u
Lass uns die PostgreSQL-Tabelle und einen Testbenutzer erstellen:
#su - pgsql
#psql system
Willkommen bei psql 8.2.4, dem interaktiven Terminal von PostgreSQL.
Tippe: \copyright für die Verteilungskonditionen
\h für Hilfe zu SQL-Befehlen
\? für Hilfe zu psql-Befehlen
\g oder mit Semikolon beenden, um die Abfrage auszuführen
\q zum Beenden
system=# CREATE TABLE “accounts”(
“i_id” SERIAL,
“s_username” VARCHAR(30) NOT NULL,
“s_password” VARCHAR(50),
“b_expired” BOOLEAN DEFAULT false,
CONSTRAINT “accounts_s_username_key” UNIQUE(“s_username”)
);
HINWEIS: CREATE TABLE erstellt eine implizite Sequenz “accounts_i_id_seq” für die serielle Spalte “accounts.i_id”
HINWEIS: CREATE TABLE / UNIQUE erstellt einen impliziten Index “accounts_s_username_key” für die Tabelle “accounts”
CREATE TABLE
system=# insert into accounts(s_username, s_password) values(‘testuser’,md5(‘secret_pass’));
INSERT 0 1
system=# select * from accounts;
i_id | s_username | s_password | b_expired
——+————+———————————-+———–
1 | testuser | baeed6d497bd4f4676306544a0e7faba | f
(1 Zeile)
Lass uns einen Ordner für unseren neuen virtuellen Benutzer erstellen:
mkdir /usr/local/www/apache22/data/testuser
chown vsftpd:vsftpd /usr/local/www/apache22/data/testuser
ls -la /usr/local/www/apache22/data/testuser
Lass uns vsftpd beim Systemstart starten:
#vi /usr/local/etc/rc.d/vsftpd:
#!/bin/sh
/usr/local/libexec/vsftpd &
Lass uns vsftpd jetzt sofort starten:
#/usr/local/etc/rc.d/vsftpd
… und vsftpd sollte jetzt gut funktionieren.
Ich bin mir bewusst, dass einige Dinge anders gemacht werden könnten, aber dieses Dokument sollte gut genug sein, um dich zu leiten.
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.