在 Ubuntu 15.10 上使用 vsftpd + TLS 加密和 MySQL 的虚拟主机
本教程适用于这些操作系统版本
- Ubuntu 15.10(狡猾的狼人)
- Ubuntu 12.10(Quantal Quetzal)
在此页
- 1 条初步说明
- 2 安装 vsftpd、MySQL 和 phpMyAdmin
- 3 为 vsftpd 创建 MySQL 数据库
- 4 配置vsftpd
- 5 为 TLS 创建 SSL 证书
- 6 在 vsftpd 中启用 TLS
- 7 创建第一个虚拟用户
- 8 数据库管理
- 9 虚拟机镜像
- SSH登录
- MySQL 登录
Vsftpd 是 Linux 上最安全和最快的 FTP 服务器之一。通常,vsftpd 被配置为与系统用户一起工作。本文档描述了如何安装一个 vsftpd 服务器,该服务器使用 MySQL 数据库中的虚拟用户而不是真实的系统用户。这样性能更高,并且允许在一台机器上拥有数以千计的 ftp 用户。
对于 MySQL 数据库的管理,您可以使用基于 Web 的工具,如 phpMyAdmin,它也将安装在本指南中。 phpMyAdmin 是一个舒适的图形界面,这意味着您不必乱用命令行。
本教程基于 Ubuntu 15.10。你应该已经设置了一个
本指南旨在作为实用指南;它不包括理论背景。它们在网络上的许多其他文档中得到处理。
本文档不提供任何形式的保证!我想说的是,这不是建立这样一个系统的唯一方法。有很多方法可以实现这个目标,但这是我采用的方法。我不保证这对你有用!
1 初步说明
在本教程中,我使用 IP 地址为 192.168.1.100 的主机名 server1.example.com。这些设置可能因您而异,因此您必须在适当的地方替换它们。
因为我们必须以 root 权限运行本教程中的所有步骤,所以我们可以在本教程中的所有命令前加上字符串 sudo,或者我们现在通过键入成为 root
sudo su
2 安装vsftpd、MySQL和phpMyAdmin
Vsftpd 没有内置的 MySQL 支持,因此我们必须使用 PAM 对 MySQL 数据库进行身份验证。所以我们除了安装 vsftpd、MySQL 和 phpMyAdmin 之外,还安装了 libpam-mysql:
apt-get -y install vsftpd libpam-mysql mysql-server mysql-client phpmyadmin libpam-ldap
您将被问及以下问题:
New password for the MySQL "root" user: <-- yourrootsqlpassword
Repeat password for the MySQL "root" user: <-- yourrootsqlpassword
LDAP server Uniform Resource Identifier: <-- ENTER
Distinguished name of the search base: <-- ENTER
LDAP version to use: <-- 3
Make local root Database admin: <-- Yes
Does the LDAP database require login? <-- No
LDAP account for root: <-- ENTER
LDAP root account password: <-- ldaprootpw
Web server to configure automatically: <-- Select the option: apache2
Configure database for phpmyadmin with dbconfig-common? <-- Yes
Password of the database's administrative user: <-- Enter the MariaDB root password
MySQL application password for phpmyadmin: <-- Press enter, apt will create a random password automatically.3 为 vsftpd 创建 MySQL 数据库
现在我们创建一个名为 vsftpd 的数据库和一个名为 vsftpd 的 MySQL 用户,vsftpd 守护进程稍后将使用它来连接到 vsftpd 数据库:
mysql --defaults-file=/etc/mysql/debian.cnf
CREATE DATABASE vsftpd;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'ftpdpass';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO 'vsftpd'@'localhost.localdomain' IDENTIFIED BY 'ftpdpass';
FLUSH PRIVILEGES;将字符串 ftpdpass 替换为您要用于 MySQL 用户 vsftpd 的任何密码。仍然在 MySQL shell 上,我们创建我们需要的数据库表(是的,只有一张表!):
USE vsftpd;
CREATE TABLE `accounts` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 30 ) NOT NULL ,
`pass` VARCHAR( 50 ) NOT NULL ,
UNIQUE (
`username`
)
);quit;
正如您可能已经注意到的那样,随着退出;命令我们已经离开了 MySQL shell 并回到了 Linux shell。
顺便说一句,(我假设你的 ftp 服务器系统的主机名是 server1.example.com)你可以在 http://server1.example.com/phpmyadmin/ 下访问 phpMyAdmin(你也可以使用 IP 地址代替 server1.example .com) 在浏览器中并以用户 vsftpd 身份登录。然后你可以看看数据库。稍后您可以使用 phpMyAdmin 来管理您的 vsftpd 服务器。
4 配置vsftpd
首先,我们创建一个名为 vsftpd 的非特权用户(主目录为 /home/vsftpd),属于组 nogroup。我们将在该用户下运行 vsftpd,我们的虚拟用户的 FTP 目录将在 /home/vsftpd 目录中(例如 /home/vsftpd/user1、/home/vsftpd/user2 等)。
useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd
然后我们备份原始的 /etc/vsftpd.conf 文件并创建我们自己的:
cp /etc/vsftpd.conf /etc/vsftpd.conf_orig
cat /dev/null > /etc/vsftpd.conf
nano /etc/vsftpd.conf该文件应包含以下内容:
listen=YES anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES nopriv_user=vsftpd chroot_local_user=YES secure_chroot_dir=/var/run/vsftpd pam_service_name=vsftpd rsa_cert_file=/etc/ssl/certs/vsftpd.pem guest_enable=YES guest_username=vsftpd local_root=/home/vsftpd/$USER user_sub_token=$USER virtual_use_local_privs=YES user_config_dir=/etc/vsftpd_user_conf
配置选项在 http://vsftpd.beasts.org/vsftpd_conf.html 上有解释。我们的虚拟设置的重要选项是 chroot_local_user、guest_enable、guest_username、user_sub_token、local_root 和 virtual_use_local_privs。
使用 user_config_dir 选项,您可以为覆盖部分全局设置的每个用户配置文件指定一个目录。如果您想使用此功能,这完全是可选的,由您决定。但是,我们现在应该创建该目录:
mkdir /etc/vsftpd_user_conf
现在我们必须配置 PAM,以便它使用 MySQL 数据库来验证我们的虚拟 FTP 用户,而不是 /etc/passwd 和 /etc/shadow。 vsftpd 的 PAM 配置在 /etc/pam.d/vsftpd 中。我们备份原始文件并创建一个新文件,如下所示:
cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd_orig
cat /dev/null > /etc/pam.d/vsftpd
nano /etc/pam.d/vsftpdauth required pam_mysql.so user=vsftpd passwd=ftpdpass host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2 account required pam_mysql.so user=vsftpd passwd=ftpdpass host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2
之后,我们重启 vsftpd:
service vsftpd restart
5 为 TLS 创建 SSL 证书
为了使用 TLS,我们必须创建一个 SSL 证书。我在 /etc/ssl/private 中创建它 - 如果该目录不存在,请立即创建它:
mkdir -p /etc/ssl/private
chmod 700 /etc/ssl/private之后,我们可以生成 SSL 证书,如下所示:
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
国家名称(2 个字母代码)[AU]:<-- 输入您的国家名称(例如,\DE\)。
州或省名称(全名)[Some-State]:<-- 输入您的州或省名称。
地方名称(例如,城市)[]:<-- 输入您的城市。
组织名称(例如,公司)[Internet Widgits Pty Ltd]:<-- 输入您的组织名称(例如,您公司的名称)。
组织单位名称(例如,部门)[]:<-- 输入您的组织单位名称(例如 \IT 部门\)。
通用名称(例如,您的name) []:<-- 输入系统的完全限定域名(例如 \server1.example.com\)。
电子邮件地址 []:<-- 输入您的电子邮件地址。6 在 vsftpd 中启用 TLS
为了在 vsftpd 中启用 TLS,打开 /etc/vsftpd.conf...
nano /etc/vsftpd.conf
...并添加以下选项:
# Turn on SSL ssl_enable=YES # Allow anonymous users to use secured SSL connections allow_anon_ssl=YES # All non-anonymous logins are forced to use a secure SSL connection in order to # send and receive data on data connections. force_local_data_ssl=YES # All non-anonymous logins are forced to use a secure SSL connection in order to send the password. force_local_logins_ssl=YES # Permit TLS v1 protocol connections. TLS v1 connections are preferred ssl_tlsv1=YES # Permit SSL v2 protocol connections. TLS v1 connections are preferred ssl_sslv2=NO # permit SSL v3 protocol connections. TLS v1 connections are preferred ssl_sslv3=NO # Disable SSL session reuse (required by WinSCP) require_ssl_reuse=NO # Select which SSL ciphers vsftpd will allow for encrypted SSL connections (required by FileZilla) ssl_ciphers=HIGH # This option specifies the location of the RSA certificate to use for SSL # encrypted connections. rsa_cert_file=/etc/ssl/private/vsftpd.pem [...]
如果您使用 force_local_logins_ssl=YES 和 force_local_data_ssl=YES,则只允许 TLS 连接(这将锁定所有使用不支持 TLS 的旧 FTP 客户端的用户);通过使用 force_local_logins_ssl=NO 和 force_local_data_ssl=NO 允许 TLS 和非 TLS 连接,具体取决于 FTP 客户端支持的内容。
之后重启vsftpd:
service vsftpd restart
就是这样。您现在可以尝试使用您的 FTP 客户端进行连接;但是,您应该将 FTP 客户端配置为使用 TLS(如果您使用 force_local_logins_ssl=YES 和 force_local_data_ssl=YES,这是必须的)——请参阅下一章如何使用 FileZilla 执行此操作。
7 创建第一个虚拟用户
要填充数据库,您可以使用 MySQL shell:
mysql --defaults-file=/etc/mysql/debian.cnf
USE vsftpd;
现在我们使用密码 secret 创建虚拟用户 testuser(将使用 MySQL 的 PASSWORD 函数加密存储):
INSERT INTO accounts (username, pass) VALUES('testuser', PASSWORD('secret'));
quit;testusers 主目录是/home/vsftpd/testuser;不幸的是,如果该目录不存在,vsftpd 不会自动创建该目录。因此,我们现在手动创建它并使其归 vsftpd 用户和 nogroup 组所有:
mkdir /home/vsftpd/testuser
chown vsftpd:nogroup /home/vsftpd/testuser
chmod a-w /home/vsftpd/testuser现在在您的工作站上打开您的 FTP 客户端程序(例如 FileZilla 或 FireFTP)并尝试连接。作为主机名,您使用 server1.example.com(或系统的 IP 地址),用户名是 testuser,密码是秘密的。
8 数据库管理
对于大多数人来说,如果他们有 MySQL 的图形前端,那就更容易了;因此您也可以使用 phpMyAdmin(在本例中位于 http://server1.example.com/phpmyadmin/)来管理 vsftpd 数据库。
每当您创建或修改用户时,请确保使用 MySQL 的 PASSWORD 函数来加密该用户的密码。另外,当你创建一个新的虚拟用户时,请不要忘记在 shell 上创建该用户的 homedir,如上一章末尾所示。
9 虚拟机镜像
本教程以 OVA/OVF 格式的虚拟机可供 Howtoforge 订阅者使用。 VM 格式兼容 VMWare 和 Virtualbox 以及其他可以导入此格式的工具。您可以在顶部的右侧菜单中找到下载链接。单击文件名开始下载。
VM 的登录详细信息为:
SSH登录
用户名:administrator
密码:howtoforge管理员用户具有 sudo 权限。
登录
用户名:root
密码:howtoforge请在首次启动后更改密码。
VM 配置为静态 IP 192.168.1.100,可以在文件 /etc/network/interfaces 中更改 IP。
10 个链接
- vsftpd:http://vsftpd.beasts.org/
- Ubuntu:http://www.ubuntu.com/