前些天用vsftpd+mysql實現虛擬用戶登錄
把偶的菜鳥筆記和大家分享一下
有什麼問題請指正
特別申明:本文不適合Linux老鳥們
HTML版本:
Debian+vsftpd+MySQL實現虛擬用戶
(posted by guitarbug @
)
一需求虛擬用戶登錄
由於之前配置成功了postfix+MySQL虛擬用戶登錄
體會到了使用虛擬用戶的好處和靈活性
所以這次也考慮采用虛擬用戶
並且將FTP虛擬用戶的信息也存儲在MySQL中
這樣以後用PHP等寫一些WEB GUI的管理程序
統一管理用戶
還是蠻方便的
限制IP的匿名登錄
開放匿名登錄
但是只允許特定的IP可以匿名登錄
不同用戶
不同目錄
不同權限
聽起來有點像繞口令吧
舉例來說
有
個用戶
分別是普通用戶(normal)和管理員(admin)
FTP有
個目錄
分別是incoming和pub
要實現如下權限設置:
代碼:
incoming pub
normal 讀/寫 只讀
admin 讀/寫 讀/寫
通過FTP管理Web站點
服務器上還架設了Apache
而網站管理員對Linux又不是很熟悉
而且也不想開放一個帳號給網站管理員
以免他登錄到系統上去
把系統搞的亂
糟
所以參考Internet上提供虛擬主機的流行做法
就是通過FTP來管理網站
所以需要提供一個可供網站管理員登錄FTP進行網站管理的帳號
擴展功能
待定
二選擇FTP服務器軟件 Linux下架設FTP站點
有很多優秀的FTP服務器軟件可供選擇
例如Wu
FTPD
Pure
FTPD
ProFTPD以及vsFTPD等等
要想選擇一個適合自己需求的FTP服務器軟件
也需要費點腦筋才行
對於我來說
選擇 vsftpd(very secure FTP daemon)
主要有以下兩點原因:
選擇原則一
有人說
哪個FTPD是你最熟悉的就用哪個
不過由於我之前沒有在Linux下架設FTP站點的經驗
所以
對我來說
一切都是新的起點
在vsftpd的官方主頁上看到了Debian官方FTP
RH官方FTP等都使用了vsftpd
於是
隨波逐流
吧
這樣看起來會有面子些~
選擇原則二
第二點很大程度取決於vsftpd(very secure FTP daemon)的名字
因為它是很安全的FTP軟件嘛
哈哈
再說Debian官方等FTP都使用了vsftpd
選擇它應該沒錯的~
PS:FTP服務器軟件的選擇可以參考
鳥哥的Linux私房菜中的簡易vsftpd服務器架設
一文
三實現 基於Debian GNU/Linux
Sarge 和 vsftpd
需要的軟件包
)
vsftpd
very secure FTP daemon
)
mysql
server
mysql
client
前者是MySQL數據庫服務器
用於存儲虛擬用戶信息
後者提供一個命令行的MySQL Client
由於我之前配置postfix時
已經安裝過了MySQL
所以我不必安裝這個包了^_^
)
libpam
mysql
vsftpd是通過PAM驗證用戶信息的
這個包可以讓PAM去讀取MySQL完成驗證
安裝
以root登錄Debian
輸入以下命令
搞定~
代碼:
#aptget install vsftpdlibpammysql
創建一個必要的本地用戶
雖說是虛擬用戶
不過
由於虛擬用戶的信息存儲在MySQL數據庫中
所以還是需要一個能夠讀取MySQL數據庫的本地用戶
)
創建本地用戶的家目錄
此目錄也是FTP的家目錄
代碼:
#mkdir /home/ftp
)
創建名為ftpguest的本地用戶
代碼:
#useradd ftpguest d /home/ftp
)
修改FTP家目錄的所有者和組
代碼:
#chown ftpguestnogroup /home/ftp
配置MySQL數據庫
)創建用於存儲虛擬用戶信息的數據庫ftpvuser
代碼:
#mysqladmin u root p create ftpvuser
)
連接數據庫
代碼:
#mysql u root p
)創建用於存儲虛擬用戶信息的表users
代碼:
mysql>use ftpvuser;
mysql>CREATE TABLE users (username varchar() NOT NULL
password varchar() NOT NULL
PRIMARY KEY (username)) TYPE=MyISAM;
)讓本地用戶ftpguest能讀取ftpvuser數據庫的users表的內容
注:YourPassword用於設定ftpguest訪問數據庫的密碼
代碼:
mysql>grant select on ftpvuserusers to ftpguest@localhost identified
by YourPassword;
mysql>flush privileges;
)
建立虛擬用戶
代碼:
mysql>insert into users (usernamepassword) values (normal);
mysql>insert into users (usernamepassword) values (admin);
mysql>insert into users (usernamepassword) values (webmaster);
)
完成MySQL的配置
代碼:
mysql>quit;
配置vsftpd的PAM驗證
)
打開PAM配置文件
代碼:
#nano /etc/pamd/vsftpd
)
將以前的內容注釋掉
然後添加下面
行內容
注:YourPassword就是剛才在前面設定的ftpguest訪問數據庫的密碼
代碼:
auth required pam_mysqlso user=ftpguest passwd=YourPassword host=localhost
db=ftpvuser table=users usercolumn=username passwdcolumn=password crypt=
account required pam_mysqlso user=ftpguest passwd=YourPassword host=localhost
db=ftpvuser table=users usercolumn=username passwdcolumn=password crypt=
配置vsftpd
)
打開vsftpd的配置文件
代碼:
#nano /etc/nf
注意:一旦修改了/etc/nf文件的內容
必須重啟vsftpd才能使新的設置生效
方法是:
代碼:
#/etc/initd/vsftpd stop
#/etc/initd/vsftpd start
直接#/etc/init
d/vsftpd restart
好像不起作用?
)
修改nf文件如下
代碼:
#關閉匿名用戶訪問
#anonymous_enable=YES
#開啟本地用戶訪問
local_enable=YES
#開啟虛擬用戶訪問
guest_enable=YES
guest_username=ftpguest
#將本地用戶限制在自己的家目錄這樣可避免FTP用戶訪問到其他的系統目錄
chroot_local_user=YES
)
OOPS: cap_set_proc
趕快登錄FTP試一下吧
不過為什麼無法登錄呢?服務器返回錯誤:
OOPS: cap_set_proc
Google之
這個錯誤似乎與SELinux有關
解決辦法是加載capability模塊:
代碼:
#modprobe capability
為了讓Linux在啟動時自動加載此模塊把這個模塊放到/etc/modules中即可
)限制IP的匿名登錄
要想限制登錄vsftpd的客戶端的IP地址要用到一個叫TCP Wrappers的東東對於TCP Wrappers我的理解是如果在vsftpd中啟用了TCP Wrappers的話每次客戶端向vsftpd發起一個連接請求的時候vsftpd首先會把這個連接請求交給TCP Wrappers處理如果客戶端的IP被TCP Wrappers放行的話才能繼續與vsftpd繼續會話否則直接就被拒絕服務了不知道對不對?
a修改/etc/nf
代碼:
#啟用TCP Wrappers
tcp_wrappers=YES
b
修改/etc/hosts
deny
拒絕所有向vsftpd發起連接請求的IP
不過
如果hosts
deny與hosts
allow沖突的話
以hosts
allow優先處理
這好像就是
先deny所有
然後在hosts
allow開放特權
呵呵
代碼:
#拒絕所有連入vsftpd的IP先
vsftpd: ALL
c
修改/etc/hosts
allow
在這裡開放允許登錄vsftpd的IP地址關於VSFTPD_LOAD_CONF環境變量
vsftpd的man是這麼說的:
If tcp_wrappers sets the VSFTPD_LOAD_CONF environment variable
then the vsftpd session will try and load the vsftpd configuration file specified in this variable
代碼:
#限制可以匿名登錄vsftpd的IP地址
vsftpd: : setenv VSFTPD_LOAD_CONF /etc/vsftpd/vsftpdanonymous
#允許vsftpd的虛擬用戶以任何IP連接FTP
vsftpd: ALL : setenv VSFTPD_LOAD_CONF /etc/vsftpd/vsftpdvirtual
d
修改/etc/vsftpd/vsftpd
anonymous
代碼:
#mkdir /etc/vsftpd/
#nano /etc/vsftpd/vsftpdanonymous
#允許匿名登錄
anonymous_enable=YES
e
修改/etc/vsftpd/vsftpd
virtual
代碼:
#nano /etc/vsftpd/vsftpdvirtual
#不允許匿名登錄
anonymous_enable=NO
)
為不同的用戶設置不同的訪問權限
a
激活單個用戶配置功能
增加以下配置行到vsftpd的配置文件:
代碼:
#nano /etc/nf
#指定不同用戶配置文件的存放路徑
user_config_dir=/etc/vsftpd/vsftpd_user_conf
b
普通用戶:下載/上傳
編輯/etc/vsftpd/vsftpd_user_conf/normal
注意:用戶的配置文件名與用戶名一致
不過匿名用戶的配置文件名為ftp
而不是anonymous
代碼:
#mkdir /etc/vsftpd/vsftpd_user_conf
#nano /etc/vsftpd/vsftpd_user_conf/normal
加入以下內容:
#允許下載
代碼:
anon_world_readable_only=NO
#允許寫入上傳以及建立目錄
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
c管理員用戶:下載/上傳/刪除等
代碼:
#cp /etc/vsftpd/vsftpd_user_conf/normal /etc/vsftpd/vsftpd_user_conf/admin
編輯admin的配置文件:
代碼:
#nano /etc/vsftpd/vsftpd_user_conf/admin
管理員除了擁有普通用戶的權限以外
還擁有刪除/重命名/改變文件屬性的權限
加入以下內容:
代碼:
#允許重命名和刪除文件
anon_other_write_enable=YES
#虛擬用戶擁有與本地用戶相同的權限(由於chmod僅僅對本地用戶有效所以如果想要虛擬用戶擁有chmod的權限這一項必須激活)
virtual_use_local_privs=YES
#允許修改文件屬性
chmod_enable=YES
d
網站管理員
代碼:
#cp /etc/vsftpd/vsftpd_user_conf/admin /etc/vsftpd/vsftpd_user_conf/webmaster
編輯webmaster的配置文件:
代碼:
#nano /etc/vsftpd/vsftpd_user_conf/webmaster
加入以下內容:
代碼:
#將FTP家目錄指向網站的家目錄(我的www目錄使用Apache默認的目錄)
local_root=/var/www
#默認情況下上傳到FTP站點的文件的擁有者都是ftpguest其他用戶是沒有訪問權限的
#所以當訪問網站的時候會出現沒有權限訪問該文件的錯誤這是由於Apache的用戶
#wwwdata無法訪問/var/www下的文件造成的把umask設置成甚至即可解決這個問題
local_umask=
e
為normal
admin用戶設置對incoming
pub目錄不同的權限
閱讀了一遍vsftpd man中關於權限的相關設置
似乎沒有單獨設置每個目錄權限的地方?後來想到是不是可以利用Linux文件系統的文件權限設置來達到此目的
以前在Windows下利用IIS來架設站點時
我就是利用NTFS權限設置來達到控制不同用戶對目錄的訪問權限
不過試了一下
還是無法完美的實現以下的權限控制:
代碼:
incoming pub
normal 讀/寫 只讀
admin 讀/寫 讀/寫
舉例來說
可以通過把pub設置成只讀來控制normal用戶只讀pub的權限
不過admin對pub也是只讀了不過
還好
因為admin擁有修改目錄屬性的權限
如果admin用戶想要通過FTP來完成管理pub目錄的話
可以臨時把pub目錄修改成讀/寫屬性
四小結vsftpd的目標是完成一個簡易而且安全性不低的FTPD
功能嘛
似乎還是有點不足
特別是目錄權限這方面的設置如果是對目錄權限有比較復雜的需求的話
可以考慮一下Proftpd
在測試的時候
除了使用FTP Client工具以外
最好再使用Sniffer類的軟件作為輔助
因為有時候FTP Client並不會完全把FTPD返回信息呈現在你面前
而有時候
這些信息對排除FTPD故障會有很大幫助的
而一旦使用Sniffer類的軟件
所有的客戶端與服務器端交互的信息都不會漏掉的
五參考Manpage of VSFTPD
CONF:
vsftp配置大全:
?tid=
From:http://tw.wingwit.com/Article/program/MySQL/201311/29336.html