版权声明:欢迎转载与交流。https://blog.csdn.net/one2more/article/details/89765930
案例背景
公司为适应业务需求,拟搭建一台FTP服务器,为相关客户提供文档的下载。
要求:
1、该FTP服务器对所有互联网开放共享目录,允许下载相关公开文档,
但是禁止上传内容;
2、公司的合作客户和单位能够使用该FTP服务器上传和下载相关文档,
但是不可以删除相关数据;
3、另需保证服务器的稳定运行并对其进行相应优化。
一、需求分析和解决方案
1、考虑到服务器的安全性,所以采用虚拟账号验证登陆机制,并对不同的虚拟账号设置不同的权限限制。
2、为保证服务器的性能,还需根据用户的不同等级对客户端的下载速度和连接数进行相应的限制。
3、创建ftp
虚拟账号,允许大众用户使用ftp账号下载。
4、创建vip
虚拟账号,允许自己的合作单位和客户适应VIP账号可上传、下载。
二、方案实现
1、创建虚拟用户数据库
[root@localhost ~]# vim /etc/vsftpd/vsftpd_virtualusers.txt
//写入以下内容(奇数行为用户名,偶数行为用户密码):
ftp
123456ftp
vip
123456vip
2、利用db_load
工具生成虚拟数据库
[root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualusers.txt /etc/vsftpd_virtualusers.db
// -T 表示允许应用程序将文本文件转译载入数据库;
// -t hash 表示指定加密类型为hash加密;
// -f 指定输出的源文件(即包含用户名和密码的文本文件。此文件格式:奇数行为用户名,偶数行为密码)
[root@localhost ~]# rm -rf /etc/vsftpd/vsftpd_virtualusers.txt
//改文件中保存的为明文的用户名密码,删除以避免信息泄露;
[root@localhost ~]# chmod 600 /etc/vsftpd/vsftp_virtualusers.db
//修改数据库文件访问权限为600避免该文件被系统其它用户修改和查看。
3、配置PAM文件,使ftp经pam认证
为了使服务器能够使用数据库文件(/etc/vsftpd/vsftpd_virtualusers.db)对客户端进行身份验证,需要调用系统的PAM模块。
【1】PAM(Plugable Authentication Module)
为可插拔认证模块。不必重新安装应用系统,
只需通过修改制定的配置文件,调整对该程序的认证方式。
PAM模块的配置文件路径:"/etc/pam.d/"目录,
此目录下保存着大量与认证有关的配置文件,并以服务名称命名。
【2】修改“/etc/pam.d/vsftpd
”配置文件
在行首使用#
注释掉已有文件内容后,写入以下两行内容:
[root@localhost ~]# vim /etc/pam.d/vsftpd
# 在行首使用`#`注释掉已有文件内容后,写入以下内容:
# auth负责认证(用户名、密码等)
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_virtualusers
# account负责统计用户相关信息(账户有效期、权限等)
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_virtualusers
4、创建虚拟账号对应的系统用户及FTP共享的目录
对于公共账号和客户账号,需配置不同的权限,
因此需对两个账号的家目录进行隔离,以控制不同用户对文件的访问。
公共账号ftp,对应系统账号ftpuser,并指定其主目录为/var/ftp/public。
客户账户vip,对应系统账号ftpvip,并指定其主目录为/var/ftp/vip。
【1】创建账号
[root@localhost ~]# useradd -d /var/ftp/public ftpuser
[root@localhost ~]# useradd -d /var/ftp/vip ftpvip
【2】更改目录权限(普通用户只能下载、vip用户可上传可下载)
[root@localhost ~]# chmod -R 500 /var/ftp/public
[root@localhost ~]# chmod -R 700 /var/ftp/vip
5、为每个用户建立单独的配置文件
一个配置文件无法实现对不同用户做不同的限制,因此需要为每个虚拟用
户建立独立的配置文件,并根据需要进行相应的设置。
【1】修改/etc/vsftpd.conf
主配置文件
把anonymous_enable=
改为NO
(禁止匿名访问,必须使用用户名密码);
把local_enable=
改为YES
(允许本地账户ftpuser和ftpvip登录);
把chroot_local_user=
改为YES
(将所有本地用户限制在自己的家目录中);
把pam_service_name=
改为vsftp
(配置vsftp使用的PAM模块为vsftp);
在最后加入:
user_config_dir=/etc/vsftpd/virtualuserconfig
(指定每个虚拟用户的配置文件路径);
max_clients=300
(限制最大连接数为300);
max_per_ip=10
(防止被攻击或恶意大批量下载限制每个IP最多建立10个连接);
【2】建立虚拟账户配置文件
在第【1】步中user_config_dir指定的路径下,建立与虚拟账户同
名的配置文件并添加相应的配置字段。
1)首先建立公共账户ftp的配置文件
[root@localhost ~]# mkdir /etc/vsftpd/virtualuserconfig
[root@localhost ~]# touch /etc/vsftpd/virtualuserconfig/ftp
[root@localhost ~]# vim /etc/vsftpd/virtualuserconfig/ftp
# 写入以下内容:
guest_enable=YES #是否允许匿名/来宾账户访问
guest_username=ftpuser #虚拟账号对应的系统账号
anon_world_readable_only=NO #是否允许匿名用户访问整个系统
anon_max_rate=90000 #访问速度限制为90KB,默认为字节,偏差80%~120%
2)建立vip账户的配置文件
[root@localhost ~]# touch /etc/vsftpd/virtualuserconfig/vip
[root@localhost ~]# vim /etc/vsftpd/virtualuserconfig/vip
# 写入以下内容:
guest_enable=YES #是否允许匿名/来宾账户访问
guest_username=ftpvip #虚拟账号对应的系统账号
anon_umask=077 #设置默认权限
anon_world_readable_only=NO #是否允许匿名用户访问整个系统
write_enable=YES #是否允许在文件系统写入
anon_mkdir_write_enable=YES #是否允许创建目录/文件夹
anon_upload_enable=YES #是否允许匿名用户上传
anon_max_rate=150000 #访问速度限制为150KB,默认为字节,偏差80%~120%
3)重启服务
[root@localhost ~]# service vsftpd restart
三、测试
测试之前先创建测试文件和相关目录
[root@localhost ~]# dd if=/dev/zero of=/var/ftp/public/test.img bs=1M count=500
[root@localhost ~]# mkdir /var/ftp/public/tset.txt
[root@localhost ~]# dd if=/dev/zero of=/var/ftp/vip/testvip1.img bs=1M count=500
[root@localhost ~]# dd if=/dev/zero of=/var/ftp/vip/testvip2.img bs=1M count=500
1、测试虚拟用户ftp(测试下载速度、能否上传、能否删除)
下载速度限制生效、不能上传、不能删除文件
2、测试虚拟账户vip(测试下载速度、能否上传、能否删除、能否新建文件夹)
下载速度限制生效、能够上传、能够新建文件夹、不能删除文件
四、拓展
1、无法访问FTP服务器
关闭防火墙
[root@localhost ~]# service iptables stop #临时关闭防火墙
[root@localhost ~]# chkconfig iptables off #关闭防火墙开机自启动
写入防火墙规则
[root@localhost ~]# iptables -I INPUT -p tcp --dport 21 -j ACCEPT #FTP连接端口
[root@localhost ~]# iptables -I INPUT -p tcp --dport 20 -j ACCEPT #主动模式下的20端口
[root@localhost ~]# iptables-save >/etc/sysconfig/iptables #保存防火墙配置
2、能访问但无法正常登陆(关闭SELinux)
临时关闭SELinux
[root@localhost ~]# setenforce 0 #临时关闭防火墙
永久关闭SELinux
[root@localhost ~]# vim /etc/selinux/config #把“SELINUX=”项设置为“disabled”
写入SELinux规则
[root@localhost ~]# setsebool -P ftpd_full_access on
3、使vip账号拥有删除文件和改名权限
编辑/etc/vsftpd/virtualuserconfig/vip
配置文件,加入一行anon_other_write_enable=YES
[root@localhost ~]# vim /etc/vsftpd/virtualuserconfig/vip
# 写入以下内容:
guest_enable=YES #是否允许匿名/来宾账户访问
guest_username=ftpvip #虚拟账号对应的系统账号
anon_umask=077 #设置默认权限
anon_world_readable_only=NO #是否允许匿名用户访问整个系统
write_enable=YES #是否允许在文件系统写入
anon_mkdir_write_enable=YES #是否允许创建目录/文件夹
anon_upload_enable=YES #是否允许匿名用户上传
anon_max_rate=150000 #访问速度限制为150KB,默认为字节,偏差80%~120%
anon_other_write_enable=YES #允许拥有其他的写权限(加上之前的限制相当于完全开放写权限)