背景:
生产环境经常会有传输导数情况存在,应生产人员要求部署相关ftp服务。
需要访问FTP服务端提供的资源时,可以使用专门的FTP客户端/管理工具(FTP命令程序、Filezilla图形工具),也可以使用Web浏览器、下载工具(比如wget)等支持FTP协议的通用软件。
定位匿名访问FTP资源的地址形式如下:
ftp://服务器地址/,对应服务器上的 /var/ftp/ 目录
ftp://服务器地址/path/to/file,对应服务器上的 /var/ftp/path/to/file 文件
对于要求登录验证才能访问的FTP资源,可以在地址中指定用户名、密码信息:
ftp://user:pass@服务器地址/,对应服务器上的用户家目录 ~user/
ftp://user:pass@服务器地址/path/to/file,对应服务器上的 ~user/path/to/file 文件
环境:
两台物理机IP为192.168.1.3与192.168.1.5
步骤:
1、使用yum安装vsftpd软件包
代码语言:javascript复制[root@bigdata1 ~]# yum -y install vsftpd
2、启用vsftpd服务,并设为开机自动运行
代码语言:javascript复制[root@bigdata1 ~]# service vsftpd restart;chkconfig vsftpd on
Redirecting to /bin/systemctl restart vsftpd.service
注意:正在将请求转发到“systemctl enable vsftpd.service”。
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
[root@bigdata1 ~]# netstat -anptu |grep vsftpd
tcp6 0 0 :::21 :::* LISTEN 1288/vsftpd
3、为ftp访问建立测试文件
在匿名FTP起始目录/var/ftp/下默认有一个pub/子目录(用来提供开放资源),在此目录下建立一个名为anon.txt的文件
代码语言:javascript复制[root@bigdata1 ~]# cd /var/ftp/pub/
[root@bigdata1 pub]# echo '1111111'>a.txt
[root@bigdata1 pub]# cat a.txt
1111111
4、新建用户list并设置好密码,此用户即可用做ftp用户使用,在list家目录下建立一个名为list.txt的文件,内容随意。
代码语言:javascript复制[root@bigdata1 pub]# useradd list
[root@bigdata1 pub]# echo 123456 |passwd --stdin list
更改用户 list 的密码 。
passwd:所有的身份验证令牌已经成功更新。
代码语言:javascript复制[root@bigdata1 pub]# su - list
[list@bigdata1 ~]$ touch b.txt
[list@bigdata1 ~]$ echo '123456' >b.txt
[list@bigdata1 ~]$ 登出
5、测试匿名用户登陆
代码语言:javascript复制[root@bigdata3 yum.repos.d]# ftp 192.168.1.3
Connected to 192.168.1.3 (192.168.1.3).
220 (vsFTPd 3.0.2)
Name (192.168.1.3:root): ftp 匿名用户ftp
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,1,3,240,202).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 18 Sep 02 13:44 pub
226 Directory send OK.
ftp>
6、用户list测试
代码语言:javascript复制[root@bigdata3 yum.repos.d]# ftp 192.168.1.3
Connected to 192.168.1.3 (192.168.1.3).
220 (vsFTPd 3.0.2)
Name (192.168.1.3:root): list
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,1,3,70,152).
150 Here comes the directory listing.
-rw-rw-r-- 1 1001 1001 0 Sep 02 13:59 b.txt
226 Directory send OK.
衍生问题解决
对于匿名用户ftp来说,默认已经启用禁锢(仅限于起始目录/var/ftp);而对FTP本地用户来说,默认并没有禁锢(不仅可以访 问宿主目录,还可以跳转到其他目录),存在一定安全隐患。若要禁锢本地用户,只需设置 chroot_local_user = YES即可。
vsftpd服务提供了两个用户列表文件,其中 /etc/vsftpd/ftpusers 作为默认的黑名单使用,列在此文件内的用户将无法登入FTP。
而另一个文件 /etc/vsftpd/user_list只是一个用户名列表,根据配置参数 userlist_enable 的值是YES(默认)还是NO来决定是否启用此列表。一旦启用此列表文件以后,如果配置参数 userlist_deny的值是YES(默认)则此列表为黑名单(拒绝指定的用户),如果是NO则此列表作为白名单使用。
不安全隐患点01:
用户list可登陆ftp机器下载和查看本机所有有权限文件
代码语言:javascript复制 [root@bigdata3 yum.repos.d]# ftp 192.168.1.3
Connected to 192.168.1.3 (192.168.1.3).
220 (vsFTPd 3.0.2)
Name (192.168.1.3:root): list
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,1,3,93,167).
150 Here comes the directory listing.
-rw-rw-r-- 1 1001 1001 0 Sep 02 13:59 b.txt
226 Directory send OK.
ftp> cd / 切换到ftp-server的机器/目录下
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,1,3,249,224).
150 Here comes the directory listing.
lrwxrwxrwx 1 0 0 7 Aug 16 14:46 bin -> usr/bin
dr-xr-xr-x 4 0 0 4096 Aug 16 14:50 boot
drwxr-xr-x 20 0 0 3160 Sep 02 09:54 dev
drwxr-xr-x 77 0 0 8192 Sep 02 13:52 etc
drwxr-xr-x 4 0 0 30 Sep 02 13:52 home
lrwxrwxrwx 1 0 0 7 Aug 16 14:46 lib -> usr/lib
lrwxrwxrwx 1 0 0 9 Aug 16 14:46 lib64 -> usr/lib64
drwxr-xr-x 2 0 0 6 Aug 12 2015 media
drwxr-xr-x 2 0 0 6 Aug 12 2015 mnt
drwxr-xr-x 3 0 0 25 Aug 16 18:30 opt
dr-xr-xr-x 355 0 0 0 Sep 02 09:54 proc
dr-xr-x--- 4 0 0 4096 Aug 16 18:31 root
drwxr-xr-x 21 0 0 600 Sep 02 10:02 run
lrwxrwxrwx 1 0 0 8 Aug 16 14:46 sbin -> usr/sbin
drwxr-xr-x 2 0 0 6 Aug 12 2015 srv
dr-xr-xr-x 13 0 0 0 Sep 02 09:54 sys
drwxrwxrwt 7 0 0 4096 Sep 02 10:35 tmp
drwxr-xr-x 13 0 0 4096 Aug 16 14:46 usr
drwxr-xr-x 20 0 0 4096 Sep 02 10:02 var
dr-xr-xr-x 8 0 0 2048 Dec 09 2015 yum
226 Directory send OK.
修改vsftpd.conf配置文件,启用禁锢本地用户的设置,建议在配置文件末尾修改,不去修改配置文件中注释。
代码语言:javascript复制chroot_local_user=YES
allow_writeable_chroot=YES
测试
代码语言:javascript复制[root@bigdata3 ~]# ftp 192.168.1.3 连接ftp
Connected to 192.168.1.3 (192.168.1.3).
220 (vsFTPd 3.0.2)
Name (192.168.1.3:root): list 用户list
331 Please specify the password.
Password: 密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls 查看当前目录文件,为list家目录
227 Entering Passive Mode (192,168,1,3,121,213).
150 Here comes the directory listing.
-rw-rw-r-- 1 1001 1001 0 Sep 02 13:59 b.txt
226 Directory send OK.
ftp> cd / 变换目录
250 Directory successfully changed.
ftp> ls 查看目录仍然为用户家目录,禁锢生效
227 Entering Passive Mode (192,168,1,3,32,249).
150 Here comes the directory listing.
-rw-rw-r-- 1 1001 1001 0 Sep 02 13:59 b.txt
226 Directory send OK.
使用FTP黑白名单:
1、测试FTP黑名单文件/etc/vsftpd/ftpusers
添加一个用户mike,并设好密码,并将mike加入到FTP黑名单
代码语言:javascript复制[root@bigdata1 pub]# vi /etc/vsftpd/ftpusers
测试mike登陆失败
代码语言:javascript复制[root@bigdata3 ~]# ftp 192.168.1.3
Connected to 192.168.1.3 (192.168.1.3).
220 (vsFTPd 3.0.2)
Name (192.168.1.3:root): mike
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
2、测试FTP白名单文件/etc/vsftpd/user_list
修改vsftpd服务配置,确认userlist_enable=YES,并在其下方添加一行新的配置语句userlist_deny=NO,然后重载服务
测试:
新增hadoop用户放置在白名单中进行测试,只有加入白名单的hadoop可以登陆。
代码语言:javascript复制[root@bigdata3 ~]# ftp 192.168.1.3
Connected to 192.168.1.3 (192.168.1.3).
220 (vsFTPd 3.0.2)
Name (192.168.1.3:root): hadoop
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,1,3,62,50).
150 Here comes the directory listing.
226 Directory send OK.
ftp> 221 Goodbye.
[root@bigdata3 ~]# ftp 192.168.1.3
Connected to 192.168.1.3 (192.168.1.3).
220 (vsFTPd 3.0.2)
Name (192.168.1.3:root): list
530 Permission denied.
Login failed.
ftp> 221 Goodbye.
[root@bigdata3 ~]# ftp 192.168.1.3
Connected to 192.168.1.3 (192.168.1.3).
220 (vsFTPd 3.0.2)
Name (192.168.1.3:root): mike
530 Permission denied.
Login failed.
当用户即在白名单又在黑名单中用户虽然被接受,但在输入密码后仍然被拒绝。
FTP并发以及带宽限制
关于vsftpd服务器的并发及带宽限制,主要用到以下配置参数
max_clients:限制并发的客户端个数
max_per_ip:限制每个客户机IP的并发连接数
anon_max_rate:匿名最大速度(字节/秒)
local_max_rate:验证用户最大速率(字节/秒)
限制并发连接数
修改vsftpd服务配置,在末尾添加并发限制并重载服务
代码语言:javascript复制[root@bigdata3 ~] vim /etc/vsftpd/vsftpd.conf
max_clients=100
max_per_ip=2
访问vsftpd服务器时,只要客户端不主动断开连接,且闲置不超过300秒(默认),vsftpd服务器都会保留此连接。因此可以开多个命令终端同时登入此FTP服务器,以测试并发限制效果。
匿名登入FTP服务器且不退出,前两次连接都是成功的,当第三次(超过2)连接时,会出现“There are too many connections .. ..”的报错提示,连接失败
代码语言:javascript复制[root@bigdata3 ~]# ftp 192.168.1.3
Connected to 192.168.1.3 (192.168.1.3).
421 There are too many connections from your internet address. //连接数超限
ftp> pwd
Not connected. //未连接成功
ftp> quit
限制FTP传输速度
修改vsftpd服务配置,在末尾添加速度限制,并重载服务
代码语言:javascript复制[root@svr5 ~]# vim /etc/vsftpd/vsftpd.conf
.. ..
anon_max_rate=50000
local_max_rate=500000
[root@svr5 ~]# service vsftpd reload
关闭 vsftpd: [确定]
为 vsftpd 启动 vsftpd: [确定]
匿名登陆问题
vi /etc/vsftpd/vsftpd.conf
修改其中参数
anonymous_enable=YES 将其改成NO