FTP 的安装与配置

FTP 的安装与配置

1. 参考内容

1.1 https://help.aliyun.com/document_detail/51998.html
1.2 http://wiki.ubuntu.org.cn/Vsftpd
1.3 http://wiki.ubuntu.org.cn/Vsftpd%E8%99%9A%E6%8B%9F%E7%94%A8%E6%88%B7%E8%AE%BE%E7%BD%AE
1.4 https://askubuntu.com/questions/413677/vsftpd-530-login-incorrect
1.5 https://askubuntu.com/questions/575523/how-to-setup-virtual-users-for-vsftpd-with-access-to-a-specific-sub-directory
1.6 https://www.jianshu.com/p/413ac3ab26a3
1.7 https://www.cnblogs.com/kuliuheng/p/3209744.html

2. 整体说明

2.1 这篇博客是针对Ubuntu 安装FTP服务的说明和介绍,Ubuntu 版本 16.04
2.2 要使用FTP服务,首先我们得安装FTP的服务程序,本文安装的是VSFTPD,安装软件后我们需要修改一些配置(比如支持虚拟用户登录、用户的权限设置)。到此,我们已经可以使用FTP服务了,但是在客户端和服务器之间传输数据时候是明文传输(包括登录时的账户名和密码),为了安全,我们需要服务器和客户端使用FTPS 协议传输。

3. 安装与配置

3.1 安装VSFTP

3.1.1 安装指令

sudo apt-get install vsftpd

3.1.2 安装以后,你应该可以看到 该软件对应的配置文件 /etc/vsftpd.conf
通过 man 5 vsftpd.conf 你可以查看配置文件内容
文件内容 xferlog_file=/var/log/vsftpd.log 定义了日志文件位置

3.1.3 防火墙配置
FTP默认的端口是21,你需要防火墙配置中打开21端口

3.1.4 启动命令

sudo service vsftpd start/restart/stop  -- 启动,重启,关闭
sudo netstat -npltu | grep 21 -- 查看 端口状态

3.2 配置VSFTP

先说我的需求场景:

平时本地Windows 服务器代码,利用FTP上传到云服务器,在服务编译运行。 我可以使用云服务器的系统账号来使用FTP服务器,但是这样这个FTP账户拥有的权限和我的云服务器系统账号基本接近,不太安全,所以我想创建一个虚拟用户,只用来FTP的数据传输。

规划:`/home/vsftpd` 目录专门用来传输文件。 `/home/vsftpd/ftpone` 是我的第一个FTP账号的工作目录,可以在此目录内长传、下载文件。
我的第一个账号:**ftpone**

3.2.1 vsftpd.conf 的基本配置(用户权限配置)

先备份配置,备份配置,备份配置 /etc/vsftpd.conf
先改几个基本配置:
anonymous_enable=NO    --匿名用户禁止登陆
local_enable=YES       --本地用户(服务器账号)允许登陆
chroot_local_user=YES  --禁止用户浏览非个人目录文件

配置的时候,NO或者YES后面一定不要有空格!!!
——————————————————————————————————-
以下是一些配置选项的说明:
这CSDN的markdown支持简直了,下面这些内容文本输入就显示不全,只能截图了。
VSFTPD常用配置选项

3.2.2 为虚拟用户创建服务器的系统账号

sudo useradd vsftpd -d /home/vsftpd -s /bin/false

前面说过,我准备将vsftpd 作为以后ftp的工作目录, 记住,一定要指定 -s /bin/false 
这是很多人账号和密码都对,但是登录时有 530 报错的原因。

因为我要用账号ftpone登录,使用 /home/vsftpd/ftpone 作为该账号的可见根目录。
所以需要 创建该目录并设置权限。
sudo mkdir /home/vsftpd/ftpone
sudo chown vsftpd:vsftpd /home/vsftpd/ftpone    -- 修改目录拥有者
sudo chmod 744 /home/vsftpd/ftpone              -- 修改权限

权限问题是导致很多人上传、下载失败的原因!!! 

3.2.3 创建虚拟用户数据库

为了安全,我们建立的虚拟用户将采用PAM(Linux身份验证共享库系统,它为系统中的应用程序或服务提供动态身份验证模块支持)进行验证。
vsftpd 也使用了这个系统 pam_service_name=vsftpd, 对应验证配置文件在 /etc/pam.d/vsftpd

很多人出现 530 错误码的时候,修改这个参数内容,这是不安全的。博客后面介绍

以下是为了这个验证服务器做的工作。

首先安装 db5.3-util (ubuntu 版本不同 db*—util的版本号也不同) 
sudo apt-get install db5.3-util


然后创建账号密码文件
vi /home/vsftpd/user.txt
内容如下,必须奇数行用户名,偶数行密码:(如果想创建多个账号,依次规则继续添加)
ftpone
123456

最后产生账号密码的数据库文件
sudo db4.8_load -T -t hash -f /home/vsftpd/user.txt /etc/vsftpd_login.db
需要修改文件权限:
sudo chmod 600 /etc/vsftpd_login.db

至此,虚拟用户的账号密码都已经建立,那么如何让vsftpd使用起来呢?前面说过,这个是为了系统的身份验证(PAM), 那么我们需要在pam系统的vsfptd配置文件中使用。 路径 /etc/pam.d/vsftpd
修改该文件,在最前面添加两行
sudo useradd vsftpd -d /home/vsftpd -s /bin/false
sudo chown vsftpd:vsftpd /home/vsftpd

(参考内容1.5 使用htpasswd)

3.2.4 分配虚拟用户权限

因为虚拟用户可能多个,所以要指定用户对于目录
我们在 /etc/vsftpd.conf 添加一行
user_config_dir=/etc/vsftpd_user_conf 
(你要问我这个配置项在原来配置文件中是没有的,我怎么知道要加的, 记得前面 man 5 vsftpd.conf 吗,很多选项说明)
这行配置指明我们对各个用户的具体(差异化)配置放到了该目录下
我们在目录下创建文件  /etc/vsftpd_user_conf/ftpone
文件名和账号名一致,可以根据自己需求添加更多内容
文件内容如下:(YES和NO后面不能有空格,注释)
chroot_local_user=YES   -- 禁止用户切换目录
local_root=/home/vsftpd/ftpone    --指定工作目录

至此, 使用 sudo service vsftpd restart 启动vsftpd后,就可以使用账号 ftpone, 密码 123456 使用 服务器提供的FTP服务了

4. 安全配置

完成上面内容后,我们就可以使用虚拟用户登录FTP服务了,但是我们的数据传输都是明文,很不安全。我们使用SSL/TLS来进行数据的加密。

4.1 为 FTP 生成 SSL / TLS 证书

4.1.1 创建放置证书和秘钥的目录

sudo mkdir  /etc/ssl/private

4.1.2 创建证书和秘钥

sudo openssl req -x509 -nodes -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem -days 365 -newkey rsa:2048
执行该指令,会让你以此输入以下信息

Country Name (2 letter code) [XX]:IN

State or Province Name (full name) []:guangdong

Locality Name (eg, city) [Default City]:shenzhen

Organization Name (eg, company) [Default Company Ltd]:test1

Organizational Unit Name (eg, section) []:test1

Common Name (eg, your name or your server’s hostname) []:xxx

Email Address []:[email protected]

执行该指令后,将证书和秘钥都放在了同一个文件 /etc/ssl/private/vsftpd.pem
建议只改 -days 参数,表示证书的有效期

4.1.3 如何让vsftpd使用TLS
修改 /etc/vsftpd.conf 文件

启用 ssl 服务,使用比SSL更安全的TLS: ssl_enable=YES

ssl_tlsv1=YES

ssl_sslv2=NO

ssl_sslv3=NO

为了防止特定密码攻击,添加下面内容:
ssl_ciphers=HIGH

为了安全, 禁用重用ssl: require_ssl_reuse=NO

为了禁止匿名用户使用ssl登录: allow_anon_ssl=NO 强制非匿名用户使用ssl登录:

force_local_data_ssl=YES

force_local_logins_ssl=YES
如果你要使用 FTP的被动连接模式,需要服务器告诉客户端,连接一个服务器随机端口(参考1.7): pasv_min_port=10000 pasv_max_port=11000 (我个人使用,所以开方1000个已经很足够了)

使用我们上面步骤制作的证书和秘钥: rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem

4.1.4 配置防火墙
在4.1.3 步骤中,我们需要使用端口 10000 -11000,所以防火墙要开方这些端口

5. 常见错误说明

5.1 错误码:530

  1. 原因1 :账号或者密码错误
  2. 原因2:确定账号和密码正确,没有给玩家指定 shell,你可以在 /etc/passwd 中查看账号,是否指定了shell。该文件格式:username:password:User ID:Group ID:comment:home directory:shell

    通常网上的方式是:修改/etc/vsftpd.conf 中的pam_service_name=vsftpd,值改为ftp
    确实这样好了,但是这样是不安全的。pam_service_name选项是指定 pam 验证规则的,如果只为ftp,由于默认ftp是没有规则的,所以能够连接成功,但这样就等于弃用了vsftpd的pam规则,所以是不安全的。

    再回到原因,因为pam_service_name=vsftpd 表示使用 /etc/pam.d/vsftpd,这文件最后有一行
    auth required pam_shells.so
    这行表示需要登录账户有 shell,这个shell必须在 /etc/shells 中存在。

    这也是我们在3.2.2 创建用户时,指定shell的原因。

猜你喜欢

转载自blog.csdn.net/l101606022/article/details/79944576