在vsftp中實現基于pam_mysql的虛擬用戶機制

FTP簡介

在介紹vsftp相關內容前,簡單描述下FTP。FTP全稱File Transfer Protocol,文件傳輸協議。
它是一個C/S架構的協議,在Linux中其服務端實現主要有vsftpd,pureftpd,proftpd,Filezilla,本文主要介紹的是vsftp??蛻舳藢崿F主要是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,密碼為mageedu
    INSERT INTO users(name,password) VALUES ('jerry',password('mageedu.com')); #添加用戶jerry,密碼為mageedu.com
    select * 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.sopam_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=2

    account required /usr/lib64/security/pam_mysql.so user=vsftpd
    passwd=mageedu host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

    auth開頭的是一行,它表示認證需要使用后面的內容,/usr/lib64/security/pam_mysql.so指定pam_mysql.so文件的位置;通過userpasswd兩項指定連接數據庫的用戶名和密碼;host指定連接數據庫的主機,localhost即表示本機之意;dbtable一起指定去哪個數據庫哪個表中查找用戶信息,usercolumnpasswdcolumn指定表中哪列數據對應用戶名,哪列數據對應密碼;crypt指明表中密碼的加密方式,2表示使用的mysql自帶的password函數加密的。
    account開頭的是另一行,它和auth一起完成用戶的認證和審計工作。

  • 在vsftpd中啟用基于pam_mysql的虛擬用戶機制
    在vsftpd默認的配置文件/etc/vsftpd/vsftpd.conf中增加如下內容:
    guest_enable=YES #允許此項,所有非匿名用戶都被視作來賓,來賓用戶被重新映射為一個guest username
    guest_username=vuser #指定guest username的名稱,之前我們已新建了vuser,用來將所有虛擬用戶映射成為vuser
    pam_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

(0)
N24_lantianN24_lantian
上一篇 2017-01-07 14:22
下一篇 2017-01-07 16:43

相關推薦

  • Linux文本處理工具

    Linux文本處理工具 文件內容查看的工具:cat tac rev cat?[options]?[filename] ????-E?//顯示行結束符 ????-n?//對顯示出的行編號 ????-A?//顯示所有控制符 ????-b?//非空行編號 ????-S?//壓縮連續的空行為一行 tac?//用于將文件已行為單位的反序輸出,即第一行最后顯示,最后一行…

    Linux干貨 2017-09-09
  • 抓包獲取QQ好友IP地址

    作者:網海過客 原文連接:https://www.chinasa.net/archives/326.html 原理:通過抓包軟件,抓取QQ進程,向QQ好向發送UDP數據包,獲取QQ好友IP地址 抓包軟件:科來網絡分析系統 步驟: 1、打開抓包軟件,選擇網卡,本地進程分析。 2、向QQ好友發起語音通話 3、在抓包軟件里,找到QQ進程,數據包,過濾UDP協議,在…

    Linux干貨 2017-06-30
  • Linux基礎知識之history命令詳解

     該博文以CentOS6.8_x86_64系統為基礎,Xshell 5遠程連接CentOS系統,以root身份登錄系統。 為什么要學習history命令?     history命令是Linux的一個內嵌的shell命令,history命令的使用有時會大大縮短我們輸入命令的時間,達到節省命令快捷操作的要求。學…

    Linux干貨 2016-07-27
  • Linux程序包管理之RPM

    Linux程序包管理之RPM RPM概念 rpm是什么 RPM 是Ret Hat Package Manager(RPM軟件包管理器)的縮寫,遵循GPL協議,可以運行在各種Linux上,公認的行業標準。 rpm干什么 對于終端用戶來說 簡化了Linux系統的安裝、卸裝、更新和升級的過程,用命令完成 對于開發者來說 RPM允許把軟件編碼包裝成源代碼和程序包提供…

    Linux干貨 2016-11-22
  • 設計模式(十一)代理模式Proxy(結構型)

    1.概述        因為某個對象消耗太多資源,而且你的代碼并不是每個邏輯路徑都需要此對象, 你曾有過延遲創建對象的想法嗎 ( if和else就是不同的兩條邏輯路徑) ? 你有想過限制訪問某個對象,也就是說,提供一組方法給普通用戶,特別方法給管理員用戶?以上兩種需求都非常類似,并且都需要解決一個更大的問題:你如何提供…

    Linux干貨 2015-07-09
  • 磁盤及文件系統管理

    Linux磁盤及文件系統: 磁盤:用于持久存放數據 常見的磁盤有:機械硬盤、固態硬盤 I/O Ports: I/O設備地址 常見的硬盤接口類型:      IDE(ata):并口,133MB/s     SCSI:并口,UltraSCSI320,320MB/s,UltraSCSI…

    Linux干貨 2016-08-26
欧美性久久久久