步骤 1:安装 FTP 服务器

1、 安装 vsftpd 服务器很直接,只要在终端运行下面的命令。

  1. # yum install vsftpd

2、 安装完成后,服务先是被禁用的,因此我们需要手动启动,并设置在下次启动时自动启用:

  1. # systemctl start vsftpd
  2. # systemctl enable vsftpd

3、 接下来,为了允许从外部系统访问 FTP 服务,我们需要打开 FTP 守护进程监听的 21 端口:

  1. # firewall-cmd --zone=public --permanent --add-port=21/tcp
  2. # firewall-cmd --zone=public --permanent --add-service=ftp
  3. # firewall-cmd --reload

步骤 2: 配置 FTP 服务器

4、 现在,我们会进行一些配置来设置并加密我们的 FTP 服务器,让我们先备份一下原始配置文件/etc/vsftpd/vsftpd.conf

  1. # cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.orig

接下来,打开上面的文件,并将下面的选项设置相关的值:

anonymous_enable=NO             ### 禁用匿名登录
local_enable=YES ### 允许本地用户登录
write_enable=YES ### 允许对文件系统做改动的 FTP 命令
local_umask=022 ### 本地用户创建文件所用的 umask 值
dirmessage_enable=YES ### 当用户首次进入一个新目录时显示一个消息
xferlog_enable=YES ### 用于记录上传、下载细节的日志文件
connect_from_port_20=YES ### 使用端口 20 (ftp-data)用于 PORT 风格的连接
xferlog_std_format=YES ### 使用标准的日志格式
listen=NO ### 不要让 vsftpd 运行在独立模式
listen_ipv6=YES ### vsftpd 将监听 IPv6 而不是 IPv4
pam_service_name=vsftpd ### vsftpd 使用的 PAM 服务名
userlist_enable=YES ### vsftpd 支持载入用户列表
tcp_wrappers=YES ### 使用 tcp wrappers

5、 现在基于用户列表文件 /etc/vsftpd.userlist 来配置 FTP 来允许/拒绝用户的访问。

默认情况下,如果设置了 userlist_enable=YES,当 userlist_deny 选项设置为 YES 的时候,userlist_file=/etc/vsftpd.userlist 中列出的用户被拒绝登录。

然而, 更改配置为 userlist_deny=NO,意味着只有在 userlist_file=/etc/vsftpd.userlist 显式指定的用户才允许登录。

userlist_enable=YES ### vsftpd 将从 userlist_file 给出的文件中载入用户名列表
userlist_file=/etc/vsftpd.userlist ### 存储用户名的文件
userlist_deny=NO

这并不是全部,当用户登录到 FTP 服务器时,它们会进入 chroot jail 中,这是仅作为 FTP 会话主目录的本地根目录。

接下来,我们将介绍如何将 FTP 用户 chroot 到 FTP 用户的家目录(本地 root)中的两种可能情况,如下所述。

6、 接下来添加下面的选项来限制 FTP 用户到它们自己的家目录。

chroot_local_user=YES
allow_writeable_chroot=YES

chroot_local_user=YES 意味着用户可以设置 chroot jail,默认是登录后的家目录。

同样默认的是,出于安全原因,vsftpd 不会允许 chroot jail 目录可写,然而,我们可以添加allow_writeable_chroot=YES 来覆盖这个设置。

保存并关闭文件。

步骤 3: 用 SELinux 加密 FTP 服务器

7、现在,让我们设置下面的 SELinux 布尔值来允许 FTP 能读取用户家目录下的文件。请注意,这原本是使用以下命令完成的:

  1. # setsebool -P ftp_home_dir on

然而,由于这个 bug 报告:https://bugzilla.redhat.com/show_bug.cgi?id=1097775ftp_home_dir 指令默认是禁用的。

现在,我们会使用 semanage 命令来设置 SELinux 规则来允许 FTP 读取/写入用户的家目录。

  1. # semanage boolean -m ftpd_full_access --on

这时,我们需要重启 vsftpd 来使目前的设置生效:

  1. # systemctl restart vsftpd

步骤 4: 测试 FTP 服务器

8、 现在我们会用 useradd 命令创建一个 FTP 用户来测试 FTP 服务器。

  1. # useradd -m -c “Ravi Saive, CEO” -s /bin/bash ravi
  2. # passwd ravi

之后,我们如下使用 echo 命令添加用户 ravi 到文件 /etc/vsftpd.userlist 中:

  1. # echo "ravi" | tee -a /etc/vsftpd.userlist
  2. # cat /etc/vsftpd.userlist

9、 现在是时候测试我们上面的设置是否可以工作了。让我们使用匿名登录测试,我们可以从下面的截图看到匿名登录没有被允许。

# ftp 192.168.56.10
Connected to 192.168.56.10 (192.168.56.10).
220 Welcome to TecMint.com FTP service.
Name (192.168.56.10:root) : anonymous
530 Permission denied.
Login failed.
ftp>

测试 FTP 匿名登录

10、 让我们也测试一下没有列在 /etc/vsftpd.userlist 中的用户是否有权限登录,下面截图是没有列入的情况:

# ftp 192.168.56.10
Connected to 192.168.56.10 (192.168.56.10).
220 Welcome to TecMint.com FTP service.
Name (192.168.56.10:root) : aaronkilik
530 Permission denied.
Login failed.
ftp>

FTP 用户登录失败

11、 现在最后测试一下列在 /etc/vsftpd.userlist 中的用户是否在登录后真的进入了他/她的家目录:

# ftp 192.168.56.10
Connected to 192.168.56.10 (192.168.56.10).
220 Welcome to TecMint.com FTP service.
Name (192.168.56.10:root) : ravi
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls

用户成功登录

警告:使用 allow_writeable_chroot=YES 有一定的安全隐患,特别是用户具有上传权限或 shell 访问权限时。

只有当你完全知道你正做什么时才激活此选项。重要的是要注意,这些安全性影响并不是 vsftpd 特定的,它们适用于所有提供了将本地用户置于 chroot jail 中的 FTP 守护进程。

因此,我们将在下一节中看到一种更安全的方法来设置不同的不可写本地根目录。

步骤 5: 配置不同的 FTP 家目录

12、 再次打开 vsftpd 配置文件,并将下面不安全的选项注释掉:

  1. #allow_writeable_chroot=YES

接着为用户(ravi,你的可能不同)创建另外一个替代根目录,并将所有用户对该目录的可写权限移除:

  1. # mkdir /home/ravi/ftp
  2. # chown nobody:nobody /home/ravi/ftp
  3. # chmod a-w /home/ravi/ftp

13、 接下来,在用户存储他/她的文件的本地根目录下创建一个文件夹:

  1. # mkdir /home/ravi/ftp/files
  2. # chown ravi:ravi /home/ravi/ftp/files
  3. # chmod 0700 /home/ravi/ftp/files/

接着在 vsftpd 配置文件中添加/修改这些选项:

  1. user_sub_token=$USER ### 在本地根目录下插入用户名
  2. local_root=/home/$USER/ftp ### 定义任何用户的本地根目录

保存并关闭文件。再说一次,有新的设置后,让我们重启服务:

  1. # systemctl restart vsftpd

14、 现在最后在测试一次查看用户本地根目录就是我们在他的家目录创建的 FTP 目录。

# ftp 192.168.56.10
Connected to 192.168.56.10 (192.168.56.10).
220 Welcome to TecMint.com FTP service.
Name (192.168.56.10:root) : ravi
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls

FTP 用户家目录登录成功

就是这样了!在本文中,我们介绍了如何在 CentOS 7 中安装、配置以及加密的 FTP 服务器,使用下面的评论栏给我们回复,或者分享关于这个主题的任何有用信息。

在下一篇文章中,我们还将向你介绍如何在 CentOS 7 中保护使用 SSL/TLS连接的 FTP 服务器,再此之前,请继续关注 TecMint。

via: http://www.tecmint.com/install-ftp-server-in-centos-7/

作者:Aaron Kili 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如何在 CentOS 7 中安装、配置和安全加固 FTP 服务的更多相关文章

  1. 如何在CentOS系统中安装配置SNMP服务

    CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,现在有一大部分服务器在使用此操作系统:SNMP(简单网络 ...

  2. 如何在 CentOS 8 中安装 Cockpit Web 控制台

    如何在 CentOS 8 中安装 Cockpit Web 控制台 [日期:2019-10-31] 来源:Linux公社  作者:醉落红尘 [字体:大 中 小]   在本文中,我们将帮助您在CentOS ...

  3. 如何在CentOS 7中安装最新Git(源码安装)

    如何在CentOS 7中安装最新Git 2017年05月20日 11:49:53 阅读数:1624 Git是在今天的软件开发行业一个非常有用的版本控制工具.我一直使用Git.于是为Linux公社的读者 ...

  4. 如何在 CentOS 7 中安装或升级最新的内核

    虽然有些人使用 Linux 来表示整个操作系统,但要注意的是,严格地来说,Linux 只是个内核.另一方面,发行版是一个完整功能的系统,它建立在内核之上,具有各种各样的应用程序工具和库. 在正常操作期 ...

  5. 在CentOS 7中安装配置JDK8

    为什么80%的码农都做不了架构师?>>>   ###说明 参考博客:http://blog.csdn.net/czmchen/article/details/41047187 系统环 ...

  6. 【转】如何在CentOS/RHEL中安装基于Web的监控系统 linux-das

    Linux-dash是一款为Linux设计的基于Web的轻量级监控面板.这个程序会实时显示各种不同的系统属性,比如CPU负载.RAM使用率.磁盘使用率.网速.网络连接.RX/TX带宽.登录用户.运行的 ...

  7. 在阿里云的CentOS环境中安装配置MySQL、JDK、Maven

    Welcome to Alibaba Cloud Elastic Compute Service ! [root@izbp19stm1x1k2io1e7r3tz ~]# rpm -Uvh http:/ ...

  8. CentOS 7中安装和配置Promethues

    Prometheus 是什么? Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的.随着发展,越来越多公司和组织接受采用Prome ...

  9. 在CentOS 7中安装nginx服务器

    简要地介绍一下,如何在CentOS 7中安装nginx服务器  下载对应当前系统版本的nginx包(package) # wget  http://nginx.org/packages/centos/ ...

随机推荐

  1. 解决Fragment每次进入都加载的问题

    1.首先了解一下fragment的生命周期 onCreate是指创建该fragment类似于Activity.onCreate,你可以在其中初始化除了view之外的东西,onCreateView是创建 ...

  2. Android实例剖析笔记(四)

    摘要:分析NoteEditor这个类和以及Content Provider机制 NoteEditor深入分析 首先来弄清楚“日志编辑“的状态转换,通过上篇文章的方法来做下面这样一个实验,首先进入“日志 ...

  3. python测试开发django-8.windows系统安装mysql8教程

    前言 MySQL 是最流行的关系型数据库管理系统,可以在本地搭建一个mysql的环境,便于学习. windows7/windows10 mysql-8.0.11-winx64 下载安装包 mysql的 ...

  4. visio 画类图时 方法里如何加参数

    鼠标双击类(打开属性对话框)-->(类别)操作-->属性-->(类别)参数-->(添加参数)

  5. 再有人问你synchronized是什么,就把这篇文章发给他

    在再有人问你Java内存模型是什么,就把这篇文章发给他.中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronize ...

  6. go语言基础之可见性规则验证

    1.可见性规则验证 如果想使用别的包的函数.结构体类型.络构体成员. 函数名.类型名,结构体成员变量名,首字母必段大写,可见. 如果首字母是小写,只能在同一个包里使用. 文件夹样例: 示例: vi t ...

  7. mysql09---sql语句优化

    Sql语句本身的优化 问题是: 如何从一个大项目中,迅速的定位执行速度慢的语句. (定位慢查询) 首先我们了解mysql数据库的一些运行状态如何查询(比如想知道当前mysql运行的时间/一共执行了多少 ...

  8. Template Method 模板方法 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. Javascript执行效率总结

    Javascript是一门非常灵活的语言,我们可以随心所欲的书写各种风格的代码,不同风格的代码也必然也会导致执行效率的差异,开发过程中零零散散地接触到许多提高代码性能的方法,整理一下平时比较常见并且容 ...

  10. IOS中键盘隐藏几种方式

    在ios开发中,经常需要输入信息.输入信息有两种方式: UITextField和UITextView.信息输入完成后,需要隐藏键盘,下面为大家介绍几种隐藏键盘的方式. <一> 点击键盘上的 ...