linux基本服务之FTP服务-vsftpd安装配置。

在Linux系统中FTP服务器的服务不并是叫做ftp,而是叫做vsftpd,通过在Linux系统中安装和配置vsftpd来实现文件的共享。

vsftpd
vsftpd全称(very secure FTP daemon)是一款在Linux系统中最受欢迎的FTP服务器。vsftpd支持匿名访问和本地用户模式两种访问方式。匿名访问方式任何用户都可以访问搭建的FTP服务;本地用户模式只支持添加的本地用户访问搭建的FTP服务。

说明: 匿名用户模式和本地用户模式只可同时配置一种,vsftpd默认已开启匿名访问功能,就是无需输入用户名密码即可登录FTP服务器,但是没有修改或上传文件的权限。

一、安装vsftpd

[root@localhost ~]#vsftpd -version  //查看是否安装了vsftpd
[root@localhost ~]#yum install vsftpd -y    //安装vsftpd服务
[root@localhost ~]#systemctl enable vsftpd    //设置开机自启
[root@localhost ~]#systemctl start vsftpd    //启动ftp服务
[root@localhost ~]#systemctl restart vsftpd   //重启ftp服务
[root@localhost ~]#netstat -antup | grep ftp    //监听ftp端口是否启动

二、有关防火墙的操作。

1、查看防火墙状态

[root@localhost ~]#systemctl status firewalld //查看防火墙的启动信息

[root@localhost ~]#firewall-cmd --state //查看防火墙当前的状态

2、防火墙的基本操作

[root@localhost ~]#systemctl start firewalld //启动防火墙,系统重启后恢复。

[root@localhost ~]#systemctl enable firewalld //启用防火墙,永久生效。

[root@localhost ~]#systemctl stop firewalld  //停止防火墙,系统重启后恢复。

[root@localhost ~]#systemctl disable firewalld //禁用防火墙,永久生效。

[root@localhost ~]#systemctl restart firewalld.service //重启防火墙。

[root@localhost ~]#systemctl is-enable firewall.service //查看防火墙服务是否开机启动。

[root@localhost ~]#systemctl list-unit-files | grep enabled //查看已启动的服务列表。

[root@localhost ~]#systemctl --failed //查看启动失败的服务列表。

3、在防火墙中开启FTP服务。

[root@localhost ~]#firewall-cmd --get-services    //查看可以打开的服务有哪些。

[root@localhost ~]#firewall-cmd --list-services    //firewalld打开了哪些服务,防火墙中没有开启http和ftp服务,则不能通过外网访问搭建的nginx服务器和ftp服务器

[root@localhost ~]#firewall-cmd --permanent --add-service=ftp    //在防火墙列表中永久开启FTP服务,如不加--permanent参数为临时开放。

4、重启防火墙策略生效。
[root@localhost ~]#systemctl restart firewalld    //策略修改完成之后需要重启防火墙生效。
---------------------------------------------------------------------------------------------------

 补充:防火墙开放和关闭端口操作,#对于本例只开放21号端口似乎没什么用。

A、开启一个端口,以端口21为例。

firewall-cmd --zone=public --add-port=21/tcp --permanent  //zone=public:表示域为公共的;add-port=21/tcp:添加tcp协议的端口21;permanent 永久的,如果没有此参数,重后失效;

B、关闭一个端口,以端口21为例。

firewall-cmd --permanent --remove-port=21/tcp  //zone=public:表示域为公共的;add-port=21/tcp:添加tcp协议的端口21;permanent 永久的,如果没有此参数,重后失效;

C、查看防火墙开启的全部端口。

firewall-cmd --list-ports

 

重新载入防火墙规则

firewall-cmd --reload

再次查询,开启成功;

三、配置SElinux

VSFTPD是一个FTP服务器程序,然后SELinux是CentOS的防火墙组件。由于 vsftpd 默认被 SELinux 拦截,所以会遇到访问FTP出现以下的问题:

226 Transfer done (but failed to open directory).(传输完成,但是打开路径失败)

550 Failed to change directory(更改路径失败)

553 Could not create file.

解决方法一:降低SELinux安全级别(此方法原理是:降低SELinux安全级别,把enforcing降低到permissive,但降低整体系统安全作为代价来解决一个小问题,这总不是最佳方案。)

[root@localhost ~]#vim /etc/sysconfig/selinux    //编辑SELinux配置,设置SELINUX=enforcing改为SELINUX=permissive

************************************************************************************************

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

# enforcing - SELinux security policy is enforced.

# permissive - SELinux prints warnings instead of enforcing.

# disabled - No SELinux policy is loaded.

SELINUX=permissive

# SELINUXTYPE= can take one of three two values:

# targeted - Targeted processes are protected,

# minimum - Modification of targeted policy. Only selected processes are protected.

# mls - Multi Level Security protection.

SELINUXTYPE=targeted

************************************************************************************************

[root@localhost ~]#systemctl restart vsftpd   //重启ftp服务,设置生效。

解决方法二:在SELinux中设置FTP允许访问

[root@localhost ~]#getsebool -a | grep ftp    //首先查看SELinux中有关FTP的设置状态:
*************************************************************
ftpd_anon_write --> off

ftpd_connect_all_unreserved --> off

ftpd_connect_db --> off

ftpd_full_access --> off ---# 此行默认为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@localhost ~]#setsebool -P ftpd_full_access=on    //设置ftpd_full_access为开启状态,-P是保存选项,每次重启时不必重新执行这个命令了。

[root@localhost ~]#systemctl restart vsftpd   //重启ftp服务,设置生效。

A、vsftp虚拟用户模式

 1、检查是否安装db_load

[root@localhost ~]#find / -name "db_load"  //检查是否安装db_load

[root@localhost ~]#rpm -qf /user/bin/db_load //查询软件版本号

db_load命令 – 生成db数据库
db_load命令的作用是将用户信息文件转换为数据库并使用 hash 加密,如果需要保存虚拟帐号和密码的文本文件且不让被系统帐号直接调用,我们就需要使用db_load 命令生成db数据库。
# db_load -T -t hash -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db
-T
选项-T 允许应用程序能够将文本文件转译载入进数据库。 由于我们之后是将虚拟用户的信息以文件方式存储在文件里的,为了让Vsftpd这个应用程序能够通过文本来载入用户数据,必须要使用这个选项。如果指定了选项-T,那么一定要追跟子选项-t
-t
子选项-t, 追加在在-T选项后,用来指定转译载入的数据库类型 。扩展介绍下,-t可以指定的数据类型有 Btree、Hash、Queue和Recon数据库。
-f
参数后面接 包含用户名和密码的文本文件 ,文件的内容是: 奇数行用户名、偶数行密码
2、创建用户密码明文文件。

[root@localhost ~]#vi  /etc/vsftpd/vuser.list    //创建用于进行FTP认证的用户数据库文件,其中奇数行为账户名,偶数行为密码。

*******************************************************************

zhangsan    //创建用户名(奇数行) 

zhangsanmima    //创建密码(偶数行)

lisi    //创建用户名(奇数行) 

lisimima    //创建用户名(奇数行) 

*******************************************************************

3、生成密文文件db。

[root@localhost ~]#db_load -T hash -f /etc/vsftpd/vuser.list /etc/vsftpd/vuser.db    //生成加密后的用户数据库文件,cat这个文件会看到最后两行的明文内容,待解。

[root@localhost ~]#file /etc/vsftpd/vuser.db    //查看生成的加密文件属性。

[root@localhost ~]#rm -rf vuser.list    //删除明文账户文件。

 

4、创建vsftpd服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户。

FTP服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。

由于Linux系统中的每一个文件都有所有者、所属组属性,例如使用虚拟账户“张三”新建了一个文件,但是系统中找不到账户“张三”,就会导致这个文件的权限出现错误。为此,需要再创建一个可以映射到虚拟用户的系统本地用户。简单来说,就是让虚拟用户默认登录到与之有映射关系的这个系统本地用户的家目录中,虚拟用户创建的文件的属性也都归属于这个系统本地用户,从而避免Linux系统无法处理虚拟用户所创建文件的属性权限。

 

为了方便管理FTP服务器上的数据,可以把这个系统本地用户的家目录设置为/var目录(该目录用来存放经常发生改变的数据)。并且为了安全起见,我们将这个系统本地用户设置为不允许登录FTP服务器,这不会影响虚拟用户登录,而且还可以避免黑客通过这个系统本地用户进行登录。

[root@localhost ~]#useradd -d /var/ftproot -s /sbin/nologin virtual //创建一个名为virtual的虚拟用户,同时在/var/目录下创建ftproot文件夹作为virtual用户的家目录,用来上传文件。

[root@localhost ~]#ls -ld /var/ftproot //查看创建的ftproot文件夹的权限

[root@localhost ~]#chmod -Rf 755 /var/ftproot //修改新建立的ftproot文件夹权限,创建者有写权限,所属组和其他用户读和执行。

5、建立用于支持虚拟用户的PAM文件。

PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。

通俗来讲,PAM是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认证方式,而不必对应用程序进行任何修改。PAM采取了分层设计(应用程序层、应用接口层、鉴别模块层)的思想,其结构如图下图所示:

pam
图:PAM的分层设计结构

[root@localhost ~]#vim /etc/pam.d/vsftpd.vu //新建一个用于虚拟用户认证的PAM文件vsftpd.vu,其中PAM文件内的“db=”参数为使用db_load命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀.

***********************************************************************************************************
auth required pam_userdb.so db=/etc/vsftpd/vuser //编辑内容,意思是权限验证使用此数据库。

account required pam_userdb.so db=/etc/vsftpd/user //编辑内容,意思是登录账号来源使用此数据库。

***********************************************************************************************************

6、在vsftpd服务程序的主配置文件中通过pam_service_name参数将PAM认证文件的名称修改为vsftpd.vu。

PAM作为应用程序层与鉴别模块层的连接纽带,可以让应用程序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序需要PAM认证时,则需要在应用程序中定义负责认证的PAM配置文件,实现所需的认证功能。

例如,在vsftpd服务程序的主配置文件中默认就带有参数pam_service_name=vsftpd,表示登录FTP服务器时是根据/etc/pam.d/vsftpd文件进行安全认证的。现在我们要做的就是把vsftpd主配置文件中原有的PAM认证文件vsftpd修改为新建的vsftpd.vu文件即可。

[root@localhost ~]#vim /etc/vsftpd/vsftpd.conf

********************************************************************************************************************
anonymous_enable=NO    //禁止匿名开放模式
local_enable=YES    //允许本地用户模式
guest_enable=YES    //开启虚拟用户模式
guest_username=virtual    //指定虚拟用户账户
allow_writeable_chroot=YES    //允许对禁锢的FTP根目录执行写入权限,而且不拒绝用户的登录请求。
pam_service_name=vsftpd.vu //指定PAM文件
********************************************************************************************************************

7、为虚拟用户设置不同的权限。

虽然账户zhangsan和lisi都是用于vsftpd服务程序认证的虚拟账户,但是我们依然想对这两人进行区别对待。比如,允许张三上传、创建、修改、查看、删除文件,只允许李四查看文件。这可以通过vsftpd服务程序来实现。只需新建一个目录,在里面分别创建两个以zhangsan和lisi命名的文件,其中在名为zhangsan的文件中写入允许的相关权限(使用匿名用户的参数):

[root@localhost ~]# mkdir /etc/vsftpd/vusers_dir/    //新建一个用户目录?
[root@localhost ~]# cd /etc/vsftpd/vusers_dir/    //进入新建的用户目录。
[root@localhost vusers_dir]# touch lisi    //新建一个名为lisi的文件,不设置任何权限。
[root@localhost vusers_dir]# vim zhangsan    //新建一个zhangsan的文件,设置相关权限如下。

*************************************************
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

*************************************************

8、然后再次修改vsftpd主配置文件,通过添加user_config_dir参数来定义这两个虚拟用户不同权限的配置文件所存放的路径。

[root@localhost ~]#vim /etc/vsftpd/vsftpd.conf

********************************************

user_config_dir=/etc/vsftpd/vusers_dir

********************************************

9、测试
zhangsan用户具有读写权限,所以可以新建文件等。但是lisi没有权限。
 
posted @ 2022-05-15 20:16  郭晓宁  阅读(782)  评论(0编辑  收藏  举报