Vsftpd配置詳解之與MySql的結(jié)合
Vsftpd 配置之結(jié)合MySql數(shù)據(jù)庫(kù)
將vsftpd與MySql相結(jié)合,我們可以把用戶和日志信息放到數(shù)據(jù)庫(kù)里面去,如果再結(jié)合php來(lái)管理數(shù)據(jù)庫(kù),則可以使vsftpd管理更加方便。下面我們就來(lái)討論一下基于MySql的虛擬戶和日志功能。
使用MySql來(lái)實(shí)現(xiàn)虛擬用戶
前面我們介紹了兩類用戶,關(guān)于匿名用戶的語(yǔ)句比較多,權(quán)限限制比較靈活;而本地用戶的特點(diǎn)是每個(gè)用戶對(duì)應(yīng)一個(gè)密碼和主文件夾,登錄控制比較靈活??刹豢梢詫烧叩膬?yōu)點(diǎn)結(jié)合一下呢?答案是肯定的,這就是虛擬用戶。關(guān)于虛擬用戶的啟用,需要使用以下兩條語(yǔ)句:
- guest_enable=yes/no
- guest_username=user_name
上述guest_enable表示是否開(kāi)啟虛擬用戶功能,guest_username表示虛擬用戶登錄后映射的本地用戶名。如果開(kāi)啟虛擬用戶功能,本地用戶登錄后將映射到guest_username參數(shù)指定的用戶,主目錄也變成該用戶的主目錄。
我們修改vsftpd主配置文件,變?yōu)橄旅娴臉幼樱?/P>
- 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
再新建一個(gè)用戶virftp改變一下其主目錄的權(quán)限:
- # useradd -d /var/virftp -s /sbin/nologin virftp
- # chmod 704 /var/virftp
這時(shí)再以/etc/passwd中的用戶登錄ftp,通過(guò)查看內(nèi)容,會(huì)發(fā)現(xiàn)主目錄已經(jīng)切換到/var/virftp/,可以下載和上傳文件,但不能改名和刪除。這就是說(shuō),限制匿名用戶的參數(shù)也同樣適用于本地用戶。
如果想讓虛擬用戶像本地用戶那樣擁有每個(gè)用戶獨(dú)立的主目錄、獨(dú)立的配置文件和權(quán)限,又該怎么辦呢?還記得user_config_dir參數(shù)吧!在每個(gè)用戶獨(dú)立的配置文件里設(shè)定不同的權(quán)限和local_root參數(shù)就可以了。
再來(lái)看看這個(gè)參數(shù):
- virtual_use_local_privs=yes/no
從剛才的實(shí)驗(yàn)可以看到,虛擬用戶登錄后,受到匿名用戶參數(shù)的限制。我們可以通將此參數(shù)的值改為yes,則虛擬用戶會(huì)變得和本地用戶一樣,擁有和本地用戶一樣的特權(quán)。由于我們平常都是看中了匿名用戶限制參數(shù)比較細(xì)致這個(gè)特點(diǎn)才啟用虛擬用戶的,所以此參數(shù)默認(rèn)值為no!
下面我們結(jié)合MySql,把用戶登錄信息放到數(shù)據(jù)庫(kù)里面去。首先我們需要安裝MySql。
到官網(wǎng)下載MySql,為了簡(jiǎn)單起見(jiàn),我們下載在linux下已經(jīng)編譯好的版本。我下載的版本是mysql-5.1.18-beta-linux-i686-glibc23.tar.gz,然后照下面的步驟來(lái)安裝MySql。
- # groupadd mysql
- # useradd -g mysql mysql
如果系統(tǒng)中已經(jīng)有了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
如果原來(lái)系統(tǒng)中已經(jīng)安裝舊版mysql,***將它卸載,除非你有足夠的把握很好地面對(duì)系統(tǒng)中的兩個(gè)mysql;通常習(xí)慣將mysql安裝在/usr/local/mysql中,但為了將來(lái)版本升級(jí)的需要,建議使用鏈接方式使用mysql。
- # cd mysql
- # chown -R mysql:mysql .
- # scripts/mysql_install_db --user=mysql
初始化mysql數(shù)據(jù)庫(kù),這步之前必須保證mysql用戶有權(quán)限訪問(wèn)mysql目錄。
- # chown -R root .
- # chown -R mysql data
***做這兩步,至少官方文檔是這么建議的。
MySql的命令和man文檔并不在PATH和MANPATH中,所以我們要手動(dòng)加入。打開(kāi)vi /etc/profile文件,找到export PATH ...那一行,大約在40行左右,在它的前面加上一行:
- PATH=”$PATH”:/usr/local/mysql/bin
打開(kāi)/etc/man.config(有的版本為/etc/man.conf),在它的任何地方加入一行:
- MANPATH /usr/local/mysql/man
到這時(shí)mysql就已經(jīng)安裝好了,通過(guò)這個(gè)命令啟動(dòng)mysql:
/usr/local/mysql/bin/mysqld_safe --user=mysql &
為了讓mysql支持開(kāi)機(jī)啟動(dòng),執(zhí)行下面的命令:
- # cp support-files/mysql.server /etc/rc.d/init.d/mysqld
- # chkconfig –add mysqld
這樣就可以讓mysql以服務(wù)的方式開(kāi)機(jī)啟動(dòng),且還可以使用如下命令管理mysql服務(wù):
# service mysqld {start|stop|restart|reload|force-reload|status}
啟動(dòng)mysql服務(wù),檢測(cè)下是否正常運(yùn)行:
- # netstat -l|grep mysql
- tcp 0 0 *:mysql *:* LISTEN
- unix 2 [ ACC ] STREAM LISTENING 25534 /tmp/mysql.sock
看到了吧,mysql已經(jīng)在監(jiān)聽(tīng)了,但它的socket file在/tmp/下,郁悶!
默認(rèn)情況下,mysql沒(méi)有密碼,任何人都可以登入。為了加強(qiáng)安全性,我們給mysql加上root帳號(hào)密碼:
- # 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>
建立數(shù)據(jù)庫(kù)ftpdb:
- mysql> create database ftpdb;
#p#
在數(shù)據(jù)庫(kù)ftpdb中建立一個(gè)表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)
這里要注意密碼字段的長(zhǎng)度,不同的算法生成的密文長(zhǎng)度是不一樣的,建議不要少于50位,否則可能導(dǎo)致密文在存儲(chǔ)時(shí)被截短。
我們插入兩條記錄作為兩個(gè)ftp的登錄名和密碼,使用mysql自帶的password函數(shù)來(lái)加密密碼:
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)
然后我們?cè)俳⒁粋€(gè)可以讓ftp服務(wù)登陸數(shù)據(jù)庫(kù)的用戶:
mysql> grant select on ftpdb.ftpuser to ftpdb_query@localhost identified by 'P@ssw0rd';
這個(gè)用戶只能瀏覽 ftpdb 數(shù)據(jù)庫(kù)下的 ftpuser 表中內(nèi)容,我們?nèi)绻胍院蠓峙湟粋€(gè)可以完全管理 ftpdb 數(shù)據(jù)庫(kù)的用戶,再這樣:
mysql> grant all on ftpdb.* to ftpdb_all@localhost identified by 'P@ssw0rd';
到這里MySql的設(shè)置就算完了,接下來(lái)安裝 PAM 基于 mysql 數(shù)據(jù)庫(kù)的認(rèn)證插件,我們可以到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
這里要注意兩點(diǎn),一是我們的mysql是手動(dòng)安裝在/usr/local/mysql下的,因此./configure命令需要指定mysql安裝目錄;二是安裝好之后,pam_mysql.so被安裝到了/usr/lib/security. 如果make過(guò)程出現(xiàn)錯(cuò)誤,不要理會(huì),只要產(chǎn)生pam_mysql.so文件即可,我們可以直接將此文件考入/lib/security/目錄。
然后來(lái)編寫(xiě)PAM認(rèn)證文件:
- # 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
注意,整個(gè)這個(gè)文件中只有auth和account兩行內(nèi)容,中途不要加回車換行;文件中不要再有包含其它pam模塊的行;如果pam_mysql.so文件沒(méi)有在/lib/security目錄,就需要指定文件路徑。文件中其它字段的意思是:
user 訪問(wèn)數(shù)據(jù)庫(kù)用戶名
passwd 訪問(wèn)數(shù)據(jù)庫(kù)用戶密碼
host 數(shù)據(jù)庫(kù)主機(jī)
db 數(shù)據(jù)庫(kù)名
table 表名
usercolumn 用戶列名
passwdcolumn 密碼列名
crypt 密碼驗(yàn)證機(jī)制;0 代表明文,1 代表DES 加密,2 代表Mysql的password()函數(shù)加密,3代表md5算法,4代表sha加密。
現(xiàn)在我們修改vsftpd主配置文件/etc/vsftpd/vsftpd.conf,把pam_service_name的值改為ftpdb,也就是我們剛才建立的那個(gè)PAM認(rèn)證文件的名字。再登錄服務(wù)器測(cè)試,可以發(fā)現(xiàn)/etc/passwd中的用戶已經(jīng)無(wú)法登錄到服務(wù)器了,而數(shù)據(jù)庫(kù)中存儲(chǔ)的用戶名是可以登錄的。我們還可以按前面所述的方法為每個(gè)虛擬用戶建立獨(dú)立的配置文件,指定獨(dú)立的主目錄;還可以結(jié)合apache服務(wù)建立php頁(yè)面,然后實(shí)現(xiàn)讓用戶在web界面注冊(cè)帳號(hào)、修改密碼,這要比原來(lái)的認(rèn)證方式靈活得多。
在MySql中記錄日志
接下來(lái)我們看一下如何利用剛才的PAM 模塊來(lái)結(jié)合mysql 數(shù)據(jù)庫(kù)記錄vsftpd 服務(wù)的日志。在介紹之前,我們來(lái)看看vsftp中關(guān)于日志記錄的參數(shù)。
- xferlog_enable=yes/no //是否啟用 xferlog 日志格式
- xferlog_std_format=yes/no //是否采用標(biāo)準(zhǔn)格式記錄日志
- xferlog_file=/path/to/logfile //xferlog 日志文件所在位置,默認(rèn)為/var/log/xferlog
上面的參數(shù)設(shè)置記錄xferlog日志的格式。這是早期Wu-ftpd服務(wù)的日志格式,它會(huì)記錄上傳和下載的動(dòng)作。vsftpd也有專有的日志格式,用下列參數(shù)設(shè)置:
- dual_log_enable=yes/no //是否采用Vsftpd自己的日志記錄方式
- log_ftp_protocol=yes/no //是否記錄所有的ftp命令日志
- vsftpd_log_file=/path/to/logfile //指定vsftpd 日志文件位置,默認(rèn)為/var/log/vsftpd.log
xferlog_enable的默認(rèn)值為no(vsftpd提供的配置文件模版將其值改為了yes),dual_log_enable的默認(rèn)值也為no,就是說(shuō)默認(rèn)情況下vsftpd是不記錄日志的。我們也可以將日志信息寫(xiě)入系統(tǒng)日志/var/log/messages中,使用如下參數(shù):
syslog_enable=yes/no
還是建議大家把日志記錄為單獨(dú)的文件,以便瀏覽和管理。實(shí)驗(yàn)比較簡(jiǎn)單,我們就不做了。
對(duì)于使用文件來(lái)記錄日志的方式來(lái)說(shuō),我們必須登錄到服務(wù)器之后,才能查看日志。這樣做不方便,不靈活。我們可以把日志放到數(shù)據(jù)庫(kù)中,結(jié)合www服務(wù)建立一個(gè)瀏覽日志的頁(yè)面,這樣就非常舒服的看到web方式的日志了。下面來(lái)看看如何將日志寫(xiě)入數(shù)據(jù)庫(kù)中去。
首先必須使用虛擬用戶所在的同一個(gè)數(shù)據(jù)庫(kù),新建立存儲(chǔ)日志的表:
mysql> create table ftplog
-> (log char(100),
-> user char(20),
-> host char(20),
-> time datetime,
-> pid int);
修改 PAM 配置文件,在原來(lái)的基礎(chǔ)上我們改動(dòng)一下:
- # 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
注意在這個(gè)文件中依然就是原來(lái)的兩行,其中加入的內(nèi)容分別對(duì)應(yīng)如下:
sqllog 表示是否將日志記錄到數(shù)據(jù)庫(kù)中
logtable 記錄日志的表名
logmsgcolumn 記錄日志信息的列
logusercolumn 登錄用戶
loghostcolumn 登錄主機(jī)
logtimecolumn 登錄時(shí)間
logpidcolumn 處理該用戶連接的進(jìn)程pid
這次我換了一個(gè)登陸數(shù)據(jù)庫(kù)用戶,使用先前建立的有完全權(quán)限的用戶ftpdb_all,這個(gè)用戶才有在數(shù)據(jù)庫(kù)中使用insert命令的權(quán)限。
【編輯推薦】