1.FTP簡(jiǎn)介
File Transfer Protocol 早期的三個(gè)應(yīng)用級(jí)協(xié)議之一
? 基于C/S結(jié)構(gòu)
? 雙通道協(xié)議:數(shù)據(jù)和命令連接
? 數(shù)據(jù)傳輸格式:二進(jìn)制(默認(rèn))和文本
? 兩種模式:服務(wù)器角度
主動(dòng)(PORT style):服務(wù)器主動(dòng)連接
命令(控制):客戶端:隨機(jī)port ---? 服務(wù)器:tcp21
數(shù)據(jù):客戶端:隨機(jī)port+1 ?---服務(wù)器:tcp20
被動(dòng)(PASV style):客戶端主動(dòng)連接
命令(控制):客戶端:隨機(jī)port ---? 服務(wù)器:tcp21
數(shù)據(jù):客戶端:隨機(jī)port+1 ---?服務(wù)器:隨機(jī)port
? 服務(wù)器被動(dòng)模式數(shù)據(jù)端口示例:
227 Entering Passive Mode (192,168,175,138,224,59)
服務(wù)器數(shù)據(jù)端口為:224*256+59
2.FTP軟件介紹
? FTP服務(wù)器:
Wu-ftpd,Proftpd,Pureftpd,ServU,IIS
vsftpd:Very Secure FTP Daemon,CentOS默認(rèn)FTP服務(wù)器
高速,穩(wěn)定,下載速度是WU-FTP的兩倍
ftp,redhat.com數(shù)據(jù):單機(jī)最多可支持15000個(gè)并發(fā)
? 客戶端軟件:
ftp,lftp,lftpget,wget,curl
ftp -A ftpserver port -A主動(dòng)模式 –p 被動(dòng)模式
lftp –u username ftpserver
lftp username@ftpserver
lftpget ftp://ftpserver/pub/file
gftp: GUI centos5 最新版2.0.19 (11/30/2008)
filezilla,CuteFtp,F(xiàn)lashFXP,LeapFtp
IE ftp://username:password@ftpserver
3.FTP服務(wù)
? 狀態(tài)碼:
1XX:信息 125:數(shù)據(jù)連接打開(kāi)
2XX:成功類狀態(tài) 200:命令OK 230:登錄成功
3XX:補(bǔ)充類 331:用戶名OK
4XX:客戶端錯(cuò)誤 425:不能打開(kāi)數(shù)據(jù)連接
5XX:服務(wù)器錯(cuò)誤 530:不能登錄
? 用戶認(rèn)證:
匿名用戶:ftp,anonymous,對(duì)應(yīng)Linux用戶ftp
系統(tǒng)用戶:Linux用戶,用戶/etc/passwd,密碼/etc/shadow
虛擬用戶:特定服務(wù)的專用用戶,獨(dú)立的用戶/密碼文件
nsswitch:network service switch名稱解析框架
pam:pluggable authentication module 用戶認(rèn)證
/lib64/security /etc/pam.d/ /etc/pam.conf
Paste_Image.png
4.vsftpd服務(wù)
? 由vsftpd包提供
? 不再由xinetd管理
? 用戶認(rèn)證配置文件:/etc/pam.d/vsftpd
? 服務(wù)腳本: /usr/lib/systemd/system/vsftpd.service
/etc/rc.d/init.d/vsftpd
? 配置文件:/etc/vsftpd/vsftpd.conf
man 5 vsftpd.conf
格式:option=value
注意:=前后不要有空格
? 匿名用戶(映射為系統(tǒng)用戶ftp )共享文件位置:/var/ftp
? 系統(tǒng)用戶共享文件位置:用戶家目錄
? 虛擬用戶共享文件位置:為其映射的系統(tǒng)用戶的家目錄
5.vsftpd服務(wù)配置
? 命令端口
listen_port=21
? 主動(dòng)模式端口
connect_from_port_20=YES 主動(dòng)模式端口為20
ftp_data_port=20 指定主動(dòng)模式的端口
? 被動(dòng)模式端口范圍
linux客戶端默認(rèn)使用被動(dòng)模式
windows 客戶端默認(rèn)使用主動(dòng)模式
pasv_min_port=6000 0為隨機(jī)分配
pasv_max_port=6010
? 使用當(dāng)?shù)貢r(shí)間
use_localtime=YES 使用當(dāng)?shù)貢r(shí)間(默認(rèn)為NO,使用GMT)
? 匿名用戶
anonymous_enable=YES 支持匿名用戶
no_anon_password=YES(默認(rèn)NO) 匿名用戶略過(guò)口令檢查
anon_world_readable_only (默認(rèn)YES)只能下載全部讀的文件
anon_upload_enable=YES 匿名上傳,注意:文件系統(tǒng)權(quán)限
anon_mkdir_write_enable=YES 可以創(chuàng)建文件
anon_other_write_enable=YES 可刪除和修改上傳的文件
anon_umask=077 指定匿名上傳umask
指定上傳文件的默認(rèn)的所有者和權(quán)限
chown_uploads=YES(默認(rèn)NO)
chown_username=yin 指定所有者
chown_upload_mode=0644 指定權(quán)限
? Linux系統(tǒng)用戶
guest_enable=YES 所有系統(tǒng)用戶都映射成guest用戶
guest_username=ftp 配合上面選項(xiàng)才生效,指定guest用戶
local_enable=YES 是否允許linux用戶登錄
write_enable-YES 允許linux用戶上傳文件
local_umask=022 指定系統(tǒng)用戶上傳文件的默認(rèn)權(quán)限
local_root=/ftproot 非匿名用戶登錄所在目錄
? 禁錮所有系統(tǒng)用戶在家目錄中
chroot_local_user=YES(默認(rèn)NO,不禁錮)禁錮系統(tǒng)用戶
? 禁錮或不禁錮特定的系統(tǒng)用戶在家目錄中,與上面設(shè)置功能相反
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
當(dāng)chroot_local_user=YES時(shí),則chroot_list中用戶不禁錮
當(dāng)chroot_local_user=NO時(shí),則chroot_list中用戶禁錮
? wu-ftp日志:默認(rèn)啟用
xferlog_enable=YES (默認(rèn))啟用記錄上傳下載日志
xferlog_std_format=YES (默認(rèn))使用wu-ftp日志格式
xferlog_file=/var/log/xferlog (默認(rèn))可自動(dòng)生成
? vsftpd日志:默認(rèn)不啟用
dual_log_enable=YES 使用vsftpd日志格式,默認(rèn)不啟用
vsftpd_log_file=/var/log/vsftpd.log(默認(rèn))可自動(dòng)生成
? 登錄提示信息
ftpd_banner=“welcome to mage ftp server"
banner_file=/etc/vsftpd/ftpbanner.txt 優(yōu)先上面項(xiàng)生效
? 目錄訪問(wèn)提示信息
dirmessage_enable=YES (默認(rèn))
message_file=.message(默認(rèn))信息存放在指定目錄下.message
? 使用pam(Pluggable Authentication Modules)完成用戶認(rèn)證
pam_service_name=vsftpd
pam配置文件:/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers 默認(rèn)文件中用戶拒絕登錄
? 是否啟用控制用戶登錄的列表文件
userlist_enable=YES 默認(rèn)有此設(shè)置
userlist_deny=YES(默認(rèn)值)黑名單,不提示口令,NO為白名單
userlist_file=/etc/vsftpd/users_list 此為默認(rèn)值
? 連接限制
max_clients=0 最大并發(fā)連接數(shù)
max_per_ip=0 每個(gè)IP同時(shí)發(fā)起的最大連接數(shù)
? vsftpd服務(wù)指定用戶身份運(yùn)行
nopriv_user=nobody
? 傳輸速率:字節(jié)/秒
anon_max_rate=0 匿名用戶的最大傳輸速率
local_max_rate=0 本地用戶的最大傳輸速率
? 連接時(shí)間:秒為單位
connect_timeout=60 主動(dòng)模式數(shù)據(jù)連接超時(shí)時(shí)長(zhǎng)
accept_timeout=60 被動(dòng)模式數(shù)據(jù)連接超時(shí)時(shí)長(zhǎng)
data_connection_timeout=300 數(shù)據(jù)連接無(wú)數(shù)據(jù)輸超時(shí)時(shí)長(zhǎng)
idle_session_timeout=60 無(wú)命令操作超時(shí)時(shí)長(zhǎng)
? 優(yōu)先以文本方式傳輸
ascii_upload_enable=YES
ascii_download_enable=YES
? 配置FTP服務(wù)以非獨(dú)立服務(wù)方運(yùn)行:listen=NO,默認(rèn)為獨(dú)立方式
? 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
}
Paste_Image.png
Paste_Image.png
service xinetd restart 啟動(dòng)服務(wù)
6.實(shí)現(xiàn)基于SSL的FTPS
? 查看是否支持SSL
ldd
which vsftpd
查看到libssl.so
? 創(chuàng)建自簽名證書
cd /etc/pki/tls/certs/
make vsftpd.pem
openssl x509 -in vsftpd.pem -noout –text
? 配置vsftpd服務(wù)支持SSL:/etc/vsftpd/vsftpd.conf
ssl_enable=YES 啟用SSL
allow_anon_ssl=NO 匿名不支持SSL
force_local_logins_ssl=YES 本地用戶登錄加密
force_local_data_ssl=YES 本地用戶數(shù)據(jù)傳輸加密
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
? 用filezilla等工具測(cè)試
7.vsftpd虛擬用戶
? 虛擬用戶:
所有虛擬用戶會(huì)統(tǒng)一映射為一個(gè)指定的系統(tǒng)帳號(hào):訪問(wèn)共享位置,即為此系統(tǒng)帳號(hào)的家目錄各虛擬用戶可被賦予不同訪問(wèn)權(quán)限,通過(guò)匿名用戶的權(quán)限控制參數(shù)進(jìn)行指定
? 虛擬用戶帳號(hào)的存儲(chǔ)方式:
文件:編輯文本文件,此文件需要被編碼為hash格式
奇數(shù)行為用戶名,偶數(shù)行為密碼
db_load -T -t hash -f vusers.txt vusers.db
關(guān)系型數(shù)據(jù)庫(kù)中的表中:
實(shí)時(shí)查詢數(shù)據(jù)庫(kù)完成用戶認(rèn)證
mysql庫(kù):pam要依賴于pam-mysql
/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README
8.實(shí)現(xiàn)基于文件驗(yàn)證的vsftpd虛擬用戶
虛擬用戶:針對(duì)某個(gè)服務(wù),需要涉及到用戶驗(yàn)證的時(shí)候,可以針對(duì)這個(gè)服務(wù)
創(chuàng)建單獨(dú)的賬戶密碼,用于驗(yàn)證
一、創(chuàng)建用戶數(shù)據(jù)庫(kù)文件
? vim /etc/vsftpd/vusers.txt
wang
wangpass
mage
magepass
? cd /etc/vsftpd/
? db_load -T -t hash -f vusers.txt vusers.db (vusers.txt里面是一行用戶名一行密碼,db_load將文件轉(zhuǎn)化為特定的數(shù)據(jù)文件,沒(méi)有權(quán)限直接訪問(wèn)文件系統(tǒng))
? chmod 600 vusers.db
二、創(chuàng)建用戶和訪問(wèn)FTP目錄
這是操作系統(tǒng)賬號(hào),將虛擬賬號(hào)關(guān)聯(lián)到這里,給虛擬賬號(hào)分配權(quán)限訪問(wèn)磁盤
? useradd -d /var/ftproot -s /sbin/nologin vuser (vuser就是系統(tǒng)賬號(hào),虛擬賬號(hào)都是通過(guò)他訪問(wèn))
? chmod +rx /var/ftproot/
? centos7 還需要執(zhí)行以下操作:
? chmod -w /var/ftproot/
? mkdir /var/ftproot/upload
? setfacl -m u:vuser:rwx /var/ftproot/upload
三、創(chuàng)建pam配置文件
? vim /etc/pam.d/vsftpd.db
auth required pam_userdb.so db=/etc/vsftpd/vusers(添加支持?jǐn)?shù)據(jù)庫(kù)文件,man pam_userdb)
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設(shè)置:
禁用SELinux 或者 setsebool -P ftpd_full_access 1
六、虛擬用戶建立獨(dú)立的配置文件
? mdkir /etc/vsftpd/vusers.d/ 創(chuàng)建配置文件存放的路徑
? vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers.d/
? cd /etc/vsftpd/vusers.d/ 進(jìn)入此目錄
? 允許wang用戶可讀寫,其它用戶只讀
? vim wang 創(chuàng)建各用戶自已的配置文件
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
?vim mage 創(chuàng)建各用戶自已的配置文件
local_root=/ftproot 登錄目錄改變至指定的目錄
9.實(shí)現(xiàn)基于MYSQL驗(yàn)證的vsftpd虛擬用戶
? 說(shuō)明:本實(shí)驗(yàn)在兩臺(tái)CentOS主機(jī)上實(shí)現(xiàn),一臺(tái)做為FTP服務(wù)器,一臺(tái)做數(shù)據(jù)庫(kù)服務(wù)器
一、安裝所需要包和包組:
? 在數(shù)據(jù)庫(kù)服務(wù)器上安裝包:
? Centos7:在數(shù)據(jù)庫(kù)服務(wù)器上安裝
yum –y install mariadb-server mariadb
systemctl start mariadb.service
systemctl enable mariadb
? Centos6:在數(shù)據(jù)庫(kù)服務(wù)器上安裝
yum –y install mysql-server
?在FTP服務(wù)器上安裝vsftpd和pam_mysql包
centos6:pam_mysql由epel6的源中提供
yum install vsftpd pam_mysql
? centos7:無(wú)對(duì)應(yīng)rpm包,需手動(dòng)編譯安裝
yum -y groupinstall "Development Tools"
yum -y install mariadb-devel pam-devel vsftpd
下載pam_mysql-0.7RC1.tar.gz
ftp://172.16.0.1/pub/Sources/sources/pam/
tar xvf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1/
./configure --with-mysql=/usr --with-pam=/usr
--with-pam-mods-dir=/lib64/security
make
make install
二、在數(shù)據(jù)庫(kù)服務(wù)器上創(chuàng)建虛擬用戶賬號(hào)
1.建立存儲(chǔ)虛擬用戶數(shù)據(jù)庫(kù)和連接的數(shù)據(jù)庫(kù)用戶
mysql> CREATE DATABASE vsftpd;
mysql> SHOW DATABASES;
? ftp服務(wù)和mysql不在同一主機(jī):
mysql> GRANT SELECT ON vsftpd.* TO
vsftpd@'172.16.%.%' IDENTIFIED BY 'magedu';
? ftp服務(wù)和mysql在同一主機(jī):
mysql> GRANT SELECT ON vsftpd.* TO
vsftpd@localhost IDENTIFIED BY 'magedu';
mysql> GRANT SELECT ON vsftpd.* TO
vsftpd@'127.0.0.1' IDENTIFIED BY 'magedu';
mysql> FLUSH PRIVILEGES;
2.準(zhǔn)備相關(guān)表
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;
測(cè)試連接
mysql -uvsftpd -h 172.16.200.200 -pmagedu
mysql> SHOW DATABASES;
3.添加虛擬用戶
? 根據(jù)需要添加所需要的用戶,為了安全應(yīng)該使用PASSWORD
函數(shù)加密其密碼后存儲(chǔ)
mysql>DESC users;
mysql> INSERT INTO users(name,password)
values(‘wang',password('magedu'));
mysql> INSERT INTO users(name,password)
values(‘mage',password('magedu'));
mysql> SELECT * FROM users;
三、在FTP服務(wù)器上配置vsftpd服務(wù)
1.在FTP服務(wù)器上建立pam認(rèn)證所需文件
vi /etc/pam.d/vsftpd.mysql 添加如下兩行
auth required pam_mysql.so user=vsftpd
passwd=magedu host=mysqlserver db=vsftpd table=users
usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd
passwd=magedu host=mysqlserver db=vsftpd table=users
usercolumn=name passwdcolumn=password crypt=2
注意:參考README文檔,選擇正確的加密方式
crypt是加密方式,0表示不加密,1表示crypt(3)加密,2表示
使用mysql password()函數(shù)加密,3表示md5加密,4表示
sha1加密
配置字段說(shuō)明
? auth 表示認(rèn)證
? account 驗(yàn)證賬號(hào)密碼正常使用
? required 表示認(rèn)證要通過(guò)
? pam_mysql.so模塊是默認(rèn)的相對(duì)路徑,是相對(duì)/lib64/security/路
徑而言,也可以寫絕對(duì)路徑;后面為給此模塊傳遞的參數(shù)
? user=vsftpd為登錄mysql的用戶
? passwd=magedu 登錄mysql的的密碼
? host=mysqlserver mysql服務(wù)器的主機(jī)名或ip地址
? db=vsftpd 指定連接msyql的數(shù)據(jù)庫(kù)名稱
? table=users 指定連接數(shù)據(jù)庫(kù)中的表名
? usercolumn=name 當(dāng)做用戶名的字段
? passwdcolumn=password 當(dāng)做用戶名字段的密碼
? crypt=2 密碼的加密方式為mysql password()函數(shù)加密
2.建立相應(yīng)用戶和修改vsftpd配置文件,使其適應(yīng)mysql認(rèn)證
建立虛擬用戶映射的系統(tǒng)用戶及對(duì)應(yīng)的目錄
useradd -s /sbin/nologin -d /var/ftproot vuser
chmod 555 /var/ftproot centos7 需除去ftp根目錄的寫權(quán)限
mkdir /var/ftproot/{upload,pub}
setfacl –m u:vuser:rwx /var/ftproot/upload
確保/etc/vsftpd.conf中已經(jīng)啟用了以下選項(xiàng)
anonymous_enable=YES
添加下面兩項(xiàng)
guest_enable=YES
guest_username=vuser
修改下面一項(xiàng),原系統(tǒng)用戶無(wú)法登錄
pam_service_name=vsftpd.mysql
四、啟動(dòng)vsftpd服務(wù)
service vsftpd start;systemctl start vsftpd
chkconfig vsftpd on;systemctl enable vsftpd
查看端口開(kāi)啟情況
netstat -tnlp |grep :21
五、Selinux相關(guān)設(shè)置:在FTP服務(wù)器上執(zhí)行
? 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/
六、測(cè)試:利用FTP客戶端工具,以虛擬用戶登錄驗(yàn)證結(jié)果
? tail /var/log/secure
七、在FTP服務(wù)器上配置虛擬用戶具有不同的訪問(wèn)權(quán)限
vsftpd可以在配置文件目錄中為每個(gè)用戶提供單獨(dú)的配置文件以定義其ftp服務(wù)訪問(wèn)權(quán)限,每個(gè)虛擬用戶的配置文件名同虛擬用戶的用戶名。配置文件目錄可以是任意未使用目錄,只需要在vsftpd.conf指定其路徑及名稱即可
? 1、配置vsftpd為虛擬用戶使用配置文件目錄
vim /etc/vsftpd/vsftpd.conf
添加如下選項(xiàng)
user_config_dir=/etc/vsftpd/vusers_config
? 2、創(chuàng)建所需要目錄,并為虛擬用戶提供配置文件
mkdir /etc/vsftpd/vusers_config/
cd /etc/vsftpd/vusers_config/
touch wang mage
? 3、配置虛擬用戶的訪問(wèn)權(quán)限
虛擬用戶對(duì)vsftpd服務(wù)的訪問(wèn)權(quán)限是通過(guò)匿名用戶的相關(guān)
指令進(jìn)行的。如果需要讓用戶wang具有上傳文件的權(quán)限,可以修改/etc/vsftpd/vusers_config/wang文件,在里面添加如下
選項(xiàng)并設(shè)置為YES即可,只讀則設(shè)為NO
注意:需確保對(duì)應(yīng)的映射用戶對(duì)于文件系統(tǒng)有寫權(quán)限
anon_upload_enable={YES|NO}
anon_mkdir_write_enable={YES|NO}
anon_other_write_enable={YES|NO}
10.Ftp工具
? Axel:網(wǎng)絡(luò)客戶端工具
下載安裝axel
ftp://172.16.0.1/pub/Sources/6.x86_64/axel/axel-
2.4-1.el6.rf.x86_64.rpm
? axel -n 3 -o /root
ftp://172.16.0.1/pub/ISOs/CentOS-7-x86_64-
Everything-1511.iso
Paste_Image.png
time axel -n 3 ftp://172.18.25..238/pub/f1 測(cè)試下載速度
wget