一澎嚣、FTP基礎
FTP(File Transfer Protocol击吱,文件傳輸協(xié)議)網(wǎng)上文章很多淋淀,我就不說了,重點說明下覆醇,使用FTP協(xié)議傳輸數(shù)據(jù)時朵纷,命令和數(shù)據(jù)是分開使用不同的端口傳輸?shù)模纾菏褂肍TP命令get(下載)一個文件永脓,get這個命令默認是通過TCP 21號端口號來傳遞的袍辞;而數(shù)據(jù)請求的傳遞,則通過其他端口來完成常摧。這個用于傳遞數(shù)據(jù)的端口搅吁,是通過兩種工作模式來定義的,不同的工作模式落午,數(shù)據(jù)傳輸?shù)亩丝谑怯袇^(qū)別的谎懦;但是~命令的傳輸端口是不會變化的,默認是21溃斋。下面來說說FTP兩種工作模式界拦。
二、FTP的工作模式
FTP的工作模式有兩種梗劫,有主動連接和被動連接;所謂主動或被動這是相對于服務器來講的
第一個:主動模式(POST)
在這個模式下享甸,F(xiàn)TP客戶端會通過2個端口來完成此次FTP任務;
第一個端口在跳,用于連接FTP服務端的21端口枪萄,一般會任意選擇一個高端口,如40001猫妙。第二個端口FTP客戶端也會監(jiān)聽40002端口(40001+1)瓷翻,默認是用于傳輸命令的端口+1,如果該端口剛好被占用,則再+1齐帚,如此類推妒牙,這個端口是用于和服務端進行數(shù)據(jù)傳輸?shù)摹K对妄,現(xiàn)在兩個端口都準備妥當了湘今,接下來,客戶端發(fā)送POST請求剪菱,該請求攜帶自己正在監(jiān)聽的40002端口摩瞎,服務端收到POST請求后,會使用本地20號端口孝常,主動去連接客戶端的40002端口旗们,最后客戶端返回確定。
主動模式的缺點在于构灸,不容易連接到客戶端的端口上上渴,默認大多數(shù)的客戶端防火墻是禁止外部主機隨意訪問的,所以出現(xiàn)了被動模式喜颁。
第二個:被動模式(PASV)
在被動模式中稠氮,命令的傳輸和數(shù)據(jù)的傳輸連接都是由客戶端發(fā)起的,這樣就可以避免客戶端的防火墻拒絕了半开,畢竟用戶可能并不知道防火墻是干嘛用的隔披。
客戶端使用任意高端口(如40001)發(fā)起一個PSAV請求給服務端,服務端收到后稿茉,返回一個用于傳輸數(shù)據(jù)的端口锹锰,如(5678)給客戶端,客戶端收到后漓库,再使用本地任意端口號再去連接服務器端的5678端口恃慧,最后服務返回確認信息。
三渺蒿、VSFTPD服務
簡介
VSFTPD服務網(wǎng)上教程也很多痢士,本地賬戶認證和匿名認證就不細說了,主要說說MYSQL+PAM+VSFTP的虛擬用戶認證實現(xiàn)
實驗環(huán)境:Centos7_X64
-
VSFTPD服務基礎
安裝vsftpd:[root@test2 ~]# yum install -y vsftpd
VSFTPD程序環(huán)境:
主程序:/usr/sbin/vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
數(shù)據(jù)根目錄:/var/ftp
Systemd Unit File: /usr/lib/systemd/system/vsftpd.service
- 配置VSFTPD
VFTPD的用戶類別:
VSFTPD的用戶類別分為兩類茂装,一類是本地用戶怠蹂,一類是虛擬用戶;
本地用戶可以是本地的系統(tǒng)用戶和普通用戶少态,匿名用戶也是系統(tǒng)用戶城侧,匿名用戶映射到本地系統(tǒng)用戶叫ftp;默認登陸ftp后彼妻,所處位置是賬戶對應的家目錄嫌佑,由于ftp用戶的家目錄在/var/ftp豆茫,所以匿名用戶登陸后,默認的所處位置則在/var/ftp屋摇;默認可以自己有權限訪問的所有路徑間切換揩魂,所以如果使用本地賬戶登陸ftp,如果全選允許,是可以切換到其他目錄上的炮温,如/etc火脉,為了安全,應該禁錮用戶于其家目錄中柒啤。
VSFTPD的配置文件
主配置文件是/etc/vsftpd/vsftpd.conf倦挂,配置格式為:
指令 值
,注意指令前面不能有多余字符白修;
配置詳細說明能通過man vsftpd.conf
來查看妒峦。
命令分類:
系統(tǒng)用戶命名作用于能通過本地登陸的用戶,而匿名用戶命令作用與虛擬用戶和匿名用戶
針對匿名用戶的配置:
anonymous_enable=YES #是否開啟匿名用戶
anon_upload_enable=YES #是否運行匿名用戶上傳文件
anon_mkdir_write_enable=YES #是否允許匿名用戶mkdir文件夾
anon_other_write_enable=YES #是否運行匿名用戶創(chuàng)建或刪除文件
anon_umask=077 #匿名用戶創(chuàng)建的文件umask
針對系統(tǒng)用戶的配置:
local_enable=YES #是否開啟本地用戶登陸
write_enable=YES #是否允許寫入操作
local_umask=022 #創(chuàng)建文件的默認權限
其他配置:
上傳下載速率限制:
anon_max_rate=0 #限制匿名用戶的速率兵睛,0為不限制
local_max_rate=0 #限制本地用戶的速率,0為不限制
并發(fā)連接數(shù)限制:
max_clients=2000 #最大能并發(fā)多少個連接
max_per_ip=50 #單個IP最大的連接數(shù)窥浪,即一個主機最大能建立多少個連接
控制可登錄vsftpd服務的用戶列表
userlist_enable=YES #啟用/etc/vsftpd/user_list文件來控制可登錄用戶
userlist_deny=YES|NO #YES即黑名單祖很,NO即白名單
輔助配置文件
/etc/vsftpd/ftpusers #列在此文件中的用戶 均禁止使用ftp服務
禁錮用戶于其家目錄中
chroot_local_user=YES #禁錮所有本地用戶 于其家目錄;需要事先去除用戶對家目錄的寫權限漾脂;
也可以寫一個文件假颇,只對文件中的用戶做禁錮
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list #禁錮列表中文件存在的用戶于其家目錄中;需要事先去除用戶對家目錄的寫權限骨稿;
傳輸日志(不常用):
xferlog_enable=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
- PAM模塊簡單介紹
簡介:
PAM笨鸡,Pluggable Authentication Modules,可插拔認證模塊坦冠,是一套共享庫形耗,如果編寫應用時,需要用到身份驗證功能時辙浑,可以選擇自己寫認證功能激涤,又或者調(diào)用由PAM提供的公共庫,完成用戶驗證判呕,簡單來說倦踢,程序員可以調(diào)用PAM模塊實現(xiàn)用戶驗證功能,而不用自己重新編寫侠草,這種方式下,就算升級本地認證機制,也不用修改程序.PAM使用配置/etc/pam.d/下的文件來管理對程序的認證方式辱挥,程序員只要在對應目錄下創(chuàng)建對應的配置文件,就可以調(diào)用本地的認證模塊.模塊放置在/lib/security下,以加載動態(tài)庫的形式進行边涕。包括系統(tǒng)登陸的程序login,su命令晤碘,也是調(diào)用了PAM模塊實現(xiàn)用戶驗證褂微。
VSFTPD的用戶身份驗證,也是由PAM模塊實現(xiàn)的哼蛆;在/etc/vsftpd/vsftpd.conf這個主配文件中蕊梧,有1條指令指指明vsftpd的PAM配置文件路徑的,如:pam_service_name=vsftpd
指明認證時候腮介,讀取/etc/pam.d/vsftpd
這個配置文件肥矢。配置文件內(nèi)容
[root@test2 ~]# cat /etc/pam.d/vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
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
實現(xiàn)vsftpd通過mysql數(shù)據(jù)庫來完成虛擬用戶登陸,只需要配置pam能夠支持數(shù)據(jù)庫驗證就可以了叠洗,默認pam是不支持的甘改,可以通過安裝一個第三方模塊:pam_mysql
,使得pam能夠通過mysql是完成用戶驗證灭抑。
VSFTPD+PAM+MYSQL實現(xiàn)步驟:
-
安裝所需要程序mysql和pam_mysql
安裝mysql
[root@test2 ~]# yum install mariadb-server //配置mysql十艾,新建一個用戶vsftpd,和一個數(shù)據(jù)庫vsftpd [root@test2 ~]# systemctl restart mariadb [root@test2 ~]# mysql MariaDB [(none)]> CREATE DATABASE vsftp; MariaDB [(none)]> GRANT SELECT ON vsftp.* TO 'vsftp'@'localhost' IDENTIFIED BY '523569'; //給定SELECT權限 //創(chuàng)建一個用于保存用戶密碼的表 MariaDB [vsftp]> CREATE TABLE user(id INT NOT NULL AUTO_INCREMENT,name CHAR(30) NOT NULL,password CHAR(48) NOT NULL,PRIMARY KEY(id));
//查看表結(jié)構
MariaDB [vsftp]> DESC user;
+----------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(30) | NO | | NULL | |
| password | char(48) | NO | | NULL | |
+----------+----------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
//添加2個測試的虛擬用戶腾节,根據(jù)需要添加所需要的用戶忘嫉,需要說明的是,這里將其密碼為了安全起見應該使用PASSWORD函數(shù)加密后存儲案腺。
MariaDB [vsftp]> INSERT INTO user(name,password)VALUES('tom',password('523569'));
MariaDB [vsftp]> INSERT INTO user(name,password)VALUES('sun',password('523569'));
至此庆冕,MYSQL配置完成,接下來劈榨,則
-
安裝pam_mysql模塊
下載pam_mysql模塊访递,地址:http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
[root@test2 ~]# tar -xf pam_mysql-0.7RC1.tar.gz //解壓
[root@test2 ~]# cd pam_mysql-0.7RC1
[root@test2 pam_mysql-0.7RC1]# ./configure --help //可以查看安裝幫助
重點以下幾項:
--with-mysql=PREFIX specify MySQL installation prefix
//指定mysql的安裝路徑,我是通過yum安裝的同辣,所以默認是在/usr下
--with-pam=PREFIX specify PAM installation prefix
//默認也在/usr下
--with-pam-mods-dir=DIR specify PAM module installation path
//指定PAM模塊安裝的位置拷姿,默認在/usr/lib64/security
#下面開始安裝pam_mysql
在開始安裝之前,需要安裝2個開發(fā)包旱函。
[root@test2 pam_mysql-0.7RC1]# yum install mariadb-devel pam-devel
//pam.mysql編譯需要依賴到這2個包
./configure安裝配置如下:
[root@test2 pam_mysql-0.7RC1]# ./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/usr/lib64/security/
[root@test2 pam_mysql-0.7RC1]# make && make install
[root@test2 pam_mysql-0.7RC1]# ls /usr/lib64/security/pam_mysql.so #安裝成功后响巢,可以看到該模塊
3. **配置VSFTPD**
1.建立pam認證配置文件,寫入配置內(nèi)容
[root@test2 pam_mysql-0.7RC1]# vim /etc/pam.d/vsftpd_vuse
auth required /lib/security/pam_mysql.so user=vsftp passwd=523569 host=localhost db=vsftp table=user usercolumn=name passwdcolumn=password crypt=2
account required /lib/security/pam_mysql.so user=vsftp passwd=523569 host=localhost db=vsftp table=user usercolumn=name passwdcolumn=password crypt=2
注意:由于mysql的安裝方式不同,pam_mysql.so基于unix sock連接mysql服務器時可能會出問題陡舅,此時抵乓,建議授權一個可遠程連接的mysql并訪問vsftpd數(shù)據(jù)庫的用戶。
2.修改vsftpd配置靶衍,配置PAM認證文件為我們新建的PAM配置文件:vsftpd_vuse灾炭。
添加以下選項
guest_enable=YES #虛擬用戶需要啟用來賓賬戶并映射到一個本地用戶
guest_username=vuser #虛擬賬戶映射到的本地用戶
請確保/etc/vsftpd.conf中已經(jīng)啟用了以下選項
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
chroot_local_user=YES
配置好后,新建對應用戶颅眶,并把家目錄指定為/var/vsftpd蜈出。
[root@test2 pam_mysql-0.7RC1]# useradd -d /var/vsftpd vuser
重啟服務
[root@test2 pam_mysql-0.7RC1]# systemctl restart vsftpd
為了不影響實驗,關閉防火墻和關閉SELINUX:
[root@test2 pam_mysql-0.7RC1]# systemctl stop firewalld
[root@test2 pam_mysql-0.7RC1]# setenforce 0
修改文件夾權限:
chmod go+rx /var/ftproot
驗證
[root@test2 pam_mysql-0.7RC1]# ftp localhost
Name (localhost:root): tom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
4. 配置虛擬用戶具有不同的訪問權限
vsftpd可以在配置文件目錄中為每個用戶提供單獨的配置文件以定義其ftp服務訪問權限涛酗,每個虛擬用戶的配置文件名同虛擬用戶的用戶名铡原。配置文件目錄可以是任意未使用目錄偷厦,只需要在vsftpd.conf指定其路徑及名稱即可。虛擬用戶的配置命令和匿名用戶命令是一樣的
```
1燕刻、為虛擬用戶定義配置文件目錄
[root@test2 pam_mysql-0.7RC1]# vim /etc/vsftpd/vsftpd.conf user_config_dir=/etc/vsftpd/vuser_config
2只泼、創(chuàng)建所需要目錄,并為虛擬用戶提供配置文件
[root@test2 pam_mysql-0.7RC1]# mkdir /etc/vsftpd/vuser_config
//創(chuàng)建與用戶同名的配置文件
[root@test2 pam_mysql-0.7RC1]# vim /etc/vsftpd/vuser_config/tom
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
//tom用戶擁有上傳卵洗,刪除请唱,新建文件夾操作
```