注:(测试主机的ip为192.168.1.156)
vsftpd:一个从0建构的非常安全的FTP服务程序.
1. 安装vsftpd软件包(vsftpd.x86_64 0:3.0.2-11.el7_2)
yum -y install vsftpd
systemctl start vsftpd.service # 启动
ss -lnt # 查看21号端口处于监听状态,成功的话此时可在浏览器中输入
# ftp://192.168.1.156可得到内容如下图(即/var/ftp目录中内容)或使
# 用ftp lftp等命令行客户端也能访问成功
主配置文件: /etc/vsftpd/vsftpd.conf
辅助配置文件: /etc/vsftpd/ftpusers # pam认证的配置文件可以 查看文件/etc/pam.d/vsftpd说明(为了安全,默认是拒绝了诸如root等用户的登录)
主程序: /usr/sbin/vsftpd
UnitFile: /usr/lib/systemdj/system/vsftpd.service
文件路径映射: /var/ftp 即用户的家目录的映射,访问ftp必须以某个系统用户的身份,此用户的家目录即文件档目录
ftp用户种类
- 匿名用户: 不需要输入帐号或密码就能访问的用户.
- 系统用户: 本机上存在的且有账号与密码的用户.(因为搭建vsftpd只是为了共享文件,用此用户登录会削弱安全性)
- 虚拟用户: 映射到某个系统用户的文件,只是为了登录vsftpd为存在,非常安全
配置vsftpd主配置文件(/etc/vsftpd/vsftpd.conf)
1.
anonymous_enable=YES
# 是否允许匿名用户登录
2.anon_upload_enable=YES
# 是否允许匿名用户上传
3.anon_other_write_enable=YES
# 是否允许匿名用户删除文件 依赖2(这项配置文件默认没有,得自己编写)
4.anon_other_mkdir_enable=YES
# 是否允许匿名用户创建目录. 依赖2
5.local_enable=YES
# 是否允许系统用户登录(普通用户才行)
6.chroot_local_user=YES
# 用户访问ftp服务器端时只能访问登录用户自己的家目录(安全性)并映射成'/',需要事先将用户家目录取消其写权限,不然会报出OOPS: vsftpd: refusing to run with writable root inside chroot()Login failed.Service not available, remote server has closed connection类似的错误
7.chroot_list_enable=YES
# 哪些用户需要将其禁锢在其家目录
8.chroot_list_file=/etc/vsftpd/chroot_list
# 这条依赖6与7,6是YES的话8中的文件用户不会禁锢,反之相反(需要手动创建 echo 'centos'>/etc/vsftpd/chroot_list)
9.xferlog_enable=YES
# 激活上传与下载的日志,建议这9 10 11几条都关闭
10.xferlog_std_format=YES
11.xferlog_file=/var/log/xferlog
12.userlist_enable=YES
# 是否启用列表(/etc/vsftpd/user_list)控制可登录的用户,如果这个指令为YES的话则由第13条指令控制这个列表的拒绝行为与
13.userlist_deny={YES|NO}
# YES(默认)的话为拒绝/etc/vsftpd/user_list里的用户登录,NO为允许, 即可登录用户黑白名单的设置(需要显示输入用户名或密码)[[
虚拟用户登录vsftpd(更安全)
用户帐号可以存储在文件 MySQL Redis..中,这里我们用MySQL实现.
pam模块(/usr/lib64/security/)对各应用程序的支持
例如:pam.cracklib.so可以验证弱口令
应用程序调用pam哪些模块的文件 /etc/pam.d/*
实例演示(利用pam认证模块 MySQL 完成虚拟用户访问vsftpd服务)
1. yum -y install mariadb-server #安装数据库
systemctl start mariadb.service; ss -lnt; # 启动数据库服务并检查
2. yum -y groupinstall "Development Tools" "Server Platform Development" # 准备编译环境(因为CentOS7没有自pam-mysql的rpm包,需要自行编译CentOS6不存在这个问题)
3. wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz #下载pam-mysql的源码包并编译
tar -zxvf pam_mysql-0.7RC1.tar.gz # 查看INSTALL 与README文件
yum -y install mariadb-devel pam-devel openssl-devel # 安装部分支持包
./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security #configure
make && make install
4. mysql # 准备数据库内容
>create datebase vsftpd; # 创建名为vsftpd的数据库来保存虚拟用户
>use vsftpd;
>create table users (id int not null auto_increment primary key, name char(30) not null unique key, password char(48) );
>desc users; # 查看
>insert into users (name,password) values ('james',PASSWORD('magedu'));
>insert into users (name,password) values ('uangianlap',PASSWORD('magedu'));
>select * from users; #检查是否生成数据
>grant select(all) on vsftpd.* to 'vsftpd'@'localhost' identified by 'magedu'; # 授权vsftpd用户对本机上的数据库vsftpd里的所有表具有select(或者all)权限
>grant select(all) on vsftpd.* to 'vsftpd'@'127.0.0.1' identified by 'magedu'; # 对于地址解析,保险起见
>flush privileges;exit;
5. 修改vsftpd主配置文件里的指令为: pam_service_name=vsftpd.mysql # 不是非得叫这个名,但这个文件要存在于/etc/pam.d/中.
vim /etc/pam.d/vsftpd.mysql # pam-mysql README文件
> auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=magedu host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
> account required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=magedu host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
6. 创建一个用以(所有)虚拟用户映射的用户
useradd -r -d /ftproot -s /sbin/nologin vuser
mkdir /ftproot/{pub,upload} # 注意目录起码得是555的权限,要实现上传得755,不然虚拟用户会无法访问
7. 修改主配置文件(/etc/vsftpd/vsftpd.conf),添加以下指令
guest_enable=YES #guest来宾表示虚拟帐号
guest_username=vuser # 虚拟帐号都映射到上一步创建的vuser用户
8. systemctl restart vsftpd.service;ss -lnt; 重启vsftpd服务并检查,即可生效
9. 修改主配置文件(/etc/vsftpd/vsftpd.conf)上一步后即使vuser对于目录/ftproot/upload有w权限,虚拟用户访问依旧无法实现上传功能.添加:
user_config_dir=/etc/vsftpd/users_conf
mkdir /etc/vsftpd/users_conf # 目录名可以任意,这个目录下存放的都是跟用户名同名的文件,当同名的用户访问vsftpd服务时,这个文件的设置便作用生效.
cat > /etc/vsftpd/users_conf/james<<eof
>anon_upload_enable=YES # 虚拟用户也可以使用匿名用户的指令
>eof
cat > /etc/vsftpd/users_conf/uangianlap<<eof
>anon_upload_enable=NO
>eof
systemctl restart vsftpd.service;ss -lnt; # 重启并测试james与uangianlap两个虚拟用户是否都有对vsftpd的上传权限.这时候就只有james可以上传了.
经过以上9步,即可搭建一个安全的满足自定义需求的vsftpd服务了.