VSFTPD是一種在UNIX/Linux中非常安全且快速的FTP服務器,目前已經被許多大型站點所採用。VSFTPD支持將用戶名和口令保存在數據庫文件或數據庫服務器中。VSFTPD稱這種形式的用戶爲虛擬用戶。相對於FTP的本地(系統)用戶來說,虛擬用戶只是FTP服務器的專有用戶,虛擬用戶只能訪問FTP服務器所提供的資源,這大大增強系統本身的安全性。相對於匿名用戶而言,虛擬用戶需要用戶名和密碼才能獲取FTP服務器中的文件,增加了對用戶和下載的可管理性。對於需要提供下載服務,但又不希望所有人都可以匿名下載;既需要對下載用戶進行管理,又考慮到主機安全和管理方便的FTP站點來說,虛擬用戶是一種極好的解決方案。
1、編譯安裝pam_mysql
注意:安裝這些軟件包之前不要忘記安裝開發環境
yum -y groupinstall "Development Tools"
yum -y groupinstall "Development Libraries"
mysql安裝請參考本文LAMP最新編譯安裝
tar xf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1
./configure --with-mysql=/usr/local/mysql
make && make install
cp /usr/lib/security/pam_mysql.so /lib/security/
2、編譯安裝vsftpd
tar xf vsftpd-2.3.5.tar.gz
cd vsftpd-2.3.5
less INSTALL /建議查看這個安裝文檔,裏面有詳細說明安裝vsftpd步驟/
make && make install
複製vsftpd的主配置文件
mkdir -pv /etc/vsftpd
cp vsftpd.conf /etc/vsftpd/
編輯配置文件/etc/vsftpd/vsftpd.conf
添加:listen=YES
啓動vsftpd服務器
/usr/local/sbin/vsftpd &
-----------------------------------------------------------------------------------------
二、服務配置
1、配置mysql,創建數據庫表用戶等操作
創建數據庫爲vsftpd
mysql> create database vsftpd;
Query OK, 1 row affected (0.10 sec)
創建表爲users
mysql> use vsftpd;
Database changed
mysql> create table users (
-> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> name CHAR(15) NOT NULL UNIQUE KEY,
-> password CHAR(48) NOT NULL );
Query OK, 0 rows affected (0.22 sec)
添加兩個用戶,採用加密模式
mysql> insert into users (name,password) values ('test',password('123456'));
Query OK, 1 row affected (0.06 sec)
mysql> insert into users (name,password) values ('test1',password('123456'));
Query OK, 1 row affected (0.01 sec)
爲用戶vsftpd授權
mysql> grant select on vsftpd.* to vsftpd@localhost identified by '123456';
Query OK, 0 rows affected (0.08 sec)
mysql> grant select on vsftpd.* to [email protected] identified by '123456';
Query OK, 0 rows affected (0.01 sec)
最後刷新一下表
mysql> flush privileges;
Query OK, 0 rows affected (0.05 sec)
2、建立認證文件
cd /etc/pam.d
touch vsftpd.mysqluser
vim vsftpd.mysqluser 添加以下內容
auth required pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
保存退出
說明:
auth 對用戶所提供的認證信息進行驗證,比如檢查用戶賬號及密碼
account 執行基於非驗證的賬號管理。它主要用來允許或者限制用戶對某個服務的訪問時間,當前有效的系統資源最多可以有多少個用戶,限制用戶的位置等
crypt=2: 使用MYSQL中的password()函數加密
3、建立虛擬用戶映射的系統用戶及對應的目錄
useradd -s /sbin/nologin -d /var/ftpuser ftpuser
chmod go+rx /var/ftpuser
4、配置vsftpd主配置文件/etc/vsftpd/vsftpd.conf
請確保/etc/vsftpd/vsftpd.conf中已經啓用了以下選項
anonymous_enable=YES #表示允許匿名用戶登錄訪問
local_enable=YES #表示允許本地系統用戶登錄訪問
write_enable=YES #表示允許寫入權限
anon_upload_enable=NO #表示匿名用戶是否有上傳的權限,這裏是關閉的,要開啓NO改成YES
anon_mkdir_write_enable=NO #表示匿名用戶沒有寫入的權限,這裏是關閉的,開開啓NO改成YES
chroot_local_user=NO #表示把ftp本地用戶鎖定在家目錄,爲了安全,建議關閉
添加以下選項
guest_enable=YES #啓用虛擬用戶
guest_username=ftpuser #虛擬用戶映射的系統用戶,就是上面我們建立的用戶,名字是ftpuser
pam_service_name=vsftpd.ftp #啓用PAM認證,並指定文件,這個文件路徑在/etc/pam.d/ftp
6、關閉vsftpd和開啓vsftpd
關閉vsftpd:killall vsftpd
開啓vsftpd:/usr/local/sbin/vsftpd /etc/vsftpd/vsftpd.conf &
測試:lftp [email protected]
輸入密碼就可以正常登錄了
三、解決系統用戶無法登錄ftp
如果使用虛擬用戶,那麼系統本地用戶就無法登錄了,如果要解決這個問題,必須可以修改/etc/pam.d/vsftpd文件,把虛擬用戶基本mysql的配置文件(/etc/pam.d/vsftpd.my),放置到/etc/pam.d/vsftpd裏就可以解決了,需要添加和修改的幾個選項如下:
#%PAM-1.0
auth sufficient pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account sufficient pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
#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 system-auth
account include system-auth
#session include system-auth
#session required pam_loginuid.so
此時,再次測試,虛擬用戶和系統本地用戶都可以正常登錄,但是系統本地用戶登錄的家目錄是虛擬用戶的家目錄,無法登錄自己系統
本地的家目錄,如果系統用戶要想使用家目錄,可以用以下參數定義
實驗過程中遇到的問題:
問題一、用虛擬賬號登錄ftp的時候報錯:ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
解決方法:chown a-w /var/ftpuser,做完這步但是虛擬用戶就無法上傳文件了,這時在/
user_config_dir=/etc/vsftpd/users
1. which vsftpd # 確定文件路徑
2. vim /etc/hosts.deny # 改文件立即生效
vsftpd: 172.16.0.2300
#假設僅允許172.16網段訪問
vim /etc/hosts.allow
vsftpd: 171.16 # 只允許172.16.0.0/16網段
vim /etc/hosts.deny
ALL: ALL # 拒絕其他的用戶登陸