系統環境:centos 5.6
vsftpd:2.3.5
vsftpd是UNIX/Linux中非常安全且快速的FTP服務器,目前已經被許多大型站點所採用。vsftpd支持將用戶名和口令保存在數據庫文件或數據庫服務器中。登錄FTP有三種方式,匿名登錄、本地用戶登錄和虛擬用戶登錄:
匿名登錄:在登錄FTP時使用默認的用戶名,一般是ftp或anonymous;
本地用戶登錄:使用系統用戶登錄,在/etc/passwd中;
虛擬用戶登錄:這是FTP專有用戶,有兩種方式實現虛擬用戶,本地數據文件和數據庫服務器;
FTP虛擬用戶是FTP服務器的專有用戶,使用虛擬用戶登錄FTP,只能訪問FTP服務器提供的資源,大大增強了系統的安全。
一、vsftpd安裝
1.安裝必要的支持文件
db4
db4-devel
db4-utils
2.開始安裝vsftpd
(1)源碼包安裝
下載最新穩定版本:vsftpd-2.3.5.tar.gz
tar zxvf vsftpd-2.3.5.tar.gz
cd vsftpd-2.3.5
./configure
make
make install
cd ../
(2)yum自動安裝
yum install vsftpd
(3)rpm包安裝
rpm -qa |grep vsftpd
rpm -ivh vsftpd-2.0.5-16.el5_5.1.i386.rpm
二、vsftpd配置
1.本地數據文件方式
(1)添加虛擬用戶口令文件
vim /etc/vsftpd/vftpuser.txt
#添加虛擬用戶名和密碼,奇數行爲用戶名,偶數行爲密碼
xiaojiang
cusAVnRfwnK3sYaD
test
qPJN5pyy73hSAqnU
(2)生成虛擬用戶口令認證文件
將剛添加的vftpuser.txt虛擬用戶口令文件轉換成系統識別的口令認證文件。
首先查看系統有沒有安裝生成口令認證文件所需的軟件db4-utils。
rpm -qa |grep db4-utils
yum install db4 db4-utils db4-devel
使用db_load命令生成虛擬用戶口令認證文件
db_load -T -t hash -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db
chmod 0600 /etc/vsftpd/vftpuser.*
查看生成虛擬用戶口令認證文件
file /etc/vsftpd/vftpuser.db
(3)編輯vsftpd的PAM認證文件
cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd_bak
vim /etc/pam.d/vsftpd
#其他都註釋掉,添加下面這兩行:
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vftpuser
account required /lib/security/pam_userdb.so db=/etc/vsftpd/vftpuser
****************************
說明:(2014-06-12更新)
在實際工作中,我們使用的系統更多的是64位的,所以,我們在添加上面兩行文件時,參考下面的方式來添加:
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser
在此,先檢查文件pam_userdb.so在什麼位置,一般是在:/lib64/security/pam_userdb.so
如果我們按照最開始的方式添加,在登錄ftp用戶時提示錯誤:530 Login incorrect
檢查日誌:tail -f /var/log/secure
發現下面錯誤信息:
Jun 12 13:52:39 VM_166_69_centos vsftpd[4872]: PAM unable to dlopen(/lib/security/pam_userdb.so): /lib/security/pam_userdb.so: wrong ELF class: ELFCLASS32
Jun 12 13:52:39 VM_166_69_centos vsftpd[4872]: PAM adding faulty module: /lib/security/pam_userdb.so
*************************
(4)建立本地映射用戶並設置宿主目錄權限
所有的FTP虛擬用戶需要使用一個系統用戶,這個系統用戶不需要密碼。
mkdir /home/vftpsite
useradd -d /home/vftpsite -s /sbin/nologin vftpuser
chmod 0777 /home/vftpsite
(5)配置vsftpd.conf(設置虛擬用戶配置項)
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_umask=022
#開啓虛擬用戶
guest_enable=YES
#虛擬用戶對應的系統用戶
guest_username=vftpuser
#PAM認證文件
pam_service_name=vsftpd
(6)重啓vsftpd服務
service vsftpd restart
說明:vsftpd上傳下載默認路徑爲/home/vftpsite
(7)測試虛擬用戶登錄
ftp 192.168.1.22
(8)爲指定虛擬用戶建立獨立的配置文件
vim /etc/vsftpd/vsftpd.conf
#添加用戶配置目錄支持
user_config_dir=/etc/vsftpd/vusers_dir
爲用戶建立獨立的配置目錄及文件,配置文件名與用戶名同名
mkdir /etc/vsftpd/vusers_dir/
cd /etc/vsftpd/vusers_dir/
vim xiaojiang
輸入以下內容:
local_root=/home/vftpsite
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_umask=022
2.數據庫服務器方式
(1)安裝mysql
具體安裝見另外文檔
(2)建立本地映射用戶並設置宿主目錄權限
mkdir /home/vftpsite
useradd -d /home/vftpsite -s /sbin/nologin vftpuser
chmod 0700 /home/vftpsite
(3)配置vsftpd.conf(設置虛擬用戶配置項)
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_umask=022
#開啓虛擬用戶
guest_enable=YES
#虛擬用戶對應的系統用戶
guest_username=vftpuser
#PAM認證文件
pam_service_name=vsftpd
(4)在MySQL中建立用戶口令數據庫
mysql -u root -p
#建立虛擬用戶數據庫,庫名vftpuser
create database vftpuser;
use vftpuser;
#建立虛擬用戶口令表,表名users
create table users(name char(32) binary,passwd char(48) binary);
#建立兩個虛擬用戶,bobyuan和markwang
insert into users (name,passwd) values ('xiaojiang','cusAVnRfwnK3sYaD');
insert into users (name,passwd) values ('test','qPJN5pyy73hSAqnU');
#授權vftpuser這個賬號可以讀取vftpuser數據庫的user表
grant select on vftpuser.users to vftpuser@localhost identified by 'AW978jdIfrDc';
flush privileges;
#驗證vftpuser用戶是否設置成功
注:
1.虛擬用戶密碼經過MySQL加密,加密後的密碼pam-mysql不能識別(MySQL和pam-mysql兼容性有些問題),因此使用明文保存密碼。
2.批量添加用戶
vi vftpuser.txt
#添加用戶名和密碼,注意字段之間要用Tab鍵隔開。
xiaojiang cusAVnRfwnK3sYaD
test qPJN5pyy73hSAqnU
use vftpuser;
load data local infile "/vftpuser.txt" into table users;
flush privileges;
(5)編譯MySQL的PAM認證模塊
查看/lib/security目錄下有沒有MySQL對應的PAM模塊。
ll /lib/security/pam_mysql*
tar -zxvf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1
./configure --with-mysql=/usr/local/webserver/mysql/ --with-pam-mods-dir=/lib/security/
make
make install
(6)編輯vsftpd的PAM認證文件
vim /etc/pam.d/vsftpd
其他都註釋掉,添加下面這兩行:
auth required /lib/security/pam_mysql.so user=vftpuser passwd=123456 host=localhost db=vftpuser table=users usercolumn=name passwdcolumn=passwd crypt=2 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1
account required /lib/security/pam_mysql.so user=vftpuser passwd=123456 host=localhost db=vftpuser table=users usercolumn=name passwdcolumn=passwd crypt=2 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1
說明:
crypt=0:表示口令使用明文方式保存在數據庫中
crypt=1:表示口令使用UNIX的DES加密方式加密後保存在數據庫中
crypt=2:表示口令使用MySQL的password()函數加密後保存在數據庫中
crypt=3:表示口令使用MD5散列值的方式保存在數據庫中
(7)重啓vsftpd服務
service vsftpd restart
說明:vsftpd上傳下載默認路徑爲/home/vftpsite
(8)測試虛擬用戶登錄
ftp 192.168.1.22
三、virtual_use_local_privs參數說明
當virtual_use_local_privs=YES時,虛擬用戶和本地用戶有相同的權限;
當virtual_use_local_privs=NO時,虛擬用戶和匿名用戶有相同的權限,默認是NO。
當virtual_use_local_privs=YES,write_enable=YES時,虛擬用戶具有寫權限(上傳、下載、刪除、重命名)。
當virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=YES,
anon_upload_enable=YES時,虛擬用戶不能瀏覽目錄,只能上傳文件,無其他權限。
當virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
anon_upload_enable=NO時,虛擬用戶只能下載文件,無其他權限。
當virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
anon_upload_enable=YES時,虛擬用戶只能上傳和下載文件,無其他權限。
當virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
anon_mkdir_write_enable=YES時,虛擬用戶只能下載文件和創建文件夾,無其他權限。
當virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
anon_other_write_enable=YES時,虛擬用戶只能下載、刪除和重命名文件,無其他權限。
四、虛擬用戶配置文件
1. 所有虛擬用戶使用統一配置
vim /etc/vsftpd/vsftpd.conf
添加如下內容:
write_enable=YES
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=vftpuser
virtual_use_local_privs=NO
pam_service_name=vsftpd
#可以下載
anon_world_readable_only=NO
#不能上傳,默認爲no
anon_upload_enable=NO
#不能新建文件夾
anon_mkdir_write_enable=NO
#不能刪除和重命名文件
anon_other_write_enable=NO
ftpd_banner=Welcome to onbing's FTP server
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
ascii_upload_enable=YES
ascii_download_enable=YES
tcp_wrappers=NO
setproctitle_enable=YES
listen_port=21
connect_from_port_20=YES
idle_session_timeout=600
data_connection_timeout=120
max_clients=0
max_per_ip=3
local_max_rate=512000
2. 各個虛擬用戶使用自身配置
vim /etc/vsftpd/vsftpd.conf
添加內容如下:
write_enable=YES
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=vftpuser
virtual_use_local_privs=NO
pam_service_name=vsftpd
#指定虛擬用戶配置文件路徑
user_config_dir=/etc/vsftpd/vsftpd_user_conf
ftpd_banner=Welcome to onbing's FTP server
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
ascii_upload_enable=YES
ascii_download_enable=YES
tcp_wrappers=NO
setproctitle_enable=YES
listen_port=21
connect_from_port_20=YES
idle_session_timeout=600
data_connection_timeout=120
max_clients=0
max_per_ip=3
local_max_rate=512000
#新建虛擬用戶配置文件路徑
mkdir /etc/vsftpd/vsftpd_user_conf
#編輯xiaojiang的配置文件
vi /etc/vsftpd/vsftpd_user_conf/xiaojiang
添加如下內容:
#只開放下載權限。注意這個地方千萬不能寫成YES,否則xiaojiang將不能列出文件和目錄
anon_world_readable_only=NO
#編輯test的配置文件
vi /etc/vsftpd/vsftpd_user_conf/test
添加內容如下:
#開放寫權限
write_enable=YES
#開放下載權限
anon_world_readable_only=NO
#開放上傳權限
anon_upload_enable=YES
#開放創建目錄的權限
anon_mkdir_write_enable=YES
#開放刪除和重命名的權限
anon_other_write_enable=YES
《全文完》
說明:
1.具體企業應用(略)
2.本文參考文檔:《Vsftpd FTP服務器-虛擬用戶(mysql)和本地用戶同時驗證》