構建基於mysql數據庫存儲虛擬用戶賬號密碼的vsftpd服務。
實驗環境:
centos6:安裝vsftpd服務、lftp客戶端、pam_mysql包
注意:pam_mysql包由epel源提供
centos7:安裝mariadb-server和mariadb-devel包
[root@localhost yum.repos.d]# yum install mysql-devel
步驟一:準備數據庫。
在數據庫中添加mysql的用戶和實驗用的存儲的用戶和密碼
[root@localhost ~]# mysql -uroot -h 127.0.0.1 -p
Enter password:
MariaDB [(none)]>
創建用戶ftp服務器連接mariadb服務器的用戶和專用數據庫及表
MariaDB [(none)]> create database vsftpd;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> create user vsftpd;
Query OK, 0 rows affected (0.02 sec)
MariaDB [(none)]> grant select on vsftpd.* to [email protected] identified by "111111";
Query OK, 0 rows affected (0.03 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.01 sec)
創建表ftpuser
MariaDB [vsftpd]> create table ftpuser (id int AUTO_INCREMENT NOT NULL,name char(20) binary NOT NULL,password char(48) binary NOT NULL, primary key(id));
Query OK, 0 rows affected (0.08 sec)
爲實驗準備數據,在ftpuser表中插入兩條記錄
MariaDB [vsftpd]> insert into ftpuser(name,password) values ("lp1","111111");
Query OK, 1 row affected (0.03 sec)
MariaDB [vsftpd]> insert into ftpuser(name,password) values ("lp2","111111");
數據庫環節準本完畢。
在另一臺主機上安裝vsftpd服務和pam-mysql。因爲vsftpd是基於pam機制來認證的,所有要實現基於mysql來存儲虛擬用戶的的賬號和密碼,必須使用pam-mysql模塊來完成。
[root@bogon ~]# rpm -q pam_mysql
pam_mysql-0.7-0.12.rc1.el6.x86_64
[root@bogon ~]# rpm -q vsftpd
vsftpd-2.2.2-11.el6_3.1.x86_64
首先測試本主機能夠連接另一臺mariadb服務器。(注意:測試環境中沒有涉及到iptables防火牆策略,所有請確保數據庫端的iptables能夠通過。同時,請確保selinux處於關閉狀態或者permissive狀態)
步驟二:建立pam認證所需要的文件。
[root@bogon pam.d]# vim /etc/pam.d/vsftpd.mysql
auth required /lib64/security/pam_mysql.so user=vsftpd passwd=111111 host=172.16.249.209 db=vsftpd table=ftpuser
usercolumn=name passwdcolumn=password crypt=0
account required /lib64/security/pam_mysql.so user=vsftpd passwd=111111 host=172.16.249.209 db=vsftpd table=ftpus
er usercolumn=name passwdcolumn=password crypt=0
注意:這裏的crypt的值有5種,0表示明文,1和3表示使用MD5加密,4表示使用sha1加密,2表示使用mysql數據庫的password()函數加密,但是可能出現的問題就是此處的加密方式和數據庫處的加密方式不同從而導致認證不會通過。此處的host有三種方式:
1. absolute path to the unix socket (e.g. "/tmp/mysql.sock") // vsftpd和mysal在同一主機
2. host name (e.g. "somewhere.example.com") //vsftpd和mysal不在同一主機
3. host name + port number (e.g. "somewhere.example.com:3306")//vsftpd和mysal不在同一主機
第三步:配置vsftpd。
建立虛擬用戶映射的系統賬號以及對應的目錄。
[root@bogon var]# useradd -d /var/ftproot -s /sbin/nologin vuser
默認創建的家目錄其他用戶是沒有任何權限的,所以給其相應的權限
[root@bogon var]# ll -d /var/ftproot
drwx------. 3 vuser vuser 4096 9月 23 21:53 /var/ftproot
[root@bogon var]# chmod go+rx /var/ftproot
修改配置文件中的以下幾項:
anonymous_enable=NO //開啓虛擬用戶此項可以禁用
local_enable=YES //此項必須開啓,因爲虛擬用戶必須映射爲一個本地用戶來訪問數據
write_enable=YES //本地用戶有寫權限
xferlog_enable=YES //開啓日誌功能
xferlog_file=/var/log/xferlog //日誌文件
log_ftp_protocol=YES //這項也是日誌功能,但要求xferlog_std_format=NO,這兩個日誌可以用來排錯。
chroot_local_user=YES //禁錮用戶家目錄,
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
pam_service_name=vsftpd.mysql //vsftpd.mysql是pam認證的文件
userlist_enable=NO //用默認值
userlist_deny=YES //用默認值
guest_enable=YES //虛擬用戶登錄方式必須添加的選項
guest_username=vuser //虛擬用戶登錄方式必須添加的選項
此外,要想對每個虛擬用戶都提供配置文件,只需要在配置文件中添加
user_config_dir=/etc/vsftpd/vusers_dir/
然後在在此目錄下創建以用戶名爲文件名的文件,並寫入響應的控制項即可。
構建基於文本文件認證的虛擬用戶登錄:
第一步:創建用於存儲賬號密碼的文件。(此文件有特殊格式,奇數行爲用戶名,偶數行爲密碼)
[root@localhost vsftpd]# vim vuser.list
keke
111111
lili
111111
第二步:使用db_load命令將此文件格式化爲數據庫文件(pam認證必須的,而db_load命令是由db4—utils包提供的)
[root@localhost vsftpd]# db_load -T -t hash -f vuser.list vuser.db
註釋:The -T option allows non-Berkeley DB applications to easily load text files into databases選項-T允許應用程序能夠將文本文件轉譯載入進數據庫。由於我們之後是將虛擬用戶的信息以文件方式存儲在文件裏的,爲了讓Vsftpd這個應用程序能夠通過文本來載入用戶數據,必須要使用這個選項。如果指定了選項-T,那麼一定要追跟子選項-t
[root@localhost vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
爲了安全更其權限
[root@localhost vsftpd]# chown 600 /etc/vsftpd/vuser.*
創建ftp根目錄以及虛擬用戶映射的用戶
[root@bogon var]# useradd -d /var/ftproot -s /sbin/nologin vuser
默認創建的家目錄其他用戶是沒有任何權限的,所以給其相應的權限
[root@bogon var]# ll -d /var/ftproot
drwx------. 3 vuser vuser 4096 9月 23 21:53 /var/ftproot
[root@bogon var]# chmod go+rx /var/ftproot
建立支持虛擬用戶的pam認證文件
[root@localhost pam.d]# vim vuser
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
注意:文件中的db指向的是之前db_load命令創建的vuser.db,但在此處不能加.db後綴。
然後修改配置文件
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_umask=022
guest_enable=YES
guest_username=vuser
pam_service_name=vuser
user_config_dir=/etc/vsftpd/vusers_dir
然後在/etc/vsftpd/vusers_dir 目錄下創建以用戶名爲文件名的文件
[root@localhost vsftpd]# mkdir vuser_dir
[root@localhost vsftpd]# cd vuser_dir
[root@localhost vuser_dir]# touch keke
[root@localhost vuser_dir]# touch lili
[root@localhost vuser_dir]# vim keke
anon_upload_enable=YES
anon_mkdir_write_enable=YES
注意:如果在實驗中遇到問題,可考慮下面的辦法:
selinux控制ftp的選項有:
[root@bogon ~]# getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
ftpd_connect_db --> off
ftpd_use_passive_mode --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
設置其中的選項
[root@bogon ~]# setsebool ftp_home_dir on
[root@bogon ~]# setsebool ftpd_connect_db on
[root@bogon ~]# setsebool alow_ftpd_anon_write on
[root@bogon ~]# setsebool allow_ftpd_full_access on
排錯可參看/var/log/secure文件的內容或者查看日誌。