1、FTP服务器的一些基本概念
(1)FTP连接方式
控制连接:标准端口为21,用于发送FTP命令信息。
数据连接:标准端口为20,用于上传、下载数据。
(2)数据连接的建立类型
主动模式:服务端从20端口主动向客户端发起连接。
被动模式:服务端在指定范围内的某个端口被动等待客户端发起连接。
一般都采用被动模式。主动模式存在安全隐患,客户机很容易发起DdoS攻击。
(3)FTP传输模式
文本模式:ASCII模式,以文本序列传输数据。
二进制模式:Binary模式,以二进制序列(比特流)传输数据。
ASCII模式一般只用于纯文本文件传输,而Binary模式更适合传输程序、图片等文件。尤其是对于可执行文件,如果把可执行文件以文本模式传输,则下载下来的文件将无法正常使用。
在rhel6中默认采用二进制模式,在rhel6以前的版本中默认采用文本模式,为了提高可靠性,rhel6不再支持文本模式。
(4)FTP用户的类型
匿名用户:anonymous或ftp,这两个其实是同一个用户。
本地用户:帐号名称、密码等信息保存在passwd、shadow文件中。但是系统用户在访问时默认只能访问自己的主目录,而不是vsftpd的主目录/var/ftp
虚拟用户:使用独立的帐号/密码数据文件。
2、vdftpd服务
后台进程:vsftpd
启动脚本:/etc/init.d/vsftpd
类型:System V 服务
使用端口:20(ftp-data),21(ftp)
所需RPM包:vsftpd
配置文件:/etc/vsftpd/vsftpd.conf
查看配置文件帮助:man vsftpd.conf
默认主目录是:/var/ftp
3、配置匿名用户下载和上传
[root@test ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
3.1安装FTP软件包,客户端和服务器端:
tftp-server-0.49-7.el6.i686
ftp-0.17-51.1.el6.i686
tftp-0.49-7.el6.i686
vsftpd-2.2.2-6.el6_0.1.i686
lftp-4.0.9-1.el6.i686
gvfs-obexftp-1.4.3-12.el6.i686
启动服务,并设为开机自动
service vsftpd start
chkconfig vsftpd on
编辑主配置文件/etc/vsftpd/vsftpd.conf
anonymous_enable=YES 表示允许匿名用户访问。
local_enable=YES 表示允许使用系统用户访问,
write_enable=YES 表示允许允许匿名用户或系统用户具有写入权限
将“/var/ftp/pub”目录的属主改为ftp,即可赋予匿名用户写入权限
[root@test ~]# chown ftp /var/ftp/pub/
同时在配置文件/etc/vsftpd/vsftpd.conf中增加以下几行:
anon_upload_enable=YES #表示允许匿名用户上传
anon_mkdir_write_enable=YES #表示允许匿名用户创建目录
anon_umask=022 #表示设置匿名用户的umask值
anon_max_rate=500000 #表示对匿名用户的传输速率进行限制,单位为字节。
重启服务:service vsftpd restart(reload)
3.2、在客户端使用匿名用户访问测试
此时匿名用户可以新建文件夹,可以上传文件,如下图:
4、配置本地用户上传和下载
(1)vsftpd可以直接使用Linux系统的本地用户作为FTP用户。
使用本地用户登录FTP服务器后,默认将位于用户自己的主目录中,且具有读写权限。
如利用test用户访问ftp,那么默认将进入到的目录是/home/test。
创建系统用户,并设置密码,并在主目录中放置一个测试文件:
useradd ftptest
passwd ftptest
echo ‘ftp test’ > /home/ftptest/ftptest.txt
创建系统用户test,并设置密码:
useradd test
passwd test
(2)实现的场景一:允许用户test登录,且登录成功后位于自己的家目录中。不允许ftptest用户登录
配置参数:
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user =YES
chroot_list_enable=NO
chroot_list_file=/etc/vsftpd/chroot_list
local_umask=022
userlist_enable=YES
userlist_deny=NO
将test用户加入到
/etc/vsftpd/user_list文件。
[root@test vsftpd]# vi /etc/vsftpd/user_list
test
[root@test ~]# cd /home/test/
[root@test test]# ls
test.txt 新建文件夹
测试:
(3)实现场景二:允许ftptest用户登录,登录成功后位于/data目录,禁止test用户登录。
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user =YES
chroot_list_enable=NO
chroot_list_file=/etc/vsftpd/chroot_list
local_umask=022
userlist_enable=YES
userlist_deny=NO
local_root=/data
将ftptest用户加入到 /etc/vsftpd/user_list文件。从此文件中删除test用户。
[root@test vsftpd]# vi /etc/vsftpd/user_list
ftptest
配置参数解释:
-
anonymous_enable=NO //禁止匿名用户登录
-
local_enable=YES //是否允许本地系统用户访问
-
write_enable=YES // 表示允许允许匿名用户或系统用户具有写入权限
-
chroot_local_user =YES // 本地用户在访问时只能访问自己家目录
-
chroot_list_enable=NO //指定一些用户访问限止在自己的home目录下,就是只能访问自己的家目录
-
chroot_list_file=/etc/vsftpd/chroot_list //在/etc/vsftpd/chroot_list文件中中列出的是被限制的用户的列表,文件不存在得新建
-
local_umask=022 // 设定本地用户上传文件所用的掩码。
-
local_root=/data //设置用户登陆时是访问ftp服务的主目录/data
对于chroot_local_user与chroot_list_enable的组合效果,可以参考下表:
|
chroot_local_user=YES
|
chroot_local_user=NO
|
chroot_list_enable=YES
|
1、所有用户都被限制在其主目录下; 2、使用chroot_list_file指定的用户列表,这些用户作为“例外”,不受限制
|
1、所有用户都不被限制其主目录下;
2、使用chroot_list_file指定的用户列表,这些用户作为“例外”,受到限制
|
chroot_list_enable=NO
|
1、所有用户都被限制在其主目录下; 2、不使用chroot_list_file指定的用户列表,没有任何“例外”用户
|
1、所有用户都不被限制其主目录下;
2、不使用chroot_list_file指定的用户列表,没有任何“例外”用户
|
(4)关于用户访问控制
vsftpd中提供了2个与本地用户相关的配置文件:
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/ftpusers,包含的用户账号将被禁止登录vsftpd服务器,不管该用户是否在/etc/vsftpd/user_list文件中出现。
通常将root、bin、daemon等特殊用户列在该文件中,禁止用于登录FTP服务。
/etc/vsftpd/user_list,该文件中包含的用户账户可能被禁止登录,也可能被允许登录,具体在主配置文件vsftpd.conf中决定。
当存在“userlist_enable=YES”的配置项时,/etc/vsftpd/user_list文件生效。如果配置“userlist_deny=YES”,则
仅禁止列表中的用户账户登录,如果配置“userlist_deny=NO”,则仅允许列表中的用户账户登录。
userlist_enable=YES 是系统的默认设置,表示启用userlist用户列表。
userlist_deny=NO 是我们后来添加的,表示只允许列表中的用户登录。
5、配置FTP虚拟用户下载和上传(多个虚拟用户通过本地用户进行登录)
所谓虚拟账户是指:存放于独立数据库文件中的FTP用户账户,可以将他们映射到某个不能登录的系统用户账号上,进一步增强FTP服务器的安全性
(1)、创建虚拟用户数据库文件
使用db_load命令工具创建Berkeley DB格式的数据库文件。db_load工具由db4-utils软件包提供。安装db4_utils组件。
建立一个文本格式的用户名/密码 列表文件,用于存放虚拟用户账号。文件名可以随意,文件一般保存在/etc/vsftpd目录
[root@test ~]# vim /etc/vsftpd/login.txt
harry
123
natasha
123 # 文件中的奇数行表示用户名,偶数行为上一行用户所对用的密码。
以此文件为数据源通过db_load工具创建出Berkeley DB格式的数据库文件:
[root@test ~]# cd /etc/vsftpd/
[root@test ~]# db_load -T -t hash -f logins.txt logins.db
db_load命令是一种固定用法,其中的“-T”选项表示允许非Berkeley DB的应用程序使用从文本格式转换的DB数据库文件,“-t hash”选项指定读取数据文件的基本方法,“-f”选项用于指定数据的源文件。
最后为了提高虚拟用户账号的安全性,最好将这两个存放虚拟用户账号的文件的权限都设为600,即只有root用户具有读取和写入权限。
chmod 600 logins.txt
chmod 600 logins.db
(2)创建虚拟用户的映射账号
vsftpd服务对虚拟用户其实是采用了映射的控制方式,把所有的虚拟用户账号都对应到了同一个系统用户账号上,并将这个系统用户的主目录作为所有虚拟用户登录后共用的FTP根目录。
useradd -d /var/ftproot -s /sbin/nologin virtual
chmod 755 /var/ftproot
在useradd命令中,利用-d选项指定了用户的主目录,利用-s选项禁止用户登录。然后再修改目录权限,使得其他用户可以访问。
(3)创建PAM认证文件
对虚拟用户的身份认证是通过PAM机制来实现的,PAM是Linux系统中的一个独立API(应用程序接口),它提供了各种验证模块以供其它程序调用。
当这些程序需要进行用户身份验证的操作时,就可以直接调用PAM的相应模块,而无需由自己来提供验证功能。所以PAM在Linux系统中提供了统一的身份验证机制。
PAM的认证文件都统一存放在/etc/pam.d/目录中,下面我们在这个目录中创建一个FTP虚拟用户的认证文件:
vim /etc/pam.d/vsftpd.vu【新建文件】
auth required pam_userdb.so db=/etc/vsftpd/logins
account required pam_userdb.so db=/etc/vsftpd/logins
在文件中,通过“db=/etc/vaftpd/logins”参数指定了要使用的虚拟用户数据库文件的位置,注意这里不需要写“.db” 的扩展名。
(4)修改vsftp配置,添加虚拟用户支持
原有配置:
anonymous_enable=NO
local_enable=YES * #由于需要映射本地用户,所以此项必须启用
write_enable=YES * #表示允许写入。
local_umask=022
pam_service_name=vdftpd
tcp_wrappers=YES
userlist_enable=YES
anon_umask=022 * #在vsftpd服务中,虚拟用户被默认作为匿名用户进行处理以降低权限 ,因此对应的配置项通常以anon_开头
anon_max_rate=500000
添加:
guest_enable=YES #表示启用虚拟用户映射功能
guest_username=virtual #表示指定所映射的系统用户名称
pam_service_name=vsftpd.vu #表示指定PAM认证文件
user_config_dir=/etc/vsftpd/vuser #表示虚拟用户配置文件的存放目录。
(5)创建虚拟用户配置文件
为了对虚拟用户进行精确控制,实现不同用户拥有不同的权限,还需要为每个虚拟用户建立独立的配置文件,在vsftpd.conf配置文件中我们已经指定了虚拟用户配置文件的存放位置/etc/vsftpd/vuser。
下面我们首先创建虚拟用户配置文件存放目录,然后为harry用户创建配置文件,文件名即是用户名:
mkdir /etc/vsftpd/vuser
cd /etc/vsftpd/vuser
vim harry
然后设置允许harry用户上传,设置方法同匿名用户:
anon_upload_enable=YES
anon_mkdir_write_enable=YES
再为natasha也创建一个配置文件,如果natasha只允许下载,那么只需要有一个配置文件即可,文件内容保持空白。
touch natasha
重启服务:service vsftpd restart
这样虚拟用户便全部设置好了,harry用户具有下载和上传的权限,而natasha只能下载不能上传。
(6)登录测试
防火墙的配置:
添加规则:
iptables -t filter -A INPUT -s 192.168.0.0/16 -p tcp --dport 21 -j ACCEPT
SElinux配置
set -P allow_ftpd_anon_write on
set -P allow_ftpd_full_access on
set -P ftp_home_dir on