在linux环境下,使用最多的FTP服务端软件就是Vsftpd!
系统用户模式虽然可以控制访问,但是如果用户过多,就会影响服务器系统的管理,对服务器安全造成威胁!而且我们需要的仅仅是可以使用搭建在服务器的FTP服务而已!
那么就需要我们设置虚拟用户进行登录,这也是推荐的方式!这种方式更加安全!
虚拟用户就是没有实际的真实系统用户,而是通过映射到其中一个真实用户以及设置相应的权限来实现访问验证,虚拟用户不能登录Linux系统,从而让系统更加的安全可靠。
一、安装
# yum install vsftpd
二、启动服务
# systemctl start vsftpd.service
三、配置
配置文件说明
/etc/vsftpd/vsftpd.conf是vsftpd服务的核心配置文件!
1.备份
# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
2.以下指令待查
cd /home/wwwftp/www
# chown nginx:nginx phpmyadmin
# chmod -R 755 phpmyadmin
四、首先需要我们新建一个虚拟宿主用户,也就是上边说的要映射的真实用户:
# useradd virtualhost -s /sbin/nologin
设置宿主用户也不允许登录系统!
五、然后修改配置文件,下边我给出我的设置:
# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #设定不允许匿名访问
local_enable=YES #设定本地用户可以访问。注意:主要是为虚拟宿主用户,如果该项目设定为NO那么所有虚拟用户将无法访问。
write_enable=YES #设定可以进行写操作。
local_umask=022 #设定上传后文件的权限掩码。
anon_upload_enable=NO #禁止匿名用户上传。
anon_mkdir_write_enable=NO #禁止匿名用户建立目录。
dirmessage_enable=YES #设定开启目录标语功能。
xferlog_enable=YES #设定开启日志记录功能。
connect_from_port_20=YES #设定端口20进行数据连接。(主动模式)
chown_uploads=NO #设定禁止上传文件更改宿主。
#chown_username=whoever
xferlog_file=/var/log/vsftpd.log
#设定Vsftpd的服务日志保存路径。注意,该文件默认不存在。必须要手动touch出来,并且由于这里更改了Vsftpd的服务宿主用户为手动建立的Vsftpd。必须注意给与该用户对日志的写入权限,否则服务将启动失败。
xferlog_std_format=YES #设定日志使用标准的记录格式。
#idle_session_timeout=600 #设定空闲连接超时时间,单位为秒,这里默认。
#data_connection_timeout=120 #设定空闲连接超时时间,单位为秒,这里默认
#nopriv_user=ftptest
async_abor_enable=YES #设定支持异步传输功能。
ascii_upload_enable=YES
ascii_download_enable=YES #设定支持ASCII模式的上传和下载功能。
ftpd_banner=Welcome to blah FTP service. #设定Vsftpd的登陆标语。
#deny_email_enable=YES
# (default follows)
#banned_email_file=/etc/vsftpd/banned_emails
chroot_list_enable=NO #禁止用户登出自己的FTP主目录。
allow_writeable_chroot=YES
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list
ls_recurse_enable=NO #禁止用户登陆FTP后使用"ls -R"的命令。该命令会对服务器性能造成巨大开销。如果该项被允许,那么挡多用户同时使用该命令时将会对该服务器造成威胁。
listen=YES 设定该Vsftpd服务工作在StandAlone模式下
#listen_ipv6=NO
userlist_enable=YES #设定userlist_file中的用户将不得使用FTP。
#userlist_deny=NO
tcp_wrappers=YES #设定支持TCP Wrappers
#下边是关于虚拟用户的重要配置
guest_enable=YES #设定启用虚拟用户功能。
guest_username=virtualhost #指定虚拟用户的宿主用户。
virtual_use_local_privs=YES #设定虚拟用户的权限符合他们的宿主用户。
pam_service_name=vsftpd #设定PAM服务下Vsftpd的验证配置文件名。因此,PAM验证将参考/etc/pam.d/下的vsftpd文件配置。
user_config_dir=/etc/vsftpd/virtualconf #设定虚拟用户个人Vsftp的配置文件存放路径。也就是说,这个被指定的目录里,将存放每个Vsftp虚拟用户个性的配置文件,一个需要注意的地方就是这些配置文件名必须和虚拟用户名相同。
需要注意的地方:
①Vsftpd的日志文件不存在,建立Vsftpd的日志文件,并更该属主为Vsftpd的服务宿主用户。
# touch /var/log/vsftpd.log
# chown virtualhost.virtualhost /var/log/vsftpd.log
②建立虚拟用户配置文件存放路径:
# mkdir /etc/vsftpd/virtualconf
这里是跟配置文件中的user_config_dir这一项是对应的!
六、接着制作虚拟用户数据库文件,这里需要先安装db4包,用来支持文件数据库。
安装:
# yum install db4
然后建立虚拟用户名单文件:
# touch /etc/vsftpd/virtusers
建立了一个虚拟用户名单文件,这个文件就是来记录vsftpd虚拟用户的用户名和口令的数据文件,我这里给它命名为virtusers。为了避免文件的混乱,我把这个名单文件就放置在/etc/vsftpd/下。
接着编辑这个文件,将虚拟用户信息写入这个文件
# vim /etc/vsftpd/virtusers
内容如下:
webftp
123456
ftpftp
123456
类似上边的格式,一行用户名,一行密码!
接着生成虚拟用户数据文件:
# db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db
# vim /etc/vsftpd/chroot_list
webftp
ftpftp
四、设定PAM验证文件,并指定虚拟用户数据库文件进行读取
这里需要我们安装pam服务,一般系统都会有安装:
# yum install pam
Vsftp的PAM验证配置文件:/etc/pam.d/vsftpd
这里对应的就是核心配置文件中的pam_service_name,它会去找/etc/pam.d/vsftpd这个文件!
那么我们需要编辑这个文件,同样的编辑前先备份一下:
# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
然后编辑文件:
# vim /etc/pam.d/vsftpd
内容如下:
#%PAM-1.0
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
以上两条是手动添加的,内容是对虚拟用户的安全和帐户权限进行验证,一定要放在最前面。
这里的auth是指对用户的用户名口令进行验证。
这里的accout是指对用户的帐户有哪些权限哪些限制进行验证。
其后的sufficient表示充分条件,也就是说,一旦在这里通过了验证,那么也就不用经过下面剩下的验证步骤了。相反,如果没有通过的话,也不会被系统立即挡之门外,因为sufficient的失败不决定整个验证的失败,意味着用户还必须将经历剩下来的验证审核。
再后面的/lib/security/pam_userdb.so表示该条审核将调用pam_userdb.so这个库函数进行。
最后的db=/etc/vsftpd/virtusers则指定了验证库函数将到这个指定的数据库中调用数据进行验证。
这里有一个问题需要注意一下:
如果你的系统是64位的,那么这里要改成:
/lib64/security/pam_userdb.so
否则会验证失败!不能登录!
七、配置虚拟用户
1.规划好虚拟用户的主路径:
# mkdir /home/wwwftp/
2.建立测试用户的FTP用户目录:
# mkdir /home/wwwftp/www /home/wwwftp/ftp
3.建立虚拟用户配置文件模版:
# cp /etc/vsftpd/vsftpd.conf.bak /etc/vsftpd/virtualconf/vconf.tmp
4.定制虚拟用户模版配置文件:
# vim /etc/vsftpd/virtualconf/vconf.tmp
内容如下:
local_root=/home/wwwftp/
指定虚拟用户的具体主路径。
anonymous_enable=NO
设定不允许匿名用户访问。
write_enable=YES
设定允许写操作。
local_umask=022
设定上传文件权限掩码。
anon_upload_enable=NO
设定不允许匿名用户上传。
anon_mkdir_write_enable=NO
设定不允许匿名用户建立目录。
idle_session_timeout=600
设定空闲连接超时时间。
data_connection_timeout=120
设定单次连续传输最大时间。
max_clients=10
设定并发客户端访问个数。
max_per_ip=5
设定单个客户端的最大线程数,这个配置主要来照顾Flashget、迅雷等多线程下载软件。
local_max_rate=50000
设定该用户的最大传输速率,单位b/s。
这里将原vsftpd.conf配置文件经过简化后保存作为虚拟用户配置文件的模版。这里将并不需要指定太多的配置内容,主要的框架和限制交由 Vsftpd的主配置文件vsftpd.conf来定义,即虚拟用户配置文件当中没有提到的配置项目将参考主配置文件中的设定。而在这里作为虚拟用户的配置文件模版只需要留一些和用户流量控制,访问方式控制的配置项目就可以了。这里的关键项是local_root这个配置,用来指定这个虚拟用户的FTP主路径。
八、更改虚拟用户的主目录的属主为虚拟宿主用户:
# chown -R virtualhost.virtualhost /home/wwwftp/
1.配置虚拟用户,从虚拟用户模版配置文件复制:
# cp /etc/vsftpd/virtualconf/vconf.tmp /etc/vsftpd/virtualconf/webftp
2.针对具体用户进行定制:vi /etc/vsftpd/virtualconf/webftp
local_root=/home/wwwftp/www/
anonymous_enable=NO
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
idle_session_timeout=300
data_connection_timeout=90
max_clients=1
max_per_ip=1
local_max_rate=25000
当然,如果很熟练的话3,4,6步骤都可以省略!不要设置!
这里主要是为了方便!可以在原来的基础的进行修改而已!
最后别忘了,开启或者重启服务!
目的:匿名用户可上传、不能删除、不能更名
方法:在匿名用户主目录下新建一个upload目录用来存放匿名用户上传文件
修改/etc/vsftpd/vsftpd.conf
anonymous_enable=YES 启用匿名访问
ftp_username=ftp 指定匿名用户,默认为ftp
anon_root=/data/software指定匿名用户登录后的主目录为/data/software目录
write_enable=YES 允许登录的FTP用户写权限,还要视目录的权限而定
anon_upload_enable=YES 允许匿名用户上传文件
anon_mkdir_write_enable=NO 不允许匿名用户创建目录
anon_other_write_enable=NO 不允许匿名用户进行删除或者改名等操作
在匿名用户主目录下新建一个upload目录,并将该目录权限设为777
# mkdir /data/software/upload
# chmod 777 /data/software/upload
而此时主目录的属主应该是root
# chown root.root /data/software
这样匿名用户就对主目录有可读非写权限,而对upload有可读、可上传、非删除、非更名权限
如果在上面的条件下,要使匿名用户拥有upload目录下文件的删除、更名权限,则将anon_other_write_enable=YES即可
匿名登录,上传文件功能需要以下操作
# chmod 777 -R /var/ftp/pub
测试
我们可以先在模板目录新建一个空文件
touch /opt/vsftp/virtual1/test.txt
1
登录一下,在windows打开cmd:(当然我们使用浏览器,或者使用windows文件浏览窗口都可以!)
ftp 192.168.164.133
1
使用用户virtual1和密码123456登录!
然后输入ls,展示该目录下文件列表。
看有没有我们刚才新建的test.txt文本?!
然后测试一下上传,使用put命令,然后看一下目录中是否有上传的文件?
接着测试一下建立目录操作:mkdir newdir,看是否有新目录被创建?!
然后测试一下下载:使用get test.txt,将test.txt文件下载到本地!注意默认的下载路径为windows用户目录c:\Users\xxxxx目录下