文件服务器 – vsftpd
文件服务器是一种专供其他电脑访问文件和存储的程序。文件服务器通常比一般的个人电脑拥有更大的存储容量,并具有一些其他的功能,如磁盘镜像、多个网络接口卡、热备援多电源供应器。到后来文件服务器逐渐进化成带有RAID存储子系统和其他高可用特性的高性能存储系统。
-
ftp:应用层的文件共享协议,也是一个应用程序
-
nfs, cifs:网络存储协议
-
nfs:1985年SUN开发,用于Unix系统间实现磁盘文件共享的一种协议;
-
cifs:由Microsoft开发,用于连接Windows客户机和服务器,并且后来的NBT协议进一步发展为SMB,使得Windows系统和Linux可以互通;
-
smaba:Linux上cifs的客户端,或Linux的cifs服务端,实现Windows系统Linux互通的程序;
-
NAS:网络存储系统,是一种远程访问接入设备,使用nfs协议或cifs协议实现,较SAN能够降低存储成本
-
SAN:存储区域网络,存储接口协议转换为网络传输,通过SCSI转为光纤通道或是iSCSI传输
FTP协议
FTP 是File TransferProtocol(文件传输协议)用于Internet上的控制文件的双向传输。
FTP实现的目标
-
促进文件的共享(计算机程序或数据)
-
鼓励间接或者隐式的使用远程计算机
-
向用户屏蔽不同主机中各种文件存储系统(File system)的细节
-
可靠和高效的传输数据
FTP是仅基于TCP的服务,不支持UDP。与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口)。通常来说这两个端口是21(命令端口)和20(数据端口)。但FTP 工作方式的不同,数据端口并不总是20。客户端由于安装了防火墙会导致服务端发起的连接请求被阻挡,因此被动模式只要求服务器端产生一个监听相应端口的进程,这样就可以绕过客户端安装了防火墙的问题。这就是主动与被动FTP的最大不同之处。
-
主动模式
主动模式要求客户端和服务器端同时打开并且监听一个端口以创建连接,主动模式创建连接过程如下: -
客户端打开一个随机的端口(端口号大于1024,在这里,我们称它为x),同时一个FTP进程连接至服务器的21号命令端口。此时,该tcp连接的来源地端口为客户端指定的随机端口x,目的地端口(远程端口)为服务器上的21号端口;
-
客户端开始监听端口(x+1),同时向服务器发送一个端口命令(通过服务器的21号命令端口),此命令告诉服务器客户端正在监听的端口号并且已准备好从此端口接收数据。这个端口就是我们所知的数据端口;
-
服务器打开20号源端口并且创建和客户端数据端口的连接。此时,来源地的端口为20,远程数据(目的地)端口为(x+1);
-
客户端通过本地的数据端口创建一个和服务器20号端口的连接,然后向服务器发送一个应答,告诉服务器已经创建好连接,可以开始数据传输;
-
被动模式
客户端发送连接请求,在FTP服务器收到Pasv命令后,随机打开一个高端端口(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTPserver不再需要建立一个新的和客户端之间的连接。
服务器的控制端口是21,数据端口是随机的,且是客户端去连接对应的数据端口,所以在做静态的映射话只开放21端口是不可以的。此时需要做DMZ。
大部分网页浏览器要求使用被动模式,然而并不是所有的FTP服务器都支持被动模式。
由于FTP连接时的密码和传输的文件内容都使用明文传输,及其不安全。且因为必须开放一个随机的端口以创建连接,导致客户端防火墙很难追踪主动模式下的FTP流量。因此使用被动模式的FTP可以减少许多问题。此外,FTP服务器在需要传输较多的小文件时性能不好。
FTP协议的实现:
-
Server端开源解决方案:
…….wuftpd:Washington University ftp daemon
…….vsftpd:Very Secure ftp daemon
…….proftpd, pureftpd, … -
Client程序:
…….GUI:flashfxp, cute, filezilla, gftp, …
…….CLI:ftp, lftp, …
vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面,是一个完全免费的、开发源代码的ftp服务器软件,支持很多其他的 FTP 服务器所不支持的特征。比如:非常高的安全性需求、带宽限制、良好的可伸缩性、可创建虚拟用户、支持IPv6、速率高等。
vsftpd的配置文件
-
获取帮助
man 5 vsftpd.conf
cd /usr/share/doc/vsftpd-3.0.2/EXAMPLE/
-
配置选项说明
rpm -ql vsftp
#主配置文件
主程序:/usr/sbin/vsftpd
Unit File: /usr/lib/systemd/system/vsftpd.service
主配置:/etc/vsftpd/vsftpd.conf
文档路径:每一个用户都有一个以家目录的文档路径
ftp用户的家目录/var/ftp/pub/file --> ftp://host:port/pub/file
lftp -u centos,pass HOST #系统中用户的家目录为local_root
用户put条件:iptables、SELinux、安全上下文、ftp允许upload配置
vim /etc/vsftpd.conf
匿名用户
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YE
系统用户
local_enable=YES
write_enable=YES
#虚拟用户
guest_enable=YES #定启用虚拟用户功能
guest_username=vsftpd #指定虚拟用户的宿主用户
virtual_use_local_privs=YES #设定虚拟用户的权限符合他们的宿主用户
user_config_dir=/etc/vsftpd/vconf #设定虚拟用户配置文件存放路径
上传文件的属主设置
chown_uploads=YES
chown_username=USERNAM
系统用户chroot()
chroot_local_user=YES #所有用户都锁定,不予许在其家目录有写权限,即那ftp用户
#不用于登录系统的账号对于"home-user"的根没有写权限
#或针对用户对家目录有些权限的账户开启白名单
#YES开启白名单,NO开启黑名单
chroot_list_enable=YES #开启名单功能,不开启则禁锢所有用户,要先开启锁定
chroot_list_file=/etc/vsftpd/chroot_list #白/黑名单
userlist_enable=YES #user_list控制用户访问
userlist_deny=YES #vsftpd自带的用户登录控制,默认为YES/黑名单,NO为白名单,黑名单直接无法输入密码pam则是给允许登录用户的认证
认证服务:
pam_service_name=vsftpd #/etc/pam.d/vsftpd
日志记录
xferlog_file=/var/log/vsftpd.log #文件要手动建立,vsftpd用户对日志文件vsftpd.log的读写权限,否则服务将启动失败。
其他
#idle_session_timeout=600 #设定空闲连接超时时间,单位秒
#data_connection_timeout=120 #设定单次最大连续传输时间,单位秒
#ftpd_banner=Welcome to blah FTP service. #设定Vsftpd的登陆标语
ls_recurse_enable=NO #禁止"ls -R"的命令,安全设定
listen=YES #设Vsftpd独立守护进程,否则由xinetd代理
vsftpd + pam + file_db + virtual_vsftp_user
pam基于本地的文件验证登录用户
-
生成经过哈希运算的用户认证文件以及虚拟用户配置
cd /etc/vsftpd/
mkdir user_conf/ #虚拟用户的配置文件
echo -e "alice\nalicepass\ntom\ntompass" user_conf/login
db_load -T -t hash -f user_conf/login.txt user_conf/login.db
chmod 600 user_conf/login
chmod 600 user_conf/login.db
useradd -d /data/ftp -s /sbin/nologin vftp_user #虚拟用户的代理者
vim user_conf/jerry
anon_upload_enable=YES #上传
anon_other_write_enable=NO #删除
anon_mkdir_write_enable #创建目录
vim user_conf/alice
anon_upload_enable=YES #上传
anon_other_write_enable=YSE #删除
anon_mkdir_write_enable #创建目录
-
建立虚拟用户认证所需的pam配置文件
vim /etc/pam.d/vsftpd.local
auth required pam_userdb.so db=/etc/vsftpd/user_conf/login
account required pam_userdb.so db=/etc/vsftpd/user_conf/login
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*或则在 pam 中同时启用 vsftpd_mysql 与原来的 vsftpd 认证来源,即在mysql中找不到的user将在系统用户中找。
#sufficient表示身份认证则通过,否则跳过,进行下面模块的验证,是一个充分条件;
#required 表示本模块必须返回成功才能通过认证,可以认为是一个必要条件;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vi /etc/pam.d/vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth sufficient pam_userdb.so db=/etc/vsftpd/user_conf/login
account sufficient pam_userdb.so db=/etc/vsftpd/user_conf/login
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
修改vsftpd.conf文件,允许虚拟用户,指定pam配置文件及虚拟用户的路径
vi /etc/vsftpd/vsftpd.conf
#修改或增加
pam_service_name=vsftpd.local #要和建的PAM文件对应
guest_enable=YES #允许虚拟用户
guest_username=vftp_user #代理者身份
user_config_dir=/etc/vsftpd/user_conf #虚拟用户账号配置目录
-
建立vftp_user的家目录
mkdir -p /data/ftp/{pub,upload}
setfacl -m u:vftp_user:rwx /data/ftp/upload
-
重启测试
systemctl restart vsftpd
lftp -u jerry,jerry 10.1.x.x
cd upload
put /file
vsftpd + pam + mysql + virtual_vsftp_user
pam认证机制:程序定义调用/usr/lib64/security/pam_*.so下的pam模块以实现相应的用户登录认证,如su、login、vsftp等在/etc/pam.d/有相应的身份认证配置文件。
vsftpd依赖于pam完成用户认证,vsftpd的虚拟用户可使用指定pam读取的认证文件,由于在Centos 7上的epel源中没有pam_mysql程序,因此使用编译安装的方式为pam提供连接mysql的模块。
-
安装vsftpd与mysql,创建vsftpd数据库
yum -y install vsftpd mariadb-server mariadb
systemctl start mariadb.service
#首次安装mysql,安全增强,否则无法远程登录
mysql_secure_installation
#创建数据库
mysql>CREATE DATABASE vsftpd;
#授权给vsftpduser用户
mysql>GRANT SELECT ON vsftpd.* TO 'vsftpduser'@'127.0.0.1' IDENTIFIED BY 'vsftpdpass'
mysql>GRANT SELECT ON vsftpd.* TO 'vsftpduser'@'localhost' IDENTIFIED BY 'vsftpdpass'
mysql>flush privileges;
#创建表,name作为主键
mysql>use vsftpd; #或在下使用vsftpd.user
mysql>CREATE TABLE users (
->uid SMALLINT UNSIGNED NOT NULL AUTO_INCREAMENT UNIQUE KEY,
->name varchar(50) NOT NULL PRIMARY KEY,
->password CHAR(48) NOT NULL
->);
#插入用户,使用mysql提供的加密函数Encryption Functions
mysql>INSERT INTO users (name,password) VALUES ('alice',PASSWORD('alice')),('jerry',PASSWORD('jerry'));
\q
-
编译安装pam_mysql-0.7RC1
yum -y groupinstall "Development Tools" "Server Platform Development"
yum -y install mariadb-devel pam-devel
tar xf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1
cat INSTALL #安装文档
./configure --with-pam/usr --with-mysql/usr --with-pam-mods-dir=/usr/lib64/security/
make install
mkdir -pv /data/ftp/{pub,upload}
useradd -d /data/ftp vftp_user #虚拟用户代理
setfacl -m u:vftp_user:rwx /data/ftp/upload
#基于pam_mysql的认证配置文件
cat README
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vi /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so host=127.0.0.1 user=vsftpduser passwd=mage db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so host=127.0.0.1 user=vsftpduser passwd=mage db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*或则在 pam 中同时启用 vsftpd_mysql 与原来的 vsftpd 认证来源,即在mysql中找不到的user将在系统用户中找。
#sufficient表示身份认证则通过,否则跳过,进行下面模块的验证,是一个充分条件;
#required 表示本模块必须返回成功才能通过认证,可以认为是一个必要条件;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vi /etc/pam.d/vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth sufficient pam_mysql.so host=127.0.0.1 user=vsftpduser passwd=vsftpdpass db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account sufficient pam_mysql.so host=127.0.0.1 user=vsftpduser passwd=vsftpdpass db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=3
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
指定pam配置文件及虚拟用户的路径,创建ftp虚拟用户
vi /etc/vsftpd.conf
guest_enable=YES #访客登录
guest_username=vftp_user #访客以vftp_user身份访问家目录
pam_service_name=vsfptd.mysql #修改为新的pam认证文件
user_config_dir=/etc/vsftpd/vftp_user_conf #虚拟用户的配置文件路径
mkdir /etc/vsftpd/vftp_user_conf
vim /etc/vsftp/jerry
anon_upload_enable=YES #上传
anon_other_write_enable=NO #删除
anon_mkdir_write_enable #创建目录
vim /etc/vsftp/alice
anon_upload_enable=YES #上传
anon_other_write_enable=YSE #删除
anon_mkdir_write_enable #创建目录
-
访问测试
lftp -u alice,alice 10.1.x.x
cd upload
put /testdir/file #
rm file
#pam认证时的日志文件
tail /var/log/secure
登录时错误类型
-
配置中禁止了用户chroot,但该账户对其加目录有w权限,或不在白名单中
Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot() -
无法通过验证,pam认证失败、没有开启服务、密码错误、
530 Login incorrect. -
无法上传文件,检查SELinux、iptables、目的文件夹权限、配置文件是否允许update
put: Access failed: 553 Could not create file. (fstab) -
Secure日志显示pam如法识别登录用户,检查pam模块、使用sufficient代替required等
pam_unix(vsftpd:auth): check pass; user unknown
pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=test r
host=localhost
总结
vsftp在启动前要配置好相关的安全设置,在生产环境中建议使用虚拟用户访问ftp服务器,并针对特定的用户给予上传和修改的权限。特别需要注意的是要做到共享资源与操作系统的“隔离”,即不允许用户访问系统的其他目录,避免敏感文件的泄露。如果安全要求较高,可视具体情况开启SELinux功能,以及使用ssl加密传输文件。此外,为了防止暴力破解,可针对max_login_fails次数过多的ip添加拒绝访问的策略,如使用DenyHosts程序等等。
原创文章,作者:helloc,如若转载,请注明出处:http://www.178linux.com/51855
评论列表(1条)
总结的很全面,不错,继续努力!!!