FTP文件傳輸協議

title ftp 01.jpg

本章內容

FTP文件傳輸協議介紹

vsftpd服務

實現基於SSLFTPS

vsftpd虛擬用戶介紹

實現基於文件驗證的vsftpd虛擬用戶

實現基於MYSQL驗證的vsftpd虛擬用戶

 

文件傳輸協議(FTP

File Transfer Protocol 早期的三個應用級協議之一(另外兩個是smtphttp

基於C/S結構

雙通道協議:數據和命令連接

數據傳輸格式:二進制(默認)和文本

兩種模式:服務器角度

主動(PORT style):服務器主動連接(不常用,客戶端有時會裝防火牆)

命令(控制):客戶端:隨機port --- 服務器:tcp21

數據:客戶端:隨機port ---服務器:tcp20

被動(PASV style):客戶端主動連接

命令(控制):客戶端:隨機port --- 服務器:tcp21

數據:客戶端:隨機port ---服務器:隨機port

服務器被動模式數據端口示例:

227 Entering Passive Mode (192,168,175,138,224,59)

服務器數據端口爲:224*256+59

Windows默認是主動模式,linux默認是被動模式

 

FTP軟件介紹

FTP服務器:

Wu-ftpdProftpdPureftpdServUIIS

vsftpd:Very Secure FTP DaemonCentOS默認FTP服務器

高速,穩定,下載速度是WU-FTP的兩倍

ftp.redhat.com數據:單機最多可支持15000個併發

客戶端軟件:

ftplftplftpgetwgetcurl

ftp -A ftpserver port -A主動模式 -p 被動模式

lftp -u username ftpserver

lftp username@ftpserver

lftpget ftp://ftpserver/pub/file

gftp: GUI centos5 最新版2.0.19 (11/30/2008)

filezillaCuteFtpFlashFXPLeapFtp

IE ftp://username:password@ftpserver

ftp不支持補齊,lftp支持補齊,lftpgetwgetcurl是非交互式的,wgetcurl還支持http

curl ftp://url -o newfilename

curl ftp://url/f1.sh | bash  #一鍵安裝腳本實現

filezella:免費,既可以當ftp客戶端,也可以當ssh客戶端

CuteFtpFlashFXPLeapFtp:付費

 

FTP服務

狀態碼:

1XX:信息 125:數據連接打開

2XX:成功類狀態 200:命令OK 230:登錄成功

3XX:補充類 331:用戶名OK

4XX:客戶端錯誤 425:不能打開數據連接

5XX:服務器錯誤 530:不能登錄

用戶認證:

匿名用戶:ftp,anonymous,對應Linux用戶ftp

系統用戶:Linux用戶,用戶/etc/passwd,密碼/etc/shadow

虛擬用戶:特定服務的專用用戶,獨立的用戶/密碼文件

nsswitch:network service switch名稱解析框架

pam:pluggable authentication module 用戶認證

/lib64/security /etc/pam.d/ /etc/pam.conf

 

vsftpd服務

vsftpd包提供

不再由xinetd管理

用戶認證配置文件:/etc/pam.d/vsftpd

服務腳本: /usr/lib/systemd/system/vsftpd.service

/etc/rc.d/init.d/vsftpd

配置文件:/etc/vsftpd/vsftpd.conf

man 5 vsftpd.conf

格式:option=value

注意:= 前後不要有空格

匿名用戶(映射爲系統用戶ftp )共享文件位置:/var/ftp

系統用戶共享文件位置:用戶家目錄

虛擬用戶共享文件位置:爲其映射的系統用戶的家目錄

 

vsftpd服務配置

命令端口

listen_port=21

主動模式端口

connect_from_port_20=YES 主動模式端口爲20

ftp_data_port=20 指定主動模式的端口

被動模式端口範圍

linux客戶端默認使用被動模式

windows 客戶端默認使用主動模式

pasv_min_port=6000 0爲隨機分配

pasv_max_port=6010

使用當地時間

use_localtime=YES 使用當地時間(默認爲NO,使用GMT,指ftp這個客戶端工具,但沒法照顧包括各瀏覽器在內的客戶端工具,總會有不對的)

 

匿名用戶

anonymous_enable=YES 支持匿名用戶 no_anon_password=YES(默認NO) 匿名用戶略過口令檢查 anon_world_readable_only (默認YES)只能下載全部讀的文件

anon_upload_enable=YES 匿名上傳,注意:文件系統權限

anon_mkdir_write_enable=YES

anon_umask=077 指定匿名上傳文件的umask

anon_other_write_enable=YES 可刪除和修改上傳的文件

ftp的根目錄(/var/ftp)默認不允許有寫權限,否則登錄不上去

指定上傳文件的默認的所有者和權限

chown_uploads=YES(默認NO)

chown_username=wind

chown_upload_mode=0644

 

Linux系統用戶

guest_enable=YES 所有系統用戶都映射成guest用戶

guest_username=ftp 配合上面選項才生效,指定guest用戶

local_enable=YES 是否允許linux用戶登錄

write_enable-YES 允許linux用戶上傳文件

local_umask=022 指定系統用戶上傳文件的默認權限

local_root=/ftproot 非匿名用戶登錄所在目錄

禁錮所有系統用戶在家目錄中

chroot_local_user=YES(默認NO,不禁錮)禁錮系統用戶

禁錮或不禁錮特定的系統用戶在家目錄中,與上面設置功能相反 chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list

chroot_local_user=YES時,則chroot_list中用戶不禁錮

chroot_local_user=NO時,則chroot_list中用戶禁錮

 

wu-ftp日誌:默認啓用

xferlog_enable=YES (默認)啓用記錄上傳下載日誌

xferlog_std_format=YES (默認)使用wu-ftp日誌格式

xferlog_file=/var/log/xferlog (默認)可自動生成

vsftpd日誌:默認不啓用

dual_log_enable=YES 使用vsftpd日誌格式,默認不啓用

vsftpd_log_file=/var/log/vsftpd.log(默認)可自動生成

登錄提示信息

ftpd_banner=“welcome to cloud ftp server"

banner_file=/etc/vsftpd/ftpbanner.txt 優先此項生效

目錄訪問提示信息

dirmessage_enable=YES (默認)

message_file=.message(默認)信息存放在指定目錄下.message

 

使用pam(Pluggable Authentication Modules)完成用戶認證

pam_service_name=vsftpd

pam配置文件:/etc/pam.d/vsftpd

/etc/vsftpd/ftpusers 默認文件中用戶拒絕登錄(因/etc/pam.d/vsftpdpam_listfile.so 這行的sense=deny,改成allow則爲白名單)

是否啓用控制用戶登錄的列表文件

userlist_enable=YES 默認有此設置

userlist_deny=YES(默認值)黑名單,不提示口令,NO爲白名單

userlist_file=/etc/vsftpd/users_list 此爲默認值

若要root用戶登錄,則ftpusersusers_list這兩個文件都要改

連接限制

max_clients=0 最大併發連接數

max_per_ip=0 每個IP同時發起的最大連接數

vsftpd服務指定用戶身份運行

nopriv_user=nobody

 

傳輸速率:字節/

anon_max_rate=0 匿名用戶的最大傳輸速率

local_max_rate=0 本地用戶的最大傳輸速率

連接時間:秒爲單位

connect_timeout=60 主動模式數據連接超時時長

accept_timeout=60 被動模式數據連接超時時長

data_connection_timeout=300 數據連接無數據輸超時時長

idle_session_timeout=60 無命令操作超時時長

優先以文本方式傳輸

ascii_upload_enable=YES

ascii_download_enable=YES

最好還是用二進制方式傳輸,否則容易破壞非文本文件的數據

ftp連着時可以自由切換

ftp> ascii

200 Switching to ASCII mode.

ftp> binary

200 Switching to Binary mode.

ftp>

 

配置FTP服務以非獨立服務方運行:listen=NO,默認爲獨立方式

cat /etc/xinetd.d/vsftpd

service ftp

{

flags = REUSE

socket_type = stream

wait = no

user = root

server = /usr/sbin/vsftpd

log_on_failure += USERID

disable = no

}

 

實現基於SSLFTPS

查看是否支持SSL

ldd `which vsftpd` 查看到libssl.so

創建自簽名證書

cd /etc/pki/tls/certs/

make vsftpd.pem  生成自簽名證書的簡單命令

openssl x509 -in vsftpd.pem -noout -text

配置vsftpd服務支持SSL/etc/vsftpd/vsftpd.conf

ssl_enable=YES 啓用SSL

allow_anon_ssl=NO 匿名不支持SSL

force_local_logins_ssl=YES 本地用戶登錄加密

force_local_data_ssl=YES 本地用戶數據傳輸加密

rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem

filezilla等工具測試

 

vsftpd虛擬用戶

企業中有時候會有這種需求,不同的用戶使用不同的用戶名密碼,以不同的權限訪問不同的ftp目錄,虛擬用戶可用來滿足這種需求

虛擬用戶:

所有虛擬用戶會統一映射爲一個指定的系統帳號:訪問共享位置,即爲此係統帳號的家目錄

各虛擬用戶可被賦予不同的訪問權限,通過匿名用戶的權限控制參數進行指定

虛擬用戶帳號的存儲方式:

文件:編輯文本文件,此文件需要被編碼爲hash格式

奇數行爲用戶名,偶數行爲密碼

db_load -T -t hash -f vusers.txt vusers.db

關係型數據庫中的表中:

實時查詢數據庫完成用戶認證

mysql庫:pam要依賴於pam-mysql

/lib64/security/pam_mysql.so

/usr/share/doc/pam_mysql-0.7/README

 

實現基於文件驗證的vsftpd虛擬用戶

一、創建用戶數據庫文件

vim /etc/vsftpd/vusers.txt

ftpuser1

centos

ftpuser2

rhel

ftpuser3

111111

cd /etc/vsftpd/

db_load -T -t hash -f vusers.txt vusers.db

chmod 600 vusers.db

 

二、創建用戶和訪問FTP目錄

useradd -r -d /var/ftproot -m -s /sbin/nologin vuser

chmod +rx /var/ftproot/

centos7 還需要執行以下操作:

chmod -w /var/ftproot/

mkdir /var/ftproot/upload

setfacl -m u:vuser:rwx /var/ftproot/upload

 

三、創建pam配置文件

vim /etc/pam.d/vsftpd.db

auth required pam_userdb.so db=/etc/vsftpd/vusers

account required pam_userdb.so db=/etc/vsftpd/vusers

 

四、指定pam配置文件

vim /etc/vsftpd/vsftpd.conf

guest_enable=YES

guest_username=vuser

pam_service_name=vsftpd.db

 

五、SELinux設置:

禁用SELinux 或者 setsebool -P ftpd_full_access 1

 

六、虛擬用戶建立獨立的配置文件

mdkir /etc/vsftpd/vusers.d/ 創建配置文件存放的路徑

vim /etc/vsftpd/vsftpd.conf

user_config_dir=/etc/vsftpd/vusers.d/

cd /etc/vsftpd/vusers.d/ 進入此目錄

允許ftpuser1用戶可讀寫,其它用戶只讀

vim ftpuser1 創建各用戶自已的配置文件

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

vim ftpuser2 創建各用戶自已的配置文件

local_root=/ftproot 登錄目錄改變至指定的目錄

 

七、測試

ftpuser1配置成功,擁有讀寫權限

FTP 基於文件驗證的vsftpd虛擬用戶,01:ftpuser1配置成功.jpg

ftpuser2配置成功,只有只讀權限,故上傳失敗

FTP 基於文件驗證的vsftpd虛擬用戶,02:ftpuser2只有只讀權限,故上傳失敗.jpg 

實現基於MYSQL驗證的vsftpd虛擬用戶

說明:本實驗在兩臺CentOS主機上實現,一臺做爲FTP服務器,一臺做數據庫服務器,此處以192.168.30.75作爲FTP服務器,以192.168.30.7作爲數據庫服務器

一、安裝所需要包和包組:

在數據庫服務器上安裝包:

Centos7:在數據庫服務器上安裝

yum -y install mariadb-server

systemctl start mariadb.service

systemctl enable mariadb

Centos6:在數據庫服務器上安裝

yum -y install mysql-server

FTP服務器上安裝vsftpdpam_mysql

centos6pam_mysqlepel6的源中提供

yum install vsftpd pam_mysql

centos7:無對應rpm包,需手動編譯安裝

yum -y groupinstall "Development Tools"

yum -y install mariadb-devel pam-devel vsftpd

下載pam_mysql-0.7RC1.tar.gz

http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz

tar xvf pam_mysql-0.7RC1.tar.gz

cd pam_mysql-0.7RC1/

./configure --with-pam-mods-dir=/lib64/security

make

make install

編譯成功後,在/lib64/security文件夾中會出現pam_mysql.so文件

FTP 基於MySQL驗證的vsftpd虛擬用戶,01:pam-mysql編譯成功.jpg 

二、在數據庫服務器上創建虛擬用戶賬號

1.建立存儲虛擬用戶數據庫和連接的數據庫用戶

mysql> CREATE DATABASE vsftpd;

mysql> SHOW DATABASES;

ftp服務和mysql不在同一主機:

mysql> GRANT SELECT ON vsftpd.* TO

vsftpd@'192.168.30.%' IDENTIFIED BY 'centos';

ftp服務和mysql在同一主機:

mysql> GRANT SELECT ON vsftpd.* TO

vsftpd@localhost IDENTIFIED BY 'centos';

mysql> GRANT SELECT ON vsftpd.* TO

vsftpd@'127.0.0.1' IDENTIFIED BY 'centos';

mysql> FLUSH PRIVILEGES;

 

2.準備相關表

mysql> USE vsftpd;

Mysql> SHOW TABLES;

mysql> CREATE TABLE users (

id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,

name CHAR(50) BINARY NOT NULL,

password CHAR(48) BINARY NOT NULL

);

mysql>DESC users;

測試連接

mysql -uvsftpd -h 192.168.30.7 -pcentos

mysql> SHOW DATABASES;

 

3.添加虛擬用戶

根據需要添加所需要的用戶,爲了安全應該使用PASSWORD函數加密其密碼後存儲

mysql>DESC users;

mysql> INSERT INTO users(name,password) values('ftpuser1',password('centos'));

mysql> INSERT INTO users(name,password) values('ftpuser2',password('centos'));

mysql> SELECT * FROM users;

FTP 基於MySQL驗證的vsftpd虛擬用戶,02:創建表和用戶成功.jpg 

三、在FTP服務器上配置vsftpd服務

1.FTP服務器上建立pam認證所需文件

vi /etc/pam.d/vsftpd.mysql 添加如下兩行

auth required pam_mysql.so user=vsftpd passwd=centos host=192.168.30.7 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

account required pam_mysql.so user=vsftpd passwd=centos host=192.168.30.7 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

注意:參考README文檔,選擇正確的加密方式

crypt是加密方式,0表示不加密,1表示crypt(3)加密,2表示使用mysql password()函數加密,3表示md5加密,4表示sha1加密

配置字段說明

auth 表示認證

account 驗證賬號密碼正常使用

required 表示認證要通過

pam_mysql.so模塊是默認的相對路徑,是相對/lib64/security/路徑而言,也可以寫絕對路徑;後面爲給此模塊傳遞的參數

user=vsftpd爲登錄mysql的用戶

passwd=centos 登錄mysql的的密碼

host=mysqlserver mysql服務器的主機名或ip地址

db=vsftpd 指定連接msyql的數據庫名稱

table=users 指定連接數據庫中的表名

usercolumn=name 當做用戶名的字段

passwdcolumn=password 當做用戶名字段的密碼

crypt=2 密碼的加密方式爲mysql password()函數加密

 

2.建立相應用戶和修改vsftpd配置文件,使其適應mysql認證

建立虛擬用戶映射的系統用戶及對應的目錄

useradd -s /sbin/nologin -d /var/ftproot vuser

chmod 555 /var/ftproot centos7 需除去ftp根目錄的寫權限

mkdir /var/ftproot/{upload,pub}

setfacl -m u:vuser:rwx /var/ftproot/upload

確保/etc/vsftpd/vsftpd.conf中已經啓用了以下選項

anonymous_enable=YES

添加下面兩項

guest_enable=YES

guest_username=vuser

修改下面一項,原系統用戶無法登錄

pam_service_name=vsftpd.mysql

 

四、啓動vsftpd服務

service vsftpd start;systemctl start vsftpd

chkconfig vsftpd on;systemctl enable vsftpd

查看端口開啓情況

netstat -tnlp |grep :21

 

五、Selinux相關設置:在FTP服務器上執行

restorecon -R /lib64/security

setsebool -P ftpd_connect_db 1

setsebool -P ftp_home_dir 1

chcon -R -t public_content_rw_t /var/ftproot/

 

六、測試:利用FTP客戶端工具,以虛擬用戶登錄驗證結果

tail /var/log/secure

 

七、在FTP服務器上配置虛擬用戶具有不同的訪問權限

vsftpd可以在配置文件目錄中爲每個用戶提供單獨的配置文件以定義其ftp服務訪問權限,每個虛擬用戶的配置文件名同虛擬用戶的用戶名。配置文件目錄可以是任意未使用目錄,只需要在vsftpd.conf指定其路徑及名稱即可

1、配置vsftpd爲虛擬用戶使用配置文件目錄

vim /etc/vsftpd/vsftpd.conf

添加如下選項

user_config_dir=/etc/vsftpd/vusers_config

2、創建所需要目錄,併爲虛擬用戶提供配置文件

mkdir /etc/vsftpd/vusers_config/

cd /etc/vsftpd/vusers_config/

touch ftpuser1 ftpuser2

3、配置虛擬用戶的訪問權限

虛擬用戶對vsftpd服務的訪問權限是通過匿名用戶的相關指令進行的。如果需要讓用戶ftpuser1具有上傳文件的權限,可以修改/etc/vsftpd/vusers_config/ftpuser1文件,在裏面添加如下選項並設置爲YES即可,只讀則設爲NO

注意:需確保對應的映射用戶對於文件系統有寫權限

anon_upload_enable={YES|NO}

anon_mkdir_write_enable={YES|NO}

anon_other_write_enable={YES|NO}

local_root=/ftproot 登錄目錄改變至指定的目錄

4、測試

FTP 基於MySQL驗證的vsftpd虛擬用戶,03:ftpuser1配置成功.jpg 

Ftp工具

Axel:網絡客戶端工具

下載安裝axel

ftp://172.20.0.1/pub/Sources/6.x86_64/axel/axel-2.4-1.el6.rf.x86_64.rpm

axel -n 3 -o /root ftp://172.20.0.1/pub/ISOs/CentOS/CentOS-7-x86_64-Everything-1804.iso 可以啓用併發


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章