一、vsftpd的基本使用
# 安装vsftpd软件
shell> yum install vsftpd
# 启动服务
shell> chkconfig vsftpd on
shell> service vsftpd start
# 简单测试
shell> ftp 192.168.246.120
连接到 192.168.246.120.
220 (vsFTPd 2.0.5)
用户(192.168.246.120:(none)): anonymous
331 Please specify the password.
密码:
230 Login successful.
ftp> help
命令可能是缩写的。 命令为:
! delete literal prompt send
? debug ls put status
append dir mdelete pwd trace
ascii disconnect mdir quit type
bell get mget quote user
binary glob mkdir recv verbose
bye hash mls remotehelp
cd help mput rename
close lcd open rmdir
ftp> bye
221 Goodbye.
# 配置文件详解/etc/vsftpd/vsftpd.conf
anonymous_enable=YES # 是否启用匿名用户
local_enable=YES # 是否启用系统用户
write_enable=YES # 系统用户是否可以上传文件
anon_mkdir_write_enable=YES # 匿名用户是否可以上传文件
anon_mkdir_write_enable=YES # 匿名用户是否可以创建文件
anon_other_write_enable=YES # 匿名用户是否可以删除文件
dirmessage_enable=YES # 显示欢迎信息
xferlog_enable=YES # 打开传输日志
xferlog_file=/var/log/xferlog # 传输日志文件的日志目录
xferlog_std_format=YES # 传输日志文件的日志显示格式
chroot_list_enable=YES # 启用禁锢用户功能 (注意针对系统用户的)
chroot_list_file=/etc/vsftpd/chroot_list # 禁锢用户列表
chroot_local_user=YES # 禁锢的所有的用户
listen=YES # vsftpd是否使用独立守护进程进行工作
pam_service_name=vsftpd # pam验证使用的文件名,在/etc/pam.d/目录中
userlist_enable=YES # 启用list_use文件对用户访问进行控制
userlist_deny=YES # YES:禁止/etc/vsftpd/list_user中所有用户访问ftp(黑名单)
# NO: 允许/etc/vsftpd/list_user中所有用户访问ftp(白名单)
max_clients=100 # FTP服务的最大的连接数
max_per_ip=8 # 每个IP允许的最大连接数
#/etc/vsftpd/ftpusers文件的作用(pam模块使用的配置文件)
基于pam验证时使用的用户列表文件,禁止中所有用户访问ftp.
# 使用不同用户登录测试
# 1、匿名用户
① 使用匿名用户登录映射的用户是ftp,所有登录的目录是ftp用户的家目录,默认在/var/ftp下. 用户已经被禁锢在/var/ftp下了.
② 将配置anon_mkdir_write_enable=YES启用后,并需要ftp用户对自己的家目录有写权限,默认权限是root用户和root组.
一般我们可以在/var/ftp下创建一个目录为upload并让ftp用户拥有写权限.就可以实现用户上传文件了.但是不能删除和创建文件.
shell> mkdir -pv /var/ftp/upload
shell> setfacl -m u:ftp:rwx /var/ftp/upload
shell> getfacl /var/ftp/upload
getfacl: Removing leading '/' from absolute path names
# file: var/ftp/upload
# owner: root
# group: root
user::rwx
user:ftp:rwx
group::r-x
mask::rwx
other::r-x
如果想可以使用创建文件需要开启anon_mkdir_write_enable=YES.
如果想可以使用创建文件需要开启anon_other_write_enable=YES.
# 2、系统用户
① 使用系统用户登录映射的用户就是登录的系统用户,登录的目录就是登录系统用户的家目录.用户没有被禁锢在增加自己的家目录下.
可以使用chroot_list_enable=YES和chroot_list_file=/etc/vsftpd/chroot_list定义禁锢的用户列表,chroot_list文件直接将用户名写入即可.
也可以启用chroot_local_user=YES禁锢的所有的系统用户
② 将配置write_enable=YES启用后, 系统用户登录到FTP时就可以有上传文件的权限了(包括删除和创建文件).
因为系统用户的家目录默认的是自己的用户和自己的用户组.
二、安全的ftp服务
# 使用抓包工具tcpdump分析数据包得知ftp协议是明文的,可以分析数据表轻易的获取用户名和密码.
shell> tcpdump -i eth0 -nn -X -vv tcp port 21 and ip host 192.168.246.120
# 使用安全的ftp服务(ftps服务)
# 1、使用openssl建立私有CA
shell> cd /etc/pki/CA
# 私钥
shell> (umask 077;openssl genrsa -out privite/cakey.pem 2014)
# CA证书
shell> openssl req -new -x509 -key privite/cakey.pem -out cacert.pem -days
---------------------------------------------------------------------------
Country Name (2 letter code) [GB]:CN
State or Province Name (full name) [Berkshire]:AH
Locality Name (eg, city) [Newbury]:CZ
Organization Name (eg, company) [My Company Ltd]:ca ltd
Organizational Unit Name (eg, section) []:ca eg
Common Name (eg, your name or your server's hostname) []:www.ca.com
Email Address []:admin@ca.com
---------------------------------------------------------------------------
shell> touch index.txt serial
shell> echo 00 > serial
shell> mkdir certs crl newcerts
shell> mkdir /etc/pki/sign
# 2、建立vsftpd的证书
shell> mkdir -pv /etc/vsftpd/ssl
shell> cd /etc/vsftpd/ssl
# 私钥
shell> (umask 077;openssl genrsa -out vsftpd.key 1024)
# 证书申请
shell> openssl req -new -key vsftpd.key -out vsftpd.csr
---------------------------------------------------------------------------
Country Name (2 letter code) [GB]:CN
State or Province Name (full name) [Berkshire]:AH
Locality Name (eg, city) [Newbury]:CZ
Organization Name (eg, company) [My Company Ltd]:ca ltd
Organizational Unit Name (eg, section) []:ca eg
Common Name (eg, your name or your server's hostname) []:ftp.spook.com
Email Address []:admin@spook.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
---------------------------------------------------------------------------
shell> cp ./vsftpd.csr /etc/pki/sign
shell> cd /etc/pki/sign
# 签署证书
shell> openssl ca -in vsftpd.csr -out vsftpd.crt -days 365
shell> cp ./vsftpd.crt /etc/vsftpd/ssl
# 3、修改vsftpd的配置文件/etc/vsftpd/vsftpd.conf
shell> vim /etc/vsftpd/vsftpd.conf
添加如下内容:
# SSL FUNCTION
######################
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key
# 4、测试(使用客户端软件,如FlashFXP)
三、建立基于MYSQL的虚拟用户实现FTP的访问
1、安装需要使用的MYSQL数据库(此处的版本为mysql-5.6.20,下载网站http://www.mysql.com/)
# 增加mysql用户和mysql组
shell> groupadd mysql
shell> useradd -r -g mysql -M -s /sbin/nologin mysql
# 解压mysql安装包并创建链接文件
shell> tar -xf mysql-5.5.39-linux2.6-i686.tar.gz -C /usr/local/
shell> ln -s /usr/local/mysql-5.5.39-linux2.6-i686 /usr/local/mysql
# 修改mysql目录中所有的文件的宿主和属组为mysql
shell> cd /usr/local/mysql
shell> chown -R mysql:mysql .
# 初始化mysql数据库
shell> scripts/mysql_install_db --user=mysql
# 修改mysql目录中所有的文件的宿主为root
shell> chown -R root .
# 修改mysql目录中data文件的宿主为mysql
shell> chown -R mysql data
# 复制mysql的主配置文件
shell> cp ./support-files/my-default.cnf /etc/my.cnf
# 复制mysql的服务脚本
shell> cp support-files/mysql.server /etc/init.d/mysqld
# 将mysql的服务脚本加到服务列表中并在默认级别开启服务
shell> chkconfig --add mysqld
shell> chkconfig mysqld on
# 将mysql的二进制文件增加到系统环境变量中
shell> vim /etc/profile.d/mysql.sh
增加 export PATH=$PATH:/usr/local/mysql/bin
# 将mysql的库文件增加到系统库中
shell> vim /etc/ld.so.conf.d/mysql.conf
增加 /usr/local/mysql/lib
shell> ldconfig -v
# 将mysql的头文件增加到系统库中
shell> ln -s /usr/local/mysql/include/ /usr/include/mysql
# 启动mysql服务
shell> service mysqld start
2、安装pam的mysql插件:pam_mysql-0.7RC1
shell> tar zxvf pam_mysql-0.7RC1.tar.gz
shell> cd pam_mysql-0.7RC1
shell> ./configure --with-mysql=/usr/local/mysql --with-openssl
shell> make
shell> make install
#复制安装的pam-mysql模块
shell> cp /usr/lib/security/{pam_mysql.la,pam_mysql.so} /lib/security/
3、创建虚拟用户账号
①准备数据库及相关表
mysql> create database vsftpd;
mysql> grant select on vsftpd.* to vsftpd@localhost identified by 'vsftpd';
mysql> grant select on vsftpd.* to vsftpd@127.0.0.1 identified by 'vsftpd';
mysql> flush privileges;
mysql> use vsftpd;
mysql> create table users(
-> id int AUTO_INCREMENT NOT NULL,
-> username varchar(20) binary NOT NULL,
-> password varchar(48) binary NOT NULL,
-> primary key(id)
-> );
mysql> exit
②添加测试的虚拟用户
根据需要添加所需要的用户,需要说明的是,这里将其密码采用明文格式存储,
原因是pam_mysql的password()函数与MySQL的password()函数可能会有所不同。
mysql> insert into users(username,password) values('tom','tom');
mysql> insert into users(username,password) values('eric','eric');
③配置vsftpd
#建立pam认证所需文件
shell> vim /etc/pam.d/vsftpd.mysql
添加如下两行:
auth required /lib/security/pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=users usercolumn=username passwdcolumn=password crypt=0
account required /lib/security/pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=users usercolumn=username passwdcolumn=password crypt=0
#建立虚拟用户映射的系统用户及对应的目录
shell> useradd -s /sbin/nologin -d /var/ftproot vuser
shell> chmod go+rx /var/ftproot
#修改vsftpd的配置文件,使其适应mysql认证
shhell> vim /etc/vsftpd/vsftpd.conf
#请确保vsftpd.conf中已经启用了以下选项
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
chroot_local_user=YES
#而后添加以下选项
guest_enable=YES
guest_username=vuser
#并确保pam_service_name选项的值如下所示,对应的文件位置在/etc/pam.d/下
pam_service_name=vsftpd.mysql
④重启vsftpd服务并测试
shell> service vsftpd restart
出现问题可以参考/var/log/secure中的日志
4、配置虚拟用户具有不同的访问权限(目前只具有下载的权限)
# 配置介绍
vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,
每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,
只需要在vsftpd.conf指定其路径及名称即可。
# 配置vsftpd为虚拟用户使用配置文件目录
shell> vim /etc/vsftpd/vsftpd.conf
添加如下选项:
user_config_dir=/etc/vsftpd/vusers_dir
# 创建所需要目录,并为虚拟用户提供配置文件
shell> mkdir /etc/vsftpd/vusers_dir/
shell> cd /etc/vsftpd/vusers_dir/
shell> touch tom
# 配置虚拟用户的访问权限
虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的. 比如, 如果需要让tom用户具有上传文件的权限,
可以修改/etc/vsftpd/vusers/tom文件,在里面添加如下选项即可:anon_upload_enable=YES
如果使其可以创建文件需要开启anon_mkdir_write_enable=YES.
如果使其可以删除文件需要开启anon_other_write_enable=YES.
所有选项和匿名用户选项一致.
# 配置各个权限后可以使用FlashFXP连接测试