Linux下FTP伺服器的配置及其應用
一.FTP簡介:
FTP: file transfer protocol (檔案傳輸協定)是一個用于在兩台或者多台不同的作業系統中傳輸檔案的協定,從FPT的誕生至今已經40年了。今年是它的40年紀念。是以它理所當然的成為了這個世界上最古老的協定,沒有之一。
二.FTP工作原理
FTP的工作基于TCP協定
我們最常見的也是最常用的端口:
21号端口:是實作指令控制的。(當我們驗證之後,我們執行一些比如put get ls等指令都是通過這個端口進行傳輸的)
20号端口:實作資料傳輸的。
伺服器有兩種資料傳輸模式:
1.主動模式。
2.被動模式。
主動模式和被動模式是針對伺服器來說的,而到底在運作的過程中到底采用主動模式還是被動模式,則是由用戶端來決定的。主動模式要求用戶端和伺服器端同時打開并且監聽一個端口以建立連接配接。在這種情況下,用戶端由于安裝了防火牆會産生一些問題。是以,創立了被動模式。被動模式隻要求伺服器端産生一個監聽相應端口的程序,這樣就可以繞過用戶端安裝了防火牆的問題。
主動模式的實作方式:
a.用戶端打開一個随機的端口(端口号大于1024,在這裡,我們稱它為x),同時一個FTP程序連接配接至伺服器的21号指令端口。此時,該tcp連接配接的來源地端口為用戶端指定的随機端口x,目的地端口(遠端端口)為伺服器上的21号端口。
b.用戶端開始監聽端口(x+1),同時向伺服器發送一個端口指令(通過伺服器的21号指令端口),此指令告訴伺服器用戶端正在監聽的端口号并且已準備好從此端口接收資料。這個端口就是我們所知的資料端口。
c.伺服器打開20号源端口并且建立和用戶端資料端口的連接配接。此時,來源地的端口為20,遠端資料(目的地)端口為(x+1)。
d.用戶端通過本地的資料端口建立一個和伺服器20号端口的連接配接,然後向伺服器發送一個應答,告訴伺服器它已經建立好了一個連接配接。
三.FTP的使用者/伺服器類型:
1)FTP伺服器可以支援的使用者類型主要有3大類。
1.匿名使用者: anonymous 或者 ftp
一般使用的就是匿名使用者。
2.本地使用者:
賬号名稱、密碼等資訊儲存在passwd、shadow檔案中
3.虛拟使用者:
使用獨立的賬号/密碼資料檔案。
可以是 db 資料庫,也可以直接放在mysql 中,也可以放在一個檔案上
2)常見的FTP伺服器:
IIS Serv-U(在windows上比較常用的)
wu-ftpd(現存最古老的) 、
Proftpd (功能非常強大的ftp軟體,根據你的需要,它可以制定)
pureftpd (功能強大的ftp軟體)
vsftpd(Redhat上最常用的,輕量級的 隻有140K,但是卻非常安全)
3)常見的FTP用戶端:
ftp指令
lftp指令
gftp (linxu上圖形化的ftp工具)
CuteFTP
FlashFTP(号稱是最快的FTP)、
Ftps 會有通過ssl加密的機制。
四.vsftpd 伺服器
我們以vsftpd伺服器的構架,來講解到底如何架構一個FTP伺服器
首先要知道,我們vsftpd伺服器就是用ftp這個使用者的身份來運作的。而vsftpd又受到selinux的控制,是以要先把selinux關了。
1. 安裝vsftpd:
yum install vsftpd -y
安裝好之後,我們可以看到vsfptd這個指令被安裝在了/usr/sbin目錄中叫做vsftpd
配置檔案儲存在/etc/vsftpd目錄下,而它的所有檔案儲存在/var/ftp中
2.如何配置vsftpd
首先進入/etc/vsftpd目錄下
① ftpusers 檔案:
這個是一個定義檔案裡面定義着那些被禁止登陸的使用者
② user_list 檔案:
這個檔案中的清單提供一份FTP使用者清單,定義了是否禁止使用者登入,而這個檔案是否能生效,取決于主配置檔案中的設定
③ /etc/vsftpd.conf
主配置檔案,詳細的定義了所有的規則:
我們來看看常用的規則:
local_enable=YES 是否允許以本地使用者身份通路
本地使用者預設通過ftp登陸預設在家目錄下
write_enable 是否允許本地使用者登入後可寫?(隻建立檔案)
anon_mkdir_write_enable=YES 允許本地使用者登入後可建立檔案夾
anon_upload_enable=YES 是否允許匿名使用者上傳
chown_upload=YES 對匿名使用者上傳的檔案進行一次自動的更改屬主
chown_username=root 定義更改的屬主
dirmessage_enable=YES 給目前目錄增加一個歡迎資訊
message_file=.message 你的歡迎檔案的位置。
xferlog_enable=YES 是否開啟日志資訊
xferlog_file=/var/log/vsftpd.log配置日志檔案在哪
idle_session_timeout=600 會話的響應時間
data_connection_timeout=120 資料響應時間
ftpd_banner=Welcome to bash FTPservice. FTP的歡迎資訊。
chroot_list_enable=YES 這項的作用是是否把使用者鎖在它的家目錄中。
這個不開啟的話是非常危險的。不對使用者進行限制則會讓一個使用者各種亂跑,并且修改檔案。當這個開啟的時候,使用者登入到這個目錄中後,使用pwd指令則根本不顯示你到底位于何方。
chroot_list_file=/etc/vsftpd/chroot_list通過這個表,你可以定義到底限制哪些使用者切換目錄。
listen=YES 讓FTP以獨立程序運作在我們的機子上的。
如果改成 NO, 則讓他以一個非獨立的程序。則成為init的一個子程序。
pam_service_name=vsftpd 基于pub認證
userlist_enable=YES 是否開啟清單的控制 user_list 檔案:
userlist_deny=YES 他預設是拒絕的,隻要你想進去,則會立刻拒絕。如果我們改成NO,則僅能這個清單中的使用者通路。
lftp-u student 172.16.100.1 則可以進行驗證
3.啟動服務:
service vsftpd start
4.匿名使用者
它的預設匿名使用者的登入路徑是在 /var/ftp,如果你使用“id ftp”的話,就會發現ftp這個使用者也在系統裡,發現它的家目錄是/var/ftp,這個就是登陸到我們的FTP伺服器上的匿名使用者所用的賬号。
五.建構基于虛拟使用者的vsftpd伺服器認證:
1.建立虛拟FTP使用者的賬号資料庫檔案
建立虛拟使用者的賬号名、密碼清單
vim/etc/vsftpd/vusers.list
mike
123
john
456
這裡,一行是使用者,一行是密碼
由于ftp是不能識别這個檔案的。是以我們需要用db4-utils這個軟體将其進行一次哈希的轉換。
db_load-T -t hash -f vusers.list vusers.db
将其轉換成資料庫類型的檔案。
為了安全起見,将它的權限更改為600
chmod 600 /etc/vsftpd/vusers.*
2.建立FTP根目錄及虛拟使用者映射的系統使用者
虛拟出來的使用者可以自定義虛拟家目錄。
mkdir /var/ftproot/pub
useradd-d /var/ftproot -s /sbin/nologin virtual
chmod 755 /var/ftproot/
3.建立支援虛拟使用者的PAM認證檔案
vim /etc/pam.d/vsftpd.vu
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
↑ ↑ ↑
認證 認證的操作 所需要的認證的庫
授權 授權的操作 授權所需要的庫
4.在vsftpd.conf中添加支援配置
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_umask=022
guest_enable=YES
guest_username=virtual
pam_service_name=vsftpd.vu
5.為個别虛拟使用者建立獨立的配置檔案
在vsftpd.conf中添加使用者配置目錄支援
user_config_dir=/etc/vsftpd/vusers_dir
為使用者mike john建立獨立的配置目錄及檔案
mkdir /etc/vsftpd/vusers_dir/
cd /etc/vsftpd/vusers_dir
touch mike
vim john
anon_upload_enable=YES
anon_mkdir_write_enable=YES
max_clients ##限制用戶端最大請求
max_per_ip ##限制每個ipd
6.重新加載 vsftpd 配置
service vsftpd restart
六.用Openssl實作對傳輸資料加密。
對于FTP而言,由于它協定的古老,這就直接導緻它的安全性是非常的差的,是以我們就需要使用SSL的方式對其傳輸的資料進行加密,在這裡,我們不列出詳細的解釋,隻将操作直接寫入。希望大家能自行研究加密的方式。
1.先給我們的伺服器制作CA:
cd /etc/pki/CA
mkdir crets newcerts crl
touch index.txt serial
echo 01 > serial
openssl genrsa 1024 > private/cakey.pem
chmod 600 private/cakey.pem
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
2.進入 cd/etc/vsftpd/制作屬于自己的證書并讓CA頒發授權
mkdir ssl
cd ssl/
openssl genrsa 1024 > vsftpd.key
openssl req -new -key vsftpd.key -out vsftpd.csr
openssl ca -in vsftpd.csr -out vsftpd.crt
3.證書辦好了,但是還要支援SSL
在vsftpd的配置檔案中
vim /etc/vsftpd/vsftpd.conf
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
allow_anon_ssl=NO
force_local_data_ssl=YES #強制檔案傳輸加密,
force_local-logins_ssl=YES #強制登陸加密
rsa_cert_file=/etc/vsftpd/ssl/vsftpd_cert.pem #證書
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd_key.pem #私鑰
驗證一下。這裡要用一點進階一點的用戶端通路:
我們選擇基于TLS認證的FlashFXP軟體進行驗證。
這時候通路FTP的時候已經出現了需要進行公鑰交換的認證了。則我們的通過OpenSSL加密的方式就這樣實作了。
七.總結
FTP是一種大家最常用的協定,了解它,并且努力的掌握它可以幫助我們做好很多工作,而它的安全又是自己的一大隐患,是以我們在使用它的同時一定不能忘了将它的安全措施做到最好。
如果作為讀者的你發現了什麼寫作的漏洞或者錯誤的話,歡迎給予批評,我會快速糾正的。也希望大家共同進步。
本文轉自 dengaosky 51CTO部落格,原文連結:http://blog.51cto.com/dengaosky/1853605,如需轉載請自行聯系原作者