Vsftpd服务linux
1.匿名开放模式:算法
是一种最不安全的认证模式,任何人均可以无需密码验证而直接登陆到FTP服务器。数据库
搭建过程:vim
yum install vsftpd* ftp -y安全
iptables -F服务器
service iptables saveapp
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bakssh
grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conftcp
cat /etc/vsftpd/vsftpd.conf测试
默认配置:
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
第1步:修改主配置文件:vim /etc/vsftpd/vsftpd.conf
添加下5行:注意空格,删除译文:
anonymous_enable=YES(默认开启)#是否容许匿名用户访问
anon_umask=022 #匿名用户上传文件的umask值
anon_upload_enable=YES #是否容许匿名用户上传文件
anon_mkdir_write_enable=YES #是否容许匿名用户建立目录
anon_other_write_enable=YES #是否容许匿名用户修改、删除 建立目录
#下2行,默认不添加
anon_max_rate=0 #匿名用户的最大传输速率(字节/秒),0为不限制
anon_root=/var/ftp/pub #指定匿名用户的FTP根目录
第2步:重启服务,并设置开机启动
systemctl restart vsftpd
systemctl enable vsftpd
第3步:测试
报错1:
[root@gyt~]# ftp 192.168.1.109
Connected to 192.168.1.109 (192.168.1.109).
220 (vsFTPd 3.0.2)
Name (192.168.1.109:root): ftp
331 Please specify the password.
Password:此处敲击回车便可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub #切换匿名用户根目录/var/ftp/pub
250 Directory successfully changed.
ftp> mkdir files #建立目录文件
550 Permission denied. #系统提示“权限拒绝”(Permission denied)
在vsftpd服务程序的匿名开放认证模式下,默认访问的是/var/ftp目录。查看该目录的权限得知,只有root管理员才有写入权限。下面将目录的全部者身份改为系统帐户ftp便可(该帐户在系统中已经存在),这样应该能够了吧:
解决报错1:
(1)查看目录权限:
[root@gyt ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 root root 16 Jul 13 14:38 /var/ftp/pub
(2)修改属主
[root@gyt ~]# chown -Rf ftp /var/ftp/pub
[root@gyt ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 ftp root 16 Jul 13 14:38 /var/ftp/pub
报错2:
[root@linuxprobe ~]# ftp 192.168.1.109
Connected to 192.168.1.109 (192.168.1.109).
220 (vsFTPd 3.0.2)
Name (192.168.1.109:root): ftp
331 Please specify the password.
Password:此处敲击回车便可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
550 Create directory operation failed.
#系统提示“建立目录的操做失败”(Create directory operation failed)
想必各位读者也应该意识到是SELinux服务在“捣乱”。
下面使用getsebool命令查看与FTP相关的SELinux域策略都有哪些:
[root@gyt ~]# getsebool -a | grep ftp
ftp_home_dir --> off
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
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off
解决报错2:
根据经验(须要长期培养,别无它法)和策略的名称判断出ftpd_full_access--> off策略规则致使了操做失败。接下来修改该策略规则,而且在设置时使用-P参数让修改过的策略永久生效,确保在服务器重启后依然可以顺利写入文件。
[root@gyt ~]# setsebool -P ftpd_full_access=on
再次测试:
[root@gyt ~]# ftp 192.168.1.109
Connected to 192.168.1.109 (192.168.1.109).
220 (vsFTPd 3.0.2)
Name (192.168.1.109:root): ftp
331 Please specify the password.
Password:此处敲击回车便可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
257 "/pub/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.
2.本地用户模式:
是经过Linux系统本地的帐户密码信息进行认证的模式,相较于匿名开放模式更安全,并且配置起来也很简单。可是若是被黑客破解了帐户的信息,就能够畅通无阻地登陆FTP服务器,从而彻底控制整台服务器。
搭建过程:
yum install vsftpd* ftp -y
iptables -F
service iptables save
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
cat /etc/vsftpd/vsftpd.conf
默认配置:
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
第1步:修改配置文件:
[root@gyt ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #禁止匿名访问模式
local_enable=YES #容许本地用户模式
write_enable=YES #设置可写权限
local_umask=022 #本地用户模式建立文件的umask值
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES #开启用户做用名单文件功能
tcp_wrappers=YES
默认不配置下行:
userlist_deny=YES #启用“禁止用户名单”,名单文件为ftpusers和user_list
第2步:重启服务
[root@gyt ~]# systemctl restart vsftpd
[root@gyt ~]# systemctl enable vsftpd
第3步:测试
#按理来说,如今已经彻底能够本地用户的身份登陆FTP服务器了。可是在使用root管理员登陆后,系统提示以下的错误信息:
报错1:
[root@gyt ~]# ftp 192.168.1.109
Connected to 192.168.1.109 (192.168.1.109).
220 (vsFTPd 3.0.2)
Name (192.168.1.109:root): root
530 Permission denied.
Login failed. #登陆失败
ftp>
#缘由:(ftpusers和user_list)这两个文件里的系统用户禁止登陆。
解决方法1:删除这2个文件里的系统用户以下:
解决办法2:从新建立新系统用户,保证这2个文件里没有用户名。
[root@gyt ~]# cat /etc/vsftpd/user_list
1 # vsftpd userlist
2 # If userlist_deny=NO, only allow users in this file
3 # If userlist_deny=YES (default), never allow users in this file, and
4 # do not even prompt for a password.
5 # Note that the default vsftpd pam config also check/etc/vsftpd/ftpusers
6 # for users that are denied.
7 root #删除root
8 bin
9 daemon
略.....
[root@gyt ~]# cat /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
1 root #删除root
2 bin
3 daemon
略.....
果真如此!vsftpd服务程序为了保证服务器的安全性而默认禁止了root管理员和大多数系统用户的登陆行为,这样能够有效地避免黑客经过FTP服务对root管理员密码进行暴力破解。若是您确认在生产环境中使用root管理员不会对系统安全产生影响,只需按照上面的提示删除掉root用户名便可。咱们也能够选择ftpusers和user_list文件中没有的一个普通用户尝试登陆FTP服务器:
#在采用本地用户模式登陆FTP服务器后,默认访问的是该用户的家目录,也就是说,访问的是/home/gyt目录。并且该目录的默认全部者、所属组都是该用户本身,所以不存在写入权限不足的状况。可是当前的操做仍然被拒绝,是由于咱们刚才将虚拟机系统还原到最初的状态了。为此,须要再次开启SELinux域中对FTP服务的容许策略:
设置SELinux域容许策略,而后使用本地用户模式登陆FTP服务器。
[root@gyt ~]# getsebool -a | grep ftp
[root@gyt ~]# setsebool -P ftpd_full_access=on
#在实验课程和生产环境中设置SELinux域策略时,必定记得添加-P参数,不然服务器在重启后就会按照原有的策略进行控制,从而致使配置过的服务没法使用。
[root@gyt ~]# ftp 192.168.1.109
Connected to 192.168.1.109 (192.168.1.109).
220 (vsFTPd 3.0.2)
Name (192.168.1.109:root): root
331 Please specify the password.
Password:此处输入该用户的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/home/gyt/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.
3.虚拟用户模式:
虚拟用户模式是这三种模式中最安全的一种认证模式,固然,由于安全性较之于前面两种模式有了提高,因此配置流程也会稍微复杂一些。
搭建过程:
yum -y install lrzsz* (远程链接rz上传 sz 文件名 下载软件)
yum install vsftpd* ftp -y
iptables -F
service iptables save
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
cat /etc/vsftpd/vsftpd.conf
#默认配置:
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
第1步:建立用于进行FTP认证的用户数据库文件,其中奇数行为帐户名,偶数行为密码。例如,咱们分别建立出gyt和pemglang两个用户。
[root@gyt ~]# cd /etc/vsftpd/
[root@gyt vsftpd]# vim vuser.list
gyt
123.com
penglang
123456
xiaowang
123456
#可是,明文信息既不安全,也不符合让vsftpd服务程序直接加载的格式,所以须要使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,而且下降数据库文件的权限(避免其余人看到数据库文件的内容),而后再把原始的明文信息文件删除。
[root@gyt vsftpd]# db_load -T -t hash -f vuser.list vuser.db #转换成数据库文件
[root@gyt vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@gyt vsftpd]# chmod 600 vuser.db
[root@gyt vsftpd]# rm -f vuser.list
第2步:建立vsftpd服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户。FTP服务用于存储文件的根目录指的是,当虚拟用户登陆后所访问的默认位置。
#为了方便管理FTP服务器上的数据,能够把这个系统本地用户的家目录设置为/var目录(该目录用来存放常常发生改变的数据)。而且为了安全起见,咱们将这个系统本地用户设置为不容许登陆FTP服务器,这不会影响虚拟用户登陆,并且还能够避免黑客经过这个系统本地用户进行登陆
[root@gyt ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@gyt ~]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/
[root@gyt ~]# chmod -Rf 755 /var/ftproot/
第3步:创建用于支持虚拟用户的PAM文件vsftpd.vu。
#PAM(可插拔认证模块)是一种认证机制,经过一些动态连接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员能够根据需求灵活调整服务程序的不一样认证方式。要想把PAM功能和做用彻底讲透,至少要一个章节的篇幅才能够(对该主题感兴趣的读者敬请关注本书的进阶篇,里面会详细讲解PAM)。
#通俗来说,PAM是一组安全机制的模块,系统管理员能够用来轻易地调整服务程序的认证方式,而没必要对应用程序进行任何修改。PAM采起了分层设计(应用程序层、应用接口层、鉴别模块层)的思想。
#新建一个用于虚拟用户认证的PAM文件vsftpd.vu,其中PAM文件内的“db=”参数为使用db_load命令生成的帐户密码数据库文件的路径,但不用写数据库文件的后缀:
[root@gyt ~]# vim /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
第4步:在vsftpd主配置文件中经过pam_service_name参数将PAM认证文件的名称修改成vsftpd.vu,PAM做为应用程序层与鉴别模块层的链接纽带,可让应用程序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序须要PAM认证时,则须要在应用程序中定义负责认证的PAM配置文件,实现所需的认证功能。
[root@gyt ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #禁止匿名开放模式
local_enable=YES #容许本地用户模式
guest_enable=YES #开启虚拟用户模式
guest_username=virtual #指定虚拟用户帐户
allow_writeable_chroot=YES #容许对禁锢的FTP根目录执行写入操做
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu#指定PAM文件
userlist_enable=YES
tcp_wrappers=YES
第5步:为虚拟用户设置不一样的权限。虽然帐户gyt和penglang都是用于vsftpd服务程序认证的虚拟帐户,可是咱们依然想对这两人进行区别对待。好比,容许gyt上传、建立、修改、查看、删除文件,只容许penglang查看文件。这能够经过vsftpd服务程序来实现。只需新建一个目录,在里面分别建立两个以gyt和pemglang命名的文件,其中在名为gyt的文件中写入容许的相关权限(使用匿名用户的参数):
[root@gyt ~]# mkdir /etc/vsftpd/vusers_dir/
[root@gyt ~]# cd /etc/vsftpd/vusers_dir/
建立3个用户文件写入权限:
[root@gyt vusers_dir]# vim gyt
复制时请注意删除译文;
anon_upload_enable=YES #是否容许匿名用户下载文件
anon_mkdir_write_enable=YES #是否容许匿名用户建立目录
anon_other_write_enable=YES #是否容许匿名用户修改、删除 建立目录
其余用户配置以下:
[root@gyt vusers_dir]# vim penglang #查看、下载 建立目录(不能删除)
anon_upload_enable=YES
anon_mkdir_write_enable=YES
[root@gyt vusers_dir]# vim xiaowang #查看、下载文件
anon_upload_enable=YES
第6步:而后再次修改vsftpd主配置文件,经过添加user_config_dir参数来定义这两个虚拟用户不一样权限的配置文件所存放的路径。为了让修改后的参数当即生效,须要重启vsftpd服务程序并将该服务添加到开机启动项中:
[root@gyt ~]# vim /etc/vsftpd/vsftpd.conf
#完整配置:
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES
user_config_dir=/etc/vsftpd/vusers_dir
第7步:重启服务,设置开机启动,设置SELinux域容许策略。
[root@gyt ~]# systemctl restart vsftpd
[root@gyt ~]# systemctl enable vsftpd
设置SELinux域容许策略,而后使用虚拟用户模式登陆FTP服务器。
[root@gyt ~]# getsebool -a | grep ftp
[root@gyt ~]# setsebool -P ftpd_full_access=on
第8步:测试
#此时,不但可使用虚拟用户模式成功登陆到FTP服务器,还能够分别使用帐户gyt和pemglang来检验他们的权限。固然,读者在生产环境中必定要根据真实需求来灵活配置参数,不要照搬这里的实验操做。
[root@gyt ~]# ftp 192.168.1.109
Connected to 192.168.1.109 (192.168.1.109).
220 (vsFTPd 3.0.2)
Name (192.168.1.109:root): xiaowang #虚拟用户xiaowang登陆
331 Please specify the password.
Password:此处输入虚拟用户的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
550 Permission denied. #系统提示“权限拒绝”(Permission denied)
ftp> exit
221 Goodbye.
[root@gyt ~]# ftp 192.168.1.109
Connected to 192.168.1.109 (192.168.1.109).
220 (vsFTPd 3.0.2)
Name (192.168.1.109:root): gyt #虚拟用户gyt登陆
331 Please specify the password.
Password:此处输入虚拟用户的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files #默认建立的文件根文件目录在/var/ftproot下
257 "/files" created
ftp> rename files database #重命名文件数据库
350 Ready for RNTO. #准备好了
250 Rename successful. #更名成功
ftp> rmdir database #rmdir数据库
250 Remove directory operation successful. #删除目录操做成功
ftp> exit
221 Goodbye.
重启服务器时。注意防火墙设置iptables -F 清除
注意上传文件的属主属组以及权限须要改成644能够下载。