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的配置文件存放的目录
第一个文件
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家目录的权限
大家注意,家目录的权限是755,这个权限是不能改变的。切记!切记!!
vsftpd安装好,默认就可以匿名下载,所以达到第一个功能,我们要做的就只是启动服务器
使用
service vsftpd start来启动vsftpd服务
也可以使用
chkconfig vsftpd . 来打开2-5级别系统启动时启动vsftpd
现在我们先用win下面的资源管理来测试ftp服务器
成功登陆了
顺便在var/ftp/pub目录里面建立些文件,看能不能下载,可以下载哈~
刚才我们完成了匿名用户的测试,现在我们在linux下测试
linux最经典的ftp client软件lftp
使用lftp 软件:
lftp 服务器IP地址
这样就可以登陆进去了,使用“
?”可以查看这个模式下可以使用的命令
一般使用的命令有这几个:
ls 查看
cd 切换目录
put 文件名 上传
get 文件名 下载
下载的文件默认放在用户当前登陆的目录,所以用户一定要对当前的目录有写入权限
看下有没下载成功哈~
匿名用户默认不能上传哈~
下面我们使用ftp软件做client来登陆服务器,因为在救援模式下是没有lftp软件的,而且win下面也没有lftp软件,我们用命令提示符来做ftp的登陆
打开cmd
ftp 192.168.0.188
用户名使用ftp,密码为空
登陆successful
下面我们学习匿名用户的上传功能,这个就比较麻烦了
编辑
/etc/vsftpd/vsftpd.conf这个文件
这个配置文件很简单,而且每行命令上面都有注释来解释命令的用处
anonymous_enable=YES
是否允许匿名ftp(默认为YES),如否则选择NO,基于用户名与密码的访问。
anon_upload_enable=YES
是否允许匿名ftp 用户上传(默认被注释即不支持)
chroot_list_enable=YES
是否将系统用户限制在自己的home目录下
chroot下季我们还会测试的
chroot_list_file=/etc/vsftpd/chroot_list
如果chroot_list_enable=YES 那么在/etc/vsftpd/chroot_list 中列出的是被限制的用户的列表,这个和上面的连用
ftpd_banner=Welcome to blah FTP service.
定制欢迎信息
local_enable=YES
是否允许本地用户登录
local_umask=022
默认的umask码
配置文件里面没有anon_umask,其实可以用这条, 权限掩码,比如umask是 022,你创建一个文件本来是666 就要 -022 = 644
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
OK了,就做第二个,修改配置文件
vim /etc/vsftpd/vsftpd.conf
设置行号命令
:set nu
取消27和31行的注释,这两行的意思就是允许匿名用户上传文件
第三步修改selinux ,这个也是很多教程没有的一步
修改selinux有两种方法
1、是图形界面
2、是命令行
我们先用图形界面 ( 安装 policycoreutils-gui )
system-config-selinux
选择boolean ,点FTP ,第三条,允许匿名用户上传文件,别修改目录的上下文为他要求的
切记,选中后要等会才会出现勾,你别一直点哈,点一次就OK
我们使用命令行来打开
使用
getsebool -a | grep ftp 命令可以找到ftp的bool值,然后我们来改
getsebool -a 是显示所有的selinux的布尔值,通过管道,查找与ftp相关的
使用
setsebool -P allow_ftpd_anon_write . 命令设置布尔值
下面我们准备修改上下文
然后重新启动服务器
匿名登录FTP
现在我们匿名上传
现在匿名上传的文件是禁止删除滴~
这样匿名用户的上传就算成功了
好了,今天我们学习了,vsftpd的安装,和常见client软件的使用,还有匿名上传
ftp服务器架设进阶设置
上季我们学习了vsftpd基于匿名用户的下载和上传功能,但是匿名始终是不安全的,所以今天我们就会讲到基于用户的访问和上传
要开启基于用户的访问控制,需要注意两个方面
1、配置文件的修改
2、selinux的修改
接着上季我们的配置,现在我们来修改配置文件
vim /etc/vsftpd/vsftpd.conf
修改12行,是否允许匿名登陆改成NO
注释掉27和31行,意思是不允许匿名用户上传文件和目录
OK后,保存退出
第二步,修改selinux了哈
今天我们就不介绍图形界面了,直接使用命令来设置selinux
使用getsebool 找出关于ftp的selinux命令
getsebool -a | grep ftp
然后修改selinux,允许用户在家目录写入数据
setsebool -P allow_ftpd_anon_write off
setsebool -P ftp_home_dir .
第三步、创建虚拟用户
先创建一个用户,然后修改用户的登陆shell为nologin,让用户不能登陆系统,只能使用ftp之内的服务,然后使用passwd redhat修改密码
三步完成以后,就可以重新启动vsftpd服务,然后测试
我们先使用win来测试,打开资源管理器
现在提示输入用户和密码
登陆成功
现在测试能否写入数据,测试成功
现在ftp上去是可以删除的,在什么地方改,让他只能上传,不能删除呢?
这个问题不错,我们可以实现
但是如果自己上传了不能删除,那么谁来删除文件呢?
难道每次让服务器管理员来帮你删?好吧,我们来实现这个功能
把local umask 修改成222
然后保存,重新启动服务器
现在我们来测试,建立一个test vsftpd unmask222文件夹
我们删除他试试
删除刚才我们建立的目录vsftpd文件夹和UNIXCcode.rar文件试试
被成功删除了
一般我们都不这样设置,自己的目录自己有完全控制权限是正常,只是在一些公共目录里,我们需要设置强制位和冒险位,让其他用户不能 删除和更改自己的文件
好了,下面我们使用lftp测试
像上季那样
lftp 192.168.0.188登陆会失败
现在大家使用pwd试试,是不是看见自己在 /home/redhat目录下啊?
现在我们cd到/etc 下去试试 ,成功切换
现在我们下载系统的passwd 文件试试,下载成功,我们去看看
这样系统有多少用户都暴露在我们面前了
IE方式redhat登录的ftp界面
而且还可以下载shadow密码文件,进行激活成功教程。这样是不是很不安全啊,而且***还可以去看你服务器的配置文件,和你系统里的一些机密文件
下面我们就要使用chroot功能,修改配置文件,取消94行和96行的注释
意思是,开启chroot_list功能,而且chroot_list文件就在 /etc/vsftpd/目录下面
保存退出
chroot list默认是不存在的,需要我们手动建立,把redhat这个用户加到这个文件中,重新启动vsftpd服务
现在我们再来测试,现在使用pwd命令就看见自己已经在/下了
但是ls 发现这并不是真的/根目录
这里就是用户的家目录,这里没有etc目录,所以切换到etc就会失败
还有一点,提醒大家,匿名用户登陆,默认是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这个文件的内容
这里面都是些系统用户,ftpusers的功能是,阻止这个文件中的用户登陆
我们把redhat用户加进去,然后重启vsftpd服务
现在我们使用redhat登录试试
我输入了正确的密码,但是还是登陆失败了
OK,现在我们取消redhat用户的限制,让他可以登陆
又可以成功登陆了
如果系统有很多用户,不能使用ftp,我们要一个一个添加到这个文件里面,是不是很麻烦啊?
还有,系统添加一个用户也默认有ftp的登陆权限,是不是也不安全?
所以我们要制定更严格的ftp用户策略,我们将通过下面的配置,使只有在user_list文件中的用户才能登录系统
修改配置文件:
vim /etc/vsftpd/vsftpd.conf
文件最后添加两行,修改成我图片中的样子
然后保存退出,重启vsftpd服务
使用刚才的用户测试下看能不能登陆,现在redhat不能登录了哈~
能登陆就有问题了,应该是不能登陆哈,然后把redhat用户加入到user_list文件中,重新启动服务,这样就可以登陆了
可以登陆了哈~
大家测试吧,注意检查ftpusers 这个文件里,不能有测试的用户存在,不然对测试结果要出现误导哈~
现在把ftpusers里的root用户删除了,然后加到user_list中
root应该都可以登陆的
现在就是访问控制了,使用iptables来控制ftp,只允许本地网络使用自己的ftp服务器
我们不测试本地网络,我们测试只允许某个IP地址访问我们的ftp服务器,这样好测试点
iptables -L 查看filter表的内容
由于我们现在不用NAT,我们就先不讲,只学filter,包过滤
iptables分两个表:filter和nat
filter表里面有3个链:
INPUT chain
FORWARD chain
output chain
一般服务器上就用input连,来控制进入服务器的流量和包
下面我们写一个规则:禁止一个IP地址访问
这个IP地址就用你的服务器的IP地址
给INPUT添加一条规则内容
匹配源,也就是来自 192.168.0.188这个IP
接着就是匹配的协议和端口,我用的是tcp的21端口,也就是ftp服务器的命令连接端口
最后就是匹配这个规则的动作 -j REJECT 拒绝哈~
完整的命令就是这样:
在INPUT连中添加一条规则,匹配来自源为192.168.0.254的tcp包,连接自己的21号端口,匹配了的包就被REJECT,拒绝
iptables -A INPUT -s 192.168.0.188 -p tcp –dport 21 -j REJECT
查看,这条规则就写进入了,可以使用iptables -nL 查看,n参数的意思是不解析,这样看更直观,速度更快
大家看看他们的差别
修改规则后,保存,切记要保存,不然你的配置重新启动就会丢失
service iptables save
service iptables restart
现在我们用被拒绝的IP地址来测试还能不能够访问
登录失败了,访问被禁止了
OK,我们删除这条规则
删除INPUT的第五条规则:
iptables -D INPUT 5
刚才的规则就被删除了,记住:保存
再测试
成功哈~
下面我们使用tcp_wrapper 来控制vsftpd
解释下tcp_wrapper
tcp_wrapper 就是tcp封装,是运行在介于防火墙和内部服务间的一个模块
只要支持tcp封装的服务,我们都可以使用tcp封装来控制他
那这么查看一个服务是不是支持tcp_wrapper呢?
我给大家介绍两个命令
只有运行这两个命令中其中一个有回显,就证明这个服务支持tcp封装,我们就可以使用tcp封装来控制这个服务的访问
这是第一个命令:
ldd `which vsftpd` | grep libwrap
这个是第二个命令:
strings `which vsftpd` | grep host
大家运行试试,
which vsftpd 是 !旁边那个符号,意思是执行里面的命令取值,不是单引号,单引号的意思是不解释引号里面的内容
怎么使用tcp_wrapper呢,这就需要两个配置文件了
/etc/hosts.deny
/etc/hosts.allow
要拒绝的IP地址我们写入hosts.deny里面,写进去后保存退出就生效,不需要重启之类的操作
这样192.168.0.186就被禁止了
tcp_wrapper和iptables,我们会跟着课程慢慢深入的介绍
好了,今天的课程就到这里。谢谢大家