一、vsftpd服务简介
vsftpd-very secure ftp daemon,非常安全的FTP服务进程,是linux/unix发行版中最主流的FTP服务程序。
它的优点是:小巧轻快,安全易用,稳定高效,满足企业跨部门,多用户的使用等。
FTP基于C/S模式,分为FTP主动模式和FTP被动模式。
二、安装vsftpd服务器程序
这里我们采用yum方式安装vsftpd服务器,并设置防火墙和关闭SElinux。
1.安装vsftpd并启动服务
- [root@vsftpserver ~]# yum install -y vsftpd
- [root@vsftpserver ~]# systemctl start vsftpd
- 设置开机启动
- [root@vsftpserver ~]# systemctl enable vsftpd
2.在防火墙上开放FTP服务
- [root@vsftpserver ~]# firewall-cmd --permanent --add-service=ftp
- success
- [root@vsftpserver ~]# firewall-cmd --reload
- success
- [root@vsftpserver ~]#
3.关闭SELinux
这里有两种方式
- [root@vsftpserver ~]# sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
- 或者:
- [root@vsftpserver ~]# setenforce 0
4.查看vsftpd运行状态
- [root@vsftpserver ~]# systemctl status vsftpd
- ● vsftpd.service - Vsftpd ftp daemon
- Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
- Active: active (running) since 一 2019-04-01 15:15:36 CST; 16h ago
- Main PID: 15720 (vsftpd)
- CGroup: /system.slice/vsftpd.service
- └─15720 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
- 4月 01 15:15:36 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon...
- 4月 01 15:15:36 localhost.localdomain systemd[1]: Started Vsftpd ftp daemon.
- [root@vsftpserver ~]#
已经正常运行。
三、配置vsftpd服务程序及测试
vsftpd作为更加安全的文件传输的服务程序,允许用户以三种认证模式登录到FTP服务器上。
分别为:匿名开放模式、本地用户模式、虚拟用户模式。
1.匿名开放模式下测试
这种模式是一种不安全的认证模式,无需密码,通过yum install -y vsftpd安装完成启动vsftpd服务后即可访问,不需其他设置。
FTP客户端直接访问:
1)windows下资源管理器或者安装FTP客户端软件
- ftp://192.168.150.96/
2)Linux系统下安装ftp/lftp客户端
- [root@ftpclient ~]# yum install ftp lftp -y
- [root@ftpclient ~]# lftp 192.168.150.96
- lftp 192.168.150.96:~> ls
- -rw-r--r-- 1 0 0 0 Apr 01 07:20 moon.txt
- drwxr-xr-x 2 0 0 177 Apr 01 07:39 music
- drwxr-xr-x 2 0 0 6 Oct 30 19:45 pub
- lftp 192.168.150.96:/> pwd
- ftp://192.168.150.96/
- lftp 192.168.150.96:/> mkdir mytest
- mkdir: Access failed: 550 Permission denied. (mytest)
- lftp 192.168.150.96:/>
此时只有读权限。
3)从服务器上下载文件
- [root@ftpclient ~]# wget -m ftp://192.168.150.96/moon.txt
- --2019-04-02 08:26:17-- ftp://192.168.150.96/moon.txt
- => “192.168.150.96/.listing”
- 正在连接 192.168.150.96:21... 已连接。
- 正在以 anonymous 登录 ... 登录成功!
- ==> SYST ... 完成。 ==> PWD ... 完成。
- ==> TYPE I ... 完成。 ==> 不需要 CWD。
- ==> PASV ... 完成。 ==> LIST ... 完成。
- [ <=> ] 309 --.-K/s 用时 0s
- 2019-04-02 08:26:17 (33.8 MB/s) - “192.168.150.96/.listing” 已保存 [309]
- 远程文件比本地文件 “192.168.150.96/moon.txt” 更老 -- 不获取。
- FINISHED --2019-04-02 08:26:17--
- Total wall clock time: 0.007s
- Downloaded: 1 files, 309 in 0s (33.8 MB/s)
- [root@ftpclient ~]#
4)修改匿名用户访问FTP服务器的权限
- [root@vsftpserver ~]# vim /etc/vsftpd/vsftpd.conf
- anonymous_enable=YES
- anon_umask=022
- anon_upload_enable=YES
- anon_mkdir_write_enable=YES
- anon_other_write_enable=YES
- 重启服务
- [root@vsftpserver ~]# systemctl restart vsftpd
然后在客户端登录服务器上进行测试
- [root@ftpclient ~]# ftp 192.168.150.96
- Connected to 192.168.150.96 (192.168.150.96).
- 220 (vsFTPd 3.0.2)
- Name (192.168.150.96:root): ftp
- 331 Please specify the password.
- Password:
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp> ls
- 227 Entering Passive Mode (192,168,150,96,185,61).
- 150 Here comes the directory listing.
- -rw-r--r-- 1 0 0 0 Apr 01 07:20 moon.txt
- drwxr-xr-x 2 0 0 177 Apr 01 07:39 music
- drwxr-xr-x 2 0 0 6 Oct 30 19:45 pub
- 226 Directory send OK.
- ftp> cd pub
- 250 Directory successfully changed.
- ftp> ls
- 227 Entering Passive Mode (192,168,150,96,126,196).
- 150 Here comes the directory listing.
- 226 Directory send OK.
- ftp> pwd
- 257 "/pub"
- ftp> mkdir test
- 550 Create directory operation failed.
- ftp>
注:FTP匿名用户默认为anonymous、ftp密码为空。
此时还是没有写权限。
5)修改SELinux安全策略
- [root@vsftpserver ~]# vim /etc/vsftpd/vsftpd.conf
- [root@vsftpserver ~]# systemctl restart vsftpd
- [root@vsftpserver ~]# getsebool -a | grep ftp
- ftpd_anon_write --> off
- ftpd_connect_all_unreserved --> off
- ftpd_connect_db --> off
- ftpd_full_access --> off
- ftpd_use_cifs --> off
- ftpd_use_fusefs --> off
- ftpd_use_nfs --> off
- ftpd_use_passive_mode --> off
- httpd_can_connect_ftp --> off
- httpd_enable_ftp_server --> off
- tftp_anon_write --> off
- tftp_home_dir --> off
- [root@vsftpserver ~]#
然后用-P打开ftdp_full_access使策略永久生效
- [root@vsftpserver ~]# setsebool -P ftpd_full_access=on
- [root@vsftpserver ~]#
重启,继续测试:
6)更改目录权限
- [root@vsftpserver ftp]# chown -R ftp pub/
- [root@vsftpserver ftp]#
2.本地用户模式下测试
将上面测试的anonymous_enable=NO
- [root@vsftpserver ftp]# vim /etc/vsftpd/vsftpd.conf
- anonymous_enable=NO
- local_enable=YES
- write_enable=YES
- local_umask=022
重启服务
此时无法登录,用匿名用户或者root用户。
1)新建两个FTP用户
- [root@vsftpserver /]# useradd moonftp01
- [root@vsftpserver /]# useradd moonftp02
- [root@vsftpserver /]# echo "11111111" | passwd --stdin moonftp01
- 更改用户 moonftp01 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- [root@vsftpserver /]# echo "11111111" | passwd --stdin moonftp02
- 更改用户 moonftp02 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- [root@vsftpserver /]#
2)禁止这两个账户登录系统,保证系统安全
- [root@vsftpserver /]# usermod -s /sbin/nologin moonftp01
- [root@vsftpserver /]# usermod -s /sbin/nologin moonftp02
- [root@vsftpserver /]#
3)登录测试
- [root@ftpclient ~]# ftp 192.168.150.96
- Connected to 192.168.150.96 (192.168.150.96).
- 220 (vsFTPd 3.0.2)
- Name (192.168.150.96:root): moonftp02
- 331 Please specify the password.
- Password:
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp> ls
- 227 Entering Passive Mode (192,168,150,96,37,81).
- 150 Here comes the directory listing.
- 226 Directory send OK.
- ftp>
3.虚拟用户模式
这种模式是安全认证机制,采用PAM(可插拔认证模块)认证。
1)安装vsftpd虚拟用户用到的软件和认证模块
- [root@vsftpserver ~]# yum install pam * libdb-tuils libbdb* --skip-broken -y
2)创建虚拟临时用户列表
虚拟临时用户文件/etc/vsftpd/vuser.list
- [root@vsftpserver vsftpd]# vim vuser.list
- [root@vsftpserver vsftpd]# cat vuser.list
- moonrong01
- 123456
- moonrong02
- 123456
- [root@vsftpserver vsftpd]#
以上建立两个用户moonrong01和moonrong02,密码为123456
3)生成vsftpd虚拟用户数据库认证文件,设置权限为600,删除原始文件
- [root@vsftpserver vsftpd]# db_load -T -t hash -f vuser.list vuser.db
- [root@vsftpserver vsftpd]# file vuser.db
- vuser.db: Berkeley DB (Hash, version 9, native byte-order)
- [root@vsftpserver vsftpd]# chmod 600 vuser.db
- [root@vsftpserver vsftpd]# rm -rf vuser.list
- [root@vsftpserver vsftpd]#
4)创建vsftpd服务程序的根目录
- [root@vsftpserver ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
- [root@vsftpserver ~]# ls -ld /var/ftproot/
- drwx------. 3 virtual virtual 78 4月 2 09:46 /var/ftproot/
- [root@vsftpserver ~]# chmod -Rf 755 /var/ftproot/
- [root@vsftpserver ~]#
5)配置PAM认证文件,两个文件
行首加入如下代码
- [root@vsftpserver ~]# vim /etc/pam.d/vsftpd.vu
- [root@vsftpserver ~]# cat /etc/pam.d/vsftpd.vu
- auth required pam_userdb.so db=/etc/vsftpd/vuser
- account required pam_userdb.so db=/etc/vsftpd/vuser
- [root@vsftpserver ~]#
- ###########这里出了问题:
- [root@localhost /]# vim /etc/pam.d/vsftpd
- #%PAM-1.0
- auth required pam_userdb.so db=/etc/vsftpd/vuser
- account required pam_userdb.so db=/etc/vsftpd/vuser
- #session optional pam_keyinit.so force revoke
- #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
- #########################
6)修改vsftpd服务程序主配置文件,通过pam_service_name参数将PAM认证文件的名称修改为vsftpd.vu。
pam_service_name=vsftpd.vu
7)为虚拟用户设置不同的权限
这里设置moonrong01上传、创建、修改、查看、删除文件的权限。
这里设置moonrong02查看文件的权限。
- [root@vsftpserver ~]# mkdir /etc/vsftpd/vusers_dir/
- [root@vsftpserver ~]# cd /etc/vsftpd/vusers_dir/
- [root@vsftpserver vusers_dir]# touch moonrong02
- [root@vsftpserver vusers_dir]# vim moonrong01
- [root@vsftpserver vusers_dir]# cat moonrong01
- anon_upload_enable=YES
- anon_mkdir_write_enable=YES
- anon_other_write_enable=YES
- [root@vsftpserver vusers_dir]#
再次修改vsftpd主配置文件
通过user_config_dir参数来定义这两个虚拟用户不现权限的配置文件所存放的路径。
- pam_service_name=vsftpd.vu
- userlist_enable=YES
- tcp_wrappers=YES
- user_config_dir=/etc/vsftpd/vusers_dir