如何把FTP用户帐号存放进MariaDB数据库中
admin
2023-06-04 23:01:30
0

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服务对目录的权限要求是非常严格的,稍有不慎,便会出各式各样的报错信息,所以大家在配置过程中,一定要细心对待。

相关内容

热门资讯

伊朗军队:已做好准备,坚决回击... 当地时间23日,伊朗军队发表声明,强调将随时准备对敌人的任何侵犯做出坚决且全方位的回击。(总台记者 ...
燃油车,真的没人买了? “如今加满一箱油,费用较年初高出近百元。”燃油车主张先生坦言,用车成本大幅上涨,让新能源车型的性价比...
出境打工月入3万?警惕境外高薪... 不要求学历和工作经验,到了国外就能找到工作,“月薪三万”“零门槛”“包吃住”,看到这样的广告,相信很...
格力空调外机嗡嗡响一下风机就不... 原因可能是制冷系统管路内发生制冷剂的缓慢渗漏,导致压缩机的工作效率骤减,内机末端装置风机盘管温度降低...
抽油烟机响了一下就不工作了 1、也许是因为插座的地方没有电了,或者油烟机的线路断掉了,出现了短路,所以油烟机不能正常的进行工作。...
冰箱搬运了一下就不制冷了 1、主要是因为搬运过程中电源线出现了拉扯导致电源线内部的线发生了断裂,所以再次使用的时候不再启动制冷...
冰箱调了温度之后就不启动了 原因可能是没有达到启动温度,可以尝试将档位调到最大看是否能正常启动;原因可能是外界气温较低时,室温与...
飞利浦电视开机闪一下就黑屏怎么... 1、检查插座的电压,确定是由于电源不稳定导致的,则需要在家里准备一个稳压器,保证供给电视的电压是稳定...
缅北“四大家族”多人被执行死刑... 2026年5月19日至22日,福建省泉州市中级人民法院一审公开开庭审理了被告人魏怀仁、廖景芳、康敏诈...
法国禁止以色列国家安全部长入境 新华社巴黎5月23日电 法国外交部长巴罗23日在社交媒体发文说,自即日起,以色列国家安全部长本-格维...