文件服務器 – vsftpd
文件服務器是一種專供其他電腦訪問文件和存儲的程序。文件服務器通常比一般的個人電腦擁有更大的存儲容量,并具有一些其他的功能,如磁盤鏡像、多個網絡接口卡、熱備援多電源供應器。到后來文件服務器逐漸進化成帶有RAID存儲子系統和其他高可用特性的高性能存儲系統。
-
ftp:應用層的文件共享協議,也是一個應用程序
-
nfs, cifs:網絡存儲協議
-
nfs:1985年SUN開發,用于Unix系統間實現磁盤文件共享的一種協議;
-
cifs:由Microsoft開發,用于連接Windows客戶機和服務器,并且后來的NBT協議進一步發展為SMB,使得Windows系統和Linux可以互通;
-
smaba:Linux上cifs的客戶端,或Linux的cifs服務端,實現Windows系統Linux互通的程序;
-
NAS:網絡存儲系統,是一種遠程訪問接入設備,使用nfs協議或cifs協議實現,較SAN能夠降低存儲成本
-
SAN:存儲區域網絡,存儲接口協議轉換為網絡傳輸,通過SCSI轉為光纖通道或是iSCSI傳輸
FTP協議
FTP 是File TransferProtocol(文件傳輸協議)用于Internet上的控制文件的雙向傳輸。
FTP實現的目標
-
促進文件的共享(計算機程序或數據)
-
鼓勵間接或者隱式的使用遠程計算機
-
向用戶屏蔽不同主機中各種文件存儲系統(File system)的細節
-
可靠和高效的傳輸數據
FTP是僅基于TCP的服務,不支持UDP。與眾不同的是FTP使用2個端口,一個數據端口和一個命令端口(也可叫做控制端口)。通常來說這兩個端口是21(命令端口)和20(數據端口)。但FTP 工作方式的不同,數據端口并不總是20。客戶端由于安裝了防火墻會導致服務端發起的連接請求被阻擋,因此被動模式只要求服務器端產生一個監聽相應端口的進程,這樣就可以繞過客戶端安裝了防火墻的問題。這就是主動與被動FTP的最大不同之處。
-
主動模式
主動模式要求客戶端和服務器端同時打開并且監聽一個端口以創建連接,主動模式創建連接過程如下: -
客戶端打開一個隨機的端口(端口號大于1024,在這里,我們稱它為x),同時一個FTP進程連接至服務器的21號命令端口。此時,該tcp連接的來源地端口為客戶端指定的隨機端口x,目的地端口(遠程端口)為服務器上的21號端口;
-
客戶端開始監聽端口(x+1),同時向服務器發送一個端口命令(通過服務器的21號命令端口),此命令告訴服務器客戶端正在監聽的端口號并且已準備好從此端口接收數據。這個端口就是我們所知的數據端口;
-
服務器打開20號源端口并且創建和客戶端數據端口的連接。此時,來源地的端口為20,遠程數據(目的地)端口為(x+1);
-
客戶端通過本地的數據端口創建一個和服務器20號端口的連接,然后向服務器發送一個應答,告訴服務器已經創建好連接,可以開始數據傳輸;
-
被動模式
客戶端發送連接請求,在FTP服務器收到Pasv命令后,隨機打開一個高端端口(端口號大于1024)并且通知客戶端在這個端口上傳送數據的請求,客戶端連接FTP服務器此端口,然后FTP服務器將通過這個端口進行數據的傳送,這個時候FTPserver不再需要建立一個新的和客戶端之間的連接。
服務器的控制端口是21,數據端口是隨機的,且是客戶端去連接對應的數據端口,所以在做靜態的映射話只開放21端口是不可以的。此時需要做DMZ。
大部分網頁瀏覽器要求使用被動模式,然而并不是所有的FTP服務器都支持被動模式。
由于FTP連接時的密碼和傳輸的文件內容都使用明文傳輸,及其不安全。且因為必須開放一個隨機的端口以創建連接,導致客戶端防火墻很難追蹤主動模式下的FTP流量。因此使用被動模式的FTP可以減少許多問題。此外,FTP服務器在需要傳輸較多的小文件時性能不好。
FTP協議的實現:
-
Server端開源解決方案:
…….wuftpd:Washington University ftp daemon
…….vsftpd:Very Secure ftp daemon
…….proftpd, pureftpd, … -
Client程序:
…….GUI:flashfxp, cute, filezilla, gftp, …
…….CLI:ftp, lftp, …
vsftpd 是一個 UNIX 類操作系統上運行的服務器的名字,它可以運行在諸如 Linux、BSD、Solaris、 HP-UNIX等系統上面,是一個完全免費的、開發源代碼的ftp服務器軟件,支持很多其他的 FTP 服務器所不支持的特征。比如:非常高的安全性需求、帶寬限制、良好的可伸縮性、可創建虛擬用戶、支持IPv6、速率高等。
vsftpd的配置文件
-
獲取幫助
man 5 vsftpd.conf
cd /usr/share/doc/vsftpd-3.0.2/EXAMPLE/
-
配置選項說明
rpm -ql vsftp
#主配置文件
主程序:/usr/sbin/vsftpd
Unit File: /usr/lib/systemd/system/vsftpd.service
主配置:/etc/vsftpd/vsftpd.conf
文檔路徑:每一個用戶都有一個以家目錄的文檔路徑
ftp用戶的家目錄/var/ftp/pub/file --> ftp://host:port/pub/file
lftp -u centos,pass HOST #系統中用戶的家目錄為local_root
用戶put條件:iptables、SELinux、安全上下文、ftp允許upload配置
vim /etc/vsftpd.conf
匿名用戶
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YE
系統用戶
local_enable=YES
write_enable=YES
#虛擬用戶
guest_enable=YES #定啟用虛擬用戶功能
guest_username=vsftpd #指定虛擬用戶的宿主用戶
virtual_use_local_privs=YES #設定虛擬用戶的權限符合他們的宿主用戶
user_config_dir=/etc/vsftpd/vconf #設定虛擬用戶配置文件存放路徑
上傳文件的屬主設置
chown_uploads=YES
chown_username=USERNAM
系統用戶chroot()
chroot_local_user=YES #所有用戶都鎖定,不予許在其家目錄有寫權限,即那ftp用戶
#不用于登錄系統的賬號對于"home-user"的根沒有寫權限
#或針對用戶對家目錄有些權限的賬戶開啟白名單
#YES開啟白名單,NO開啟黑名單
chroot_list_enable=YES #開啟名單功能,不開啟則禁錮所有用戶,要先開啟鎖定
chroot_list_file=/etc/vsftpd/chroot_list #白/黑名單
userlist_enable=YES #user_list控制用戶訪問
userlist_deny=YES #vsftpd自帶的用戶登錄控制,默認為YES/黑名單,NO為白名單,黑名單直接無法輸入密碼pam則是給允許登錄用戶的認證
認證服務:
pam_service_name=vsftpd #/etc/pam.d/vsftpd
日志記錄
xferlog_file=/var/log/vsftpd.log #文件要手動建立,vsftpd用戶對日志文件vsftpd.log的讀寫權限,否則服務將啟動失敗。
其他
#idle_session_timeout=600 #設定空閑連接超時時間,單位秒
#data_connection_timeout=120 #設定單次最大連續傳輸時間,單位秒
#ftpd_banner=Welcome to blah FTP service. #設定Vsftpd的登陸標語
ls_recurse_enable=NO #禁止"ls -R"的命令,安全設定
listen=YES #設Vsftpd獨立守護進程,否則由xinetd代理
vsftpd + pam + file_db + virtual_vsftp_user
pam基于本地的文件驗證登錄用戶
-
生成經過哈希運算的用戶認證文件以及虛擬用戶配置
cd /etc/vsftpd/
mkdir user_conf/ #虛擬用戶的配置文件
echo -e "alice\nalicepass\ntom\ntompass" user_conf/login
db_load -T -t hash -f user_conf/login.txt user_conf/login.db
chmod 600 user_conf/login
chmod 600 user_conf/login.db
useradd -d /data/ftp -s /sbin/nologin vftp_user #虛擬用戶的代理者
vim user_conf/jerry
anon_upload_enable=YES #上傳
anon_other_write_enable=NO #刪除
anon_mkdir_write_enable #創建目錄
vim user_conf/alice
anon_upload_enable=YES #上傳
anon_other_write_enable=YSE #刪除
anon_mkdir_write_enable #創建目錄
-
建立虛擬用戶認證所需的pam配置文件
vim /etc/pam.d/vsftpd.local
auth required pam_userdb.so db=/etc/vsftpd/user_conf/login
account required pam_userdb.so db=/etc/vsftpd/user_conf/login
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*或則在 pam 中同時啟用 vsftpd_mysql 與原來的 vsftpd 認證來源,即在mysql中找不到的user將在系統用戶中找。
#sufficient表示身份認證則通過,否則跳過,進行下面模塊的驗證,是一個充分條件;
#required 表示本模塊必須返回成功才能通過認證,可以認為是一個必要條件;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vi /etc/pam.d/vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth sufficient pam_userdb.so db=/etc/vsftpd/user_conf/login
account sufficient pam_userdb.so db=/etc/vsftpd/user_conf/login
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
修改vsftpd.conf文件,允許虛擬用戶,指定pam配置文件及虛擬用戶的路徑
vi /etc/vsftpd/vsftpd.conf
#修改或增加
pam_service_name=vsftpd.local #要和建的PAM文件對應
guest_enable=YES #允許虛擬用戶
guest_username=vftp_user #代理者身份
user_config_dir=/etc/vsftpd/user_conf #虛擬用戶賬號配置目錄
-
建立vftp_user的家目錄
mkdir -p /data/ftp/{pub,upload}
setfacl -m u:vftp_user:rwx /data/ftp/upload
-
重啟測試
systemctl restart vsftpd
lftp -u jerry,jerry 10.1.x.x
cd upload
put /file
vsftpd + pam + mysql + virtual_vsftp_user
pam認證機制:程序定義調用/usr/lib64/security/pam_*.so下的pam模塊以實現相應的用戶登錄認證,如su、login、vsftp等在/etc/pam.d/有相應的身份認證配置文件。
vsftpd依賴于pam完成用戶認證,vsftpd的虛擬用戶可使用指定pam讀取的認證文件,由于在Centos 7上的epel源中沒有pam_mysql程序,因此使用編譯安裝的方式為pam提供連接mysql的模塊。
-
安裝vsftpd與mysql,創建vsftpd數據庫
yum -y install vsftpd mariadb-server mariadb
systemctl start mariadb.service
#首次安裝mysql,安全增強,否則無法遠程登錄
mysql_secure_installation
#創建數據庫
mysql>CREATE DATABASE vsftpd;
#授權給vsftpduser用戶
mysql>GRANT SELECT ON vsftpd.* TO 'vsftpduser'@'127.0.0.1' IDENTIFIED BY 'vsftpdpass'
mysql>GRANT SELECT ON vsftpd.* TO 'vsftpduser'@'localhost' IDENTIFIED BY 'vsftpdpass'
mysql>flush privileges;
#創建表,name作為主鍵
mysql>use vsftpd; #或在下使用vsftpd.user
mysql>CREATE TABLE users (
->uid SMALLINT UNSIGNED NOT NULL AUTO_INCREAMENT UNIQUE KEY,
->name varchar(50) NOT NULL PRIMARY KEY,
->password CHAR(48) NOT NULL
->);
#插入用戶,使用mysql提供的加密函數Encryption Functions
mysql>INSERT INTO users (name,password) VALUES ('alice',PASSWORD('alice')),('jerry',PASSWORD('jerry'));
\q
-
編譯安裝pam_mysql-0.7RC1
yum -y groupinstall "Development Tools" "Server Platform Development"
yum -y install mariadb-devel pam-devel
tar xf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1
cat INSTALL #安裝文檔
./configure --with-pam/usr --with-mysql/usr --with-pam-mods-dir=/usr/lib64/security/
make install
mkdir -pv /data/ftp/{pub,upload}
useradd -d /data/ftp vftp_user #虛擬用戶代理
setfacl -m u:vftp_user:rwx /data/ftp/upload
#基于pam_mysql的認證配置文件
cat README
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vi /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so host=127.0.0.1 user=vsftpduser passwd=mage db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so host=127.0.0.1 user=vsftpduser passwd=mage db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*或則在 pam 中同時啟用 vsftpd_mysql 與原來的 vsftpd 認證來源,即在mysql中找不到的user將在系統用戶中找。
#sufficient表示身份認證則通過,否則跳過,進行下面模塊的驗證,是一個充分條件;
#required 表示本模塊必須返回成功才能通過認證,可以認為是一個必要條件;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vi /etc/pam.d/vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth sufficient pam_mysql.so host=127.0.0.1 user=vsftpduser passwd=vsftpdpass db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account sufficient pam_mysql.so host=127.0.0.1 user=vsftpduser passwd=vsftpdpass db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=3
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
指定pam配置文件及虛擬用戶的路徑,創建ftp虛擬用戶
vi /etc/vsftpd.conf
guest_enable=YES #訪客登錄
guest_username=vftp_user #訪客以vftp_user身份訪問家目錄
pam_service_name=vsfptd.mysql #修改為新的pam認證文件
user_config_dir=/etc/vsftpd/vftp_user_conf #虛擬用戶的配置文件路徑
mkdir /etc/vsftpd/vftp_user_conf
vim /etc/vsftp/jerry
anon_upload_enable=YES #上傳
anon_other_write_enable=NO #刪除
anon_mkdir_write_enable #創建目錄
vim /etc/vsftp/alice
anon_upload_enable=YES #上傳
anon_other_write_enable=YSE #刪除
anon_mkdir_write_enable #創建目錄
-
訪問測試
lftp -u alice,alice 10.1.x.x
cd upload
put /testdir/file #
rm file
#pam認證時的日志文件
tail /var/log/secure
登錄時錯誤類型
-
配置中禁止了用戶chroot,但該賬戶對其加目錄有w權限,或不在白名單中
Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot() -
無法通過驗證,pam認證失敗、沒有開啟服務、密碼錯誤、
530 Login incorrect. -
無法上傳文件,檢查SELinux、iptables、目的文件夾權限、配置文件是否允許update
put: Access failed: 553 Could not create file. (fstab) -
Secure日志顯示pam如法識別登錄用戶,檢查pam模塊、使用sufficient代替required等
pam_unix(vsftpd:auth): check pass; user unknown
pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=test r
host=localhost
總結
vsftp在啟動前要配置好相關的安全設置,在生產環境中建議使用虛擬用戶訪問ftp服務器,并針對特定的用戶給予上傳和修改的權限。特別需要注意的是要做到共享資源與操作系統的“隔離”,即不允許用戶訪問系統的其他目錄,避免敏感文件的泄露。如果安全要求較高,可視具體情況開啟SELinux功能,以及使用ssl加密傳輸文件。此外,為了防止暴力破解,可針對max_login_fails次數過多的ip添加拒絕訪問的策略,如使用DenyHosts程序等等。
原創文章,作者:helloc,如若轉載,請注明出處:http://www.www58058.com/51855
總結的很全面,不錯,繼續努力?。?!