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

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,密碼為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
下一篇 2017-01-07

相關推薦

  • 進程管理,計劃任務(2)

    二、作業管理     Linux的作業控制         前臺作業:通過終端啟動,且啟動后一直占據終端;         后臺作業:可通過終端啟動,但啟動后即…

    Linux干貨 2016-09-18
  • M20 – 1- 第二周(1):課堂練習與作業

    課堂練習:  1、字符終端登錄時,顯示當前登錄終端號,主機名和當前時間 [root@centos6 ~]# tty             #顯示當前終端號 /dev/pts/0 [root@cent…

    Linux干貨 2016-08-02
  • vim編輯器的用法

    vim編輯器的用法 1、vi的基本概念     vi可以分為三種模式,分別是命令模式(command mode)、輸入模式(Insert mode)和末行模式(last line mode),各模式的功能如下:     1) 命令行模式command mode)         …

    Linux干貨 2015-09-14
  • 條件測試與基礎運算

    變量類型: 整形 數值型 字符型 byte boolen 單精度 雙精度 變量種類: 環境變量– 對所有進程有效 本地變量– 僅對當前shell有效 局部變量– 僅在函數中的某一段有效 位置變量– $1,$2,$3,$4 特殊變量– $?,$0,$*,$@,$#,$$ 變量命名法則: 1.不能出現程…

    Linux干貨 2017-04-16
  • Linux文件系統

    文件是什么?存儲空間內存儲的有邊界的一段流式數據,對數據可以做到按名存取。眾多文件是如何有效的組織起來?1.  平面化把眾多文件放在一起。當想查找某個文件時,需要遍歷所有文件,當文件數目足夠多的時候,查找一個文件將會非常慢,效率極低。2.  層級結構化根據后續查找文件的篩選條件進行分類,逐層放置,通常要查找一個文件,只需要從最高層級開始,…

    2017-09-05
  • 硬鏈接和軟鏈接的區別

                        硬鏈接和軟鏈接的區別     硬鏈接: 1.創建命令:ln或link 2.同一文…

    Linux干貨 2016-12-05
欧美性久久久久