用vsftpd和mysql創(chuàng)建一個(gè)虛擬用戶ftp服務(wù)器
當(dāng)前有這樣的一個(gè)需求,我需要批量創(chuàng)建一個(gè)網(wǎng)站,比如我要?jiǎng)?chuàng)建一個(gè)foo.com的網(wǎng)站,我就會(huì)在/web/目錄下創(chuàng)建一個(gè)foo.com的目錄,WEB服務(wù)器(我這里用的是nginx)已經(jīng)自動(dòng)設(shè)置好解析。同時(shí),我需要有一個(gè)對應(yīng)的ftp賬號(hào)來管理這個(gè)網(wǎng)站,但是我不希望使用系統(tǒng)賬號(hào),一來網(wǎng)站多了,系統(tǒng)賬號(hào)必然多,而來我不希望管理網(wǎng)站的賬號(hào)能通過ssh登陸,雖然ssh也可以配置哪些賬號(hào)不允許登陸。但是不創(chuàng)建系統(tǒng)賬號(hào)顯然是最安全的做法。
于是這就是有了標(biāo)題的做法,用vsftpd做FTP服務(wù)器,用MySQL做后端數(shù)據(jù)庫,兩者通過pam-mysql插件聯(lián)系起來。配置步驟簡述如下:
- 我的系統(tǒng)是CentOS 6.2,因此現(xiàn)用yum工具安裝好所需要的軟件,包括mysql-server,vsftpd,pam-mysql等。
- 編輯/etc/vsftpd/vsftpd.conf文件,增加或者修改如下幾項(xiàng):
- anonymous_enable=NO
- virtual_use_local_privs=YES
- guest_enable=YES
- user_sub_token=$USER
- local_root=/web/$USER
- chroot_local_user=YES
- hide_ids=YES
- guest_username=nginx
guest_username 表示當(dāng)用戶登陸成功后,其uid映射到系統(tǒng)哪個(gè)賬號(hào)上,我這里為了和WEB管理相結(jié)合,因此用了nginx這個(gè)賬號(hào)。
3.創(chuàng)建數(shù)據(jù)庫表,我們創(chuàng)建一個(gè)名為vsftpd的數(shù)據(jù)庫,在其下創(chuàng)建一個(gè)users表,同時(shí)授權(quán)給vsftpd賬號(hào)登陸,創(chuàng)建過程類似如下:
- mysql> create database vsftpd;
- Query OK, 1 row affected (0.00 sec)
- mysql> use vsftpd
- Database changed
- mysql> create table users(username varchar(30) not null primary key,password varchar(41) not null);
- Query OK, 0 rows affected (0.04 sec)
- mysql> grant usage on vsftpd.users to vsftpd@localhost identified by 'abc123';
- Query OK, 0 rows affected (0.00 sec)
- mysql> insert into users values('foo.com',password('test'));
- Query OK, 1 row affected (0.00 sec)
- mysql> select * from users;
- +----------+-------------------------------------------+
- | username | password |
- +----------+-------------------------------------------+
- | foo.com | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 |
- +----------+-------------------------------------------+
- 1 row in set (0.00 s
我這里對密碼使用password加密函數(shù),因?yàn)橐蚖EB結(jié)合,因?yàn)閡sername使用了和域名相同的名字,這樣我就可以通過username來同時(shí)獲知域名,從而將賬號(hào)的主目錄鎖定在對應(yīng)的域名目錄下。
編輯/etc/pam.d/vsftpd文件,***類似如下:
- auth required pam_mysql.so user=vsftpd passwd=abc123 host=localhost db=ftpd table=users usercolumn=username passwdcolumn=password crypt=2
- account required pam_mysql.so user=vsftpd passwd=abc123 host=localhost db=ftpd table=users usercolumn=username passwdcolumn=password crypt=2
user和passwd指的是連接MySQL的賬號(hào)和密碼,crypt指的加密方式,0表示明文;不加密;1表示用crypt方式加密;2表示用MySQL的password函數(shù)加密;3表示用md5加密;4表示用sha1加密。
創(chuàng)建對應(yīng)的目錄 當(dāng)用foo.com登陸,且驗(yàn)證通過后,根據(jù)之前vsftpd的配置,它將以nginx的身份把/web/foo.com作為其主目錄,因此要保證其目錄存在,而且其身份有訪問權(quán)限。
測試,直接可以在本地測試,看看能否登陸,如果不能登陸,/var/log/secure里又看不到更多的信息,那你可以選擇在/etc/pam.d/vsftpd的配置文件里加上verbose模式,也就是在user=vsftpd那里加上一個(gè)verbose=1的選項(xiàng),這樣它就會(huì)把詳細(xì)的信息打印到/var/log/secure文件里。看看是哪里的報(bào)錯(cuò)。
其實(shí),上述只是一個(gè)最簡單的配置,pam-mysql還可以讓你配置得更復(fù)雜,比如記錄登錄日志,根據(jù)特定條件查詢過濾用戶信息等,pam-mysql軟件包自帶的README有詳細(xì)的說明,大家可以按照那個(gè)說明來配置一個(gè)符合你需求的靈活的認(rèn)證方式。