vsFTP是基于PAM進(jìn)行用戶的安全認(rèn)證的,如果讓其支持虛擬用戶,就必須修改PAM配置文件。PAM本身其實(shí)是一個(gè)框架,支持的認(rèn)證機(jī)制很豐富,對應(yīng)的認(rèn)證模塊也很多,允許用戶靈活的定制所需的認(rèn)證機(jī)制。
PAM需要依靠“/etc/pam.d”目錄下的各種配置文件,以及在“/lib/security”或“/lib64/security”目錄下的認(rèn)證模塊信息。vsFTP是安全性很高的FTP,對文件權(quán)限的檢測很嚴(yán)格。在默認(rèn)情況下,使用“/var/ftp”目錄作為FTP根目錄。該目錄只允許Root賬戶有寫權(quán)限,而對于“vsftpd”進(jìn)程來說,對應(yīng)的是“FTP”賬戶不具有寫權(quán)限。
為了滿足文件上傳要求,只能在該目錄中創(chuàng)建子目錄,用來讓用戶上傳文件。例如在“/var/ftp/pub”目錄中存儲公開的文件。vsFTP的安裝很簡單,執(zhí)行“yum install vsftpd”命令安裝。執(zhí)行“service vsftpd start”、“chkconfig vsftpd on”命令啟動vsFTP服務(wù)。vsFTP的用戶類型包括anonyous匿名用戶、系統(tǒng)用戶和虛擬用戶三類,實(shí)際上不管哪一類,都需要映射為與之對應(yīng)的系統(tǒng)用戶。例如匿名用戶會被映射為“FTP”用戶。每個(gè)用戶都對應(yīng)各自的家目錄,例如執(zhí)行“finger ftp”命令,可以看到FTP用戶對應(yīng)的是“/var/ftp”目錄。進(jìn)入“/etc/vsftpd”目錄,執(zhí)行“vim vsftpd.conf”命令,打開vsFTP配置文件。
在“anonymous=”和“l(fā)ocal_enable=”欄中可以設(shè)置是否開啟匿名和系統(tǒng)用戶。為保證可以執(zhí)行寫操作,需要事先 執(zhí)行“setenforce 0”命令將Selinux關(guān)閉。在“write_enable=”欄中設(shè)置是否允許利用系統(tǒng)賬戶上傳文件。在“anon_upload_enable=”欄中設(shè)置是否允許匿名用戶上傳文件。
注意,執(zhí)行“ps aux|grep vsftpd”命令,可以看到vsFTPS進(jìn)程是以FTP用戶身份運(yùn)行。
執(zhí)行“l(fā)s -ld /var/ftp/”命令,顯示該目錄屬主為Root賬戶。對于匿名用戶來說,雖然允許其上傳文件,但是還必須開放文件寫權(quán)限。執(zhí)行“mkdir /var/ftp/uploadfile”、“setfacl-m u:ftp:rwx /var/ftp/uploadfile/”命令,為FTP用戶創(chuàng)建名為“uploadfile”的目錄,并開放寫權(quán)限。這樣,匿名用戶就可以向該目錄上傳文件了。
注意,對于匿名用戶來說,無法刪除文件和創(chuàng)建目錄操作,除非將“anon_mkdir_write_enable=”和“anon_other_write_enable=”的值均設(shè)置為“Yes”。
為防止以系統(tǒng)用戶身份登錄FTP后,在系統(tǒng)中隨意切換目錄,必須禁錮在其家目錄中。需要刪除“chroot_list_enable=Yes”和“chroot_list_ file=/etc/vsftpd/chroot_list”兩行前面的“#”號激活。在“/etc/vsftpd”目錄下執(zhí)行“touch chroot_list”命令,創(chuàng)建“chroot_list”文件。執(zhí)行“vim chroot_list”命令進(jìn)行編輯,在其中添加需要禁錮的所有用戶名(例如“ftpuser”等),執(zhí)行“service vsftpd restart”命令重啟vsFTP,這樣當(dāng)使用預(yù)設(shè)的用戶登錄FTP后,就只能在其家目錄中活動。如果希望禁錮所有的用戶,可以編輯“vsftpd.conf”文件,將上述指令前面恢復(fù)“#”號禁用,之后添加“chroot_local_user=Yes”行即可。
默認(rèn)情況下在“/etc/vsftpd”目錄下執(zhí)行“cat ftpusers”命令打開該文件,存儲在其中的所有用戶(例如 root、daemon、operator等)均禁止訪問vsFTP服務(wù)。這是因?yàn)関sFTP的用戶認(rèn)證機(jī)制受到PAM控制,執(zhí)行“cat/etc/pam.d/vsftpd”命令,打開對應(yīng)的PAM認(rèn)證文件,可以看到其中包含“auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr= succeed”行,表示對于“ftpusers”文件中的所有賬戶的敏感度為拒絕狀態(tài),自然無法正常訪問FTP服務(wù)了。在vsFTP配置文件中 的“userlist_enable=”的值為“Yes”,意味著當(dāng)在“/etc/vsftpd”目錄下打開“user_list”文件,其中的用戶也是無法訪問vsFTP的。只有將該文件中的所有用戶名清空,上述“ftpusers”文件才真正擁有控制vsFTP的用戶訪問功能。
如果在vsFTP配置文件中添加“userlist_deny=No”行,則剛好相反,表示僅僅允許“user_list”文件中的用戶訪問vdFTP服務(wù),如果修改 為“userlist_deny=yes”行,則禁止該文件中的用戶訪問,這就實(shí)現(xiàn)了黑白名單功能。為了控制vsFTP的資源訪問機(jī)制,可以在配置文件中的“max_clients=”和“max_per_ip=”欄分別定制許可的客戶端連接數(shù)及每個(gè)客戶IP運(yùn)行連接的最大值。
因?yàn)镕TP協(xié)議是以明文傳輸?shù)?,因此使用抓包命令可以很容易捕獲密碼等敏感信息。
為了保護(hù)vsFTP的數(shù)據(jù)傳輸安全,就需要進(jìn)行加密處理。vsFTP支持兩種安全通訊方式,包括FTPS和SFTP。前一種采用FTP加SSL或TLS的機(jī)制。后一種是基于SSH來實(shí)現(xiàn)安全的FTP傳輸功能。在OPenSSH中提供了名為SubSystem的子模塊,可以實(shí)現(xiàn)SFTP功能。
要想讓vsFTP支持基于FTPS的安全通信方式,首先需要創(chuàng)建一張證書,即私有CA,讓其給vsFTP頒發(fā)一張證書,之后在vsFTP配置文件中啟用相關(guān)指令即可。
執(zhí)行“cd /etc/pki/CA”命令,進(jìn)入目標(biāo)路徑。執(zhí)行“mkdir certs newscerts crl”,“touch index.txt”、“echo 01 > serial”、“(umask 077;openssl genrsa -out private/cakey.pem 2048>)”命令,創(chuàng)建基于RAS的長度為2048的密鑰。執(zhí)行“openssl req-new -x509 -key private/cakey.pem -out cacert.pem-days 3650”命令,創(chuàng)建自簽名證書,依次輸入國家名稱、州或省份名稱、城市名、組織名等內(nèi)容。
執(zhí)行“mkdir /etc/vsftpd/ssl”、“cd /etc/vsftpd/ssl”、“(umask 077;openssl genrsa -out vsftpd.key 2048; )”命令,在目標(biāo)路徑下創(chuàng)建私鑰。執(zhí)行“openssl req -new -key vsftpd.key -out vsftpd.csr”命令,生成證書頒發(fā)申請文件,根據(jù)提示信息依次輸入國家名稱、州或省份名稱、城市名、組織名、組織單元名稱等信息。執(zhí)行“vim/etc/pki/tls/openssl.cnf/”命令,將該配置文件中的“dir=../../CA”修改為“dir=/etc/pki/CA”。執(zhí)行“openssl ca -in vsftpd.csr -out vsftpd.crt”命令,在提示欄中依次輸入“Y”完成證書簽署操作。
進(jìn)入“/etc/vsftpd”目錄,執(zhí)行“vim vsftpd.conf”文件,在其中添加“ssl_enable=Yes” 行,啟動SSL加密功能。添加“ssl_tlsv1=Yes” 和“ssl_sslv3=Yes”行,使其支持TLS V1和SSL V3協(xié)議。添加“allow_anno_ssl=No”行,禁止匿名用戶使用加密傳輸。添加“force_local_data_ssl_=Yes”和“force_local_logins_ssl=Yes”行,強(qiáng)制本地用戶在登錄和傳輸數(shù)據(jù)時(shí),必須使用SSL加密協(xié)議。添加“rsa_cert_file=/etc/vsftpd/ssl/vsftpd_cert.crt”,“rsa_private_key_file=/etc/vsftpd/ssl/vsftpd_key.key”行,分別指定RSA格式的證書和密鑰文件路徑。保存該文件,并重啟vsFTP服務(wù)使上述配置生效。
這樣,使用非匿名賬戶無法使用“FTP”命令進(jìn)行登錄,這就需要使用特定的FTP客戶端來實(shí)現(xiàn)安全傳輸。例如使用CuteFTP、FileZilla、FlashFXP等。
前面談到,vsFTP支持匿名、本地和虛擬用戶。對于虛擬用戶來說,最重要的是存儲用戶賬戶信息的方法。當(dāng)然,其存儲格式必須能夠被認(rèn)證功能支持。
例如,在MySQL中創(chuàng)建名為vsFTP的數(shù)據(jù)庫,其中包含名為“nmyh”的表,在該表中包含名為“Name”和“Mima”的字段。之后將匿名用戶信息存儲在該表中,當(dāng)進(jìn)行vsFTP認(rèn)證時(shí),只要能讓其去查詢該表中的信息,如果客戶端輸入的賬戶名和密碼域該表中的對應(yīng)行匹配,即可完成認(rèn)證操作。當(dāng)然,也可以采取其他合適的用戶信息存儲方式。
例 如,在“/etc/vsftp/目錄中創(chuàng)建名為“nmuser”的文本文件,在其中一行存儲用戶名,一行存儲對應(yīng)的密碼。這樣,可以將所有的匿名用戶信息存儲在該文件中。之后使用“db4_utils”工具中的“db_load”之類的命令,將該文件轉(zhuǎn)換為二進(jìn)制格式。使用該文件也可以實(shí)現(xiàn)vsFTP認(rèn)證功能,當(dāng)然,vsFTP的認(rèn)證其實(shí)是基于PAM來實(shí)現(xiàn)的,這樣就必須修改對應(yīng)的PAM文件才可以實(shí)現(xiàn)上述虛擬用戶認(rèn)證功能。
這里就以使用MySQL數(shù)據(jù)庫實(shí)現(xiàn)認(rèn)證為例進(jìn)行說明,首先需要安裝MySQL數(shù)據(jù)庫和開發(fā)環(huán)境,具體操作起來并不復(fù)雜,執(zhí)行“yum-y install mysql -server mysql -devel”、“yum -y groupinstall "Development Libraries"”命令即可,這里就不再贅述。
之后需要安裝名為“PAM_MySQL”模塊。執(zhí)行“tar zxvf pam_mysql-0.7rc1.tar.gz”、“cd pam_mysql-0.7rc1”、“./configure-with-mysql=/usrl --withopenssl”、“make”、“make install”、“cp /usr/lib/security/pam_mysql.so /lib/security/”等命令,來安裝該模塊。接下來需要手動編譯安裝vsFTP,執(zhí)行“mkdir -pv /usr/share/empty /var/ftp”、“useradd-s /bin/false -d /var/ftp ftp”、“tar xzvf vsftpd-x.x.x.tar.gz”、“cd vsftp-x.x.x”、“make”、“make install”等命令,執(zhí)行vsFTP的手動編譯安裝。執(zhí)行“cp vsftp.conf /etc”、“vim /etc/vsftpd.conf”命令,在vsFTP配置文件中添加“l(fā)isten=yes”項(xiàng),使vsFTP進(jìn)程處于獨(dú)立運(yùn)行狀態(tài)。
執(zhí)行“/usr/local/sbin/vsftpd &”、“chmod og-w /var/ftp”命令,來啟動vsFTP服務(wù)。連接到MySQL操作環(huán)境,執(zhí)行“create database vsftp;”命令,創(chuàng)建名為“vsftp”的數(shù)據(jù)庫,執(zhí)行“grant select on vsftp.*to vsftpd@localhost identified by 'vsftpd';”、“grant select on vsftp.*to vsftpd@127.0.0.1 identified by 'vsftpd';”命令,授權(quán)給名為“vsftpd”的用戶進(jìn)行訪問,該用密碼為“vsftpd”,該賬戶可以在Linux中手動建立。執(zhí)行“use vsftp;”、“create table nmyh(id SAMLLINT AUTO_INCREMENT NOT NULL ,name CHAR(20) BINARY NOT NULL,mima CHAR(50) BINARY NOT NULL ,PRIMARY key(id))”命令,創(chuàng)建名為“nmyh”的表,其中存在名為“name”和“mima”的字段,用來存儲匿名用戶信息。
執(zhí)行“insertinto nmyh(name,mima)values('ftpuser1','123456');”、“insert into nmyh(name,mima)values('ftpuser2','123456');”命令插入兩個(gè)用戶信息,名稱分別為“ftpuser1”和“ftpuser2”。密碼均為“123456”。執(zhí)行“select*from nmyh;”命令,來查看該表中的內(nèi)容。執(zhí)行“mysql -uvsftpd -p”命令,以“vsftpd”賬戶連接MySQL,輸入密碼后可以正常查看上述數(shù)據(jù)庫。因?yàn)樯厦嬷粸槠湓O(shè)置了Select權(quán)限。僅僅有匿名用戶信息還不夠,必須修改用來進(jìn)行PAM認(rèn)證的文件。
執(zhí)行“vim /etc/pam.d/vsftp.mysql”命令,在該配置文件中添加“auth require /lib/security/pam_mysql.so user=vsftpd password=vsftpd usercolume=name passwordcolume=mimacrypt=0”、“account require/lib/security/pam_mysql.so user=vsftpd password=vsftpd host=localhost db=vsftp table=nmyh usercolumn=name pass wordcolumn=mima crypt=0”等行內(nèi)容。表示當(dāng)?shù)卿泇sFTP服務(wù)器時(shí)必須滿足“pam_mysql.so”模塊的檢查,即從上述MySQL數(shù)據(jù)表中匹配客戶端輸入的用戶名和密碼。在Linux提示符下執(zhí)行“useradd -s /sbin/nologin -d /var/ftp2 vuser”、“chmod go+rx/var/ftp2”命令,創(chuàng)建名為“vuser”的賬戶,并設(shè)定該賬戶對應(yīng)的家目錄,并允許其他用戶讀取和執(zhí)行其家目錄的權(quán)限。當(dāng)然該賬戶無法正常登錄系統(tǒng)。
對vsFTP的配置文件“/etc/vsftpd.conf” 進(jìn)行修改,設(shè)置“anonyous_enable=Yes”、“l(fā)ocal_enable=Yes”、“write_enable=Yes”、“anon_upload _enable=Yes”、“anon_mkdir_write_enable=Yes”、“anon_other_mkdir_write_enable=Yes”、“chroot_local_user=Yes”、“guest_enable=Yes”、“guest_username=vuser”、“l(fā)isten=Yes”,“pam_service_name=vsftpd.mysql”等行,允許來賓賬戶進(jìn)行訪問。并將來賓賬戶映射為“vuser”用戶,使PAM認(rèn)證服務(wù)使用自定義的“vsftpd.mysql”文件。之后執(zhí)行“service vsftpd restart”命令重啟vsFTP??蛻舳藞?zhí)行“ftp xxx.xxx.xxx.xxx”命令,即可用上述“nmyh”表中的用戶進(jìn)行登錄了。在上述配置文件中允許用戶對FTP路徑具有讀寫操作,所以當(dāng)使用虛擬賬戶登錄后,執(zhí)行的指令均被匿名用戶進(jìn)行匹配,可以上傳下載文件。
當(dāng)然,針對不同的虛擬賬戶可設(shè)置不同的權(quán)限。打開vsFTP的配置文件“/etc/vsftpd/vsftpd.conf”, 添加“user_config_dir=/etc/vsftpd/vusers”行設(shè)置用戶配置目錄。執(zhí)行“mkdir /etc/vsftpd/vusers”命令創(chuàng)建該目錄。執(zhí)行“cd /etc/vsftpd/vusers”命令進(jìn)入該目錄,為每一個(gè)匿名用戶創(chuàng)建同名文件。
執(zhí)行“vi ftpuser1”命令,在該文件中設(shè)置“anon_upload_enable=Yes”、“anon_mkdir_write_enable=Yes”和“anon_other_write_enable=Yes”項(xiàng),允許上傳、下載和刪除文件,如果設(shè)置為“anon_upload_enable=No”、“anon_mkdir_write_enable=No”和“anon_other_write_enable=No”項(xiàng),則禁止該用戶上傳、下載和刪除文件。