2009年11月10日 星期二

Virtual Hosting With vsftpd And MySQL On Ubuntu server Koala

參考資料:

Virtual Hosting With vsftpd And MySQL On Debian Etch

簡單的說,拜PAM認證模組的福,所以可以把vsftp的帳號認證模組抽換給mysql資料庫處理。好處是,這樣不用在主機多開實體帳號才能使用ftp功能,畢竟每多一個實體帳號,就多一分風險。至於虛擬的帳號再怎麼胡搞,出事了就把對應的實體帳號封殺再善後,也多一份簡潔。ok,不廢話,第一步驟,把該裝得裝好

apt-get install vsftpd libpam-mysql mysql-server mysql-client

安裝到mysql-server就會叫你設定mysql root密碼,不知道這是啥,謝謝,再聯絡。

使用netstat –tl | grep mysql 檢查是否mysql已經上線。Howto建議把網域連線方式也先設定密碼

mysqladmin -h $server1.example.com -u root password $yourrootsqlpassword

我個人是打算用防火牆方式阻斷實體存取。

接下來順序我稍微跟Howto有點差異,先建構完vsftpd設定,再設定PAM,最後搞定SQL DB。

首先製造出這位專門替ftp背黑鍋的實體使用者vsftpd

useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd

然後修改/etc/vsftpd.conf

mv /etc/vsftpd.conf /etc/vsftpd.conf_orig
vi /etc/vsftpd.conf  << EOF
i
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
nopriv_user=vsftpd
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
guest_enable=YES
guest_username=vsftpd
local_root=/home/vsftpd/$USER
user_sub_token=$USER
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd_user_conf
^]
ZZ
EOF

重點設定值如上。然後做出針對個別使用者帳號的詳細設定檔存放的目錄

mkdir /etc/vsftpd_user_conf

接下來設定PAM,注意到$ftpdpass是等一下mysql裡存取vsftpd的密碼

mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd_orig
vi /etc/pam.d/vsftpd  << EOF
i
auth required pam_mysql.so user=vsftpd passwd=$ftpdpass host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2
account required pam_mysql.so user=vsftpd passwd=$ftpdpass host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2
^]
ZZ
EOF

回到MySQL 設定,首先登入

mysql -u root -p

輸入完密碼,開始開資料庫內動作,先建立vsftpd

CREATE DATABASE vsftpd;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY '$ftpdpass';

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO 'vsftpd'@'localhost.localdomain' IDENTIFIED BY '$ftpdpass';

FLUSH PRIVILEGES;

接下來建立資料表

USE vsftpd;

CREATE TABLE `accounts` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 30 ) NOT NULL ,
`pass` VARCHAR( 50 ) NOT NULL ,
UNIQUE (
`username`
)
) ENGINE = MYISAM ;

然後塞一筆測試帳號看看

INSERT INTO accounts (username, pass) VALUES('testuser', PASSWORD('secret'));
quit;

重新啟動vsftpd

/etc/init.d/vsftpd restart

然後用ftp連線自己看看,測試可以就算ok囉。