Linux 服务 VSFTPD
Linux服务 FTP
FTP:File Transfer Protocol 文件传输协议
是一种文件共享服务,工作于应用层,基于TCP协议实现,有两个连接:通常我们使用的协议都是客户端通过某个端口请求然后服务器端将响应返回给客户端之前使用的端口,通常都是一个连接就可以完成工作,但是ftp略有不同,它需要两个链接才能完成工作(控制连接:用于传输管理命令,比如:get,mget,put,delete和数据连接:用于传输数据);
ftp的共享数据方式:
首先在服务器中建立一个目录,将数据传输至此,然后启动一个服务器进程,监听在某个套接字上,以便于监听来自客户端的请求;当有请求过来的时候会检查文件是否存在,请求的用户是有有权限访问等;如果有权限访问,可以让用户下载,那么怎么将数据传给客户端呢?这时会建立一个数据连接专门用于传输数据;注:控制连接是一直处于连接状态的,而数据连接是用户需要传输数据的时候才会建立的,并且会超时断线; ftp是类似于C/S架构的,有客户端和服务器端;
ftp的两个连接:
控制连接(命令连接):监听在21/tcp
数据连接:
主动连接:监听在20/tcp
1.建立控制通道的连接
客户端会随机选取一个大于1024的端口来与FTP服务器的21号端口建立连接,这个过程会进行常规的三次握手,建立连接后用户便可以通过此通道来对FTP服务器执行命令:查询文件名,下载,上传等;
2.通知FTP服务器使用Active且告知连接的端口号
用户在需要数据的时候会告知服务器要用什么方式来连接,Active即为主动方式,使用此方式客户端会随机启用一个端口且通过控制连接来告知FTP服务器这两个信息,并等待服务器主动来连接自己(这就是为什么叫主动连接啦,一般我们都是站在服务器的角度来命名的);
3.FTP服务器主动向客户端连接
FTP服务器接收到客户端的需求后,会主动地使用20号端口(默认端口号)去连接客户端告知服务器自己启动的那个随机的端口,这个过程当然也是需要三次握手的,此时客户端与服务器端已经建立了两条连接,分别用于控制命令的执行与数据的传输上;
被动链接:监听端口随机
在现实的生产环境中,FTP的客户端与服务器端是有NAT或者防火墙的,主动模式建立控制连接时因为NAT会主动地记录内部送往外部的连接信息,而控制连接的建立就是由客户端向服务器端发起的,所以这个连接是可以顺利建立起来的;但是当客户端启用随机端口然后等待服务器来连接时,由于通过NAT转换后,FTP只能得知NAT的ip地址,而不是客户端的ip地址,因此ftp服务器会以20号端口主动连接NAT的某个端口(与客户端随机启用的那个端口号相同的端口),但是NAT并没有启用这个端口来监听FTP服务器的连接啊,所以会失败;如果是防火墙道理也差不多,防火墙默认是允许内网发出请求并且允许发出请求所对应的相应进来的,但是直接由外网进来的请求是会阻挡的,你会说那我可以设置允许防火墙让某个外网可以进来啊,貌似没毛病,但是因为客户端启用的端口是随机的,所以你就要将所有大于1024 的端口都放行,那么防火墙存在的意义何在呢(其实iptables已经提供了两个模块(ip_conntrack和ip
_net_ftp)专门用于分析目标是port21的连接信息,所以就可以得到客户端启用的那个随机的端口,若此时接收到FTP服务器的主动链接就能够将该数据包导向正确的后端主机了:连接追踪)!所以就有另一种模式来解决这这种问题:被动模式
1.用户与服务器建立控制连接
与主动模式一样,需要三次握手
2.客户端发送PASV的连接请求
当需要使用到数据通道时(例如使用get或者put命令时),客户端可通过控制连接发送PASV的被动连接请求,并等待服务器的回应
3.FTP服务器启动数据端口,并通知客户端来连接
此时FTP服务器端会先随机启动一个监听端口,这个端口可以是随机的,也可以是自定义某一范围的端口,这要看服务器软件而定,然后FTP服务器会通过控制连接告知客户端这个已经启动的端口,并等待客户端来连接;
4.客户端随机启用大于1024的端口进行连接
此时客户端会启用一个大于1024的端口去连接服务器启动的那个监听端口;接下来就可以进行数据的传输了;
数据传输模式:
我们知道一般的数据传输模式有文本格式(html)和二进制格式(mp3,jpeg), 那么可想而知当我们使用ftp在网上下载或上传数据时,也是有文本编码的需求的;那么ftp应该使用哪种编码的,ftp是没有像http一样通过memi将二进制编码成文本格式,然后在客户端再还原为之前的二进制格式的功能的;其实使用ftp传输数据时是遵循文件原来本身的数据格式来传输的,以前是什么格式就用什么格式传输;所以ftp同时支持文本和二进制格式;
文本传输器使用ASCII字符,并由回车符和换行符分开,而二进制不用转换或格式化就可传字符,二进制模式比文本模式更快,并且可以传输所有ASCII值,所以系统管理员一般将ftp设置成二进制模式;
二进制模式用来传输可执行文件,压缩文件和图片文件.如果使用ASCII模式传输,会现实一堆乱码,你必须重新使用BINARY模式传输,使用HTML和文本编写的文件必须用ASCII模式上传,用BINARY模式上传会破坏文件,导致文件执行出错;
数据类型:
结构化数据
半结构化数据
非机构化数据
与它不同的另一种文件共享机制是RPC(Remote Procedure Call,远程过程调用),它可以让两台计算机上的进程直接依赖于二进制协议完成通信;
NFS(NetWork File System,网络文件系统)就是基于RPC机制工作的;
Samba:CIFS(通用internet文件系统)/SMB,windows的网上邻居使用的就是CIFS协议,我们通过Samba就能够实现让linux与windows共享文件,让linux可以出现在windows的网上邻居当中;
服务器端程序:
wu-ftpd:最早的ftpd服务程序;由于没有使用模块化设计思想,任何一个地方出现故障都会导致全盘崩塌;
vsftpd(红帽默认提供):Very Secure ftpDaemon:短小精悍,主要着重于安全;
proftpd:专门用于提供ftp服务,功能丰富;
pureftpd
Filezilla(win和linux都有)
windows:Serv-U
客户端程序:
CLI:
ftp
lftp
GUI:
gftpd
FlashFXP
Cuteftp
Filezilla
vsftpd:
/etc/vsftpd:配置文件目录
/etc/init.d/vsftpd:服务脚本
/usr/sbin/vsftpd:主程序
基于pam实现用户认证:
/etc/pam.d/*
/lib/security/
/lib64/security/
支持虚拟用户
注:因为vsftpd是受selinux控制的,所以在不了解selinux时建议先将selinux关闭:setenforce 0 学习做实验的时候建议将防火墙也关闭:iptables -F(清空防火墙规则)
默认使用/var/ftp/作为其提供服务的根目录(默认是被chroot的),其中的pub子目录就是公共文件访问目录;这个目录只有root用户具有写权限;因此比较安全;
上传和下载:
上传是指客户端传数据到服务器端,对于服务器来说,这个权限是不会随便提供给任何人的,如果有心怀不轨的人盯上你,可能就会传一些带有病毒的文件;
下载是指从服务器传数据到客户端,对于服务器来说,这个权限可以提供给大多数用户,而不会危害到服务器本身;
但是上面说了/var/ftp目录是有root才具有写权限,并且绝对不允许给其他用户赋予写权限的,那么在需要的时候其他用户怎么上传文件那,我们可以通过在其中创建子目录来赋予相应用户写权限,以达到上传文件的目的;
ftp的用户:每一种用户都有其对应的系统用户;
/var/ftp/这个目录就是ftp这个用户的家目录;
匿名用户→anonymous_enable(默认映射至ftp这个系统用户)
系统用户→local_enable
虚拟用户
使用ftp ip_address登陆ftp服务器,之后会提示输入用户名以及密码,根据你的情况填入即可;如果是使用anonymous用户登陆的话则不需要密码直接回车即可;
配置文件常用选项:
anonymous_enable=YES→ 是否允许匿名用户登陆
local_enable=YES→ 是否允许系统用户登陆
创建一个用户并且设置一个密码,然后使用这个用户登陆以后你会发现里面什么都没有,连pub这个子目录都没有,其实这是正常的,因为使用系统用户登陆fpt服务器,默认进入的是此用户的家目录,但是他没有将用户锁定到自己的家目录,也就是说他可以切换到其他目录,如果不给他禁锢到家目录中这是很危险的,我们可以使用chroot实现;
write_enable=YES→系统用户是否可以上传文件
文件服务权限:文件系统权限(rwx)*文件共享权限(write_enable=YES/NO,anon_upload_enable=YES/NO)
anon_mkdir_write_enable=YES/NO→是否可以创建目录
anon_other_write_enable=YES/NO→其他的写权限,包括删除文件的权限
dirmessage_enable=YES/NO→ 用于显示欢迎信息,在目录中创建一个隐藏文件并命名为.message,然后在其中填入你想告诉他人的提示信息即可,当你进入到此目录时就会现实.message中的内容了;
xferlog_enable=YES/NO→是否打开传输日志;打开以后,当用户上传或下载文件时会将信息记录到指定的日志文件中;
xferlog_file=/var/log/xferlog→ 用于存储上面设置产生的日志信息
xferlog_std_format=YES/NO→ 是否启用标准格式记录日志
chroot_local_user=YES/NO→ 是否要将用户限制在自己的用户家目录中,为了安全性,建议设置为YES
chroot_list_enable=YES/NO→ 是否启用通过将用户写入某个文件中从而将其chroot在自己的家目录中;当上一项为YES时,此项为NO为将文件中制定的用户其限制到家目录中,此项为YES表示不限制文件中指定的用户;当上一项被注释掉之后,此项为YES则表示将用户限制到自己的家目录中,此项为NO则表示不限制;
chroot_list_file=/etc/vsftpd/chroot_list→ 在/etc/vsftpd/chroot_list中填入不想被chroot的帐号,一行一个帐号即可;需手动创建
idle_session_timeout=600→ 定义会话超时时间(跟控制连接有关,单位是秒)
data_connection_timeout=120→ 定义数据链接的超时时间(跟数据连接有关,单位时秒)
ascii_upload_enable=YES/NO→ 启用文本模式上传功能 建议注释掉
ascii_download_enable=YES/NO→ 启用文本模式下载功能 建议注释掉
pam_service_name=vsftpd→ vsftpd在pam中的配置文件(可以使写在/etc/vsftpd/ftpusers中的用户无法登陆ftp服务器)
userlist_enable=YES/NO→ 在ftpusers中没有内容时可以通过这个设置来禁止写在/etc/vsftpd/user_list中的用户登陆ftp服务器
userlist_deny=YES/NO→ 可以通过设置YES或者NO来决定/etc/vsftpd/user_list中的用户是否可以登陆ftp服务器;YES为不允许,NO为允许;
max_clients=50→ 最多允许多少客户端同时连接
max_per_ip=4→ 每个ip最多允许发起几个连接请求
更多的信息请查看man vsftpd.conf;
守护进程:
独立进程
适用于访问量大,用户在线时间比较长的服务
瞬时进程
适用于访问量小,用户在线时间比较短的服务
由xinetd(超级守护进程)代为管理
超级守护进程为一个独立进程
如果将vsftpd的配置文件中的Listen设置为YES的话,就表示以独立进程的方式运行;否则为瞬时进程,并且要在/etc/xinetd.d/目录中为其创建一个符合瞬时进程格式的脚本;
vsftpd的安全通信方式:
ftps:fpt+ssl/tls
1.创建证书,给vsftpd颁发证书
mkdir certs newcerts crl
touch index.txt
echo 01 > serial
(umask 007;openssl genrsa -out private/cakey.pem 2048)
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HN
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:guowei
Organizational Unit Name (eg, section) []:Tech
Common Name (eg, your name or your server's hostname) []:ca.guowei.com
Email Address []:
mkdir /etc/vsftpd/ssl
cd /etc/vsftpd/ssl/
(umask 077;openssl genrsa -out vsftpd.key 2048;)
openssl req -new -key vsftpd.key -out vsftpd.csr
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HN
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:guowei
Organizational Unit Name (eg, section) []:Tech
Common Name (eg, your name or your server's hostname) []:ftp.guowei.com
Email Address []:
Please enter the following 'extra' attributes to be sent with your certificate request
A challenge password []:
An optional company name []:
openssl ca -in vsftpd.csr -out vsftpd.crt
vim /etc/pki/tls/openssl.cnf
dir = /etc/pki/CA # Where everything is kept
2.编辑vsftpd.conf,添加一下几项
ssl_enable=YES→ 是否启用ssl功能
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES 支持哪几种协议
allow_anon_ssl=NO→ 匿名用户是否使用ssl加密
force_local_data_ssl=YES→ 是否强制本地用户传输文件时使用ssl加密
force_local_logins_ssl=YES→ 是否强制本地用户登陆时使用ssl加密
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt → 证书文件位置
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key →密钥文件位置
3.重启服务
service vsftpd restart
4.接下来就可以使用FlashFPXP这个客户端来连接fpt服务啦
请自行下载软件
sftp:openssh,基于ssh来实现的
虚拟用户:
只要对应的格式能被认证功能识别支持,就可以实现对应的虚拟用户;
基于mysql的虚拟用户:
比如在mysql中创建一个数据库,建立一张表,其中有两个字段:用户名(name)&密码(password);当我们需要认证的时候,就会去查找这张表,当我们输入用户名的时候,然后验证密码匹配正确的话就可以完成认证;
例子:
1.首先需要安装开发环境以及mysql数据库
开发工具自行安装
yum install mysql-server mysql-devel -y
2.安装pam_mysql-0.7RC1 → pam默认是不支持去mysql验证用户帐号的,所以我们需要为pam安装这个插件来支持这个功能;
yum install pam-devel.x86_64 -y 请事先确定是否安装此包,无则安;
http://pam-mysql.sourceforge.net/ 可以在这个网站下载这个插件;
tar -xf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1/
centos7:./configure --with-mysql=/usr --with-pam-mods-dir=/lib64/security
(centos6:./configure --with-mysql=/usr --with-openssl)
make
make install
3.配置mysql数据库
mysql
CREATE DATABASE vsftpd;
use vsftpd;
CREATE TABLE users(
id SMALLINT AUTO_INCREMENT NOT NULL,
name CHAR(20) BINARY NOT NULL,
password CHAR(48) BINARY NOT NULL,
PRIMARY key (id));
DESC users;
GRANT SELECT ON vsftpd.* TO vsftpd@localhost IDENTIFIED BY 'vsftpd';
GRANT SELECT ON vsftpd.* TO vsftpd@127.0.0.1 IDENTIFIED BY 'vsftpd';
FLUSH PRIVILEGES;
INSERT INTO users (name,password) VALUE ('tony','redhat'),('peter','redhat');
mysql -uvsfptd -p
键入密码:vsftpd
4.建立pam认证所需要的文件
vim /etc/pam.d/vsfptd.mysql
auth required pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0
account required pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0
关于crpyt的设置可以查看pam_mysql-0.7RC1/README
字段说明:
auth 表示认证
account 验证账号密码正常使用
required 表示认证要通过
pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路 径而言,也可以写绝对路径;后面为给此模块传递的参数
user=vsftpd为登录mysql的用户
passwd=magedu 登录mysql的的密码
host=mysqlserver mysql服务器的主机名或ip地址
db=vsftpd 指定连接msyql的数据库名称
table=users 指定连接数据库中的表名
usercolumn=name 当做用户名的字段
passwdcolumn=password 当做用户名字段的密码
crypt=2 密码的加密方式为mysql password()函数加密
crypt是加密方式,0表示不加密,1表示crypt(3)加密,2表示 使用mysql password()函数加密,3表示md5加密,4表示 sha1加密
5.创建虚拟用户所对应(映射)的系统用户
useradd -s /sbin/nologin -d /var/ftproot vuser
chown root.root /var/ftproot
cd /var/ftproot/
mkdir data
chown vuser.vuser data/ -R
6.修改vsftpd.conf
vim /etc/vsftpd/vsftpd.conf
force_local_data_ssl=NO
force_local_logins_ssl=NO 不通过ssl加密;上面遗留问题
guest_enable=YES
guest_username=vuser
pam_service_name=vsftpd.mysql
listen=YES
注:虚拟用户在配置文件中的指令都是由匿名用户的指令来设置的,所以想设置虚拟用户的上传下载等权限时,就需要通过设置匿名用户的指令来赋予相关的权限;
7.定义不同的虚拟用户使用不同的权限
vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_dir
mkdir /etc/vsftpd/vusers_dir
cd /etc/vsftpd/vusers_dir
touch tony
touch peter
vim tony
anon_umake=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
vim peter
anon_upload_enable=NO
tony就可以在/var/ftproot/data中上传和创建目录了,而peter不具有上传权限;
基于文件的虚拟用户:
我们可以创建一个文件:/etc/vsftpd/vusers,奇数行为用户名,偶数行为密码;然后将这个文件转换成二进制格式的文件(使用db_load工具,由db4-utils提供);
例子:
1.建立虚拟用户的帐号数据库文件
cd /etc/vsftpd/
vim vusers.list
good
123
db_load -T -t hash -f vusers.list vusers.db
chmod 600 vusers.db
2.创建ftp根目录以及虚拟用户映射的系统帐号
useradd -s /sbin/nologin virtual
chmod 755 /home/virtual/ -R
3.建立支持虚拟用户的pam认证文件
vim /etc/pam.d/vsftpd.vu
4.在vsftpd.con中添加相应配置
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES/NO
guest_enable=YES
guest_username=virtual
5.为个别虚拟用户建立独立的配置文件
vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_home
mkdir /etc/vsftpd/vusers_home
vim good
anon_mkdir_write_enable=YES
anon_upload_enable=YES
6.重新记载vsfptd的配置文件
service vsftpd restart
由于vsftpd对于用户的认证是基于pam模块来实现的,所以我们必须去配置pam的配置文件,明确告诉pam我们要使用虚拟用户这个功能;
FTP的典型消息:
在使用ftp客户端程序与ftp服务器进行通信时,经常会看见一些有ftp服务器发送的消息,这些消息是ftp所定义的;
消息号:
125:数据连接打开,传输开始;
200:命令 OK;
226:数据传输完毕;
331:用户名 OK;
425:不能打开数据连接;
426:数据连接关闭,传输被中断;
452:错误写文件;
500:数据语法,不可识别的命令;
注:根据马哥视频做的学习笔记,如有错误欢迎指正;侵删
借鉴文章:鸟哥的linux私房菜-服务器篇以及
https://blog.csdn.net/wangyj_bk/article/details/78248263