首页 > 代码库 > 如何把FTP用户帐号存放进MariaDB数据库中

如何把FTP用户帐号存放进MariaDB数据库中

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(编译环境肯定是要有的)

[root@centos730g ~]#yum install -y mariadb-devel pam-devel openssl-deve

[root@centos730g ~]# ls

anaconda-ks.cfg  pam_mysql-0.7RC1.tar.gz

[root@centos730g ~]# tar xf pam_mysql-0.7RC1.tar.gz 

[root@centos730g ~]# cd pam_mysql-0.7RC1/

[root@centos730g pam_mysql-0.7RC1]# ./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security

[root@centos730g 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)

[root@centos730g pam_mysql-0.7RC1]# 

[root@centos730g pam_mysql-0.7RC1]# make install


第四步:安装、配置mariadb-server并启动之

[root@centos730g ~]# yum install -y mariadb-server

[root@centos730g ~]# systemctl start mariadb

[root@centos730g ~]# 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的配置文件

[root@centos730g ~]# 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,并检验登录效果

[root@centos730g ~]# yum install -y lftp

[root@centos730g ~]# lftp -u admin 192.168.1.71

Password: 

lftp admin@192.168.1.71:~> ls        

ls: Login failed: 530 Login incorrect.

lftp admin@192.168.1.71:~> 

确保密码没有输入错误的情况下出现此报错信息,原因就是SELinux没有关闭。于此同时,安全模块的日志文件里面也有相应的错误记录。

[root@centos730g ~]# 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再尝试登录,一切正常

[root@centos730g ~]# getenforce

Enforcing

[root@centos730g ~]# setenforce 0

[root@centos730g ~]# getenforce

Permissive

[root@centos730g ~]# !lftp

lftp -u admin 192.168.1.71

Password: 

lftp admin@192.168.1.71:~> 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 admin@192.168.1.71:/> 

lftp admin@192.168.1.71:/> cd upload/

lftp admin@192.168.1.71:/upload> put /etc/fstab

put: Access failed: 550 Permission denied. (fstab)

lftp admin@192.168.1.71:/upload> 

lftp admin@192.168.1.71:/upload> exit

[root@centos730g ~]# lftp -u guest 192.168.1.71

Password: 

lftp guest@192.168.1.71:~> 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 guest@192.168.1.71:/> cd upload/

lftp guest@192.168.1.71:/upload> put /etc/issue

put: Access failed: 550 Permission denied. (issue)

lftp guest@192.168.1.71:/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目录拥有写入权限

[root@centos730g ~]# setfacl -m u:vsftpd:rwx /ftproot/upload/

[root@centos730g ~]# 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


[root@centos730g ~]# 

注意,虽然此时vsftp拥有写入权限,但只有在单独授权文件里面开放相应权限后,写入权限才会对该用户正式生效。


配置完成后,重启vsftpd服务,让刚才所做的配置正式生效

[root@centos730g ~]# systemctl restart vsftpd


再次使用admin帐户登录,验证上传及修改权限

[root@centos730g ~]# lftp -u admin 192.168.1.71

Password: 

lftp admin@192.168.1.71:~> cd upload/

lftp admin@192.168.1.71:/upload> put /etc/fstab

574 bytes transferred                                          

lftp admin@192.168.1.71:/upload> ls

-rw-------    1 996      994           574 Oct 18 12:47 fstab

lftp admin@192.168.1.71:/upload> mkdir admin

mkdir ok, `admin‘ created                

lftp admin@192.168.1.71:/upload> ls

drwx------    2 996      994          4096 Oct 18 12:47 admin

-rw-------    1 996      994           574 Oct 18 12:47 fstab

lftp admin@192.168.1.71:/upload> rm fstab

rm ok, `fstab‘ removed

lftp admin@192.168.1.71:/upload> ls

drwx------    2 996      994          4096 Oct 18 12:47 admin

lftp admin@192.168.1.71:/upload> rm -rf admin

rm ok, `admin‘ removed                     

lftp admin@192.168.1.71:/upload> ls

lftp admin@192.168.1.71:/upload>  

lftp admin@192.168.1.71:/upload> exit

[root@centos730g ~]# lftp -u guest 192.168.1.71

Password: 

lftp guest@192.168.1.71:~> cd upload/

lftp guest@192.168.1.71:/upload> put /etc/issue

put: Access failed: 550 Permission denied. (issue)

lftp guest@192.168.1.71:/upload> 

admin是单独做了上传修改授权的配置的,所以upload的写入权限对它是生效的,而guest没有单独授权,写入权限对其是无效的。


至此,对ftp服务的需求,在实际生产环境中基本满足,当然ftp服务的用户帐户一般不会多到使用数据库来存储,所以这就需要根据实际需求来决定采用何种方式来存储ftp的用户帐户了。但这里一定要提醒大家的是,ftp服务对目录的权限要求是非常严格的,稍有不慎,便会出各式各样的报错信息,所以大家在配置过程中,一定要细心对待。

本文出自 “爱情防火墙” 博客,请务必保留此出处http://183530300.blog.51cto.com/894387/1863191

如何把FTP用户帐号存放进MariaDB数据库中