vsftpd

簡介

FTP,File Transfer Protocol,文件傳輸協議
文件服務器,具備存儲和共享文件(權限設置合理的情況下)的功能
命令端口:TCP/21
數據端口:TCP/20(主動模式)
明文傳輸指令與數據,解決辦法是SFTP(SSH)和FTPS(SSL/TLS)

實現

服務器端實現

Linux:vsftpd, pureftpd, proftpd
Windows:Filezilla Server, Serv-U, ...

客戶端實現

Linux:ftp, lftp, ...
Windows:cuteftp, Filezilla, Flashfxp, ...

連接模式

FTP協議是一種古老的協議,比較特別。一般的協議,客戶端和服務器端之間只需要一條連接即可,但是FTP需要兩條,一條是命令連接,用於傳輸FTP命令;另外一條是數據連接,用於傳輸上傳下載的數據。
命令連接爲客戶端啓用一個隨機端口連接服務器端的21端口。
數據連接有主動模式和被動模式兩種。

主動模式

主動模式,positive,PORT

  1. 客戶端啓用一個高位隨機端口x去連接服務器的21端口建立命令連接。
  2. 命令連接建立完畢後,客戶端使用“PORT x+1”命令告訴服務器端客戶端在x+1號監聽數據連接。
  3. 服務器端使用20號端口去連接客戶端的x+1號端口建立數據連接。
  4. 客戶端通過數據連接向服務器端發送一個應答,表示數據連接建立成功開始傳輸數據。
    FTP主動模式

    缺陷:客戶端需要啓用一個數據連接監聽端口等待服務器端來連接,因此客戶端如果有防火牆的話,就需要對此端口進行放行。同時又由於端口號爲隨機的x+1號端口,因此在客戶端防火牆要放行一個隨機的端口就有一定的難度了!加之客戶端的用戶很多都是計算機小白用戶,一般不太懂的做這個設置,也不太情願。

被動模式

被動模式,passive,PASV
由於主動模式缺陷的存在,誕生了被動模式。

  1. 客戶端啓用一個高位隨機端口x去連接服務器的21端口建立命令連接。
  2. 客戶端通過命令連接向服務器端發送PASV指令表示要使用被動模式。
  3. 服務器端同意使用PASV模式,並開始監聽一個高位隨機端口m,並將此端口號告知客戶端。
  4. 客戶端使用x+1號端口與服務器端口m建立數據連接。
  5. 服務器端響應客戶端發起的數據連接請求,數據連接成功建立。
    FTP被動模式

數據傳輸模式

參考資料:
https://mingersoft.com/blog/2011/01/ftp-and-the-difference-between-ascii-and-binary-modes/
http://www.jscape.com/blog/ftp-binary-and-ascii-transfer-types-and-the-case-of-corrupt-files

ASCII

數據在計算機中存儲或者在計算機間傳輸,需要以計算機可識別的一種形式而存在。這種形式就是二進制的數據,即0和1。將字母a翻譯成二進制數值存儲在計算機中,這種翻譯過程可理解爲編碼。不同的計算機,編碼可能不同,因此需要統一,應該是ISO給統一的,後來就誕生了ASCII這種編碼。ASCII編碼將大寫字母、小寫字母、數字以及控制符號都定義了ASCII值。比如數字0的十進制ASCII值是48,二進制的值是00110000。
一般用於傳輸純文本文件(例如批處理腳本、shell腳本、HTML文件、JavaScript文件等)。對於跨平臺(例如Windows和Linux)的傳輸來說,ASCII傳輸模式可以自動修改行結束符,避免出現換行錯亂的情況。
FTP ASCII Transfer Mode

Image / Binary

逐字節傳輸數據,保留數據本身模樣,不會像ASCII那樣轉換數據,因此不會自動轉換文本文件的行結束符,可能出現跨操作系統傳輸文件後文本換行錯亂的情況。
一般用於傳輸二進制文件,庫文件、圖片、視頻、Linux下的ELF可執行文件等。

純文本文件區分

可以通過文本編輯器來區分文件是否是文本文件,常見的文本編輯器如下:

  • Windows記事本
  • Sublime Text 3
  • Notepad++
  • Vim

文本文件使用文本編輯器打開後是正常顯示的,而二進制文件如果使用編輯器打開一般會是此類亂碼。
編輯器打開二進制文件

模式選擇

  1. FTP客戶端程序一般會自動識別,因此我們無需干預。
    FTP客戶端設置數據傳輸類型
  2. FTP命令行工具可通過type命令切換
    ftp> type ascii
    200 Switching to ASCII mode.
    ftp> type binary
    200 Switching to Binary mode.
    ftp> type image
    200 Switching to Binary mode.

用戶

匿名用戶

登錄的用戶名爲anonymous或者ftp,密碼爲空。映射到本地用戶ftp,家目錄爲/var/ftp/。

本地用戶

登錄的用戶名和密碼與Linux本地用戶相同。每個FTP本地用戶都會映射到同用戶名的Linux用戶,家目錄爲Linux用戶的家目錄。

虛擬用戶

虛擬用戶可以有多個,所有的虛擬用戶都只會映射到一個本地用戶,此本地用戶在配置文件中被稱爲來賓用戶(guest_username),來賓用戶的家目錄即爲虛擬用戶的家目錄,每個虛擬用戶都可以擁有獨立的用戶名和密碼。本文中,虛擬用戶的用戶認證方式目前有兩種:

  • 伯克利DB文件
  • MySQL

環境

系統:CentOS 6.9
軟件:vsftpd 2.2.2
本實驗在iptables和selinux均關閉的情況下進行

幫助

官網:http://vsftpd.beasts.org
查看配置文件中的樣例說明

vim /etc/vsftpd/vsftpd.conf

查看man手冊

man 5 vsftpd.conf

配置文件

/etc/vsftpd/vsftpd.conf
此配置文件也是主配置文件
每一行就是一句指令(directive)或者註釋
指令的格式如下

option=value

在option、=和value的兩邊都不可以存在空格
指令有默認值,如果沒有顯式定義指令,則採用默認值,默認值查看man手冊。
“#”開頭的行表示註釋,“#”後接着1個空格表示描述信息

# Example config file /etc/vsftpd/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.

“#”後不接空格表示被註釋掉的指令

#chown_uploads=YES
#chown_username=whoever

配置文件修改之後需要重啓vsftpd服務纔會使修改生效

# service vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]

匿名用戶和本地用戶的實現

指令說明

vsftpd對權限的設置要求事無鉅細,特別是對匿名用戶的讀(下載)、寫(上傳文件、創建目錄、刪除文件和重命名等)操作,除了要求對應的Linux用戶權限設置妥當以外,還要有對應的不同指令的正確設置。

首先

write_enable:控制FTP是否可寫,無論用戶類型。最終用戶是否具備相應的權限,一個是看指令上是否允許,另一個就是和Linux用戶權限相關。

匿名用戶

anonymous_enable:是否啓用匿名用戶。
anon_upload_enable:是否允許匿名用戶上傳文件。
anon_mkdir_write_enable:是否允許匿名用戶創建目錄。
anon_other_write_enable:是否允許匿名用戶執行其他寫操作,包括刪除和重命名。
no_anon_password:是否不向匿名用戶詢問密碼,反正匿名用戶也沒有密碼,因此這項可以設置爲YES。

本地用戶

local_enable:是否啓用本地用戶。
local_umask:本地用戶創建文件的umask,文件使用666去減,目錄使用777去減。

目錄消息

dirmessage_enable:第一次進入某個目錄的歡迎/描述信息,默認在每個目錄下搜索.message文件,是否顯示與客戶端有關。
message_file:指定目錄消息文件的文件名。

數據傳輸日誌

xferlog_enable:是否啓用傳輸日誌,傳輸日誌記錄用戶上傳下載的細節信息。
vsftpd_log_file:傳輸日誌的位置。當且僅當xferlog_enable爲YES且xferlog_std_format爲NO的時候有效。默認值是/var/log/vsftpd.log。
xferlog_std_format:是否啓用標準格式的傳輸日誌,標準格式的傳輸日誌易讀性差,不過可用於傳輸統計生成器(猜測應該是一種日誌統計工具)再利用。
xferlog_file:指定標準格式的傳輸日誌文件存儲位置,當且僅當xferlog_enable和xferlog_std_format都被啓用的情況下有效。默認值是/var/log/xferlog。

數據傳輸模式

port_enable:是否啓用PORT模式,默認值是YES。
connect_from_port_20:指定FTP的PORT模式是否使用20號端口;
ftp_data_port:當connect_from_port_20爲NO的時候,此選項設置PORT模式下FTP服務器使用的數據連接端口,默認值是20。
ascii_download_enable和ascii_upload_enable:上傳和下載的時候是否明確使用ASCII數據傳輸模式。默認情況下服務器假裝允許ASCII模式但實際上會忽略ASCII請求。某些FTP如果啓用此特性,會被通過FTP命令SIZE一個大文件來達到DoS***的效果。
pasv_enable:是否啓用PASV模式,默認值是YES。
pasv_max_port和pasv_min_port:指定PASV模式下的端口範圍,設置了好配合防火牆設置,0表示使用任意端口。

修改匿名用戶上傳文件的屬主

chown_uploads:是否修改匿名用戶上傳文件的屬主,不修改的話默認匿名用戶上傳的文件的屬主和屬組都是ftp。
chown_username:設置匿名用戶上傳文件的新屬主,不會改變屬組。
chown_upload_mode:設置匿名用戶上傳文件後文件的權限,默認是0600。

設定超時時長

idle_session_timeout:客戶端輸入兩次FTP命令間隔時間的超時時長,默認是300秒。
connect_timeout:PORT模式下,客戶端響應數據連接的超時時長,默認是60秒。
data_connection_timeout:數據傳輸停止的大致超時時長,默認是300秒。

命令連接的監聽端口

standalone(獨立模式):表示直接運行在後臺,自己監聽,不依靠類似xinetd的守護進程管理。

listen:啓用的話,使vsftpd運行於獨立模式。
listen_address:當vsftpd運行於獨立模式時,此選項設置vsftpd監聽的ipv4地址,默認是0.0.0.0。
listen_port:當vsftpd運行於獨立模式時,此選項設置vsftpd監聽端口,默認是21。

設定連接及傳輸速率

local_max_rate:本地用戶最大數據傳輸速率,單位是“字節/秒”,默認是0,表示無限制。
anon_max_rate:匿名用戶最大數據傳輸速率,單位是“字節/秒”,默認是0,表示無限制。
max_clients:當vsftpd運行於獨立模式時,此選項設置vsftpd支持的最大客戶端連接數,0表示無限制,默認值是2000。
max_per_ip:當vsftpd運行於獨立模式時,此選項設置vsftpd支持的最大相同IP地址的客戶端連接數,0表示無限制,默認值是50。

禁錮本地用戶

chroot可以理解爲禁錮的意思,使得用戶在自己的家目錄,無法切換至其他目錄,但是進入自己的子目錄除外。
匿名用戶始終被禁錮。

chroot_local_user:是否禁錮所有本地用戶。
chroot_list_enable:是否啓用禁錮列表文件。當chroot_local_user爲YES的時候,chroot_list_file表示不被禁錮的本地用戶。當chroot_local_user爲NO的時候,chroot_list_file表示被禁錮的本地用戶。
chroot_list_file:禁錮列表文件位置。
注意:vsftpd從2.3.5版本開始,如果設置了禁錮用戶,那麼當用戶登錄的時候,默認是會報錯的。

refusing to run with writable root inside chroot ()

解決的辦法有兩種:

  1. 將用戶的家目錄設置爲只讀模式。
  2. 選項allow_writeable_chroot的值設置爲YES。

控制用戶登錄

/etc/vsftpd/ftpusers:這是一個文件,非指令。黑名單文件,文件中的用戶將被禁止登錄FTP。不過是在輸入密碼之後才禁止登錄的,密碼仍然被傳輸了。
將zwl用戶加入ftpusers文件中

# grep 'zwl' /etc/vsftpd/ftpusers 
zwl

在客戶端上測試登錄

# ftp 192.168.17.100
Connected to 192.168.17.100 (192.168.17.100).
220 (vsFTPd 2.2.2)
Name (192.168.17.100:root): zwl
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.

userlist_enable:是否啓用用戶列表文件。
userlist_file:用戶列表文件位置。認值是/etc/vsftpd/user_list。
userlist_deny:用戶列表文件中的用戶是否被拒絕。如果用戶被用戶列表給拒絕了,那麼連輸入賬號密碼的機會都沒有。默認值是YES。
在配置文件中啓用用戶列表userlist_enable,選項userlist_file和userlist_deny保持默認值即可。

# grep "userlist" /etc/vsftpd/vsftpd.conf
userlist_enable=YES

將用戶zwl加入userlist_file

# grep "zwl" /etc/vsftpd/user_list 
zwl

FTP客戶端測試,可以看到報錯的信息和ftpusers文件是不同的, 重要的是使用用戶列表拒絕的話,用戶無法輸入密碼。

# ftp 192.168.17.100
Connected to 192.168.17.100 (192.168.17.100).
220 (vsFTPd 2.2.2)
Name (192.168.17.100:root): zwl
530 Permission denied.
Login failed.

PAM簡述

要配置虛擬用戶的話,需要理解PAM,不過我個人不太懂PAM,目前只能簡單理解。

PAM,Pluggable Authentication Modules,可插拔認證模塊。
vsftpd是通過PAM來完成用戶認證的,配置文件中通過pam_service_name來指定vsftpd使用的PAM服務文件。

pam_service_name=vsftpd

這是相對路徑,相對於/etc/pam.d/,即使用/etc/pam.d/vsftpd這個PAM服務文件,此目錄下每一個文件都是一個pam服務。
下面是vsftpd默認使用的PAM服務文件,目前並不詳細理解,大概理解就可以了,比如從文件的第三行中的可以看出文件/etc/vsftpd/ftpusers中的每一行表示用戶(item=user),每個用戶都被拒絕登錄(sense=deny)。

# cat /etc/pam.d/vsftpd
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
auth       required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required pam_shells.so
auth       include  password-auth
account    include  password-auth
session    required     pam_loginuid.so
session    include  password-auth

PAM服務文件中調用的“.so”文件是相對路徑,相對於/lib64/security/,此類文件是動態鏈接(dynamically linked)的庫文件也是PAM的模塊文件。

虛擬用戶之伯克利DB文件的實現

創建用戶信息文本文件

# cat /etc/vsftpd/virtual_user.txt 
tom
123456
jerry
123456

安裝db4相關包獲取db_load工具,此工具存在於包db4-utils中,理論上安裝此包即可。

# rpm -qa | grep 'db4'
db4-devel-4.7.25-22.el6.x86_64
db4-utils-4.7.25-22.el6.x86_64
db4-cxx-4.7.25-22.el6.x86_64
db4-4.7.25-22.el6.x86_64

生成用戶信息db文件

# db_load –T –t hash –f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db

db_load的具體用法可以查閱RPM包db4-utils中的HTML文件

# rpm -ql db4-utils | grep 'db_load'
/usr/bin/db_load
/usr/share/doc/db4-utils-4.7.25/utility/db_load.html

pam服務文件替換

# mv /etc/pam.d/vsftpd{,.bak}
# vim /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/virtual_user
account required pam_userdb.so db=/etc/vsftpd/virtual_user

關於pam_userdb模塊的介紹,請參照官網:http://www.linux-pam.org/Linux-PAM-html/sag-pam_userdb.html
模塊的參數db的值不可以是virtual_user.txt或者virtual_user.db,一定得是virtual_user!
創建虛擬用戶所映射的本地用戶

useradd -d /home/virtual_user_home -s /sbin/nologin virtual_user
chmod 755 /home/virtual_user_home/

當來賓用戶的家目錄的權限不是所有人都可讀而且anon_world_readable_only的值爲YES的時候,虛擬用戶登錄後執行ls查看目錄會報錯

226 Transfer done (but failed to open directory).

目前找到的解決辦法有兩種
i. 虛擬用戶的主目錄,確保所有人都有讀的權限。
ii. 顯式地設置anon_world_readable_only爲NO。

anon_world_readable_only
    當啓用的時候,匿名用戶只能下載那些全局(所有者、所有組和其他人)可讀的文件。這是意識到了FTP用戶可能會擁有自己的文件,特別是在允許上傳的時候。這樣可以防止匿名用戶下載其他FTP用戶上傳的自己沒有讀權限的文件。默認值是YES。

配置文件中虛擬用戶相關配置

local_enable=YES
    非匿名用戶想要登錄的話,必須開啓,包括虛擬用戶。
guest_enable=YES
    如果啓用,所有非匿名(本地和虛擬)登錄都會被認爲是guest登錄。guest登錄的用戶會被映射成選項guest_username所指定的用戶。
guest_username=virtual_user
pam_service_name=vsftpd

配置了虛擬用戶之後,匿名用戶可以登錄,本地用戶無法登錄(因爲pam服務文件已被我們修改)。
虛擬用戶在OS中的權限設置是被識別爲選項guest_username所指定的用戶。
虛擬用戶在配置文件中的權限設置,默認是被識別爲匿名用戶,也就是說如果要確保虛擬用戶具備所有權限的話,還需要如下設置。

anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

如果想要修改虛擬用戶默認映射的用戶的話,可以參考下面這個選項。

virtual_use_local_privs
    默認情況下虛擬用戶被識別爲匿名用戶(這麼做是爲了使得虛擬用戶的權限設置更爲嚴格,特別是在寫權限上),通過設置此項可以將虛擬用戶識別爲本地用戶。默認值是NO。

虛擬用戶和匿名用戶一樣,默認是被禁錮

ftp> pwd
257 "/"
ftp> cd /etc
550 Failed to change directory.

目前爲止,我們已經可以通過伯克利DB來實現虛擬用戶了,但是所有的虛擬用戶的權限都是一樣的,如果想要使不同的虛擬用戶具備不同的權限呢?
可以藉助配置文件中的選項user_config_dir,通過此選項我們可以配置一個目錄:

user_config_dir=/etc/vsftpd/user_conf/

在目錄下創建以用戶名命名的文本文件,在文本文件中針對不同的虛擬用戶設置不同的權限:

# cat /etc/vsftpd/user_conf/tom
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
# cat /etc/vsftpd/user_conf/jerry
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

這種方式稱爲per-user basis,每個虛擬用戶的配置文件的語法和主配置文件是一樣的,但不是所有的選項都會生效,比如某些設置在用戶的會話啓用前就已經被應用了,比如listen_address、banner_file、max_per_ip、max_clients和xferlog_file等。
在此基礎上可以在主配置文件中禁用匿名用戶

anonymous_enable=NO

這樣子實現的結果就是:

  • 匿名用戶無法登錄。
  • 虛擬用戶tom具有所有的權限。
  • 虛擬用戶jerry只有下載那些所有人可讀的文件的權限。

虛擬用戶之MySQL的實現

安裝mysql服務器端,我這邊是通過下載官網5.7的yum源後安裝的

# rpm -qa | grep 'mysql'
mysql-community-libs-compat-5.7.21-1.el6.x86_64
mysql57-community-release-el6-11.noarch
mysql-community-client-5.7.21-1.el6.x86_64
mysql-community-libs-5.7.21-1.el6.x86_64
mysql-community-common-5.7.21-1.el6.x86_64
mysql-community-server-5.7.21-1.el6.x86_64
mysql-community-devel-5.7.21-1.el6.x86_64

注意:如果pam-mysql是源碼編譯安裝的話,一定要記得安裝mysql的devel包,否則在configure階段會報錯,無法找到頭和庫文件等。

# ./configure --with-pam-mods-dir=/lib64/security/ --with-mysql=/usr
checking if "/usr" is a mysql_config script... no
checking mysql_config availability in /usr/bin... no
checking mysqlclient availability in /usr/lib... no
checking mysqlclient availability in /usr/lib/mysql... no
checking mysql headers availability in /usr/include... no
checking mysql headers availability in /usr/include/mysql... no
configure: error: Cannot locate mysql client library. Please check your mysql installation.

關於mysql 5.7的初始化密碼以及密碼要求
一般我們安裝並啓動完mysql之後,都會運行mysql_secure_installation這個安全初始化腳本,以前的版本默認初始MySQL的root密碼爲空,因此直接回車即可通過
但是在5.7中,會替用戶初始化一個隨機密碼,並將此密碼寫在log當中
記得提取此密碼來運行mysql_secure_installation

# grep 'temporary password' /var/log/mysqld.log 
2018-04-11T09:38:41.716068Z 1 [Note] A temporary password is generated for root@localhost: H;CPodi6OhDt

降低密碼策略以及密碼長度要求,方便我們設置簡單的密碼

mysql> SET GLOBAL validate_password_policy = 'LOW';
mysql> SET GLOBAL validate_password_length = 4;

初始化虛擬用戶數據及MySQL用戶授權

mysql> CREATE DATABASE vsftpd_auth CHARACTER SET utf8;
Query OK, 1 row affected (0.01 sec)

mysql> USE vsftpd_auth;
Database changed

mysql> CREATE TABLE users (
    -> name VARCHAR(100),
    -> password VARCHAR(100)
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO `users` VALUES ('tom',PASSWORD('123456')),('jerry',PASSWORD('123456'));
Query OK, 2 rows affected, 2 warnings (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 2

mysql> SELECT * FROM `users`;
+-------+-------------------------------------------+
| name  | password                                  |
+-------+-------------------------------------------+
| tom   | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| jerry | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+-------+-------------------------------------------+
2 rows in set (0.01 sec)

mysql> CREATE USER 'vsftpd_auth'@'localhost' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.02 sec)

mysql> GRANT ALL ON `vsftpd_auth`.* TO 'vsftpd_auth'@'localhost';
Query OK, 0 rows affected (0.01 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

在創建表users中設置字段的長度爲100,因爲我們使用了PASSWORD函數加密,加密後的字符長度爲42,長度設置不夠的話,在INSERT的時候會報錯

ERROR 1406 (22001): Data too long for column 'password' at row 1

來賓賬戶依然使用之前在伯克利DB文件實驗環節中使用的

# grep 'virtual_user' /etc/passwd
virtual_user:x:501:501::/home/virtual_user_home:/sbin/nologin
# ls -ld /home/virtual_user_home/
drwxr--r-- 4 virtual_user virtual_user 4096 Apr 10 11:04 /home/virtual_user_home/
# grep 'guest' /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=virtual_user

下載安裝pam-mysql-第三方RPM包
網上許多安裝pam-mysql的教程都是通過官網:http://pam-mysql.sourceforge.net/
來源碼編譯安裝,通過源碼編譯安裝的pam-mysql,安裝成功後在我的環境下會登錄失敗
通過/var/log/secure日誌,發現頻繁出現這兩句報錯

Apr 13 16:47:52 server vsftpd[50238]: PAM unable to dlopen(/lib64/security/pam_mysql.so): /lib64/security/pam_mysql.so: undefined symbol: make_scrambled_password
Apr 13 16:47:52 server vsftpd[50238]: PAM adding faulty module: /lib64/security/pam_mysql.so

Google了一番發現這應該是pam-mysql自身的bug,網上有針對此問題而製作的RPM包,如下
RPM包參考網址:https://centos.pkgs.org/6/epel-x86_64/pam_mysql-0.7-0.12.rc1.el6.x86_64.rpm.html
此RPM的changelog剛好解決了此問題

2011-06-10 - Paul P. Komkoff Jr <[email protected]> 1:0.7-0.12.rc1
- make_scrambled_password fix (bz#709534)

下載安裝過程

# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/Packages/p/pam_mysql-0.7-0.12.rc1.el6.x86_64.rpm
# rpm -ivh pam_mysql-0.7-0.12.rc1.el6.x86_64.rpm
# rpm -ql pam_mysql
/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7
/usr/share/doc/pam_mysql-0.7/COPYING
/usr/share/doc/pam_mysql-0.7/CREDITS
/usr/share/doc/pam_mysql-0.7/ChangeLog
/usr/share/doc/pam_mysql-0.7/NEWS
/usr/share/doc/pam_mysql-0.7/README

如果上面那個RPM包安裝的pam-mysql模塊,使用失敗的,可以考慮官網的源碼安裝,如下兩步
安裝開發環境包組用於源碼編譯安裝

# yum groupinstall "Development Tools" "Server Platform Development"

下載安裝pam-mysql-官網源碼編譯安裝

# cd /usr/local/src/
# wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
# tar -xzf pam_mysql-0.7RC1.tar.gz
# cd pam_mysql-0.7RC1/
# ./configure --with-pam-mods-dir=/lib64/security/ --with-mysql=/usr
# make
# make install

關於pam-mysql的參數說明,記得閱讀一下README

RPM包安裝的位於:/usr/share/doc/pam_mysql-0.7/README
源碼編譯安裝的位於:/usr/local/src/pam_mysql-0.7RC1/README

創建PAM服務文件
參數verbose:設置後可用於排錯,應該也是設置了我纔看到了/var/log/secure中的報錯
參數crypt:設置用戶密碼的加密方法,0或者plain表示純文本,2或者mysql表示使用MySQL的PASSWORD()函數加密

# cat /etc/pam.d/vsftpd.mysql 
auth required pam_mysql.so user=vsftpd_auth passwd=123456 host=localhost db=vsftpd_auth table=users usercolumn=name passwdcolumn=password crypt=2 verbose=1 sqllog=1
account required pam_mysql.so user=vsftpd_auth passwd=123456 host=localhost db=vsftpd_auth table=users usercolumn=name passwdcolumn=password crypt=2 verbose=1 sqllog=1

設置vsftpd調用PAM服務文件

# grep 'pam_service' /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.mysql

vsftpd配置文件有修改的話,記得重啓服務

# service vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]

我自己測試登錄是OK的,就不貼上來了。
基於pam-mysql的虛擬用戶做per-user basis的權限設置,應該是和基於伯克利DB文件實現是一樣的,這裏沒測試。

總結

vsftpd的使用感覺還是有點麻煩,以前嘗試過pure-ftpd,相對簡單很多。
vsftpd使用到這個程度的話,我覺得已經很足夠了,畢竟這個服務目前已經不是很多人在使用了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章