1. 程式人生 > >vsftpd+pam_ihosts.so實現虛擬用戶權限控制

vsftpd+pam_ihosts.so實現虛擬用戶權限控制

ftp port vsftpd pasv ihosts

一、基礎介紹

1.vsftpd運行模式分為standalone和xinetd模式,現在生產環境中,絕大多數均采用standalone模式。

  • vsftpd一啟動,standalone模式中進程會一直駐留在內存中,當接收到21端口的請求時vsftpd進程會fork出一個子進程去處理連接,而原進程繼續監聽21端口。另更加便於PAM驗證的應用(可通過pam_ihosts.so實現單一IP、單一用戶的限制)。

  • xinetd模式的話默認是xinetd進程監聽21端口,當網卡收到外部連接請求時,xinetd進程會去調用ftp進程,並將21端口收到數據轉交給vsftpd進程處理(連接處理完畢後,vsftpd進程會自動退出),而xinetd則繼續監聽21端口(另支持單一IP限制)


既然vstandlone的模式這麽好,那麽該怎麽配置呢

1)首先禁用xinetd進程中的vsftpd,並重啟xinetd服務

# grep ‘disable‘ /etc/xinetd.d/vsftpd
        disable                 = yes

2)把vsftpd配置文件中的 listen 參數置為 YES

# grep ‘^listen‘ /etc/vsftpd/vsftpd.conf
listen=YES


2.vsftpd工作模式分主動(PORT)及被動(PASV)2 種,centos及windows等常見系統默認一般采用被動模式連接ftp server,所以搭建vsftpd時,推薦使用被動模式。如果需啟用防火墻,可以在FTP SERVER上限制被動模式數據端口範圍並放行即可。下面我們來看看這兩種模式的區別。

  • PORT模式(FTP服務器主動去連接客戶端的數據端口): 服務器端口固定,命令端口21,數據端口20。客戶端從任意特權限端口N(N>1024)發起請求連接服務器命令端口21,並監聽本機的 N+1端口,並發送FTP命令(port N+1)到服務器,FTP服務器會從自己的數據端口(默認20)主動連接客戶端的N+1端口,這樣就完成了數據傳輸通道建立了。

  • PASV模式(FTP服務器數據端口被動的等待客戶來連接):客戶端打開2個任意特權端口(N>1024,N+1),並從端口N發起一個連接,PASV模式執行PASV命令,並授權服務器連接它的數據端口,即N+1。FTP服務器會開啟一個任意的非特權端口P(如果vsftpd.conf沒有限制端口範圍),並向客戶端發送PORT P 命令。然後等待客戶通過 N+1 來連接端口P建立數據傳輸通道。

參考文檔:https://www.cnblogs.com/kuliuheng/p/3209744.html


二、vsftpd安裝配置

1.安裝

# wget  http://mirror.centos.org/centos/7/os/x86_64/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm
# rpm -ivh vsftpd-3.0.2-22.el7.x86_64.rpm


2.參數如下,具體配置根據業務需求定義

常用參數:
local_umask=022  本地用戶上傳文件後的默認權限(umask是unix系統的概念,新建的目錄權限為755,文件644)
anon_umask=077      匿名用戶的umask值,默認為077,及目錄權限是700,文件是 600
anonymous_enable=NO    禁止匿名訪問
listen=YES             運行於standalone mode
local_enable=YES    任何非匿名用戶(包含本地及虛擬用戶)都需啟用此參數
max_clients=100  #FTP服務器最大承載用戶數
max_per_ip=4     # 限制一個用戶最多連接數為4
local_max_rate=512000    # 限制本地下載帶寬不能超過500KB
anon_max_rate                    限制匿名用戶的下載帶寬,單位是bytes/s
accept_timeout=60  #超時,以秒計,用於遠程客戶端以PASV模式建立數據連接
connect_timeout=60     #超時,以秒計,用於遠程客戶端以PORT模式建立數據連接
connect_from_port_20=YES    # 控制端口數據走端口20,如果是被動模式,需把此參數改為NO
listen_port=8080    #更改監聽端口8080, 默認是21
#anon_upload_enable=YES    允許匿名用戶上傳文件,默認禁止
#anon_mkdir_write_enable=YES    允許匿名用戶創建目錄,默認禁止
user_config_dir=/etc/vsftpd/vsftpd_user_conf    創建虛擬用戶存儲文件
virtual_use_local_privs=NO    虛擬用戶權限與匿名用戶權限相同,虛擬用戶權限單獨設定
chroot_local_user=YES     將所有用戶鎖定在主目錄(vsftpd如果啟用chroot,默認必須保證ftp根目錄不可寫,chmod a-w /vsftp/chenss/)
chroot_list_enable=YES    啟動鎖定用戶的名單(NO或註釋為禁用),如果為NO,只鎖定chroot_list中限制用戶,YES則表明將所有用戶鎖定在主目錄,而chroot_list中的用戶不鎖定
chroot_list_file=/etc/vsftpd/chroot_list    鎖定用戶名單列表
allow_writeable_chroot=YES                默認為NO,當啟用chroot並配置些參數為YES後,虛擬用戶將具備對其根目錄寫權限
dirmessage_enable=YES       #用戶切換進入目錄時顯示.message(如果存在)文件的內容

權限參數
userlist_deny        如果userlist_enable為YES則檢查此項(默認YES)
userlist_enable      當值為YES時,如果userlist_deny為YES則禁用/etc/vsftpd/user_list文件中賬號,在輸入密碼之前就提示權限拒絕。如果userlist_deny=NO,則代表僅允許此文件中的賬號登陸

虛擬賬號參數:
pam_service_name=vsftpd    PAM認證文件名。PAM將根據/etc/pam.d/vsftpd進行認證
guest_enable=YES    啟用虛擬用戶功能
guest_username=vsftpd    指定虛擬用戶(無需是系統用戶)的宿主用戶,虛擬用戶從此賬號繼承權限
user_config_dir=/etc/vsftpd/vsftpd_user_conf    設定虛擬用戶個人vsftp的文件存放路徑(配置文件名=虛擬用戶名)
anon_upload_enable         如果設置為YES,匿名用戶將可以在特定條件下上傳文件,此參數必須激活write_enable,而且ftp用戶必須具備對上傳目錄的寫權限,虛擬用戶默認為被匿名處理,因此也需啟用此參數
anon_mkdir_write_enable  如果設置為YES,匿名用戶將可以創建目錄,條件同anon_upload_enable
write_enable          建議主配置文件中不啟用此參數,在虛擬用戶配置中開啟。允許或禁止任意形式的FTP命令寫入

詳細配置參數請參考:https://security.appspot.com/vsftpd/vsftpd_conf.html


被動模式參考配置:

anonymous_enable=NO
local_enable=YES
write_enable=NO
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=NO
xferlog_std_format=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
userlist_deny=YES
tcp_wrappers=YES
guest_enable=YES
guest_username=ftp
user_config_dir=/etc/vsftpd/vsftpd_user_conf
vsftpd_log_file=/var/log/vsftpd.log
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30010


3.虛擬賬號創建

1)創建用戶密碼文本

# cat /etc/vsftpd/logins.txt    # 奇數行是賬號,偶數行是密碼
chenss
abcdefg
test
123456

2)生成虛擬用戶認證文件

# db_load -T -t hash -f /etc/vsftpd/logins.txt /etc/vsftpd/vsftpd_login.db

備註:

  • -T 允許應用程序將文本轉譯載入數據庫

  • -t 指定載入的數據庫類型,使用hash碼加密

  • -f 指定賬號密碼文本文件

3)配置認證文件(註釋vsftpd原全部內容,再加以下2行)

# cat /etc/pam.d/vsftpd
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

備註:

  • auth是指對用戶的用戶名口令進行驗證。

  • accout是指對用戶的帳戶有哪些權限哪些限制進行驗證。

  • 再後面的/lib64/security/pam_userdb.so表示該條審核將調用pam_userdb.so這個庫函數進行。

  • 如果是32bit系統,該文件所在位置是/lib/security/pam_userdb.so

  • 如果是64bit系統,該文件所在位置是/lib64/security/pam_userdb.so

  • 最後db=/etc/vsftpd/login則指定了驗證庫函數將到這個指定的數據庫中調用數據進行驗證。其實該文件指的是/etc/vsftpd/login.db文件。註意:db=/etc/vsftpd/login格式是這樣的,去掉.db後綴。


4)創建虛擬用戶配置目錄和文件(虛擬用戶配置文件必須與用戶名一致)

# cat /etc/vsftpd/vsftpd_user_conf/chenss
local_root=/vsftp/chenss    # 虛擬用戶根目錄
guest_username=vsftp    #虛擬用戶的宿主用戶
file_open_mode=0400    # 文件權限
write_enable=YES    # 寫權限
anon_upload_enable=YES    # 上傳權限
anon_mkdir_write_enable=YES    # 創建文件夾權限
virtual_use_local_privs=YES      #虛擬用戶和本地用戶有相同的權限(即vsftpd用戶)
cmds_allowed=ABOR,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RETR,SIZE,STOR,TYPE,USER,HELP,STAT  #授權讀寫,禁止刪除

備註:cmds_allowed詳細信息請參考:http://dreamway.blog.51cto.com/1281816/1045610


5)創建虛擬用戶根目錄(test賬號同chenss)

[root@test2 ~]# mkdir -p /vsftp/chenss
[root@test2 ~]# chmod 500 /vsftp/chenss
[root@test2 ~]# chown -R vsftpd.vsftpd /vsftp/chenss

其實到了這裏,啟用vsftpd服務即可使用了


三、編譯pam_ihosts.so並加載入PAM認證

1.編譯

# git clone [email protected]:ColumPaget/pam_ihosts.git
# ./configure
# make
# make instal


2.授權chenss用戶只能能過192.168.1.10來訪問ftp:

# cat /etc/pam.d/vsftpd
account    required  /lib/security/pam_ihosts.so  user=chenss syslog allow-ip=192.168.1.10
auth    required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

pam_ihosts用法:https://github.com/ColumPaget/pam_ihosts


四、FTP數字代碼的意義(忘記在哪看到的,沒有鏈接,就直接貼代碼了)

110 重新啟動標記應答。
120 服務在多久時間內ready。
125 數據鏈路端口開啟,準備傳送。
150 文件狀態正常,開啟數據連接端口。
200 命令執行成功。
202 命令執行失敗。
211 系統狀態或是系統求助響應。
212 目錄的狀態。
213 文件的狀態。
214 求助的訊息。
215 名稱系統類型。
220 新的聯機服務ready。
221 服務的控制連接端口關閉,可以註銷。
225 數據連結開啟,但無傳輸動作。
226 關閉數據連接端口,請求的文件操作成功。
227 進入passive mode。
230 使用者登入。
250 請求的文件操作完成。
257 顯示目前的路徑名稱。
331 用戶名稱正確,需要密碼。
332 登入時需要賬號信息。
350 請求的操作需要進一部的命令。
421 無法提供服務,關閉控制連結。
425 無法開啟數據鏈路。
426 關閉聯機,終止傳輸。
450 請求的操作未執行。
451 命令終止:有本地的錯誤。
452 未執行命令:磁盤空間不足。
500 格式錯誤,無法識別命令。
501 參數語法錯誤。
502 命令執行失敗。
503 命令順序錯誤。
504 命令所接的參數不正確。
530 未登入。
532 儲存文件需要賬戶登入。
550 未執行請求的操作。
551 請求的命令終止,類型未知。
552 請求的文件終止,儲存位溢出。
553 未執行請求的的命令,名稱不正確。


本文出自 “吾言” 博客,請務必保留此出處http://wuyanc.blog.51cto.com/11569260/1980871

vsftpd+pam_ihosts.so實現虛擬用戶權限控制