四、 使用pam实现虚拟用户(适用于standalone启动与xinetd启动)

1.  配置
实现 vsftp虚拟用户的关键是创建vsftp的pam用户数据文件和修改vsftpd的pam配置文件。具体实验步骤如下:
1) 建立包含虚拟用户名称和密码的文本文件,文件奇数行为用户名,偶数行为用户密码。例如:
[root@RHEL5 mnt]# vi login.txt
test
123456
oralce
123456
2) 将包含虚拟用户的文本转换成数据库文件。
db_load -T -t hash -f login.txt /etc/vsftpd/vsftpd_login.db
db_load命令包含在 db4-utils软件包中,如果系统中不存在该命令安装此包可以解决。
3) 修改 vsftp的pam配置文件/etc/pam.d/vsftpd。将文件内容修改为以下(可以重新新建一个文件。把以前的进行备份。):
[root@RHEL5 pam.d]# vi vsftpd
auth        required     pam_userdb.so db=/etc/vsftpd/vsftpd_login
account     required     pam_userdb.so db=/etc/vsftpd/vsftpd_login
4) 检查 vsftpd.conf文件必须包含以下选项:
guest_enable=yes
guest_username=ftp
pam_service_name=vsftpd
5) 重起 vsftp服务
service vsftpd restart
 
2. 测试
[root@RHEL5 ~]# ftp 192.168.88.22
Connected to 192.168.88.22.
220 (vsFTPd 2.0.1)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.88.22:root): test
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,88,22,250,147)
150 Here comes the directory listing.
-rw-r--r--     1 0        0               8 Jan 02 10:16 mm
drwx---rwx     2 0        0            4096 Jan 02 11:11 pub
226 Directory send OK.
ftp>
还可以为不同的虚拟用户创建独立的配置文件,该参数指明用户的独立配置文件的存放位置,在配置文件中添加此参数。
User_config_dir=/etc/vsftpd/userconf
创建 User_config_dir=/etc/vsftpd/userconf目录并在该目录下建立与用户同名的文件,并在文件中写入相应的选项。例如:在文件test中写如”write_enable=no”。重新启动vsftp服务器使修改生效.
[root@RHEL5 ~]# cd /etc/vsftpd
[root@RHEL5 vsftpd]# mkdir userconf
[root@RHEL5 vsftpd]# cd userconf/
[root@RHEL5 userconf]# vi test
write_enable=no
测试如下:
[root@RHEL5 ~]# ftp 192.168.88.22
Connected to 192.168.88.22.
220 (vsFTPd 2.0.1)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.88.22:root): test
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls 
227 Entering Passive Mode (192,168,88,22,251,229)
150 Here comes the directory listing.
-rw-r--r--     1 0        0               8 Jan 02 10:16 mm
drwx---rwx     2 0        0            4096 Jan 02 11:19 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,88,22,112,205)
150 Here comes the directory listing.
226 Directory send OK.
ftp> mkdir mm
550 Permission denied.
ftp> bye
221 Goodbye.
[root@node1 ~]# ftp 192.168.88.22
Connected to 192.168.88.22.
220 (vsFTPd 2.0.1)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.88.22:root): oralce
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,88,22,197,148)
150 Here comes the directory listing.
-rw-r--r--     1 0        0               8 Jan 02 10:16 mm
drwx---rwx     2 0        0            4096 Jan 02 11:19 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir mm
257 "/pub/mm" created
ftp> ls
227 Entering Passive Mode (192,168,88,22,210,125)
150 Here comes the directory listing.
drwxr-xr-x     2 14       50           4096 Jan 02 11:20 mm
226 Directory send OK.
ftp>
可以看出 test用户不能创建文件,而oralce用户可以进行创建。
注意:对于匿名用户,如果需要禁止匿名用户连接 ftp服务器,那么在配置文件中将匿名用户的参数修改为no,不能注销,因为系统本身默认为yes。所以即使是注销也 不会生效。
 
五、虚拟用户服务器配置(通过数据库)
 
1.安装环境
系统:RHEL5.2
数据库:MySQL-server-community-5.1.30-0
ftp服务器:vsftpd-2.0.5-12.el5
2.vsftp的安装
[root@rhel5 mnt]# rpm -ivh vsftpd-2.0.5-12.el5.i386.rpm
3.创建guest用户
      vsftp服务器采用pam模块来实现虚拟用户验证。由于虚拟用户的用户名和口令被单独保存,因此vsftpd在验证的时候需要一个系统帐户读取数据库文件完成验证功能。这就是vsftpd的guest用户,就匿名用户一样需要一个系统帐户ftp。
[root@rhel5 mnt]#useradd –M –d /data –s /sbin/nologin vftp
[root@rhel5 mnt]#passwd vftp
[root@rhel5 mnt]#chmod 700 /data
[root@rhel5 mnt]#chown vftp:vftp /data
4. 安装数据库并将虚拟用户保存在mysql数据库中
 安装mysql数据库
MySQL-client-community-5.1.30-0.rhel5.i386.rpm
MySQL-server-community-5.1.30-0.rhel5.i386.rpm
MySQL-shared-compat-5.1.30-0.rhel5.i386.rpm
注意:
这几个包也必须安装。如果没有安装以下包时,虚拟用户登陆时会出问题。
perl-DBI-1.52-1.fc6.i386.rpm
perl-DBD-MySQL-3.0007-1.fc6.i386.rpm
perl-DBD-Pg-1.49-1.fc6.i386.rpm
创建数据库及用户
[root@rhel5 ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 31
Server version: 5.1.30-community MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database vsftpd;
Query OK, 1 row affected (0.00 sec)
mysql> use vsftpd;
Database changed
mysql> create table accounts(username varchar(20),passwd varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into accounts(username,passwd) value('admin','123456');
Query OK, 1 row affected (0.00 sec)
mysql> insert into accounts(username,passwd) value('upload','123456');
Query OK, 1 row affected (0.00 sec)
mysql> insert into accounts(username,passwd) value('download','123456');
Query OK, 1 row affected (0.00 sec)
mysql> grant select on vsftpd.accounts to vftp@localhost identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> quit
Bye
[root@rhel5 ~]# mysql -u vftp -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 32
Server version: 5.1.30-community MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
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> select * from accounts;
+----------+--------+
| username | passwd |
+----------+--------+
| admin     | 123456 |
| upload    | 123456 |
| download | 123456 |
+----------+--------+
3 rows in set (0.00 sec)
mysql>
5. 设置mysql的pam模块验证
      这里我们要用到一个利用mysql的进行pam验证的开源项目。在 http://sourceforge.net/projects/sysauth-pgsql网站可以下载所需要的包进行编译。下载pam_mysql-0.7RC1.tar.gz进行编译安装。在编译之前确保安装了msyql的库文件包。
vsftp的pam内容如下:
[root@rhel5 pam.d]# cat vsftpd
#%PAM-1.0
auth        required     /lib/security/pam_mysql.so user=vftp passwd=123456 host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=passwd crypt=0
account     required     /lib/security/pam_mysql.so user=vftp passwd=123456 host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=passwd crypt=0
[root@rhel5 pam.d]#
上面涉及到的参数,只要对应前面数据库的设置就可以明白。这里需要说明的参数是crypt参数。Crypt表示口令字段中的口令的加密方式:crypt=0,口令以明文方式保存在数据库中;crypt=1,口令使用unix系统的DES加密方式加密后保存在数据库中;crypt=2,口令经过mysql的password()函数加密后保存。
注意:
crypt=0 明文密码
crypt=1:使用crypt()函数(对应数据库里的encrypt(),encrypt()随机产生salt)
crypt=2:使用mysql中的password()函数加密。
Crypt=3:表示使用md5的散列方式。
6.虚拟用户进一步设置。
        vsftpd里新添加了virtual_use_local_privs参数,当该参数为yes时,虚拟用户使用与本地用户相同的权限。但该参数为no时,虚拟用户使用与匿名用户相同的权限。这两种方法相比,后者更加严格一些。特别是在有写访问的情形下。默认情况为yes。当virtual_use_local_privs为yes时,只要设置write_enable=yes,虚拟用户就可以拥有写权限。当virtual_use_local_privs为no时,对虚拟用户的设置更加严格些。
 
1)当virtual_use_local_privs为yes时
 
vsftpd的配置文件内容如下:
anonymous_enable=no
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
tcp_wrappers=YES
guest_enable=yes
guest_username=vftp
chroot_local_user=yes
local_root=/data
virtual_use_local_privs=yes
这样虚拟用户就拥有写入的权限了,尝试登陆ftp服务器,可以正常登陆ftp服务器。
2)当virtual_use_local_privs为no时
         设置三个虚拟用户。admin具有管理权限;upload用户只拥有上传权限;download用户只拥有下载权限。
设置虚拟用户各自配置文件
[root@rhel5 ~]# mkdir /etc/vsftpd/vsftpd_user_conf
[root@rhel5 ~]# cd /etc/vsftpd/vsftpd_user_conf
[root@rhel5 vsftpd_user_conf]# touch admin upload download
[root@rhel5 vsftpd_user_conf]# vi admin
write_enable=yes
anon_world_readable_only=no
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
local_root=/data
[root@rhel5 vsftpd_user_conf]# vi upload
write_enable=yes
anon_world_readable_only=no
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=no
local_root=/data
[root@rhel5 vsftpd_user_conf]# vi download
write_enable=no
anon_world_readable_only=no
anon_upload_enable=no
anon_mkdir_write_enable=no
anon_other_write_enable=no
local_root=/data
vsftpd的配置文件内容入下:
anonymous_enable=no
local_enable=YES
local_umask=022
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
idle_session_timeout=600
data_connection_timeout=120
listen=YES
pam_service_name=vsftpd
tcp_wrappers=YES
guest_enable=yes
guest_username=vftp
chroot_local_user=yes
virtual_use_local_privs=no
user_config_dir=/etc/vsftpd/vsftpd_user_conf
这样不同的用户就具有不同的权限登陆ftp服务器进行操作。