RHEL 6.x 搭建企业级FTP
==============================
db4-utils+vsftpd 搭建虚拟用户
mysql+vsftpd 搭建虚拟用户
==============================
为企业搭建基于虚拟用户的FTP服务器是非常有必要的,因为虚拟用户是在服务器上面没有此用户,就算,恶意破坏系统安全的人员得到虚拟用户的账号和密码也不能通过此账号登录到系统,保证了系统的安全性。
一、db4-utils+vsftpd 实现FTP的虚拟用户
1)安装db4-utils和vsftpd
yum -y install vsftpd db4-utils
vsftpd的虚拟用户数据库是使用Berkeley DB格式的数据库文件。建立该数据库文件需要用到db_load命令工具,db_load命令依赖于db4-utils软件包,所以需要安装db4-utils。
2)建立文本格式的用户名和密码列表文件
1
2
3
4
5
6
7
|
cat
>
/etc/vsftpd/virtual_user
.list << EOF
user1
#奇数行为用户名,偶数行为前一行的用户名的密码
123
user2
456
EOF
#此文件中空格也代表一行,不要添加额外的行
|
3)把用户名和密码列表文件,使用db_load工具转化为DB数据库文件
1
2
3
4
5
6
7
|
[root@jie3 vsftpd]
#db_load -T -t hash -f /etc/vsftpd/virtual_user.list /etc/vsftpd/virtual_user.db
[root@jie3 vsftpd]
# file /etc/vsftpd/virtual_user.db
/etc/vsftpd/virtual_user
.db: Berkeley DB (Hash, version 9, native byte-order)
#db_load -T:转换
# -t hash:指定读取数据文件的基本方法
# -f /etc/vsftpd/virtual_user.list:用户名和密码列表文件
#/etc/vsftpd/virtual_user.db:转化为Berkeley DB数据库文件
|
4)建立访问ftp的根目录及虚拟用户对应的系统账号
1
2
3
4
|
[root@jie3 vsftpd]
# useradd -d /var/ftproot -s /sbin/nologin virtual
#此用户不能登录系统,-d指定此用户的家目录
[root@jie3 vsftpd]
# chown virtual:virtual /var/ftproot/
[root@jie3 vsftpd]
# chmod 755 /var/ftproot/
|
5)建立pam认证文件
1
2
3
4
5
6
|
[root@jie3 vsftpd]
# cat > /etc/pam.d/vsftpd.vu << EOF
#%PAM-1.0
auth required pam_userdb.so db=
/etc/vsftpd/virtual_user
account required pam_userdb.so db=
/etc/vsftpd/virtual_user
EOF
##db=/etc/vsftpd/virtual_user 指向刚才用db_load命令生成的数据库文件,后缀名.db可以不写
|
6)修改配置文件,使vsftpd能支持虚拟用户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
######修改/etc/vsftpd/vsftpd.conf配置文件的内容###############
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
userlist_enable=YES
tcp_wrappers=YES
guest_enable=YES
#启用用户映射功能
guest_username=virtual
#将用户映射为之前创建的不能登录系统的用户virtual
pam_service_name=vsftpd.vu
#指定pam认证的文件
local_root=
/var/ftproot
#指定ftp的根目录
user_config_dir=
/etc/vsftpd/chroot_list
#指定给用户配置权限目录的路径
|
7)创建为虚拟用户分配权限的目录,及设置虚拟用户权限的文件,此文件必须以虚拟用户名命名。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[root@jie3 vsftpd]
# mkdir /etc/vsftpd/chroot_list
#创建配置文件里面通过user_config_dir定义的目录名称
[root@jie3 vsftpd]
# touch /etc/vsftpd/chroot_list/user1
#创建之前以用户名命名为文件,此用户存在于用户名密码列表文件中
[root@jie3 vsftpd]
# touch /etc/vsftpd/chroot_list/user2
[root@jie3 vsftpd]
# cd chroot_list/
[root@jie3 chroot_list]
# ls
user1 user2
[root@jie3 chroot_list]
# echo "anon_upload_enable=YES" >>/etc/vsftpd/chroot_list/user1
#为user1用户,设置可以上传文件的权限
[root@jie3 chroot_list]
# cat > /etc/vsftpd/chroot_list/user2 << EOF
> anon_upload_enable=YES
#user2也可以上传文件的权限
> anon_mkdir_write_enable=YES
#为user2用户设置可以创建文件的权限
> EOF
|
8)验证不同用户的不同权限
二、mysql+vsftpd 实现FTP的虚拟用户
1)安装相关软件包
下载mysql pam验证的软件包
wget http://mirrors.sohu.com/fedora-epel/6Server/x86_64/pam_mysql-0.7-0.12.rc1.el6.x86_64.rpm
http://mirrors.sohu.com/fedora-epel/6Server/x86_64/
此网站是RHEL 6.x的epel相关的软件包的地址(可以把epel也做一个yum仓库)
yum -y install mysql-server mysql-devel pam_mysql vsftpd
mysql-server :mysql服务器的软件包
mysql-devel :mysql服务器的开发包
pam_mysql : 实现mysql虚拟用户认证的包
vsftpd :提供ftp服务的软件包
2)建立访问ftp的根目录及虚拟用户对应的系统账号
1
2
3
4
|
[root@jie3 vsftpd]
# useradd -d /var/ftproot -s /sbin/nologin virtual
#此用户不能登录系统,-d指定此用户的家目录
[root@jie3 vsftpd]
# chown virtual:virtual /var/ftproot/
[root@jie3 vsftpd]
# chmod 755 /var/ftproot/
|
3)在mysql数据库服务器上创建存放用户名和密码的表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
[root@jie1 ~]
# service mysqld start #初次启动mysqld服务会等待些时间
Starting mysqld: [ OK ]
[root@jie1 ~]
# mysqladmin -u root password 'redhat' #给登录mysql服务器的root用户设置密码
[root@jie1 ~]
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection
id
is 4
Server version: 5.1.66 Source distribution
Copyright (c) 2000, 2012, 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 |
| mysql |
|
test
|
+--------------------+
3 rows
in
set
(0.00 sec)
mysql> create database ftpdb;
#创建一个存放ftp虚拟用户的数据库
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ftpdb |
| mysql |
|
test
|
+--------------------+
4 rows
in
set
(0.02 sec)
mysql> use ftpdb;
#切换到创建的数据库中
Database changed
mysql> create table
users
(name char(16) binary,
passwd
char(16) binary);
#在ftpdb数据库中新建一张有两个字段名为users的表,一个字段存放用户,一个字段存放用户的密码。
Query OK, 0 rows affected (0.03 sec)
mysql> insert into
users
(name,
passwd
) values (
'tom'
,
'123'
);
#在users表中插入一条数据,name为tom,密码为123
Query OK, 1 row affected (0.00 sec)
mysql> insert into
users
(name,
passwd
) values (
'jerry'
,
'456'
);
#在users表中在插入一条数据,name为jerry,密码为456
Query OK, 1 row affected (0.00 sec)
mysql>
select
* from ftpdb.
users
;
#查询ftpdb数据库中表users的所有数据
+-------+--------+
| name |
passwd
|
+-------+--------+
| tom | 123 |
| jerry | 456 |
+-------+--------+
2 rows
in
set
(0.00 sec)
mysql> grant
select
on ftpdb.
users
to virtual@localhost identified by
'virtual'
;
#grant关键用于设置权限,on后面接数据库的表名, to接用户名,identified by 'virtual',设置virtual用户的密码
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
#刷新同步数据
Query OK, 0 rows affected (0.00 sec)
mysql>
exit
Bye
[root@jie1 ~]
#
|
4)建立pam认证文件
1
2
3
4
5
6
7
8
9
10
11
|
[root@jie1 ~]
# find / -name 'pam_mysql*' #查找一下pam认证支持mysql的库文件
/lib64/security/pam_mysql
.so
[root@jie1 ~]
# cat > /etc/pam.d/mysql_vsftpd << EOF
#%PAM-1.0
auth required
/lib64/security/pam_mysql
.so user=virtual
passwd
=virtual host=localhost db=ftpdb table=
users
usercolumn=name passwdcolumn=
passwd
crypt=0
account required
/lib64/security/pam_mysql
.so user=virtual
passwd
=virtual host=localhost db=ftpdb table=
users
usercolumn=name passwdcolumn=
passwd
crypt=0
EOF
#/lib64/security/pam_mysql.so 指定pam认证支持mysql的库文件的路径
#user=virtual passwd=virtual 指定用户和用户的密码,此用户对数据库有select权限
#crypt表示口令字段中口令的加密方式: crypt=0,口令以明文方式(不加密)保存在数据库中;
#db=ftpdb table=user 指定在数据库服务器新建的数据库和表
|
5)修改配置文件,使vsftpd能支持虚拟用户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
######修改/etc/vsftpd/vsftpd.conf配置文件的内容###############
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
userlist_enable=YES
tcp_wrappers=YES
guest_enable=YES
#启用用户映射功能
guest_username=virtual
#将用户映射为之前创建的不能登录系统的用户virtual
virtual_use_local_privs=NO
pam_service_name=mysql_vsftpd
#指定pam认证的文件
local_root=
/var/ftproot
#指定ftp的根目录
user_config_dir=
/etc/vsftpd/chroot_list
#指定给用户配置权限目录的路径
|
6)创建为虚拟用户分配权限的目录,及设置虚拟用户权限的文件,此文件必须以虚拟用户名命名。用户名为mysql表users中的用户
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
[root@jie1 vsftpd]
# mkdir /etc/vsftpd/chroot_list #创建配置文件中user_config_dir关键字定义的目录
[root@jie1 vsftpd]
# touch chroot_list/tom #在此目录下创建数据库users表中存在的用户,且以用户名命名文件
[root@jie1 vsftpd]
# touch chroot_list/jerry
[root@jie1 vsftpd]
# cd chroot_list/
[root@jie1 chroot_list]
# ls
jerry tom
[root@jie1 chroot_list]
# echo "anon_upload_enable=YES" >tom
[root@jie1 chroot_list]
# cat > jerry << EOF
> anon_upload_enable=YES
> anon_mkdir_write_enable=YES
> EOF
[root@jie1 chroot_list]
# cat tom
anon_upload_enable=YES
[root@jie1 chroot_list]
# cat jerry
anon_upload_enable=YES
anon_mkdir_write_enable=YES
[root@jie1 chroot_list]
# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd
for
vsftpd: [ OK ]
[root@jie1 chroot_list]
#
#当virtual_use_local_privs=YES时,只需设置write_enable=YES,虚拟用户就可以就拥有写权限
#当virtual_use_local_privs=NO时,
# anon_upload_enable=YES时,匿名用户能上传,但不能覆盖和改写删除文件
# anon_mkdir_write_enable=YES时,能建立目录
# anon_other_write_enable=YES时,虚拟用户具有读写权限,和删除权限
|
7)验证不同的用户的权限
小结:为企业搭建基于虚拟用户的vsftpd是非常有必要的,虚拟用户的用户不属于服务器中的用户,这样可以保障服务器的安全隐患。