温馨提示:这篇文章已超过781天没有更新,请注意相关的内容是否还可用!
FTP简介与原理
FTP(File Transfer Protocol)中文称为“文件传输协议”。
主动模式:服务端从20端口向客户端发起连接
被动模式:服务端在指定范围内某个端口 被动等待客户端连接
FTP端口
控制连接:TCP21,用于发送FTP命令信息
数据连接:TCP20,用于上传、下载的数据
FTP相关文件
主配置文件
/etc/vsftpd/vsftpd.conf
用户控制列表文件
/etc/vsftpd/ftpusers 黑名单
/etc/vsftpd/user_list 黑名单,通过配置可以转为白名单
FTP相关用户
匿名用户:
anonymous或ftp 非常不安全,建议禁止匿名登录
本地用户 使用linux系统用户和密码;ftp是明文传输,如果被抓包了,你的Linux用户密码就会泄露,慎重!
虚拟用户 管理员自定义的模拟用户建议使用
配置文件详解
默认配置文件
anonymous_enable=YES 允许匿名用户登录 local_enable=YES 允许本地用户登录 write_enable=YES 允许本地用户上传 local_umask=022 本地用户上传umask值 dirmessage_enable=YES 用户进入目录时,显示.message文件信息 message_file =.message 指定信息文件 xferlog_enable=YES 激活记录日志 connect_from_port_20=YES 主动模式数据传输接口 xferlog_std_format=YES 使用标准的FTP日志格式 ftpd_banner 登录欢迎信息 listen=YES 允许被监听 pam_service_name=vsftpd 设置PAM外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd文件 userlist_enable=YES 用户登录限制 tcp_wrappers=YES 是否使用tcp_wrappers作为主机访问控制方式
常用全局配置
listen_address=0.0.0.0 设置监听的ip地址 listen_port=21 设置监听FTP服务端口号 download_enable =YES 是否允许下载文件 max_clients=0 限制并发连接数 max_per_ip=0 限制同一IP地址的并发连接数
被动模式
pasv_enable=YES 开启被动模式 pasv_min_port=24500 被动模式最小端口 pasv_max_port=24600 被动模式最大端口
常用安全配置
accept_timeout=60 被动模式,连接超时时间 connect_timeout=60 主动模式,连接超时时间 idle_session_timeout=600 600秒没有任何操作就断开连接 data_connection_timeout=500 资料传输时,超过500秒没有完成,就断开传输
windows客户端访问方式
1、用DOS窗口访问并且使用put上传MP4文件,get下载1文件,不支持目录下载
2、使用windows对话框访问,支持目录下载
匿名用户访问
anon_upload_enable=YES 允许匿名用户上传 anon_mkdir_write_enable=YES 允许匿名用户新建 anonymous_enable=YES 允许匿名用户访问 anon_umask=022 设置umask值,默认600
注意事项:
默认上传目录:/var/ftp/pub
如果允许上传,需要服务权限和系统目录权限同时允许
Vsftp服务的伪用户是ftp
本地用户访问
支持文件上传下载写入,但是缺点在家目录下,并且可以切换到 / 根目录下,我把passwd 密码本拷贝下来,并打开,极其危险。
配置文件:
anonymous_enable=NO local_enable=YES local_umask=022 #针对以上恐怖漏洞,在配置文件写入限制,将其限制死家目录上。 chroot_local_user=YES 开启用户目录限制(只有此行,把所有用户都限制在用户主目录中)
配置完之后登录报错:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。
要修复这个错误,可以用命令chmod a-w /home/user去除用户家目录的写权限,注意把目录替换成你自己的。
或者你可以在vsftpd的配置文件中增加下列两项中的一项:
allow_writeable_chroot=YES local_root=/var/ftp /pub 设置本地用户的FTP根目录(注意目录权限) local_max_rate=0 限制传输速率(字节/秒)
访问控制:
默认开启的配置:
chroot_local_user=YES 把用户禁锢在主目录中 userlist_enabled=YES 用户访问控制
以下三行写入报错,默认开启的,没必要设置
userlist_enable=YES 开启用户访问控制 userlist_deny=YES Userlist_file=/etc/vsftpd/user_list 此文件内用户不能访问ftp服务器,默认如此
虚拟用户访问
环境配置:
#确保以下内容已经注释掉 #chroot_local_user=YES #chroot_list_enable=YES #chroot_list_file=/etc/vsftpd/chroot_list #userlist_deny=YES
1、添加虚拟用户口令文件
2、生成虚拟用户口令认证文件
yum install db4-utils -y db_load -T -t hash -f /etc/vsftpd/vuser.txt /etc/vsftpd/vuser.db #把文本转变为认证数据库
3、编辑vsftpd的PAM认证文件
vim /etc/pam.d/vsftpd
注释掉原本所有行,可以禁止本地用户登录,因为本地用户登录依靠这个文件验证
加入此两行
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
4、建立本地映射用户并设置宿主目录权限
[root@ldx pam.d]# useradd -d /home/vsftproot -s /sbin/nologin vuser [root@ldx pam.d]# chmod 755 /home/vsftproot/
5、修改配置文件
guset_enable=YES 开启虚拟用户 guest_username=vuser ftp虚拟用户对应的系统用户 pam_service_name=vsftpd pam认证文件,默认存在 #之前guset_enable=YES 一直报错,后面直接注释掉,删除,重新换一行重写成功了,注意空格,不要出现空格。
6、重启服务
systemctl restart vsftpd
此时虚拟用户可以登录查看下载,但不能上传
默认上传的文件是宿主用户的家目录
权限使用的是匿名用户权限进行管理
7、调整虚拟用户权限,允许所有虚拟用户上传
anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES
8、可以给每个虚拟用户单独建立目录,并建立自己的配置文件。这样方便单独配置权限,并可以单独指定上传的目录。
user_config_dir=/etc/vsftpd/vuser_dir mkdir /etc/vsftpd/vuser_dir 为每个虚拟用户建立配置文件 anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES local_root=/tmp/cang 知道cang独立的上传目录 [root@ldx vuser_dir]# mkdir /tmp/cang [root@ldx vuser_dir]# chown vuser:vuser /tmp/cang/ #如果其他用户没有单独配置文件,则遵守主配置文件权限
被动模式验证:
通过端口号可以知道是被动模式,我把端口改成30000-30010再次验证
pasv_enable=YES pasv_min_port=30000 pasv_max_port=30010
配置文件最后的内容:
anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES local_max_rate=0 allow_writeable_chroot=YES guest_username=vuser guest_enable=YES listen=NO pasv_enable=YES pasv_min_port=30000 pasv_max_port=30010 listen_ipv6=YES anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES user_config_dir=/etc/vsftpd/vuser_dir pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES local_max_rate=0 allow_writeable_chroot=YES guest_username=vuser guest_enable=YES listen=NO pasv_enable=YES pasv_min_port=30000 pasv_max_port=30010 listen_ipv6=YES anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES user_config_dir=/etc/vsftpd/vuser_dir pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES
异常:
打开FTP服务器上的文件夹时发生错误。请检查是否有权限访问该文件夹
1、首先打开一个IE浏览器(如果打开了多个浏览器,请关闭)。
2、点击打开“工具”---“internet选项”---“高级”
3、找到使用被动FTP(为防火墙和DSL调制解调器兼容性),并把前面的勾去掉。
4、 然后点击确定并且关闭IE浏览器。
500 OOPS: cannot change directory:/home/nginx 500 OOPS: priv_sock_get_cmd
因为我映射的是nginx账户,nginx本身不具有家目录,所以报错,自己手动建立一个就好了
C:\Users\Administrator>ftp 159.75.255.125 连接到 159.75.255.125。 220 (vsFTPd 3.0.3) 200 Always in UTF8 mode. 用户(159.75.255.125:(none)): www_ftp 331 Please specify the password. 密码: 500 OOPS: cannot change directory:/home/nginx 500 OOPS: priv_sock_get_cmd 远程主机关闭连接。 C:\Users\Administrator>ftp 159.75.255.125 连接到 159.75.255.125。 220 (vsFTPd 3.0.3) 200 Always in UTF8 mode. 用户(159.75.255.125:(none)): www_ftp 331 Please specify the password. 密码: 230 Login successful. ftp>