上文:Linux服务器配置-VSFTP服务配置(五)
上文中已经介绍了使用数据库文件方式配置虚拟用户认证登录FTP服务器,这篇文件将介绍通过数据库方式(vsftpd服务+pam_mysql+MySQL)配置虚拟用户认证登录FTP服务器。
一、安装配置MySQL数据库
这里以在CentOS6中安装MySQL5.7.25社区版和在RHEL7中安装MySQL8.0.15社区版为例,下文中的示例图片无特殊说明,均已在CentOS6中安装MySQL5.7.25数据库为主。另外,本人发布文章中的实例都是亲自测试成功后发布的。
1、查看系统中是否安装其他版本的MySQL数据库。
rpm -qa | grep mysql
如果已安装了其他版本的mysql-server,需先停止mysqld服务,再删除安装的mysql软件包。
停止mysql服务
- CentOS6系统
service mysqld stop
- RHEL7或CentOS7系统
systemctl stop mysqld
根据所安装的mysql软件包,用 yum remove 或 rpm -e 命令删除。
2、下载mysql的repo源。
在MySQL官网https://dev.mysql.com/downloads/repo/yum/,选择适合的Linux平台发行包,下载repo源。
或用wget命令在Linux系统中直接下载repo源rpm包。(以下为适合RHEL Linux/ Oracle Linux的发行版的rpm包)
- CentOS6系统
wget https://dev.mysql.com/get/mysql80-community-release-el6-2.noarch.rpm
- RHEL7或CentOS7系统
wget https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm
3、安装下载的软件包。
安装软件包后,会获得两个mysql的repo源:/etc/yum.repos.d/mysql-community.repo 和 /etc/yum.repos.d/mysql-community-source.repo。
- CentOS6系统
rpm -ivh /root/mysql80-community-release-el6-2.noarch.rpm
- RHEL7或CentOS7系统
rpm -ivh /root/mysql80-community-release-el7-2.noarch.rpm
yum clean all
yum makecache
4、查看repo源当前启用的是哪个MySQL版本的存储库。(即当前repo源支持的MySQL版本)
MySQL的不同发行版托管在不同的子存储库中。默认情况下启用最新(当前为MySQL 8.0.15)的子存储库,并禁用所有其他版本的子存储库。使用以下命令查看MySQL Yum存储库中的所有子存储库及子存储库启用或禁用状态。
yum repolist all | grep mysql
在这里可以看出当前repo源支持的子存储库及已启用了mysql插件、工具及8.0版本的子存储库。
5、设置repo源启用哪个版本的子存储库。(即更换repo源当前支持的MySQL版本)
yum-config-manager --disable mysql80-community#关闭mysql8.0版本
yum-config-manager --enable mysql57-community #启用mysql5.7版本
yum repolist all | grep mysql #查看mysql5.7版本子存储库是否开启
除了使用以上命令之外,还可以通过手动编辑/etc/yum.repos.d/mysql-community.repo 文件来设置 ,将文件中相应MySQL版本的“enabled=”设置为1或0。(1表示启用,0表示关闭)
注:如果需要安装最新版本的MySQL数据库,此步可省略。
6、安装mysql-community(社区版)数据库
yum install -y mysql-community-server
7、查看mysql的安装版本。
mysqladmin -V
CentOS6系统
RHEL7系统
8、修改MySQL的配置文件(/etc/my.cnf)
备份配置文件
cp /etc/my.cnf /etc/my.cnf.bak
修改配置文件
vim /etc/my.cnf
#设置mysql数据字符集
character-set-server=utf8#MySQL-5.7版本
character-set-server=utf8mb4#MySQL-8.0版本
#设置mysql的端口号,默认为3306。
port=3306
设置mysql表名是否区分大小写:0表示区分大小写;1表示不区分大小写
lower_case_table_names=1
9、启动MySQL数据库。
- CentOS6系统
service mysqld start
- RHEL7或CentOS7系统
systemctl start mysqld.service
10、查询mysqld服务的运行状态并设置为开机自启。
- CentOS6系统
service mysqld status#查询mysqld服务运行状态
chkconfig mysqld on#设置mysqld服务开机自启
chkconfig --list | grep mysqld #查询mysql服务开机自启状态
- RHEL7或CentOS7系统
systemctl status mysqld #查询mysqld服务运行状态
systemctl enable mysqld#设置mysqld服务开机自启
systemctl list-unit-files | grep mysqld#查询mysql服务开机自启状态
11、查看MySQL数据库root用户的初始密码。
cat /var/log/mysqld.log | grep 'A temporary password'
12、登录MySQL数据库并设置root用户密码。
a、配置MySQL用户密码复杂度说明
validate_password.policy=0
设置密码强度检查等级。
密码强度检查等级为:0 or LOW、1 or MEDIUM、2 or STRONG。有以下取值:
0 or LOW :测试项目为Length(密码长度) 。
1 or MEDIUM:测试项目为Length; numeric, lowercase/uppercase, and special characters(密码的长度、数字、大小写和特殊字符) ,此项为默认值。
2 or STRONG:测试项目为Length; numeric, lowercase/uppercase, and special characters; dictionary file(密码的长度、数字、大小写、特殊字符和密码字典文件。)
validate_password.dictionary_file
设置用于验证密码强度的字典文件路径。
validate_password.mixed_case_count=0
设置密码大小写字符的长度
validate_password.number_count=0
设置密码数字的长度
validate_password.special_char_count=0
设置密码特殊字符的长度
validate_password.length=0
设置密码的最小长度,默认为8。
注:validate_password.length 的长度要大于 validate_password.mixed_case_count + validate_password.number_count + validate_password.special_char_count 的和。
b、FLUSH PRIVILEGES—SQL语句使用说明
此SQL语句的作用是从内置的mysql库中,将当前user和privilige表中的用户信息与权限信息提取到内存中。MySQL用户数据和权限被修改后,在“不重启mysqld服务"的情况下直接生效。
c、首次登录MySQL数据库
首次登录MySQL数据库,需使用上步查询到的初始密码。登录MySQL数据库的命令为:mysql -u username -h host -P port -p password。
在MySQL-5.7版本以后,首次登录MySQL数据库,必须先修改root用户密码后才能进行其他数据库操作,密码要求至少8位,需要包含大小写字母、数字和特殊字符。
注:下文中“mysql>”为数据库中的命令提示符,其后为要执行的SQL语句。
#使用root用户本地登录MySQL数据库。
mysql -u root -p
#修改root用户密码。(单引号内的password为新密码)
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
mysql> FLUSH PRIVILEGES;#刷新缓存
若想设置为简单密码如123456,则要通过以下SQL语句来设置。
- MySQL-5.7版本
mysql> SET GLOBAL validate_password_policy=0; #设置用户密码的检查强度
mysql> SET GLOBAL validate_password_length=6; #设置用户密码最小位数
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';#修改root用户密码
mysql> FLUSH PRIVILEGES;#刷新缓存
mysql> SELECT @@validate_password_policy;#查看用户密码的检查强度设置
mysql> SHOW VARIABLES LIKE 'validate_password%'; #查看用户密码选项的设置
- MySQL-8.0版本
mysql> SET GLOBAL validate_password.policy=0; #设置用户密码的检查强度
mysql> SET GLOBAL validate_password.length=6;#设置用户密码最小位数
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';#修改root用户密码
mysql> FLUSH PRIVILEGES;#刷新缓存
mysql> SELECT @@validate_password.policy;#查看用户密码的检查强度设置
mysql> SHOW VARIABLES LIKE 'validate_password%'; #查看用户密码选项的设置
以上只是临时配置,若要永久生效可在MySQL配置文件(/etc/my.cnf)中,加入如下配置项,并重启mysqld服务。
- CentOS6系统
validate_password_policy=0
validate_password_length=6
- RHEL7或CentOS7系统
validate_password.policy=0
validate_password.length=6
可通过quit命令退出MySQL数据库。
13、安全设置MySQL数据库
通过安全设置向导,对MySQL数据库进行安全设置操作。
安全设置分为以下几个选项:
- 修改root用户的密码
- 是否移除匿名用户
- 是否禁用root账户远程登录
- 是否移除测试数据库(test)
- 是否重新加载授权表
在Linux系统中执行以下命令,运行安全设置向导。
mysql_secure_installation
14、远程链接MySQL数据库配置
建议在测试或开发环境下开启root用户远程访问MySQL数据库的权限;在生产环境下,通过建立数据库管理员DBA,并授予相应的权限来远程管理数据库。
a、改表法
通过修改mysql内置数据库中user表host字段的值,可使root或其他用户远程访问MySQL数据库。
使用root用户登录MySQL数据库。
mysql -u root -p #登录MySQL数据库
mysql> USE mysql; #转到名为mysql的内置数据库
mysql> SELECT user,host FROM user;#查询user表的记录(仅显示出user列和host列)。
mysql> UPDATE user SET host = '%' WHERE user = 'root';#修改user表,user字段=root的host字段值为%。(也就是设置root用户可使用任何地址远程访问数据库,%表示任何地址。)
mysql> FLUSH PRIVILEGES;#刷新缓存
mysql> SELECT user,host FROM user;#查询user表的记录(仅显示出user列和host列)。
b、授权法
mysql -u root -p #登录MySQL数据库
mysql> USE mysql; #转到名为mysql的内置数据库
- 在MySQL-8.0版本中
mysql> CREATE USER 'admin'@'192.168.1.%' IDENTIFIED BY '123456'; #创建新用户、设置密码并设置允许远程访问的IP地址段(用户名admin、密码123456、可远程访问的IP地址段为192.168.1.0)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'192.168.1.%' WITH GRANT OPTION; #设置新建用户对所有数据库对象具有全部的操作权限。(MySQL 赋予用户权限的SQL语句的简单格式为:GRANT 权限 ON 数据库对象 TO 用户,如果要使该用户可以将自己拥有的权限授权给别人,可加上WITH GRANT OPTION选项。)
mysql> FLUSH PRIVILEGES;#刷新缓存
mysql> SHOW GRANTS FOR 'admin'@'192.168.1.%';#查看新建用户的权限
- 在MySQL-5.7版本中
mysql> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'192.168.1.%' IDENTIFIED BY '123456' WITH GRANT OPTION; #MySQL8.0以下的版本,创建用户和设置用户权限,可以使用一条SQL语句完成。
mysql> FLUSH PRIVILEGES;#刷新缓存
mysql> SHOW GRANTS FOR 'admin'@'192.168.1.%';#查看新建用户的权限
15、防火墙配置
- CentOS6系统
iptables -t filter -I INPUT -p tcp -m tcp --dport 3306 -m state --state NEW -j ACCEPT #添加防火墙规则
service iptables save#保存防火墙规则
service iptables restart #重启防火墙
iptables -t filter --line-number -nL INPUT#查看现有防火墙规则
- RHEL7或CentOS7系统
firewall-cmd --permanent --zone=public --add-port=3306/tcp#添加防火墙规则
firewall-cmd --reload#重载防火墙
firewall-cmd --list-all #查看现有防火墙规则
16、远程链接MySQL数据库验证
在Linux系统中使用MySQL客户端验证远程链接
mysql -u admin -h 192.168.1.90 -p
在Windows系统中使用Navicat Premium 12工具远程链接
二、安装pam-mysql
1、CentOS6系统yum方式安装
a、安装EPEL repo源
yum install -y epel-release 或 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum clean all
yum makecache
b、安装pam-mysql
yum install -y pam_mysql
2、RHEL7或CentOS7系统安装
a、下载pam_mysql-0.8.1-0.22.el7.lux.x86_64.rpm包
wget http://repo.iotti.biz/CentOS/7/x86_64/pam_mysql-0.8.1-0.22.el7.lux.x86_64.rpm
b、安装下载的软件包
rpm -ivh pam_mysql-0.8.1-0.22.el7.lux.x86_64.rpm
3、查询pam_mysql.so是否存在
find / -name pam_mysql.so
三、实例说明通过数据库方式(vsftpd服务+pam_mysql+MySQL)配置虚拟用户认证登录FTP服务器。
1、配置软件环境说明。
CentOS6系统
- CentOS release 6.10 (Final)
- vsftpd-2.2.2-24.el6.x86_64
- MySQL-5.7.25
- pam_mysql-0.7-0.12
RHEL7系统
- Red Hat Enterprise Linux Server release 7.6 (Maipo)
- vsftpd-3.0.2-25.el7.x86_64
- MySQL-8.0.15
- pam_mysql-0.8.1-0.22
服务器配置要求:
- FTP服务采用被动模式运行,只允许虚拟用户登录,并将被动端口锁定在59800-59900之间。
- 虚拟用户信息保存在MySQL数据库中。
- 虚拟用户snowfox为FTP管理员,其FTP根目录设定在/var/vftproot目录中,该用户具有可下载、上传、新建目录(文件)、更名、及删除文件的权限。
- 虚拟用户wendy为一般用户,其FTP根目录设定在/var/vftproot/wendy目录中(即只能访问自己的FTP目录),该用户具有可下载、上传、新建目录(文件)、更名、及删除文件的权限。
- 虚拟用户itcat为一般用户,其FTP根目录设定在/var/vftproot目录中(即可访问其他用户FTP目录),该用户只有查看和下载文件的权限。
2、创建本地映射用户,并设置FTP目录的权限。
adduser -d /var/vftproot -s /sbin/nologin virftp
chmod -R 755 /var/vftproot
3、配置MySQL数据库,用于vsftp虚拟用户数据库认证登录。
a、创建vsftp虚拟用户数据库认证登录所需要的库文件。
登录MySQL,创建vsftpdb数据库。
mysql -u root -p
mysql> CREATE DATABASE vsftpdb;
b、在vsftpdb数据库中创建用户表vsftp_users。
mysql> USE vsftpdb; #使用vsftpdb数据库
mysql> select database(); #查看当前用户所使用的数据库
mysql> CREATE TABLE vsftp_users( #建立vsftp用户表vsftp_users
user_id SMALLINT AUTO_INCREMENT NOT NULL, #设置表的用户id字段
user_name CHAR(20) NOT NULL, #设置表的用户名字段
user_password CHAR(48) BINARY NOT NULL, #设置表的用户密码字段
PRIMARY key(user_id)); #设置表的主键为user_id字段
mysql> DESC vsftp_users; #查看vsftp_users表结构的详细信息
c、在vsftp_users表中批量添加vsftp虚拟用户信息
mysql> INSERT INTO vsftp_users (user_name,user_password) VALUE
('snowfox',MD5('666666')),
('wendy',MD5('666666')),
('itcat',MD5('666666'));
mysql> SELECT * FROM vsftp_users; #查询vsftp_users表的所有记录
d、添加FTP数据库用户vsftp,并设置此用户只有查询vsftpdb数据库中的所有表的权限。
mysql> USE mysql;
mysql> CREATE USER 'vsftp'@'localhost' IDENTIFIED BY 'vsftpd';#创建新用户并设置密码
mysql> GRANT SELECT ON vsftpdb.* TO 'vsftp'@'localhost'; #设置新建用户并对其设置相关权限
mysql> FLUSH PRIVILEGES; #刷新缓存
mysql> SHOW GRANTS FOR 'vsftp'@'localhost'; #查看新建用户的权限
MySQL-8.0数据库
由于MySQL-8.0之前版本的加密规则是mysql_native_password,而MySQL-8.0的加密规则是caching_sha2_password,所以数据库用户在使用pam_mysql.so与MySQL-8.0版本的数据库链接时,需要修改相应数据库用户的加密规则为mysql_native_password。
mysql> ALTER USER 'vsftp'@'localhost' IDENTIFIED WITH mysql_native_password BY 'vsftpd';
mysql> FLUSH PRIVILEGES;
4、建立PAM认证文件
在/etc/pam.d/目录中创建用于vsftp的PAM认证文件。
vim /etc/pam.d/vsftpd.mysql
加入以下语句
auth required /lib64/security/pam_mysql.so user=vsftp passwd=vsftpd host=localhost db=vsftpdb table=vsftp_users usercolumn=user_name passwdcolumn=user_password crypt=3
account required /lib64/security/pam_mysql.so user=vsftp passwd=vsftpd host=localhost db=vsftpdb table=vsftp_users usercolumn=user_name passwdcolumn=user_password crypt=3
注意pam_mysql.so文件的路径。
说明:
pam_mysql.so模块选项
-- verbose 设置为1则显示详细的调试信息,默认0
-- debug 开启调试模式
-- user mysql数据库认证的用户名
-- passwd mysql数据库认证的密码
-- host mysql数据库的主机名称或IP
-- db 包含验证信息的数据库名称
-- table 包含验证信息的数据库表名称
-- usercolumn 包含验证的用户名列
-- passwdcolumn 包含验证的密码列
-- crypt 密码加密方式,
0 无加密,默认为此值;
1 使用crypt(3)函数加密;
2 使用MySQL的PASSWORD函数加密;(在mysql8.0中已经取消此函数)
3 使用普通十六进制md5加密;
4 使用普通十六机制SHA1加密;
-- sqllog 设置为“true”或“yes”,则启用SQL日志记录,默认false
-- logtable 存储日志的表名称
-- logmsgcoumn 该列存储日志的消息
-- logusercolumn 该列存储产生日志的用户名
-- logpidcolumn 该列存储产生日志的进程PID
5、修改vsftpd配置文件。
备份原配置文件
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
修改配置文件
vim /etc/vsftpd/vsftpd.conf
具体修改请参阅上篇文章—Linux服务器配置-VSFTP服务配置(五),这里就不再说明。
请注意修改以下配置项:
pam_service_name=/etc/pam.d/vsftpd.mysql
6、为虚拟用户单独创建配置文件及相应目录,已调整各个虚拟用户的不同访问权限。
具体修改请参阅上篇文章—Linux服务器配置-VSFTP服务配置(五),这里就不再说明。
7、防火墙配置
vsftpd服务的防火墙配置已在—Linux服务器配置-VSFTP服务配置(三)中加以说明,这里不再重复。
8、SELinux设置
- CentOS6系统
更改vsftp的SELinux布尔变量
setsebool -P ftp_home_dir on
setsebool -P allow_ftpd_full_access on
- RHEL7系统
setsebool -P ftpd_full_access on
9、重启vsftpd服务
- CentOS6系统
service vsftpd restart
- RHEL7系统
systemctl restart vsftpd
10、验证配置结果
11、VSFTP与MySQL部署在不同的服务器上
以上实例是VSFTP与MySQL安装在一台服务器上的配置,如果将这两个服务安装在不同的服务器上,例如vsftpd服务安装在地址为192.168.1.100的服务器上,MySQL数据库安装在地址为192.168.1.200的服务器上,配置与上面基本相同,不同之处说明如下。
① 添加FTP数据库用户时,添加的是远程链接用户,远程地址是vsftp服务器的地址。
CREATE USER 'vsftp'@'192.168.1.100' IDENTIFIED BY 'vsftpd';
② 创建用于vsftp的PAM认证文件时,host选项为MySQL服务器的地址。
auth required /lib64/security/pam_mysql.so user=vsftp passwd=vsftpd host=192.168.1.200 db=vsftpdb table=vsftp_users usercolumn=user_name passwdcolumn=user_password crypt=3
account required /lib64/security/pam_mysql.so user=vsftp passwd=vsftpd host=192.168.1.200 db=vsftpdb table=vsftp_users usercolumn=user_name passwdcolumn=user_password crypt=3
以上是我在学习Linux系统中整理的一些学习要点,肯定会有不对的地方,希望各位大侠给与指正,我们共同学习!谢谢!