FTP服务历史是比较悠久的,但由于其出现的比较早,所以设计之初也没考虑到安全问题,发展至今,FTP服务仍然采用明文传输协议,但由于其搭建及使用比较便捷,使其保留至今。今天就给大家分享一下如何搭建服务器,并让之满足实际生产环境中的相应需求。为了演示方便,我们这里把防火墙和SELinux提前关闭掉,如果忘记关闭后续过程会出现一些另人费解的报错信息。
第一步:YUM安装ftp服务器端vs-ftpd
yum install -y vsftpd
第二步:配置vs-ftpd
vim /etc/vsftpd/vsftpd.conf
xferlog_enable=YES
xferlog_file=/var/log/xferlog
pam_service_name=vsftpd.mysql
guest_enable=YES
guest_username=vsftpd
第三步:编译安装pam-mysql(编译环境肯定是要有的)
[[email protected] ~]#yum install -y mariadb-devel pam-devel openssl-deve
[[email protected] ~]# ls
anaconda-ks.cfg pam_mysql-0.7RC1.tar.gz
[[email protected] ~]# tar xf pam_mysql-0.7RC1.tar.gz
[[email protected] ~]# cd pam_mysql-0.7RC1/
[[email protected] pam_mysql-0.7RC1]# ./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security
[[email protected] pam_mysql-0.7RC1]# make
/bin/sh ./libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -I. -I. -I/usr/include/security -I/usr/include -g -O2 -g -O2 -I/usr/include/mysql -c pam_mysql.c
mkdir .libs
gcc -DHAVE_CONFIG_H -I. -I. -I. -I/usr/include/security -I/usr/include -g -O2 -g -O2 -I/usr/include/mysql -c pam_mysql.c -fPIC -DPIC -o .libs/pam_mysql.o
pam_mysql.c: In function ‘pam_mysql_converse‘:
pam_mysql.c:3192:4: warning: passing argument 2 of ‘conv->conv‘ from incompatible pointer type [enabled by default]
conv->appdata_ptr))) { //这里出现了一个报错信息,不影响最终结果,无需理会
^
pam_mysql.c:3192:4: note: expected ‘const struct pam_message **‘ but argument is of type ‘struct pam_message **‘
/bin/sh ./libtool --mode=link gcc -g -O2 -I/usr/include/mysql -o pam_mysql.la -rpath /usr/lib64/security -module -avoid-version pam_mysql.lo -L/usr/lib64/mysql -lmysqlclient -lpthread -lz -lm -lssl -lcrypto -ldl -lcrypt
gcc -shared .libs/pam_mysql.o -L/usr/lib64/mysql -lmysqlclient -lpthread -lz -lm -lssl -lcrypto -ldl -lcrypt -Wl,-soname -Wl,pam_mysql.so -o .libs/pam_mysql.so
creating pam_mysql.la
(cd .libs && rm -f pam_mysql.la && ln -s ../pam_mysql.la pam_mysql.la)
[[email protected] pam_mysql-0.7RC1]#
[[email protected] pam_mysql-0.7RC1]# make install
第四步:安装、配置mariadb-server并启动之
[[email protected] ~]# yum install -y mariadb-server
[[email protected] ~]# systemctl start mariadb
[[email protected] ~]# mysql_secure_installation //运行安全配置脚本(设置管理员密码、删除匿名帐户、开启管理员远程登录、删除测试数据库)
第五步:进入数据库创建FTP用户帐户数据库
MariaDB [(none)]> create database vsftpd;
MariaDB [(none)]> create table vsftpd.users (id int not null auto_increment primary key,name char(30) not null unique key,password char(48));
MariaDB [(none)]> insert into vsftpd.users (name,password) values (‘admin‘,password(‘adminpass‘)),(‘guest‘,password(‘guestpass‘));
MariaDB [(none)]> grant all on vsftpd.* to ‘vsftpd‘@‘127.0.0.1‘ identified by ‘vsftpdpass;
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit
第六步:手动编写ftp连接mysql的配置文件
[[email protected] ~]# vim /etc/pam.d/vsftpd.mysql
auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpdpass 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=vsftpdpass host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
第七步:创建FTP根目录,创建数据库中FTP帐户映射到本地的帐户,并指定其家目录为FTP根目录,设置FTP根目录的相应权限
mkdir -pv /ftproot/{pub,upload} //为了方便后面验证效果,创建两个目录(pub用于下载,upload用于用户上传)
chmod -w /ftproot //ftp根目录不能有写入权限
useradd -r -d /ftproot vsftpd
第八步:启动vsftpd服务,安装ftp客户端工具lftp,并检验登录效果
[[email protected] ~]# yum install -y lftp
[[email protected] ~]# lftp -u admin 192.168.1.71
Password:
lftp [email protected]:~> ls
ls: Login failed: 530 Login incorrect.
lftp [email protected]:~>
确保密码没有输入错误的情况下出现此报错信息,原因就是SELinux没有关闭。于此同时,安全模块的日志文件里面也有相应的错误记录。
[[email protected] ~]# cat /var/log/secure
Oct 18 20:00:50 centos730g vsftpd[13492]: pam_mysql - MySQL error (Can‘t connect to MySQL server on ‘127.0.0.1‘ (13))
Oct 18 20:02:30 centos730g vsftpd[13514]: pam_mysql - MySQL error (Can‘t connect to MySQL server on ‘127.0.0.1‘ (13))
关闭SELinux再尝试登录,一切正常
[[email protected] ~]# getenforce
Enforcing
[[email protected] ~]# setenforce 0
[[email protected] ~]# getenforce
Permissive
[[email protected] ~]# !lftp
lftp -u admin 192.168.1.71
Password:
lftp [email protected]:~> ls
drwxr-xr-x 2 0 0 4096 Oct 18 12:05 pub
drwxr-xr-x 2 0 0 4096 Oct 18 12:05 upload
lftp [email protected]:/>
lftp [email protected]:/> cd upload/
lftp [email protected]:/upload> put /etc/fstab
put: Access failed: 550 Permission denied. (fstab)
lftp [email protected]:/upload>
lftp [email protected]:/upload> exit
[[email protected] ~]# lftp -u guest 192.168.1.71
Password:
lftp [email protected]:~> ls
drwxr-xr-x 2 0 0 4096 Oct 18 12:05 pub
drwxr-xr-x 2 0 0 4096 Oct 18 12:05 upload
lftp [email protected]:/> cd upload/
lftp [email protected]:/upload> put /etc/issue
put: Access failed: 550 Permission denied. (issue)
lftp [email protected]:/upload>
至此为到,admin,guest两个虚拟用户都可以顺利通过mysql的验证后登录到ftp服务器,并下载文件了,但如果要想拥有上传权限,必需对单个虚拟帐户单独配置权限
第九步:为管理员帐户admin配置上传及修改权限
编辑vsftpd配置文件,添加一行
vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/users_conf
创建用于存放单个用户权限配置文件的目录
mkdir /etc/vsftpd/users_conf
手动编写权限配置文件内容
vim /etc/vsftpd/users_conf/admin
anon_upload_enable=YES //允许上传
anon_other_write_enable=YES //允许删除
anon_mkdir_write_enable=YES //允许创建目录
给本地映射帐户vsftpd用户授予/ftproot/upload目录拥有写入权限
[[email protected] ~]# setfacl -m u:vsftpd:rwx /ftproot/upload/
[[email protected] ~]# getfacl /ftproot/upload/
getfacl: Removing leading ‘/‘ from absolute path names
# file: ftproot/upload/
# owner: root
# group: root
user::rwx
user:vsftpd:rwx
group::r-x
mask::rwx
other::r-x
[[email protected] ~]#
注意,虽然此时vsftp拥有写入权限,但只有在单独授权文件里面开放相应权限后,写入权限才会对该用户正式生效。
配置完成后,重启vsftpd服务,让刚才所做的配置正式生效
[[email protected] ~]# systemctl restart vsftpd
再次使用admin帐户登录,验证上传及修改权限
[[email protected] ~]# lftp -u admin 192.168.1.71
Password:
lftp [email protected]:~> cd upload/
lftp [email protected]:/upload> put /etc/fstab
574 bytes transferred
lftp [email protected]:/upload> ls
-rw------- 1 996 994 574 Oct 18 12:47 fstab
lftp [email protected]:/upload> mkdir admin
mkdir ok, `admin‘ created
lftp [email protected]:/upload> ls
drwx------ 2 996 994 4096 Oct 18 12:47 admin
-rw------- 1 996 994 574 Oct 18 12:47 fstab
lftp [email protected]:/upload> rm fstab
rm ok, `fstab‘ removed
lftp [email protected]:/upload> ls
drwx------ 2 996 994 4096 Oct 18 12:47 admin
lftp [email protected]:/upload> rm -rf admin
rm ok, `admin‘ removed
lftp [email protected]:/upload> ls
lftp [email protected]:/upload>
lftp [email protected]:/upload> exit
[[email protected] ~]# lftp -u guest 192.168.1.71
Password:
lftp [email protected]:~> cd upload/
lftp [email protected]:/upload> put /etc/issue
put: Access failed: 550 Permission denied. (issue)
lftp [email protected]:/upload>
admin是单独做了上传修改授权的配置的,所以upload的写入权限对它是生效的,而guest没有单独授权,写入权限对其是无效的。
至此,对ftp服务的需求,在实际生产环境中基本满足,当然ftp服务的用户帐户一般不会多到使用数据库来存储,所以这就需要根据实际需求来决定采用何种方式来存储ftp的用户帐户了。但这里一定要提醒大家的是,ftp服务对目录的权限要求是非常严格的,稍有不慎,便会出各式各样的报错信息,所以大家在配置过程中,一定要细心对待。