Vsftpd配置詳解之與MySql的結合
Vsftpd 配置之結合MySql數據庫
將vsftpd與MySql相結合,我們可以把用戶和日志信息放到數據庫里面去,如果再結合php來管理數據庫,則可以使vsftpd管理更加方便。下面我們就來討論一下基于MySql的虛擬戶和日志功能。
使用MySql來實現虛擬用戶
前面我們介紹了兩類用戶,關于匿名用戶的語句比較多,權限限制比較靈活;而本地用戶的特點是每個用戶對應一個密碼和主文件夾,登錄控制比較靈活。可不可以將兩者的優點結合一下呢?答案是肯定的,這就是虛擬用戶。關于虛擬用戶的啟用,需要使用以下兩條語句:
- guest_enable=yes/no
- guest_username=user_name
上述guest_enable表示是否開啟虛擬用戶功能,guest_username表示虛擬用戶登錄后映射的本地用戶名。如果開啟虛擬用戶功能,本地用戶登錄后將映射到guest_username參數指定的用戶,主目錄也變成該用戶的主目錄。
我們修改vsftpd主配置文件,變為下面的樣子:
- listen=yes
- anonymous_enable=yes
- local_enable=yes
- pam_service_name=vsftpd
- write_enable=yes
- dirlist_enable=yes
- download_enable=yes
- anon_upload_enable=yes
- anon_mkdir_write_enable=yes
- anon_other_write_enable=no
- anon_umask=073
- guest_enable=yes
- guest_username=virftp
再新建一個用戶virftp改變一下其主目錄的權限:
- # useradd -d /var/virftp -s /sbin/nologin virftp
- # chmod 704 /var/virftp
這時再以/etc/passwd中的用戶登錄ftp,通過查看內容,會發現主目錄已經切換到/var/virftp/,可以下載和上傳文件,但不能改名和刪除。這就是說,限制匿名用戶的參數也同樣適用于本地用戶。
如果想讓虛擬用戶像本地用戶那樣擁有每個用戶獨立的主目錄、獨立的配置文件和權限,又該怎么辦呢?還記得user_config_dir參數吧!在每個用戶獨立的配置文件里設定不同的權限和local_root參數就可以了。
再來看看這個參數:
- virtual_use_local_privs=yes/no
從剛才的實驗可以看到,虛擬用戶登錄后,受到匿名用戶參數的限制。我們可以通將此參數的值改為yes,則虛擬用戶會變得和本地用戶一樣,擁有和本地用戶一樣的特權。由于我們平常都是看中了匿名用戶限制參數比較細致這個特點才啟用虛擬用戶的,所以此參數默認值為no!
下面我們結合MySql,把用戶登錄信息放到數據庫里面去。首先我們需要安裝MySql。
到官網下載MySql,為了簡單起見,我們下載在linux下已經編譯好的版本。我下載的版本是mysql-5.1.18-beta-linux-i686-glibc23.tar.gz,然后照下面的步驟來安裝MySql。
- # groupadd mysql
- # useradd -g mysql mysql
如果系統中已經有了mysql用戶,就可以省掉這步操作。
- # cd /usr/local
- # tar zxvf mysql-5.1.18-beta-linux-i686-glibc23.tar.gz
- # ln -s mysql-5.1.18-beta-linux-i686-glibc23 mysql
如果原來系統中已經安裝舊版mysql,***將它卸載,除非你有足夠的把握很好地面對系統中的兩個mysql;通常習慣將mysql安裝在/usr/local/mysql中,但為了將來版本升級的需要,建議使用鏈接方式使用mysql。
- # cd mysql
- # chown -R mysql:mysql .
- # scripts/mysql_install_db --user=mysql
初始化mysql數據庫,這步之前必須保證mysql用戶有權限訪問mysql目錄。
- # chown -R root .
- # chown -R mysql data
***做這兩步,至少官方文檔是這么建議的。
MySql的命令和man文檔并不在PATH和MANPATH中,所以我們要手動加入。打開vi /etc/profile文件,找到export PATH ...那一行,大約在40行左右,在它的前面加上一行:
- PATH=”$PATH”:/usr/local/mysql/bin
打開/etc/man.config(有的版本為/etc/man.conf),在它的任何地方加入一行:
- MANPATH /usr/local/mysql/man
到這時mysql就已經安裝好了,通過這個命令啟動mysql:
/usr/local/mysql/bin/mysqld_safe --user=mysql &
為了讓mysql支持開機啟動,執行下面的命令:
- # cp support-files/mysql.server /etc/rc.d/init.d/mysqld
- # chkconfig –add mysqld
這樣就可以讓mysql以服務的方式開機啟動,且還可以使用如下命令管理mysql服務:
# service mysqld {start|stop|restart|reload|force-reload|status}
啟動mysql服務,檢測下是否正常運行:
- # netstat -l|grep mysql
- tcp 0 0 *:mysql *:* LISTEN
- unix 2 [ ACC ] STREAM LISTENING 25534 /tmp/mysql.sock
看到了吧,mysql已經在監聽了,但它的socket file在/tmp/下,郁悶!
默認情況下,mysql沒有密碼,任何人都可以登入。為了加強安全性,我們給mysql加上root帳號密碼:
- # mysqladmin -u root password 'your_P@ssw0rd'
這樣以后登錄就需要密碼了:
- # mysql -u root -p
- Enter password:
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 5
- Server version: 5.1.18-beta MySQL Community Server (GPL)
- Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
- mysql>
建立數據庫ftpdb:
- mysql> create database ftpdb;
#p#
在數據庫ftpdb中建立一個表ftpuser,表中有username和password字段:
- mysql> use ftpdb;
- Database changed
- mysql> create table ftpuser(username char(20) not null, password char(64) not null);
- Query OK, 0 rows affected (0.15 sec)
這里要注意密碼字段的長度,不同的算法生成的密文長度是不一樣的,建議不要少于50位,否則可能導致密文在存儲時被截短。
我們插入兩條記錄作為兩個ftp的登錄名和密碼,使用mysql自帶的password函數來加密密碼:
mysql> insert into ftpuser values('test1',password('abc'));
Query OK, 1 row affected, 1 warning (0.08 sec)
mysql> insert into ftpuser values('test2',password('123'));
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from ftpuser;
---------- -------------------------------------------
| username | password |
---------- -------------------------------------------
| test1 | *0D3CED9BEC10A777AEC23CCC353A8C08A633045E |
| test2 | *23AE809DDACAF96AF0FD78ED04B6A265E0***A257 |
---------- -------------------------------------------
2 rows in set (0.00 sec)
然后我們再建立一個可以讓ftp服務登陸數據庫的用戶:
mysql> grant select on ftpdb.ftpuser to ftpdb_query@localhost identified by 'P@ssw0rd';
這個用戶只能瀏覽 ftpdb 數據庫下的 ftpuser 表中內容,我們如果想以后分配一個可以完全管理 ftpdb 數據庫的用戶,再這樣:
mysql> grant all on ftpdb.* to ftpdb_all@localhost identified by 'P@ssw0rd';
到這里MySql的設置就算完了,接下來安裝 PAM 基于 mysql 數據庫的認證插件,我們可以到http: //sourceforge.net/projects/pam-mysql/下載得到。我下載的文件是pam_mysql- 0.7RC1.tar.gz。
- # tar zxvf pam_mysql-0.7RC1.tar.gz
- # cd pam_mysql-0.7RC1
- # ./configure –with-mysql=/usr/local/mysql
- # make
- # make install
這里要注意兩點,一是我們的mysql是手動安裝在/usr/local/mysql下的,因此./configure命令需要指定mysql安裝目錄;二是安裝好之后,pam_mysql.so被安裝到了/usr/lib/security. 如果make過程出現錯誤,不要理會,只要產生pam_mysql.so文件即可,我們可以直接將此文件考入/lib/security/目錄。
然后來編寫PAM認證文件:
- # vi /etc/pam.d/ftpdb
- auth required /usr/lib/security/pam_mysql.so user=ftpdb_query passwd=P@ssw0rd host=localhost db=ftpdb table=ftpuser usercolumn=username passwdcolumn=password crypt=2
- account required /usr/lib/security/pam_mysql.so user=ftpdb_query passwd=P@ssw0rd host=localhost db=ftpdb table=ftpuser usercolumn=username passwdcolumn=password crypt=2
注意,整個這個文件中只有auth和account兩行內容,中途不要加回車換行;文件中不要再有包含其它pam模塊的行;如果pam_mysql.so文件沒有在/lib/security目錄,就需要指定文件路徑。文件中其它字段的意思是:
user 訪問數據庫用戶名
passwd 訪問數據庫用戶密碼
host 數據庫主機
db 數據庫名
table 表名
usercolumn 用戶列名
passwdcolumn 密碼列名
crypt 密碼驗證機制;0 代表明文,1 代表DES 加密,2 代表Mysql的password()函數加密,3代表md5算法,4代表sha加密。
現在我們修改vsftpd主配置文件/etc/vsftpd/vsftpd.conf,把pam_service_name的值改為ftpdb,也就是我們剛才建立的那個PAM認證文件的名字。再登錄服務器測試,可以發現/etc/passwd中的用戶已經無法登錄到服務器了,而數據庫中存儲的用戶名是可以登錄的。我們還可以按前面所述的方法為每個虛擬用戶建立獨立的配置文件,指定獨立的主目錄;還可以結合apache服務建立php頁面,然后實現讓用戶在web界面注冊帳號、修改密碼,這要比原來的認證方式靈活得多。
在MySql中記錄日志
接下來我們看一下如何利用剛才的PAM 模塊來結合mysql 數據庫記錄vsftpd 服務的日志。在介紹之前,我們來看看vsftp中關于日志記錄的參數。
- xferlog_enable=yes/no //是否啟用 xferlog 日志格式
- xferlog_std_format=yes/no //是否采用標準格式記錄日志
- xferlog_file=/path/to/logfile //xferlog 日志文件所在位置,默認為/var/log/xferlog
上面的參數設置記錄xferlog日志的格式。這是早期Wu-ftpd服務的日志格式,它會記錄上傳和下載的動作。vsftpd也有專有的日志格式,用下列參數設置:
- dual_log_enable=yes/no //是否采用Vsftpd自己的日志記錄方式
- log_ftp_protocol=yes/no //是否記錄所有的ftp命令日志
- vsftpd_log_file=/path/to/logfile //指定vsftpd 日志文件位置,默認為/var/log/vsftpd.log
xferlog_enable的默認值為no(vsftpd提供的配置文件模版將其值改為了yes),dual_log_enable的默認值也為no,就是說默認情況下vsftpd是不記錄日志的。我們也可以將日志信息寫入系統日志/var/log/messages中,使用如下參數:
syslog_enable=yes/no
還是建議大家把日志記錄為單獨的文件,以便瀏覽和管理。實驗比較簡單,我們就不做了。
對于使用文件來記錄日志的方式來說,我們必須登錄到服務器之后,才能查看日志。這樣做不方便,不靈活。我們可以把日志放到數據庫中,結合www服務建立一個瀏覽日志的頁面,這樣就非常舒服的看到web方式的日志了。下面來看看如何將日志寫入數據庫中去。
首先必須使用虛擬用戶所在的同一個數據庫,新建立存儲日志的表:
mysql> create table ftplog
-> (log char(100),
-> user char(20),
-> host char(20),
-> time datetime,
-> pid int);
修改 PAM 配置文件,在原來的基礎上我們改動一下:
- # vi /etc/pam.d/ftpdb
- auth required /usr/lib/security/pam_mysql.so user=ftpdb_all passwd=P@ssw0rd host=localhost db=ftpdb table=ftpuser usercolumn=username passwdcolumn=password crypt=2 sqllog=yes logtable=ftplog loglogmsgcolumn=log logusercolumn=user loghostcolumn=host logtimecolumn=time logpidcolumn=pid
- account required /usr/lib/security/pam_mysql.so user=ftpdb_all passwd=P@ssw0rd host=localhost db=ftpdb table=ftpuser usercolumn=username passwdcolumn=password crypt=2 sqllog=yes logtable=ftplog loglogmsgcolumn=log logusercolumn=user loghostcolumn=host logtimecolumn=time logpidcolumn=pid
注意在這個文件中依然就是原來的兩行,其中加入的內容分別對應如下:
sqllog 表示是否將日志記錄到數據庫中
logtable 記錄日志的表名
logmsgcolumn 記錄日志信息的列
logusercolumn 登錄用戶
loghostcolumn 登錄主機
logtimecolumn 登錄時間
logpidcolumn 處理該用戶連接的進程pid
這次我換了一個登陸數據庫用戶,使用先前建立的有完全權限的用戶ftpdb_all,這個用戶才有在數據庫中使用insert命令的權限。
【編輯推薦】