一、 ftp服務,File Transfer Protocal 文件傳輸協議
1. ftp基于tcp協議,C/S架構
Server: wu-ftpd, proftpd ,pureftp,vsftpd:(Very Secure ftpd),IIS,ServU
Client:
GUI: flashfxp,cuteftp,filezilla(開源), gftp(Linux)
CLI:ftp, lftp,wget, lftpget
2. ftp的傳輸機制
1) 命令連接和數據傳輸連接
最開始,只建立命令連接,當執行get命令時,開啟另一端口建立文件傳輸連接,如果get多個文件,則建立多個連接。文件傳輸結束時,拆除相應的文件連接。
2) 數據連接的主動模式和被動模式
主動連接:通??蛻舳藭b有防火墻,不允許別人主動對客戶端發起連接
被動連接:可以通過服務器端連接追蹤機制來解決防火墻問題,無論訪問哪個端口,端口必須和已經建立的鏈接產生關系。
主動模式下: 服務器工作在20號端口
被動模式下: 服務器工作在隨機端口
3. 傳輸數據:
流式話數據: 可以存入硬盤
文本文件, 二進制文件 等
4. 用戶認證機制:
1) 系統用戶
2) 虛擬用戶。通常存放在文件或者數據庫中
hash file
mysql
3) 匿名用戶
5. 數據傳輸安全機制:
sftp :ssh提供基于ssh協議的ftp服務
ftps :基于ssl的ftp
7. 響應碼
1xx:信息碼
2xx:成功狀態嗎
3xx:進一步提示補全信息的狀態
4xx:客戶端錯誤
5xx:服務器端錯誤
二、 vsftpd 安裝和配置
1. 安裝vsftpd
# yum -y install vsftpd
2. 重要的目錄
/etc/pam.d/vsftpd 認證文件存放目錄 /etc/rc.d/init.d/vsftpd 服務腳本 /usr/sbin/vsftpd 主程序文件 /etc/vsftpd/vsftpd.conf 主配置文件 /etc/vsftpd/ftpusers 用戶黑名單 /etc/vsftpd/user_list 用戶限制名單 userlist_deny=NO 僅允許此名單用戶登錄,userlist_deny=YES 不允許用戶名單的用戶登錄 /var/ftp/pub 共享文件所在位置
3. 關于pam的認證文件
## 文件所在位置/etc/pam.d/vsftpd 關于認證文件 pam: Plugable Authentication Module: 插件式認證模塊 1) nsswitch: 名稱解析框架 模塊: /lib64/libnss* , /usr/lib64/libnss* 配置文件: /etc/nsswitch.conf 2) 用戶認證框架 模塊化:/lib64/security/pam*.so 配置文件:/etc/pam.conf 和 /etc/pam.d/*
4. chroot選項
## 對于ftp用戶訪問ftp服務時使用chroot禁錮用戶 ## 在主配置文件/etc/vsftpd/vsftpd.conf中配置啟動 chroot_local_user=YES 對于本地用戶使用chroot, 將會把其家目錄作為其root目錄 chroot_list_enable=YES chroot_list里面的用戶不受chroot影響 chroot_list_file=/etc/vsftpd/chroot_list 不受chroot指令的例外用戶列表,需要手動添加,每行一個用戶名。如果沒有這個文件鏈接會失敗
chroot開啟前效果
ftp登錄用戶可以進入系統根目錄
chroot開啟后效果
開啟后,用戶的家目錄被當做root了
5. 關于匿名用戶的配置
anonymous_enable=YES 允許匿名用戶登錄 anon_upload_enable=YES 允許匿名用戶上傳文件 anon_other_write_enable=YES 允許匿名用戶執行其他寫權限 anon_mkdir_write_enable=YES 允許匿名用戶創建文件夾 ## 此時的權限為ftp用戶配置的權限疊加文件本身權限總和的效果 ## 如果文件本身權限不允許其他用戶修改,基本vsftpd.conf配置了匿名用戶可修改,結果依然不能修改 ## 文件夾也一樣,如果想要允許匿名用于在pub上傳文件,需要將其other權限添加+w
6. vsftp 控制登錄用戶的機制
## /etc/vsftpd/ftpusers中的用戶都不允許使用ftp服務, 這是在/etc/pam.d/vsftpd中定義;/etc/pam.d/vsftpd 中應該有如下一行 auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
## /etc/vsftpd/user_list文件兩種配置方法 ## 黑名單: userlist_enable=YES userlist_deny=YES ## 白名單 userlist_enable=YES userlist_deny=NO
7. 鏈接限制
max_clients: 最大并發連接數 max_per_ip: 每IP可同時發起并發請求
8. 傳輸速率
anon_max_rate: 匿名用戶的最大傳輸速率,單位是“字節/秒” local_max_rate: 本地用戶最大傳輸速率, 單位是“字節/秒”
9. 匿名用戶上傳的文件自動轉換屬主和屬組
chown_uploads=YES chown_username=someuser ## 使用特定用戶作為上傳的文件的屬主,并使用其所在的組當做屬組
10. 上傳文件的umask
anno_umask: 匿名用戶上傳文件的umask; local_umask:
11. 歡迎信息
banner_file=/path/to/some_banner_file ftp_banner=some string dirmessage_enable=yes ## 需要在某ftp可訪問的目錄下創建.messages文件
12. 虛擬用戶: 所有虛擬用戶都會被映射為一個系統用戶, 訪問時文件目錄為此系統用戶的家目錄
虛擬用戶認證機制: hash編碼的文件,奇數行為用戶名,偶數行尾秘密
關系型數據庫: pam-mysql第三方模塊認證
三、 詳解配置虛擬用戶
1. 安裝mysql和pam_mysql(epel源提供)
# yum -y install vsftpd mysql-server mysql-devel pam_mysql
2. 創建虛擬用戶賬號所映射的系統用戶
# useradd -s /sbin/nologin -d /var/ftproot vuser # chmod go+rx /var/ftproot
3. 在數據庫中添加虛擬用戶
mysql> create database vsftpd; mysql> grant select on vsftpd.* to vsftpd@192.168.98.128 identified by 'vsftpd'; mysql> flush privileges; mysql> insert into users(name,password) values('tom',password('tom')); mysql> insert into users(name,password) values('jerry',password('jerry'));
4. 配置pam認的配置文件
auth required /lib/security/pam_mysql.so user=vsftpd passwd=vsftpd host=192.168.98.128 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required /lib/security/pam_mysql.so user=vsftpd passwd=vsftpd host=192.168.98.128 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 ## 這里說明一下,host是vsftpd所在主機的主機地址,同時也是在mysql中被授權訪問的主機地址。vsftpd會通過借助pam訪問數據庫獲取數據。而vsftpd所在的主機為192.168.98.128,這里的host也是這個。 如果把vsftpd放在其他主機上與數據庫分開管理也是可以的。 ## crypt 加密方式 ## 0 明文 ## 1 Y ## 2 為mysql中的password()函數加密 ## 3 md5 ## 4 sha1
5. 配置vsftpd配置文件
## 主要添加下面三行 # vim /etc/vsftpd/vsfptd.conf guest_enable=YES ## 允許使用虛擬用戶 guest_username=vuser ## 虛擬用戶映射為vuser系統用戶 pam_service_name=vsftpd.mysql ## pam配置文件位置為/etc/pam.d/vsftpd.mysql ## 下面是一些vsftpd的基本選項 anonymous_enable=YES local_enable=YES write_enable=YES anon_upload_enable=NO anon_mkdir_write_enable=NO chroot_local_user=YES ## 另外每個虛擬用戶的單獨權限可以在 /etc/vsftpd/vuser/ 配置 例如: # vim /etc/vsftpd/vuser/tom 寫下一下幾行 anon_upload_enable=YES anon_mkdir_write_enable=YES
6. 重啟vsftpd服務,測試效果
# service vsftpd restart 在另一個臺主機上 # ftp 192.168.98.128 Connected to 192.168.98.128 (192.168.98.128). 220 (vsFTPd 2.2.2) Name (192.168.98.128:root): tom 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> 測試成功。
7. 常見的不能正常認證的錯誤
1) iptables 忘記關,selinux沒有disable :此時通常的錯誤是數據庫無法訪問
2) 虛擬用戶無法認證: 有可能是加密方式沒有設置統一
3) 數據庫沒法連接, 數據庫訪問的用戶和主機要和pam文件的用戶主機統一,一定要明確,是vsftpd借助pam訪問數據庫,而不是ftp客戶端訪問數據庫。我在這里被坑了好幾天。
原創文章,作者:以馬內利,如若轉載,請注明出處:http://www.www58058.com/4450