FTP簡介
在介紹vsftp相關內容前,簡單描述下FTP。FTP全稱File Transfer Protocol,文件傳輸協議。
它是一個C/S架構的協議,在Linux中其服務端實現主要有vsftpd,pureftpd,proftpd,Filezilla,本文主要介紹的是vsftp。客戶端實現主要是ftp和lftp兩種工具。
其工作方式:主要分為兩個層面的連接:命令連接和數據連接。通過ftp客戶端向服務端發送相關指令,然后服務器對客戶端的請求進行響應,這是命令連接。在數據連接層面則主要負責完成數據傳輸會話的建立,維持和斷開。
數據連接的工作模式又分為兩種類型:
-
主動模式(PORT)
服務器向客戶端發起數據傳輸請求,連接建立后開始傳輸數據。但是客戶端可能有防火墻設置,而不讓服務器主動向其端口發送連接請求,從而連接無法建立,數據傳輸失敗。在這種模式中服務器端使用tcp的20端口連接客戶端的端口,客戶端端口為命令連接發起端口+1的端口,依次往后找找,直到找到一個可用的端口。 -
被動模式(Passive)
客戶端向服務器發送數據傳輸請求,服務器側的端口半隨機選擇。在命令連接建立后的回復消息中,服務器會將數據連接要使用的端口以兩個數字的形式告訴客戶端,一般形為(123,221),客戶端通過公式:123*256+221得到31709,從而與服務器的31709端口建立數據連接開始傳輸數據。這一端口信息在Linux中通過ftp工具連接服務器時即可看到,形如:227 Entering Passive Mode (192,168,1,200,103,163)
,這里的服務器側的端口即為26531。
數據傳輸格式一般有ASCII和Binary兩種,但一般最好讓客戶端和服務端自協商確實,不要在客戶端強制設置,除非確定要傳輸的數據的格式,避免數據傳輸過程中出現亂碼。
FTP的用戶類型
FTP是給不同的用戶提供文件傳輸服務的,每一個或每一類用戶都可以設置不同的權限,他們的資源默認也都存儲在他們各自的家目錄中。FTP的用戶分為以下三種類型:
-
匿名用戶
這類用戶在ftp上可以統稱為anonymous,只要FTP允許匿名登錄,在登錄時輸入用戶名:anonymous,提示輸入密碼時留空,然后即可登錄到FTP服務器上。FTP默認允許匿名用戶登錄。匿名用戶一般被映射至某固定的系統用戶,如ftp,其家目錄為/var/ftp,登錄后pwd顯示為/,非系統的根,而是指ftp資源的根。 -
本地用戶
本地用戶即是指/etc/passwd中存在的用戶。他們登錄系統以后會位于自己的家目錄中。默認情況下除了列于/etc/vsftpd/user_list中的用戶之外的本地用戶都可以登錄ftp。 -
虛擬用戶
虛擬用戶的用戶名不存在于/etc/passwd中,它的實現需要借助于pam_mysql這一模塊,讓vsftpd可以去mysql數據庫中讀取ftp用戶的信息(用戶名和密碼)。默認情況下虛擬用戶的權限等同于匿名用戶。
vsftp的安裝(CentOS 7)
-
vsftp安裝前準備
-
關閉系統防火墻:(不關閉的話,若懂得如何放行ftp通信也完全可以_)
systemctl stop firewalld.service
systemctl disable firewalld.service
#關閉防火墻開機自啟 -
確認SELinux的狀態
getenforce
,非enforcing即可。setenforce 0
#立即關閉SELinux,重啟失效 -
安裝vsftp
yum -y install vsftpd
-
檢查安裝結果
rpm -ql vsftpd
列出vsftpd包安裝后系統中生成的文件,包含文件的執行程序(如/usr/sbin/vsftpd),配置文件(如/etc/vsftpd/vsftpd.conf),參考手冊,還有用于匿名用戶訪問的/var/ftp及/var/ftp/pub目錄等。systemctl start vsftpd.service
啟動vsftpd服務ss -tnlp
查看21端口是否處于監聽狀態,且占用進程為vsftpd。 -
驗證匿名用戶是否可登錄
使用ftp
或者lftp
指令匿名登錄,ftp
工具在(ftp127.0.0.1)后出現提示詢問用戶名時輸入:anonymous,密碼留空即可。lftp
工具指令( lftp -u anonymous, 127.0.0.1)即不用單獨在輸入用戶名和密碼。
借助pam_mysql實現虛擬用戶機制
ftp的虛擬用戶機制實際是指給不同的用戶創建不同的用戶名,他們有各自的密碼,但這些用戶名統一映射為一個自定義的虛擬用戶,這個虛擬用戶實際存在于/etc/passwd中但無需配置密碼,針對這些不同的用戶的認證都借助于存儲在mysql數據庫中的用戶名和密碼來實現。具體實現步驟如下:
-
先下載pam_mysql源碼安裝包
pam_mysql-0.7RC1.tar.gz
常用搜索引擎即可找到其下載頁面。 -
準備編譯安裝的環境
yum groupinstall "Development Tools" "Server Platform Development"
#這些是系統全局編譯需要安裝的包yum -y install mariadb-server mariadb-devel openssl-devel pam-devel
#這些是編譯pam_mysql源碼依賴的包 -
在mariadb中創建用于存儲虛擬用戶賬戶的數據庫及表
systemctl status mariadb.service
#啟用mariadb server服務systemctl enable mariadb.service
#設置mariadb server開機自啟create database vsftpd;
#創建名為vsftpd的數據庫use vsftpd
#切換到vsftpd數據庫中create table users ( id int AUTO_INCREMENT NOT NULL PRIMARY KEY,
name char(30) NOT NULL, password char(48) binary NOT NULL );
#指定表的內容包含id(整形數字,自動遞增,不能為空,設為主鍵),name(長度不超過30且不區分大小寫,非空字符),password(長度不超過48的區分大小寫的非空字符)。創建完成后可使用如下指令,查看表的結構:
desc users;
-
在表中創建若干虛擬用戶
INSERT INTO users(name,password) VALUES ('tom',password('mageedu'))
#添加用戶tom,密碼為mageeduINSERT INTO users(name,password) VALUES ('jerry',password('mageedu.com'));
#添加用戶jerry,密碼為mageedu.comselect * from users;
#查看表中的所有信息GRANT select ON vsftpd.* TO vsftpd@'localhost' IDENTIFIED BY 'mageedu';
#授權“vsftpd@localhost”,可以使用密碼mageedu訪問數據庫vsftpd的所有表GRANT select ON vsftpd.* TO vsftpd@'127.0.0.1' IDENTIFIED BY 'mageedu';
#授權“vsftpd@127.0.0.1”,可以使用密碼mageedu訪問數據庫vsftpd的所有表flush privileges;
#刷新mariadb的權限表
然后使用剛授權的vsftpd用戶直接在mariadb上登錄,然后查看users表的內容,以確認mariadb部分的配置無誤。 -
編譯安裝pam_mysql模塊
這里是源碼安裝的通用三步,只是在configure時需要指定一些選項,以便編譯成功。./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security
make && make install
編譯安裝成功后會在/lib64/security
中生成pam_mysql.so
和pam_mysql.la
文件。 -
在系統中創建用于虛擬用戶映射的用戶
useradd -s /sbin/nologin -d /ftproot vuser
#創建一個名為vuser的用戶,并指定其shell為nologin,家目錄為/ftproot,這樣所有的虛擬用戶登錄ftp后系統中都將其映射為vuser這一用戶,初始都位于/ftproot目錄中。 -
去掉剛創建的用戶家目錄的寫權限
chmod -w /ftproot
#如果不做這一步后面在登錄ftp時會出現如下錯誤提示:500 OOPS: vsftpd: refusing to run with writable root inside chroot()
#去掉相應用戶家目錄的寫權限即可。 -
創建pam_mysql的配置文件
這一文件的目的是告訴vsftp在驗證用戶信息時使用pam_mysql
模塊去mariadb數據庫中查找用戶信息以及查找方法。
這一配置文件需要新建,它應放置于/etc/pam.d/
目錄下,直接vim vsftpd.mysql
在文件中放置如下兩行內容,注意把以下內容放到兩行:auth required /usr/lib64/security/pam_mysql.so user=vsftpd
passwd=mageedu host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2account required /usr/lib64/security/pam_mysql.so user=vsftpd
passwd=mageedu host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2auth
開頭的是一行,它表示認證需要使用后面的內容,/usr/lib64/security/pam_mysql.so
指定pam_mysql.so文件的位置;通過user
和passwd
兩項指定連接數據庫的用戶名和密碼;host
指定連接數據庫的主機,localhost即表示本機之意;db
和table
一起指定去哪個數據庫哪個表中查找用戶信息,usercolumn
和passwdcolumn
指定表中哪列數據對應用戶名,哪列數據對應密碼;crypt
指明表中密碼的加密方式,2
表示使用的mysql自帶的password函數加密的。account
開頭的是另一行,它和auth一起完成用戶的認證和審計工作。 -
在vsftpd中啟用基于pam_mysql的虛擬用戶機制
在vsftpd默認的配置文件/etc/vsftpd/vsftpd.conf
中增加如下內容:guest_enable=YES
#允許此項,所有非匿名用戶都被視作來賓,來賓用戶被重新映射為一個guest usernameguest_username=vuser
#指定guest username的名稱,之前我們已新建了vuser,用來將所有虛擬用戶映射成為vuserpam_service_name=vsftpd.mysql
#指定vsftp要使用哪種類型的pam服務,此前我們已安裝和建立了名為vsftpd.mysql的服務類型systemctl restart vsftpd.service
#修改了服務配置文件后重啟服務,以使改動生效。
修改服務配置文件前先做好備份,任何配置錯誤都將導致服務重啟失敗
實現不同用戶使用不同的配置文件
在vsftp中支持給不同的用戶使用不同的配置文件,從而實現不同的用戶具有不同的權限,如有的用戶能上傳,有的用戶不能上傳,特別是在使用虛擬用戶時,雖然它們都映射成同一賬戶但依然支持使用基于用戶的配置文件。
實現方式:
-
全局啟用針對用戶配置目錄的配置
在/etc/vsftpd/vsftpd.conf
中加入如下一項:user_config_dir=/etc/vsftpd/users.conf.d/
#將所有需要特別定制的用戶配置文件放置于此目錄中,若某用戶在此目錄中沒有針對他的配置文件,則使用全局配置,有則相應配置文件中的條目最終生效。 -
創建針對用戶的配置文件
在/etc/vsftpd/users.conf.d/
目錄中創建和虛擬用戶名一致的配置文件,vim username
,按全局配置文件的格式將相應的指令添加進去,如全局啟用了anon_upload_enable=YES
但不想某用戶具備上傳的權限則可以在文件中直接寫上anon_upload_enable=NO
然后保存退出。
最后重新啟動vsftpd服務,登錄驗證是否符合需求即可。
原創文章,作者:N24_lantian,如若轉載,請注明出處:http://www.www58058.com/66062