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支持简直了,下面这些内容文本输入就显示不全,只能截图了。
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 :账号或者密码错误
原因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的原因。