FTP可以通过很多软件实现,我们linux下面最常用的FTP服务器架设使用vsftpd软件
vsftpd 是一个基于GPL发布的FTP服务器软件。其中的vs是“ Very Secure”的缩写,由此名称缩写可以看出,本服务器的初衷就是服务的安全性。
当然,vsftpd也是REDHAT默认安装的ftp服务器软件
后台进程:vsftpd
类型:System V 服务
使用端口:20(ftp-data),21(ftp)
所需RPM包:vsftpd
配置文件/etc/vsftpd/vsftpd.conf
FTP的主动模式和被动模式很重要
主动模式:
client 先连接服务器的 21端口(命令端口),然后client开放一个大于1024的端口等待服务器的20端口连接,21号端口的链接建立以后,服务器就用20去连接client开放的端口,简单来说就是服务器主动连客户端啦
基于上面的连接方式,如果client端有个防火墙,服务器的20端口就连接不进入,导致会连接失败。
被动模式:
就是client开启大于1024的X端口连接服务器的21(命令端口),同时开启X+1端口
当21号端口连接成功后,client会发送PASV命令,通知服务器自己处于被动模式,服务器收到这个消息后,就会开放一个大于1024的端口Y通知client,client接到通知后就会用X+1来连接服务器的Y端口,简单的说就是client主动连接服务器
一般我们使用的是主动模式
大家了解被动模式就可以了,当你架设FTP服务器,出现这样的情况,你应该想到可以使用被动模式来解决,当然防火墙一般也支持FTP的追踪模块,会自动识别自己发出的FTP数据请求。这样制动模式也能返回数据
下面我们先安装vsftpd吧
所有服务里面只有vsftpd 没有依耐关系,其他服务都要yum来安装或解决其依赖关系哈~
没有就安装下~
我们来说vsftpd的配置文件
大家切换到/etc/vsftpd目录 ,这个目录就是vsftpd的配置文件存放的目录
image
第一个文件ftpusers是用户控制文件,在这个文件里面的用户,默认是不可以使用vsftpd服务的。
第二个文件user_list默认功能和第一个一样,但是通过配置,我们可以让只有在第二个文件里的用户才能使用vsftpd服务,这样新加入的用户就不会自动拥有vsftp的使用权,这样可以让vsftpd服务器更加安全
最后一个脚本vsftpd_conf_migrate.sh是vsftpd操作的一些变量和设置,这个不用管的
当然,主角就是 vsftpd.conf ,配置vsftpd,我们操作最多的也就是这个文件了
等会我们会介绍里面的内容 ,现在大家看看自己的 /etc/passwd文件,是不是多了一个ftp的用户?
[root@rhel5 vsftpd]# cat /etc/passwd |grep ftp
大家还知道他的执行shell的特点吧
/sbin/nologin shell
这个是虚拟用户使用的,不具有登陆系统的权限。他只能使用vsftpd这样的服务器登陆用
还有这个用户的家目录是哪个,大家能从passwd文件中看出来吗?
/var/ftp这个就是ftp用户的家目录
他和其他用户不一样,他的家目录没在/home下面,在匿名登陆的时候,系统默认使用的用户就是ftp用户 ,用户登陆成功后就会进入自己的家目录,所以匿名用户登陆就会进入 / var/ftp目录,下面我们看看 ftp家目录的权限
image
大家注意,家目录的权限是755,这个权限是不能改变的。切记!切记!!
vsftpd安装好,默认就可以匿名下载,所以达到第一个功能,我们要做的就只是启动服务器
使用service vsftpd start来启动vsftpd服务
也可以使用 chkconfig vsftpd . 来打开2-5级别系统启动时启动vsftpd
image
现在我们先用win下面的资源管理来测试ftp服务器
image
成功登陆了
顺便在var/ftp/pub目录里面建立些文件,看能不能下载,可以下载哈~
image
刚才我们完成了匿名用户的测试,现在我们在linux下测试
linux最经典的ftp client软件lftp
使用lftp 软件:lftp 服务器IP地址
这样就可以登陆进去了,使用“?”可以查看这个模式下可以使用的命令
一般使用的命令有这几个:
ls 查看
cd 切换目录
put 文件名 上传
get 文件名 下载
下载的文件默认放在用户当前登陆的目录,所以用户一定要对当前的目录有写入权限
image
看下有没下载成功哈~
image
匿名用户默认不能上传哈~
image
下面我们使用ftp软件做client来登陆服务器,因为在救援模式下是没有lftp软件的,而且win下面也没有lftp软件,我们用命令提示符来做ftp的登陆
打开cmd
ftp 192.168.0.188
image
用户名使用ftp,密码为空
image
登陆successful
下面我们学习匿名用户的上传功能,这个就比较麻烦了
编辑/etc/vsftpd/vsftpd.conf这个文件
image
这个配置文件很简单,而且每行命令上面都有注释来解释命令的用处
image
anonymous_enable=YES
是否允许匿名ftp(默认为YES),如否则选择NO,基于用户名与密码的访问。
image
anon_upload_enable=YES
是否允许匿名ftp 用户上传(默认被注释即不支持)
image
chroot_list_enable=YES
是否将系统用户限制在自己的home目录下
chroot下季我们还会测试的
chroot_list_file=/etc/vsftpd/chroot_list
如果chroot_list_enable=YES 那么在/etc/vsftpd/chroot_list 中列出的是被限制的用户的列表,这个和上面的连用
image
ftpd_banner=Welcome to blah FTP service.
定制欢迎信息
image
local_enable=YES
是否允许本地用户登录
local_umask=022
默认的umask码
配置文件里面没有anon_umask,其实可以用这条, 权限掩码,比如umask是 022,你创建一个文件本来是666 就要 -022 = 644
image
dirmessage_enable=YES
是否显示目录说明文件, 默认是YES 但需要手工创建.message文件
这个.message,只有用命令登陆或者用工具,才可以看见,他不是一个弹出对话框,而是一段字符
其他的一些参数,大家了解下就好了
connect_from_port_20=YES
是否确信端口传输来自20(ftp-data)
chown_username=username
是否改变上传文件的属主, 如果是需要输入一个系统用户名, 你可以把上传的文件都改成root 属主
xferlog_file=/var/log/vsftpd.log
ftp 传输日志的路径和名字默认是/var/log/vsftpd.log
xferlog_std_format=YES
是否使用标准的ftp xferlog 模式
idle_session_timeout=600
设置默认的断开不活跃session的时间
data_connection_timeout=120
设置数据传输超时时间
ascii_upload_enable=YES
ascii_download_enable=YES

是否使用ascii码方式上传和下载文件
userlist_enable=YES
在/etc/vsftpd/user_list 文件中列出用户不能访问FTP 服务器
tcp_wrappers=YES
是否支持tcp_wrappers
userlist及tcp wrapper 下季我们会讲
我们要配置了
匿名用户上传需要注意这几个地方
1、上传目录ftp用户的写入权限
2、服务器配置支持上传
3、selinux支持上传
下面我们来一步一步的实现,先修改目录权限,创建一个上传用的目录,叫upload,分配ftp用户所有,目录权限是755
image
OK了,就做第二个,修改配置文件
vim /etc/vsftpd/vsftpd.conf
设置行号命令 :set nu
取消27和31行的注释,这两行的意思就是允许匿名用户上传文件
image
第三步修改selinux ,这个也是很多教程没有的一步
修改selinux有两种方法
1、是图形界面
2、是命令行

我们先用图形界面 ( 安装 policycoreutils-gui )
system-config-selinux
image
选择boolean ,点FTP ,第三条,允许匿名用户上传文件,别修改目录的上下文为他要求的
切记,选中后要等会才会出现勾,你别一直点哈,点一次就OK
我们使用命令行来打开
使用getsebool -a | grep ftp 命令可以找到ftp的bool值,然后我们来改
getsebool -a 是显示所有的selinux的布尔值,通过管道,查找与ftp相关的
image
使用setsebool -P allow_ftpd_anon_write . 命令设置布尔值
image
下面我们准备修改上下文
image
然后重新启动服务器
image
image
匿名登录FTP
image
现在我们匿名上传
image
现在匿名上传的文件是禁止删除滴~
image
这样匿名用户的上传就算成功了
好了,今天我们学习了,vsftpd的安装,和常见client软件的使用,还有匿名上传

ftp服务器架设进阶设置
上季我们学习了vsftpd基于匿名用户的下载和上传功能,但是匿名始终是不安全的,所以今天我们就会讲到基于用户的访问和上传
要开启基于用户的访问控制,需要注意两个方面
1、配置文件的修改
2、selinux的修改
接着上季我们的配置,现在我们来修改配置文件
vim /etc/vsftpd/vsftpd.conf
修改12行,是否允许匿名登陆改成NO
注释掉27和31行,意思是不允许匿名用户上传文件和目录
image
OK后,保存退出
第二步,修改selinux了哈
今天我们就不介绍图形界面了,直接使用命令来设置selinux
使用getsebool 找出关于ftp的selinux命令
getsebool -a | grep ftp
image
然后修改selinux,允许用户在家目录写入数据
setsebool -P allow_ftpd_anon_write off
setsebool -P ftp_home_dir .
image
第三步、创建虚拟用户
先创建一个用户,然后修改用户的登陆shell为nologin,让用户不能登陆系统,只能使用ftp之内的服务,然后使用passwd redhat修改密码
image
三步完成以后,就可以重新启动vsftpd服务,然后测试
image
我们先使用win来测试,打开资源管理器
image
现在提示输入用户和密码
image
登陆成功
image
现在测试能否写入数据,测试成功
image
现在ftp上去是可以删除的,在什么地方改,让他只能上传,不能删除呢?
image
这个问题不错,我们可以实现
但是如果自己上传了不能删除,那么谁来删除文件呢?
image
难道每次让服务器管理员来帮你删?好吧,我们来实现这个功能
把local umask 修改成222
image
然后保存,重新启动服务器
image
现在我们来测试,建立一个test vsftpd unmask222文件夹
image
我们删除他试试
image
删除刚才我们建立的目录vsftpd文件夹和UNIXCcode.rar文件试试
image
被成功删除了
image
image
就是本地用户上传文件的权限掩码,权限掩码是基础中文件权限的知识,参考RHCE课程-RH033Linux基础笔记八-文件强制位冒险位、ACL访问控制列表
一般我们都不这样设置,自己的目录自己有完全控制权限是正常,只是在一些公共目录里,我们需要设置强制位和冒险位,让其他用户不能 删除和更改自己的文件
好了,下面我们使用lftp测试
像上季那样lftp 192.168.0.188登陆会失败
image
正确的登陆方法是lftp redhat@192.168.0.188

现在大家使用pwd试试,是不是看见自己在 /home/redhat目录下啊?

image
现在我们cd到/etc 下去试试 ,成功切换

image
现在我们下载系统的passwd 文件试试,下载成功,我们去看看

image
这样系统有多少用户都暴露在我们面前了

image
IE方式redhat登录的ftp界面
image
而且还可以下载shadow密码文件,进行破解。这样是不是很不安全啊,而且黑客还可以去看你服务器的配置文件,和你系统里的一些机密文件
下面我们就要使用chroot功能,修改配置文件,取消94行和96行的注释
意思是,开启chroot_list功能,而且chroot_list文件就在 /etc/vsftpd/目录下面

image
保存退出
chroot list默认是不存在的,需要我们手动建立,把redhat这个用户加到这个文件中,重新启动vsftpd服务

image
现在我们再来测试,现在使用pwd命令就看见自己已经在/下了

image
但是ls 发现这并不是真的/根目录
这里就是用户的家目录,这里没有etc目录,所以切换到etc就会失败

image
还有一点,提醒大家,匿名用户登陆,默认是choot了的
这个就是chroot_list的功能,大家明白了吗?这样就大大提高了我们系统的安全性
OK,下面我们把系统所有用户都加到chroot文件里
如果是很多用户每个都要加入chroot_list吗?可以使用cut命令
cut -d : -f 1 /etc/passwd >> chroot_list
cut命令是切去某一列,-d是每一列的分隔符,-f 是切取第几列,然后重定向到chroot文件
这样所有用户就进去了
我们现在测试的环境是RHEL5.1,防火墙默认是accept,selinux是强制
下面我们测试ftpusers 文件的功能,我们先看看ftpusers这个文件的内容

image
这里面都是些系统用户,ftpusers的功能是,阻止这个文件中的用户登陆
我们把redhat用户加进去,然后重启vsftpd服务
image
现在我们使用redhat登录试试

image
我输入了正确的密码,但是还是登陆失败了
OK,现在我们取消redhat用户的限制,让他可以登陆

image
又可以成功登陆了

image
如果系统有很多用户,不能使用ftp,我们要一个一个添加到这个文件里面,是不是很麻烦啊?
还有,系统添加一个用户也默认有ftp的登陆权限,是不是也不安全?
所以我们要制定更严格的ftp用户策略,我们将通过下面的配置,使只有在user_list文件中的用户才能登录系统
修改配置文件:vim /etc/vsftpd/vsftpd.conf
文件最后添加两行,修改成我图片中的样子
image
然后保存退出,重启vsftpd服务
image
使用刚才的用户测试下看能不能登陆,现在redhat不能登录了哈~

image
能登陆就有问题了,应该是不能登陆哈,然后把redhat用户加入到user_list文件中,重新启动服务,这样就可以登陆了

image
可以登陆了哈~

image
大家测试吧,注意检查ftpusers 这个文件里,不能有测试的用户存在,不然对测试结果要出现误导哈~
现在把ftpusers里的root用户删除了,然后加到user_list中
image
root应该都可以登陆的

image
现在就是访问控制了,使用iptables来控制ftp,只允许本地网络使用自己的ftp服务器
我们不测试本地网络,我们测试只允许某个IP地址访问我们的ftp服务器,这样好测试点
iptables -L 查看filter表的内容
由于我们现在不用NAT,我们就先不讲,只学filter,包过滤
image
iptables分两个表:filter和nat
filter表里面有3个链:
INPUT chain
FORWARD chain
output chain
一般服务器上就用input连,来控制进入服务器的流量和包
下面我们写一个规则:禁止一个IP地址访问
这个IP地址就用你的服务器的IP地址
给INPUT添加一条规则内容
image
匹配源,也就是来自 192.168.0.188这个IP

image
接着就是匹配的协议和端口,我用的是tcp的21端口,也就是ftp服务器的命令连接端口
image
最后就是匹配这个规则的动作 -j REJECT 拒绝哈~
完整的命令就是这样:
在INPUT连中添加一条规则,匹配来自源为192.168.0.254的tcp包,连接自己的21号端口,匹配了的包就被REJECT,拒绝
iptables -A INPUT -s 192.168.0.188 -p tcp --dport 21 -j REJECT

image
查看,这条规则就写进入了,可以使用iptables -nL 查看,n参数的意思是不解析,这样看更直观,速度更快
大家看看他们的差别

修改规则后,保存,切记要保存,不然你的配置重新启动就会丢失

service iptables save
service iptables restart
image
现在我们用被拒绝的IP地址来测试还能不能够访问

image
登录失败了,访问被禁止了
OK,我们删除这条规则
删除INPUT的第五条规则:iptables -D INPUT 5
image
刚才的规则就被删除了,记住:保存

image
再测试

image
成功哈~
下面我们使用tcp_wrapper 来控制vsftpd
解释下tcp_wrapper
tcp_wrapper 就是tcp封装,是运行在介于防火墙和内部服务间的一个模块
只要支持tcp封装的服务,我们都可以使用tcp封装来控制他
那这么查看一个服务是不是支持tcp_wrapper呢?
我给大家介绍两个命令
只有运行这两个命令中其中一个有回显,就证明这个服务支持tcp封装,我们就可以使用tcp封装来控制这个服务的访问
这是第一个命令:
ldd `which vsftpd` | grep libwrap
image
这个是第二个命令:
strings `which vsftpd` | grep host

image
大家运行试试, which vsftpd 是 !旁边那个符号,意思是执行里面的命令取值,不是单引号,单引号的意思是不解释引号里面的内容
怎么使用tcp_wrapper呢,这就需要两个配置文件了
/etc/hosts.deny
/etc/hosts.allow
要拒绝的IP地址我们写入hosts.deny里面,写进去后保存退出就生效,不需要重启之类的操作

image
这样192.168.0.186就被禁止了
image
tcp_wrapper和iptables,我们会跟着课程慢慢深入的介绍
好了,今天的课程就到这里。谢谢大家