天天看點

Linux FTP虛拟使用者實作之vsftpd

vsftpd可以支援虛拟使用者,這樣這些使用者跟系統使用者不搭嘎,隻能通路FTP服務提供的資源,系統勢必就要安全的多了。我們實作FTP匿名使用者可以有兩種方式,可以把虛拟使用者清單儲存到本地一個資料檔案中,也可以把資料儲存至資料庫檔案中。下面分别介紹兩種實作方式:

本地資料檔案方式:

環境及需求:CentOS5.8

軟體包:vsftpd, db4-utils(要用到其提供的db_load工具把文本格式的使用者清單轉換成二進制的資料格式供vsftpd使用)

1、安裝所需軟體包

yum –y install vsftpd db4-utils

2、建立使用者密碼檔案

[root@ha1 vsftpd]# cd /etc/vsftpd/

[root@ha1 vsftpd]# vim vuser

tom  /*奇數行為使用者名

tompwd /*偶數行為上面使用者的密碼

jerry

jerrypwd

3、生成使用者密碼檔案,并記得更改檔案權限隻有root有讀寫權限

[root@ha1 vsftpd]# db_load -T -t hash -f vuser vuser.db

[root@ha1 vsftpd]# ls

chroot_list  ssl        vsftpd.conf             vuser

ftpusers     user_list  vsftpd_conf_migrate.sh  vuser.db

[root@ha1 vsftpd]# chmod 700 vuser vuser.db

[root@ha1 vsftpd]# ll vuser vuser.db

-rwx------ 1 root root    26 Oct 29 13:40 vuser

-rwx------ 1 root root 12288 Oct 29 13:42 vuser.db

4、為其提供PAM的配置檔案

[root@ha1 vsftpd]# cd /etc/pam.d/

[root@ha1 pam.d]# vim vsftpd.vuser

auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vuser 注意這裡db檔案名後面的.db不用帶上,這個相當于字尾吧,.db前面的才是檔案名

account required /lib/security/pam_userdb.so db=/etc/vsftpd/vuser

5、建立虛拟使用者映射的系統使用者,指定其家目錄,不需要登陸權限及密碼

[root@ha1 pam.d]# useradd -d /var/ftp/vuser -s /sbin/nologin vftpuser

[root@ha1 pam.d]# ll -d /var/ftp/vuser/

drwx------ 3 vftpuser vftpuser 4096 Oct 29 13:55 /var/ftp/vuser/

6、編輯vsftpd配置檔案使其支援虛拟使用者

[root@ha1 pam.d]# vim /etc/vsftpd/vsftpd.conf #添加以下幾行

guest_enable=YES  /*啟用虛拟使用者

guest_username=vftpuser /*指定FTP虛拟使用者映射到的系統使用者

pam_service_name=vsftpd.vuser /*定義PAM認證檔案

儲存退出,重新開機vsftpd服務

service vsftpd restart

7、用虛拟賬号登陸驗證,可以看到可以成功使用tom賬号登陸ftp并且上傳檔案,檔案位于vftpuser家目錄/var/ftp/vuser下

[root@ha1 pam.d]# !ftp
ftp 192.168.188.128
Connected to 192.168.188.128.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.188.128:root): tom
331 Please specify the password.
Password:
230 Login successful.

 
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> lcd /etc/
Local directory now /etc
ftp> put issue
local: issue remote: issue
227 Entering Passive Mode (192,168,188,128,231,93)
150 Ok to send data.
226 File receive OK.
47 bytes sent in 0.0045 seconds (10 Kbytes/s)
ftp> bye
221 Goodbye.
[root@ha1 pam.d]# ls /var/ftp/vuser/
issue 


      

通過MySQL資料庫伺服器提供密碼資料

1、安裝mysql

yum –y install mysql-server mysql-devel

2、編譯安裝pam-mysql

下載下傳位址:http://nchc.dl.sourceforge.net/project/pam-mysql/pam-mysql/0.7RC1/pam_mysql-0.7RC1.tar.gz

下載下傳完解壓,編譯安裝,configure 隻要指定一下—with-mysql即可,

[root@ha1 ~]# tar xf pam_mysql-0.7RC1.tar.gz 
[root@ha1 ~]# cd pam_mysql-0.7RC1
[root@ha1 pam_mysql-0.7RC1]# ls
acinclude.m4  config.status  install-sh   mkinstalldirs      pkg.m4
aclocal.m4    config.sub     libtool      NEWS               README
ChangeLog     configure      ltmain.sh    pam_mysql.c        stamp-h
config.guess  configure.in   Makefile     pam_mysql.la       stamp-h.in
config.h      COPYING        Makefile.am  pam_mysql.lo
config.h.in   CREDITS        Makefile.in  pam_mysql.spec
config.log    INSTALL        missing      pam_mysql.spec.in
[root@ha1 pam_mysql-0.7RC1]# ./configure --with-mysql=/usr 
      

[root@ha1 pam_mysql-0.7RC1]# make && make install

3、建立使用者密碼資料庫

建立一個使用者檔案 vim /etc/vsftpd/vuser (字段之間用Tab鍵隔開,由于我的表有個id字段,是以第一個字段直接加個Tab)

tom      tom
jerry     jerry
mysql> CREATE DATABASE vsftpd;    //建立資料庫
Query OK, 1 row affected (0.03 sec)

mysql> USE vsftpd;    //切到資料庫vsftpd
Database changed
mysql> CREATE TABLE vuser    //建立使用者表
    -> (id SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> name CHAR(20) BINARY NOT NULL,
    -> password CHAR(48) BINARY NOT NULL);
    Query OK, 0 rows affected (0.10 sec)
mysql> DESC vuser; //檢視表結構
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | smallint(6) | NO   | PRI | NULL    | auto_increment | 
| name     | char(20)    | NO   |     | NULL    |                | 
| password | char(48)    | NO   |     | NULL    |                | 
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.04 sec)
mysql> LOAD DATA LOCAL INFILE "/etc/vsftpd/vuser" INTO TABLE vuser;    //可以直接從文本檔案中批量導入使用者
Query OK, 4 rows affected, 12 warnings (0.04 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 8
mysql> INSERT INTO vuser (name,password) VALUES ('bob',password('bob')),('tina','tina'); //當然也可以直接批量插入使用者資料,這裡我一個使用了mysql的password函數,一個沒有使用,因為pam_mysql和mysql使用的password函數可能不一樣,會導緻無法認證,下面會分别測試一下
Query OK, 2 rows affected (0.03 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> GRANT SELECT ON vsftpd.* TO vftpuser@localhost IDENTIFIED BY 'vftpuser';
Query OK, 0 rows affected (0.10 sec)
mysql> GRANT SELECT ON vsftpd.* TO [email protected] IDENTIFIED BY 'vftpuser'; //這兩行給予vftpuser使用者vsftpd資料庫所有表查詢權限
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;    //重新整理權限資訊使權限生效
Query OK, 0 rows affected (0.04 sec)







      

我們用vftpuser登陸mysql驗證一下是否具有查詢權限

[root@ha1 ~]# mysql -u vftpuser -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.0.95 Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| test               | 
| vsftpd             | 
+--------------------+
3 rows in set (0.00 sec)

mysql> USE vsftpd;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SHOW TABLES;
+------------------+
| Tables_in_vsftpd |
+------------------+
| vuser            | 
+------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM vuser;
+----+-------+------------------+
| id | name  | password         |
+----+-------+------------------+
|  1 | tom   | tom              | 
|  2 | jerry | jerry            |
|  3 | tina  | tina             | 
|  4 | bob   | 7d67547927a4589e |   
+----+-------+------------------+
4 rows in set (0.00 sec)
      

4、為mysql建立一個pam配置檔案

[root@ha1 pam.d]# cd /etc/pam.d

[root@ha1 pam.d]# vim vsftpd.mysql

auth required /usr/lib/security/pam_mysql.so user=vftpuser passwd=vftpuser host=localhost db=vsftpd table=vuser usercolumn=name passwordcolumn=password crypt=0

account required /usr/lib/security/pam_mysql.so user=vftpuser passwd=vftpuser host=localhost db=vsftpd table=vuser usercolumn=name passwordcolumn=password ctypt=0

[root@ha1 pam.d]# useradd -d /var/ftp/vuser -s /sbin/nologin vftpuser

[root@ha1 pam.d]# ll -d /var/ftp/vuser/

6、修改vsftpd配置檔案,支援通過mysql認證

[root@ha1 pam.d]# vim /etc/vsftpd/vsftpd.conf

guest_enable=YES

guest_username=vftpuser

pam_service_name=vsftpd.mysql

anon_world_readable_only=NO

用windows用戶端登陸驗證,需要注意的是虛拟使用者預設使用的是匿名使用者的權限,配置檔案要加上一句anon_world_readable_only=NO,不然的話ls指令結果列不出來。

Linux FTP虛拟使用者實作之vsftpd

虛拟使用者進階設定

虛拟使用者預設使用的匿名使用者的權限,當然vsftpd還支援繼承系統使用者的權限:

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時,虛拟使用者隻能下載下傳檔案,無其他權限。

anon_upload_enable=YES時,虛拟使用者隻能上傳和下載下傳檔案,無其他權限。

anon_mkdir_write_enable=YES時,虛拟使用者隻能下載下傳檔案和建立檔案夾,無其他權限。

anon_other_write_enable=YES時,虛拟使用者隻能下載下傳、删除和重命名檔案,無其他權限。

此外,如果有需要,我們還可以為我們的虛拟使用者分别定義權限:

繼續閱讀