Hospedagem Virtual · 3 min read · Dec 16, 2025

Hospedagem Virtual Com vsftpd E PostgreSQL

Hospedagem Virtual Com vsftpd E PostgreSQL

Este documento descreve como instalar um servidor vsftpd que utiliza usuários virtuais de um banco de dados PostgreSQL em vez de usuários reais do sistema. Eu não consegui encontrar nenhum tutorial como esse na internet, então quando essa configuração finalmente funcionou para mim, decidi publicá-la. A documentação é baseada no FreeBSD 6.2, que eu fui forçado a usar recentemente (geralmente uso Debian). No entanto, o documento deve ser adequado para quase qualquer distribuição Linux também (pode exigir pequenas alterações).

OK, vamos começar.

Pacotes Necessários

  • vsftpd
  • Servidor/Cliente PostgreSQL 7.4+
  • PAM_PGSQL

Instalação

1. PostgreSQL

#cd /usr/ports/database/postgresql-server82
make install clean

Defina seu locale do postgres antes do initdb:

#vi /usr/local/pgsql/.cshrc: setenv PGLIB /usr/local/lib

setenv PGDATA $HOME/data

#Você pode querer definir algumas configurações de locale aqui
setenv PGDATESTYLE ISO
setenv LC_ALL pl_PL.ISO_8859-2

Instale o cluster do banco de dados com a codificação correta (retirada de LC_ALL):

su - pgsql
initdb -E latin2

2. PAM-PGSQL

cd /usr/ports/security/pam-pgsql
make install clean

Certifique-se de que pam-pgsql.so está em /usr/lib. Se você receber SEGFAULT, provavelmente pam_pgsql não está no caminho correto (encontrei esse problema quando tentei pam_pwdfile).

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. E Agora … Exemplos Funcionais De Arquivos De Configuração

vsftpd - é o nome do arquivo de configuração pam /etc/pam.d/vsftpd.

vsftpd - é o nome do usuário recém-adicionado (o usuário precisa de direitos de acesso de escrita ao localroot do exemplo local_umask=0000 - eu queria que os arquivos fossem armazenados com chmod 77x).

#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
guest_enable=YES
user_sub_token=$USER
local_root=/usr/local/www/apache22/data/$USER
chroot_local_user=YES
hide_ids=YES
ftpd_banner=Bem-vindo ao servidor FTP
file_open_mode=0770
local_umask=0000
anon_mkdir_write_enable=NO
guest_username=vsftpd

Por padrão, pam_pgsql está procurando a configuração no arquivo /etc/pam_pgsql.conf. Eu poderia pensar em uma configuração onde eu autentico diferentes serviços em diferentes tabelas no banco de dados postgres.

A opção config_file faz o trabalho - é assim que o arquivo se parece:

#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

Vamos criar a tabela postgres e um usuário de teste:

#su - pgsql
#psql system

Bem-vindo ao psql 8.2.4, o terminal interativo do PostgreSQL.

Digite: \copyright para termos de distribuição
\h para ajuda com comandos SQL
\? para ajuda com comandos psql
\g ou termine com ponto e vírgula para executar a consulta
\q para sair

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”) );

NOTICE: CREATE TABLE criará uma sequência implícita “accounts_i_id_seq” para a coluna serial “accounts.i_id”
NOTICE: CREATE TABLE / UNIQUE criará um índice implícito “accounts_s_username_key” para a tabela “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 row)

Vamos criar uma pasta para nosso novo usuário virtual:

mkdir /usr/local/www/apache22/data/testuser
chown vsftpd:vsftpd /usr/local/www/apache22/data/testuser
ls -la /usr/local/www/apache22/data/testuser

Vamos iniciar o vsftpd na inicialização do sistema:

#vi /usr/local/etc/rc.d/vsftpd:

#!/bin/sh
/usr/local/libexec/vsftpd &

Vamos iniciar o vsftpd agora:

#/usr/local/etc/rc.d/vsftpd

… e o vsftpd deve funcionar bem agora.

Estou ciente de que algumas coisas podem ser feitas de maneira diferente, mas este documento deve ser bom o suficiente para guiá-lo.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.