用vsftpd和mysql創(chuàng)建一個虛擬用戶ftp服務器
當前有這樣的一個需求,我需要批量創(chuàng)建一個網(wǎng)站,比如我要創(chuàng)建一個foo.com的網(wǎng)站,我就會在/web/目錄下創(chuàng)建一個foo.com的目錄,WEB服務器(我這里用的是nginx)已經(jīng)自動設置好解析。同時,我需要有一個對應的ftp賬號來管理這個網(wǎng)站,但是我不希望使用系統(tǒng)賬號,一來網(wǎng)站多了,系統(tǒng)賬號必然多,而來我不希望管理網(wǎng)站的賬號能通過ssh登陸,雖然ssh也可以配置哪些賬號不允許登陸。但是不創(chuàng)建系統(tǒng)賬號顯然是最安全的做法。
于是這就是有了標題的做法,用vsftpd做FTP服務器,用MySQL做后端數(shù)據(jù)庫,兩者通過pam-mysql插件聯(lián)系起來。配置步驟簡述如下:
- 我的系統(tǒng)是CentOS 6.2,因此現(xiàn)用yum工具安裝好所需要的軟件,包括mysql-server,vsftpd,pam-mysql等。
- 編輯/etc/vsftpd/vsftpd.conf文件,增加或者修改如下幾項:
- 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 表示當用戶登陸成功后,其uid映射到系統(tǒng)哪個賬號上,我這里為了和WEB管理相結合,因此用了nginx這個賬號。
3.創(chuàng)建數(shù)據(jù)庫表,我們創(chuàng)建一個名為vsftpd的數(shù)據(jù)庫,在其下創(chuàng)建一個users表,同時授權給vsftpd賬號登陸,創(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ù),因為要和WEB結合,因為username使用了和域名相同的名字,這樣我就可以通過username來同時獲知域名,從而將賬號的主目錄鎖定在對應的域名目錄下。
編輯/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的賬號和密碼,crypt指的加密方式,0表示明文;不加密;1表示用crypt方式加密;2表示用MySQL的password函數(shù)加密;3表示用md5加密;4表示用sha1加密。
創(chuàng)建對應的目錄 當用foo.com登陸,且驗證通過后,根據(jù)之前vsftpd的配置,它將以nginx的身份把/web/foo.com作為其主目錄,因此要保證其目錄存在,而且其身份有訪問權限。
測試,直接可以在本地測試,看看能否登陸,如果不能登陸,/var/log/secure里又看不到更多的信息,那你可以選擇在/etc/pam.d/vsftpd的配置文件里加上verbose模式,也就是在user=vsftpd那里加上一個verbose=1的選項,這樣它就會把詳細的信息打印到/var/log/secure文件里??纯词悄睦锏膱箦e。
其實,上述只是一個最簡單的配置,pam-mysql還可以讓你配置得更復雜,比如記錄登錄日志,根據(jù)特定條件查詢過濾用戶信息等,pam-mysql軟件包自帶的README有詳細的說明,大家可以按照那個說明來配置一個符合你需求的靈活的認證方式。