서버 설정 · 2 min read · Dec 16, 2025

vsftpd와 PostgreSQL을 이용한 가상 호스팅

vsftpd와 PostgreSQL을 이용한 가상 호스팅

이 문서는 실제 시스템 사용자 대신 PostgreSQL 데이터베이스에서 가상 사용자를 사용하는 vsftpd 서버를 설치하는 방법을 설명합니다. 인터넷에서 그런 튜토리얼을 찾을 수 없었기 때문에, 그 구성이 마침내 저에게 작동했을 때 이를 게시하기로 결정했습니다. 문서는 제가 최근에 사용해야 했던 FreeBSD 6.2를 기반으로 하고 있습니다(저는 보통 Debian을 사용합니다). 그럼에도 불구하고 이 문서는 거의 모든 Linux 배포판에도 적합할 것입니다(매우 작은 수정이 필요할 수 있습니다).

좋습니다, 시작해봅시다.

필요한 패키지

  • vsftpd
  • PostgreSQL 서버/클라이언트 7.4+
  • PAM_PGSQL

설치

1. PostgreSQL

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

initdb 전에 postgres 로케일을 설정하세요:

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

setenv PGDATA $HOME/data

#여기에서 일부 로케일 설정을 하고 싶을 수 있습니다.
setenv PGDATESTYLE ISO
setenv LC_ALL pl_PL.ISO_8859-2

올바른 인코딩으로 db 클러스터를 설치합니다(LC_ALL에서 가져옴):

su - pgsql
initdb -E latin2

2. PAM-PGSQL

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

pam-pgsql.so가 /usr/lib에 있는지 확인하세요. SEGFAULT가 발생하면 pam_pgsql이 올바른 경로에 없을 가능성이 높습니다(저는 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. 이제 … 구성 파일의 작동 예

vsftpd - pam 구성 파일의 이름 /etc/pam.d/vsftpd입니다.

vsftpd - 최근에 추가된 사용자의 이름입니다(사용자는 예제 local_umask=0000에서 localroot에 대한 쓰기 접근 권한이 필요합니다 - 파일이 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=FTP 서버에 오신 것을 환영합니다
file_open_mode=0770
local_umask=0000
anon_mkdir_write_enable=NO
guest_username=vsftpd

기본적으로 pam_pgsql은 /etc/pam_pgsql.conf 파일에서 구성을 찾고 있습니다. PostgreSQL 데이터베이스의 서로 다른 테이블에 대해 서로 다른 서비스를 인증하는 설정을 생각할 수 있습니다.

config_file 스위치가 작업을 수행합니다 - 파일은 다음과 같이 보입니다:

#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

Postgres 테이블과 테스트 사용자를 생성해봅시다:

#su - pgsql
#psql system

Welcome to psql 8.2.4, PostgreSQL 대화형 터미널입니다.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit

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은 serial 열 “accounts.i_id”에 대해 암시적 시퀀스 “accounts_i_id_seq”를 생성합니다.
NOTICE: CREATE TABLE / UNIQUE는 테이블 “accounts”에 대해 암시적 인덱스 “accounts_s_username_key”를 생성합니다.
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)

새로운 가상 사용자를 위한 폴더를 생성해봅시다:

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

시스템 시작 시 vsftpd를 시작합시다:

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

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

지금 바로 vsftpd를 시작합시다:

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

… 그리고 vsftpd는 이제 잘 작동해야 합니다.

어떤 것들은 다른 방식으로 수행될 수 있다는 것을 알고 있지만, 이 문서는 여러분을 안내하기에 충분할 것입니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.