转载来自公司内部爱心人士王纯的有道云笔记
vsftp--生产环境配置(注:centos7已经不需要结合mysql进行虚拟化配置,centos6可以按照下面的教程来)
一、安装所需rpm包,安装之前先检查有没有,如果没有在进行安装
yum -y install perl-DBD-MySQL.x86_64 perl-DBI.x86_64 mysql.x86_64 mysql-devel.x86_64 mysql-server.x86_64 mysql-bench.x86_64
注:如果是Centos7,可以不这样安装mysql(上面的操作略过),
具体参考这个网址:http://jingyan.baidu.com/article/25648fc182a7a99191fd0096.html (需要网络)
注:如果Centos7机器在内网内,可以按照我的mysql无网络安装教程来,记住版本要按照上面的来,不然出错。
yum -y install mysql-server mysql-devel(mysql直接这样安装也行,区别我不知道,这样做,第一步不用做了)
yum install pam-devel -y
yum install gcc gcc-c++ autoconf automake -y
yum install vsftpd -y
二、安装pam(yum源没有,如需安装需要拷贝过去) root用户
# tar -zxvf pam_mysql-0.7RC1.tar.gz
# cd pam_mysql-0.7RC1
# ./configure --with-mysql=/usr --with-openssl
# make
# make install
若此步无法执行,先执行下面的网址:
注意:必做,这不,要不无法实现
setenforce 0 关闭
vim /etc/selinux/config 永久关闭
修改 SELINUX=disabled
下面的是测试环境的配置,已经成功。
二、创建虚拟用户账号
1.准备数据库及相关表
首先请确保mysql服务已经正常启动。而后,按需要建立存储虚拟用户的数据库即可,这里将其创建为vsftpd数据库。
mysql> create database vsftpd;
mysql> grant select on vsftpd.* to vsftpd@localhost identified by 'ftp';
mysql> grant select on vsftpd.* to [email protected] identified by 'ftp';
mysql> flush privileges;
#这里用户vsftpd用处在于将来pam到mysql数据库中检索时mysql这个进程的属主以vsftpd来运行
在centos6.5上测试发现grant select on vsftpd.* to [email protected] identified by 'ftp';没有用,单用这个无法测试,后来同事告诉我这句话:mysql赋权 本地用localhost,还有外网ip,外地用 ip或者*直接所有代替。但是经测试发现:
第一种情况: 如果/etc/pam.d/vsftpd.mysql,指定host=localhost,那么只有指定 grant ..... vsftpd@localhost ......才有效,其他无论127.0.0.1,slave(主机名),还是192.168.18.181(主机ip)都不好使。
第二种情况:如果/etc/pam.d/vsftpd.mysql,指定host=192.168.18.181,那么只有vsftpd@slave,和ip地址才好使,127.0.0.1和loclhost均不好使。
第三种情况:如果/etc/pam.d/vsftpd.mysql,指定host=slave,同第二种。
mysql> use vsftpd;
mysql> create table users (
id int AUTO_INCREMENT NOT NULL,
name char(20) binary NOT NULL,
password char(48) binary NOT NULL,
primary key(id)
);
2、添加测试的虚拟用户
根据需要添加所需要的用户,需要说明的是,这里将其密码采用明文格式存储,原因是pam_mysql的password()函数与MySQL的password()函数可能会有所不同。
mysql> insert into users(name,password) values('tom','xsl');
mysql> insert into users(name,password) values('boy','xsl');
三、配置vsftpd
1.建立pam认证所需文件
#vi /etc/pam.d/vsftpd.mysql
添加如下两行,这是两句话,不可分开,分别一句,中间不可断开
auth required /lib/security/pam_mysql.so user=vsftpd passwd=ftp host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0
account required /lib/security/pam_mysql.so user=vsftpd passwd=ftp host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=0
2.修改vsftpd的配置文件,使其适应mysql认证
建立虚拟用户映射的系统用户及对应的目录
#useradd -s /sbin/nologin -d /var/ftproot vuser
#chmod go+rx /var/ftproot
请确保/etc/vsftpd.conf中已经启用了以下选项
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
chroot_local_user=YES
而后添加以下选项
guest_enable=YES
guest_username=vuser
并确保pam_service_name选项的值如下所示
pam_service_name=vsftpd.mysql
#这个文件名称一定要与上面所建立的pam文件名称相同
四、启动vsftpd服务
# service vsftpd start
# chkconfig vsftpd on
使用虚拟用户登录,验正配置结果,以下为本机的命令方式测试,你也可以在其它Win Box上用IE或者FTP客户端工具登录验正
# ftp localhost
如果使用命令方式登录时,例如以我的电脑为例,如果出现
[root@localhost ~]# ftp 192.168.0.104
Connected to 192.168.0.104.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.0.104:root): tom
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
ftp>
这样你的字样的话,请查看日志信息,使用tail /var/log/secure命令
Oct 19 15:41:42 localhost vsftpd: pam_mysql - MySQL error (Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2))
Oct 19 15:43:02 localhost vsftpd: pam_mysql - MySQL error (Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2))
如果出现这样的字样,说明pam-mysql模块无法通过mysql的套接字域mysql建立连接。
解决办法:修改/etc/my.cnf
在[mysqld]这个容器内修改套接字的路径,例如
socket = /var/lib/mysql/mysql.sock
我之前是把它放在了/tmp/目录下,因此无法建立链接。修改完成之后,就可以正常登录进去了。
五、配置虚拟用户具有不同的访问权限
vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可。
1、配置vsftpd为虚拟用户使用配置文件目录
# vim vsftpd.conf
添加如下选项
user_config_dir=/etc/vsftpd/vusers_dir
重启服务:
# service vsftpd restart
2、创建所需要目录,并为虚拟用户提供配置文件
# mkdir /etc/vsftpd/vusers_dir/
# cd /etc/vsftpd/vusers_dir/
# touch tom boy
[root@server1 ~]# mkdir /etc/vsftpd/vusers_dir
[root@server1 ~]# vim /etc/vsftpd/vusers_dir/tom #设置tom用户有所有权限
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@server1 ~]# vim /etc/vsftpd/vusers_dir/boy #设置boy用户只有upload权限
anon_upload_enable=yes
注:配置文件修改后不需要重启服务,就能生效。
[root@server2 ~]# lftp -u tom slave #使用tom用户登录
Password:
lftp tom@slave
:~> lcd /etc
lcd ok, local cwd=/etc
lftp tom@slave:~> put fstab #能够上传
711 bytes transferred
lftp tom@slave:/> ls
-rw------- 1 496 492 711 Apr 03 22:34 fstab
lftp tom@slave:/> rm fstab #能够删除
rm ok, `fstab' removed
lftp tom@slave:/> lslftp tom@slave:/>
mkdir 1 #能够创建文件夹
mkdir ok, `1' created
lftp tom@slave:/> ls
drwx------ 2 496 492 4096 Apr 03 22:35 1
lftp tom@slave:/>
[root@server2 ~]# lftp -u boy slave #使用boy用户登录
Password:
lftp boy@slave:~> ls
drwx------ 2 496 492 4096 Apr 03 22:35 1
lftp boy@slave:/> lcd /etc/
lcd ok, local cwd=/etc
lftp boy@slave:/> put fstab #能够上传
711 bytes transferred
lftp boy@slave:/> ls
drwx------ 2 496 492 4096 Apr 03 22:35 1
-rw------- 1 496 492 711 Apr 03 22:36 fstab
lftp boy@slave:/> rm fstab #不能删除
rm: Access failed: 550 Permission denied. (fstab)
lftp boy@slave:/> mkdir 2 #不能创建文件夹
mkdir: Access failed: 550 Permission denied. (2)
lftp boy@slave:/>
三、添加虚拟用户的属主用户
useradd test
mkdir -p /data/test
chown -R test. test /data/test
echo "Bonc_test_1q2w3e" | passwd --stdin test
四、配置mysql
service vsftpd start
cd /etc/vsftpd/
cat > vsftpd.conf <
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
ftpd_banner=Welcome to ${HOSTNAME} FTP service
listen=YES
userlist_enable=YES
pam_service_name=vsftpd.mysql(pam.d下的文件要跟这个一致)
tcp_wrappers=YES
guest_enable=YES
guest_username=test(虚拟用户的属主用户)
user_config_dir=/etc/vsftpd/vsftpd_user_conf(后边有操作)
virtual_use_local_privs=YES
chroot_local_user=YES
EOF
补充:
vsftpd配置文件参数解释:
Vsftpd服务安装配置:
# yum install vsftpd
# rpm -ql vsftpd :安装vsftpd生成文件:
# /etc/pam.d/vsftpd :用户认证配置文件;
# /etc/rc.d/init.d/vsftpd :服务脚本;
# /etc/vsftpd :配置文件目录;
# vsftpd.conf :主配置文件;
# /usr/sbin/vsftpd :主应用程序;
ftp服务的用户有三类:
配置文件详解:
# vim /etc/vsftpd/vsftpd.conf
匿名用户配置:
> anonymous_enable=YES|NO :是否允许登陆;
> anon_mkdir_write_enable=YES|NO :是否允许上传;
> anon_ohter_write_enable=YES|NO :是否允许删除文件
注意:开启以上选项后,客户端使用匿名用户登陆,对/var/ftp目录仍无法上传文件,需要在系统中为ftp用户添加对目录的权限;处于安全考虑可在/var/ftp创建专门用于上传的目录,并添加权限;
anon_world_readable_only:
默认情况下,匿名用户所有上传下载,所使用的用户都是ftp用户的权限,若要上传文件,则需要ftp用户有写的权限,若要下载,则需要ftp用户有读的权限,也就是说一般情况下,ftp用户对文件有读权限就对文件有下载权限了
文件有三种权限,文件所有人,文件所有组,文件的其他人,这个anon_world_readable_only参数意思是,当他为YES时候,文件的其他人必须有读的权限才允许下载,单单所有人为ftp且有读权限是无法下载的,必须其他人也有读权限,才允许下载,这是为安全性的一方面考虑,若为NO则只要ftp用户对文件有读权限即可下载
# cd /var/ftp/
# mkdir upload
# setfacl -R -m u:ftp:rwx upload/
系统用户配置:
当virtual_use_local_privs=YES时,虚拟用户和本地用户有相同的权限; 当virtual_use_local_privs=NO时,虚拟用户和匿名用户有相同的权限,默认是NO。
chroot_local_user=YES (NO):在预设的情况下,是否要将使用者限制在自己的家目录之内(chroot),如果是YES 代表用户默认就会被 chroot,如果是 NO, 则预设是没有 chroot。不过,实际还是需要底下的两个参数互相参考才行。为了安全性,这里应该要设定成YES 才好。
guest_enable=YES (NO):若这个值设定为 YES 时,那么任何实体账号,均会被假设成为 guest虚拟 (所以预设是不开放的)! 至于访客在 vsftpd 当中,预设会取得 ftp 这个使用者的相关权限。但可以通过 guest_username 来修改。
guest_username=ftp:在 guest_enable=YES 时才会生效,指定访客的身份
tcp_wrappers=YES (NO):当然我们都习惯支持 TCP Wrappers 的!所以设定为 YES!
ftpd_banner=Welcome to ${HOSTNAME} FTP service :系统欢迎信息,本身被注释
connect_from_port_20=YES (NO):ftp-data 的端口号 20
listen=YES:若设置为 YES 表示 vsftpd 是以 stand alone 的方式来启动的!预设是 NO!所以我们的 CentOS 将它改为 YES!这样才能使用 stand alone 的方式来唤醒。
> local_enable=YES|NO :是否允许登陆;
> write_enable=YES|NO :是否允许上传;
> local_umask=022 :上传文件默认权限,与系统umask无关;
> chroot_local_user=YES|NO :是否禁锢所有的ftp本地用户于其家目录中;
> chroot_list_enable=YES|NO :是否禁锢文件中指定的ftp本地用户于其家目录中;
> chroot_list_file=/etc/vsftpd/chroot_list :禁锢用户文件路径;
> dirmessage_enable=YES|BO :用户登录服务器看到信息;
注意:由于是系统用户登录,此类用户可访问其他的目录,可以通过禁锢选项将系统用户禁锢在其家目录中。
日志选项:
> xferlog_enable=YES|NO :是否开启;
> xferlog_std_format=YES|NO :标准格式;
> xferlog_file=/var/log/xferlog :日志位置;
改变上传文件的属主:
> chown_uploads=YES|NO :是否改变上传文件的属主;
> chown_username=whoever :上传文件的属主;
控制用户登录:
> userlist_enable=YES|NO :是否启用控制用户登录的列表文件;
> userlist_deny=YES|NO :YES黑名单,NO白名单;默认名单文件为:/etc/vsftpd/user_list;
连接限制:
> max_clients= :最大并发连接数;
> max_per_ip= :每个IP可同时发起的并发请求数;
传输速率:
> anon_max_rate= :匿名用户的最大传输速率, 单位是“字节/秒”;
> local_max_rate= :本地用户的最大传输速率
vsftpd使用pam完成用户认证,其用到pam
> pam_service_name=vsftpd
虚拟用户:
所有的虚拟用户会被统一映射为一个指定的系统账号,访问的共享位置即为此系统账号的家目录;各虚拟用户可被赋予不同的访问权限;通过匿名用户的权限控制参数进行指定;
用户认证:
虚拟用户:仅用于访问某特定服务中的资源;
nsswitch:networkserver switch,名称解析框架;
配置文件:/etc/nsswitch.conf
模块:/lib64/libnss*,/usr/lib64/libnss*
pam:pluggableauthentication module,用户认证框架;
模块:/lib64/security/
配置文件:/etc/pam.conf,/etc/pam.d/*
虚拟用户账号的存储方式:
文件:编辑文件
奇数行为用户名
偶数行为密码
此文件需要被编码为hash格式;
关系型数据库中的表中:即时查询数据库完成用户认证;
mysql库:pam要依赖于pam_mysql
# yum install pam_mysql
注意:pam_mysql来自于epel源;
五、修改pam配置文件
cd /etc/pam.d
cat >vsftpd.mysql<
auth required /lib/security/pam_mysql.so user=root passwd=ww host=localhost db=vsftpdvu table=users usercolumn=name passwdcolumn=passwd crypt=1 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1
account required /lib/security/pam_mysql.so user=root passwd=ww host=localhost db=vsftpdvu table=users usercolumn=name passwdcolumn=passwd crypt=1 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1
EOF
注:这块的auth required /lib/se....... verbose=1和account required /lib/secur......verbose=1各自都是完整的一句话,什么意思,就是你用#仅仅注释在auth和account前头,你会发现两句话直接完全被注释,就这这么长的两段其实就是完整的连贯的两句话,若不是,你会发现测试的时候无论使用ftp还是lftp均会验证失败,什么操作都无法进行。
注:目前可能由于pam_mysql和mysql的适配问题,MD5方式无法检验成功,password(),明文,以及encrypt()均可以。
启动mysql数据库:
service mysqld start
六、在MySQL里添加需要ftp连接的用户
/usr/bin/mysqladmin -u root password ww(为root设置初始化密码)
创建所需的数据库以及用户表:
mysql -u root -pww<< EOF
create database vsftpdvu;
use vsftpdvu;
create table users ( id int AUTO_INCREMENT NOT NULL, name char(16) binary NOT NULL, passwd char(48) binary NOT NULL, primary key(id));
create table logs (msg varchar(255), user char(16), pid int, host char(32), rhost char(32), logtime timestamp );
flush privileges;
EOF
添加虚拟用户属主用户信息:
mysql -u root -pww << EOF
use vsftpdvu;
insert into users (name,passwd) values ('test_01',encrypt('test_01'));
flush privileges;
EOF
cd /etc/vsftpd/vsftpd_user_conf
cat >test_01<
local_root=/home/test/test_01 (注意这个路径要事先创建,家目录下各个虚拟用户的主目录都要手动创建,然后指定,另外注意目录属组,例如test:test)
EOF
总结一下:系统用户vuser加上-s /sbin/nologin, ftp vuser不好使,虚拟用户好使,sftp vuser也不好使, 系统用户正常创建不加-s /sbin/nologin,虚拟用户好使,sftp 系统用户 好使, ftp 系统用户 不好使。但是为了全局的资源掌控,请看下面这段话:
做虚拟用户的用意在于限制他们只能访问ftp资源,不让他们登录主机,但是宿主用户是既能登录主机又能访问ftp资源,所以也要把宿主用户(系统用户)加到mysql里面,让他能够访问ftp资源。不把属主用户加到mysql里边也是可以的,那样就限制了他的访问资源形式。就相当于房东租出去一套房子,里边划分了N个卧室,卧室里的人只能在自己卧室活动,但是房东是整个房子的主人,可以控制整个房子的资源。也就是相当于我这块的 user_config_dir=/etc/vsftpd/vusers_dir路径下的 tom文件(虚拟用户)写上local_root=/home/test2/boy ,这样tom上传的全都在/home/test2/tom里面,但是test2看到/home/test2/*(这个需要指定test2文件local_root=/home/test2),至于限制各个用户能否走出自己的家目录,可以chroot_local_user=YES等参数。
chkconfig mysqld on
chkconfig vsftpd on
service vsftpd restart
service mysqld restart
配置完成后,以下是以后添加用户的操作:
mysql -u root -pww << EOF
use vsftpdvu;
insert into users (name,passwd) values ('cbss_cdr_up',encrypt('ASD_edc_601'));
flush privileges;
EOF
mkdir -p /data/test/01
chown -R test.test /data/test/01
cd /etc/vsftpd/vsftpd_user_conf
cat >test_01<
local_root=/data/test/01
EOF
./configure --with-openssl
make
make install
三、配置mysql
service vsftpd start
HOSTNAME=`hostname`
cd /etc/vsftpd/
cat > vsftpd.conf <
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
ftpd_banner=Welcome to ${HOSTNAME} FTP service
listen=YES
userlist_enable=YES
pam_service_name=vsftpd.mysql
tcp_wrappers=YES
guest_enable=YES
guest_username=bca
user_config_dir=/etc/vsftpd/vsftpd_user_conf
virtual_use_local_privs=YES
chroot_local_user=YES
EOF
cd /etc/pam.d
cat >vsftpd.mysql <
auth required /lib/security/pam_mysql.so user=root passwd=ww host=localhost db=vsftpdvu table=users usercolumn=name passwdcolumn=passwd crypt=1 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1
account required /lib/security/pam_mysql.so user=root passwd=ww host=localhost db=vsftpdvu table=users usercolumn=name passwdcolumn=passwd crypt=1 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1
EOF
service mysqld start
/usr/bin/mysqladmin -u root password ww
mysql -u root -pww<< EOF
create database vsftpdvu;
use vsftpdvu;
create table users ( id int AUTO_INCREMENT NOT NULL, name char(16) binary NOT NULL, passwd char(48) binary NOT NULL, primary key(id));
create table logs (msg varchar(255), user char(16), pid int, host char(32), rhost char(32), logtime timestamp );
EOF
mysql -u root -pll << EOF
use vsftpdvu;
delete from users where id=12;
insert into users (name,passwd) values ('isas_89',encrypt('ISAS618_hca'));
flush privileges;
EOF
cd /etc/vsftpd/vsftpd_user_conf
cat > cht_ftp <chkconfig mysqld on
chkconfig vsftpd on
service vsftpd restart
service mysqld restart
echo "use_localtime=yes" >> /etc/vsftpd/vsftpd.conf
service vsftpd restart
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
user=$1
password=$2
mysql -u root -pll << EOF
use vsftpdvu;
insert into users (name,passwd) values ('$user',encrypt('$password'));
flush privileges;
EOF
delete from users where id=7;
bash -x add_user.sh isas_51 ISAS992_ymb
bash -x add_user.sh isas_18 ISAS356_fyp
bash -x add_user.sh isas_91 ISAS983_hkx
bash -x add_user.sh isas_74 ISAS705_bdl
bash -x add_user.sh isas_71 ISAS036_ero
bash -x add_user.sh isas_97 ISAS795_xok
bash -x add_user.sh isas_84 ISAS184_yuv
bash -x add_user.sh isas_10 ISAS410_mrd
bash -x add_user.sh isas_38 ISAS203_vlw
bash -x add_user.sh isas_31 ISAS737_sjm
bash -x add_user.sh isas_89 ISAS618_hca
bash -x add_user.sh isas_13 ISAS441_onq
bash -x add_user.sh isas_75 ISAS592_xfo
bash -x add_user.sh isas_86 ISAS421_hzg
bash -x add_user.sh isas_88 ISAS568_jcm
bash -x add_user.sh isas_79 ISAS479_ici
bash -x add_user.sh isas_17 ISAS824_rwi
bash -x add_user.sh isas_76 ISAS375_bog
bash -x add_user.sh isas_36 ISAS421_ksf
bash -x add_user.sh isas_11 ISAS756_knj
bash -x add_user.sh isas_34 ISAS647_uoa
bash -x add_user.sh isas_81 ISAS182_ntb
bash -x add_user.sh isas_90 ISAS037_ovk
bash -x add_user.sh isas_19 ISAS608_tbn
bash -x add_user.sh isas_30 ISAS467_sov
bash -x add_user.sh isas_83 ISAS246_ilt
bash -x add_user.sh isas_59 ISAS319_was
bash -x add_user.sh isas_85 ISAS597_hfi
bash -x add_user.sh isas_87 ISAS560_ghw
bash -x add_user.sh isas_70 ISAS046_mhf
bash -x add_user.sh isas_50 ISAS220_hlw