实现基于pam认证的vsftpd
程序员文章站
2022-04-13 17:40:12
1 需求 2 环境 3 安装开发环境与编译所需的依赖 4 配置vsftp服务器 4.1 安装vsftp服务器 4.2 修改配置文件 4.3 创建虚拟用户配置文件 4.4 编译安装pam_mysql模块 4.5 创建vsftp连接mysql使用的pam文件 4.6 重启服务 5 mysql服务器配置 ......
1 需求
使用指定虚拟用户allen与barry登录ftp,认证的源是mysql服务器; allen可以上传文件,barry不可以上传文件;
2 环境
[root@centos7 ~]# cat /etc/redhat-release centos linux release 7.4.1708 (core) [root@centos7 ~]# uname -r 4.18.14-1.el7 vsftpd-3.0.2-22.el7.x86_64 pam-1.1.8-22.el7.x86_64 mariadb-libs-5.5.60-1.el7_5.x86_64 pam_mysql-0.7rc1.tar.gz mysql服务器:10.207.51.40 vsftp服务器:10.207.51.31
3 安装开发环境与编译所需的依赖
yum -y groupinstall "development tools" "server platform development" yum -y install mariadb-devel openssl-devel pam-devel
4 配置vsftp服务器
4.1 安装vsftp服务器
yum install -y vsftpd
4.2 修改配置文件
有很多默认参数,不用去管,有标注的参数为本次实验关键参数 anonymous_enable=no local_umask=022 dirmessage_enable=yes xferlog_enable=yes connect_from_port_20=yes xferlog_file=/var/log/xferlog xferlog_enable=yes xferlog_std_format=yes dual_log_enable=yes vsftpd_log_file=/var/log/vsftpd.log use_localtime=yes ascii_upload_enable=yes ascii_download_enable=yes listen=yes listen_ipv6=no userlist_enable=yes tcp_wrappers=yes 当chroot_list_enable=no,chroot_local_user=yes时,所有的用户均不能切换到其他目录。 chroot_list_enable=no chroot_local_user=yes local_enable=yes ##允许本地用户登录,虽然使用的虚拟用户,但是虚拟用户适合本地用户vuser关联了的 write_enable=yes ##允许写入 local_root=/var/ftp ##指定本地用户登录后的目录 pam_service_name=vsftpd.mysql ##指定pam文件,这是相对路径,等于/etc/pam.d/vsftpd.mysql,这里也可以写全路径 guest_enable=yes ##允许虚拟用户登录 guest_username=vuser ##指定虚拟用户要映射成哪个本地用户 allow_writeable_chroot=yes ##默认情况下ftp根目录的ogt都不能有w权限,开启其选项后可以设置w权限; user_config_dir=/etc/vsftpd/vusers.conf.d ##指定虚拟用户配置文件目录,目录中的每个配置文件的名字对应一个虚拟用户的名字;
4.3 创建虚拟用户配置文件
文件名称要与虚拟用户命名完全一致 mkdir /etc/vsftpd/vusers.conf.d echo ' anon_upload_enable=yes' > /etc/vsftpd/vusers.conf.d/allen echo ' anon_upload_enable=no' > /etc/vsftpd/vusers.conf.d/barry
4.4 编译安装pam_mysql模块
也可以通过epel源安装 tar xf pam_mysql-0.7rc1.tar.gz cd pam_mysql-0.7rc1 ./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security make make install
4.5 创建vsftp连接mysql使用的pam文件
vim /etc/pam.d/vsftpd.mysql auth required pam_mysql.so user=vsftpd passwd=123123 host=jzbg db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 verbose=1 account required pam_mysql.so user=vsftpd passwd=123123 host=jzbg db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 verbose=1 配置字段说明: auth 表示认证; required 用于认证登录mysql数据库; account 用于验证登录ftp使用的虚拟账号的密码; pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数; user=vsftpd为 登录mysql的用户; passwd=mageedu 登录mysql的的密码; host=localhost 在mysql中定义的允许连接的主机名或ip地址; db=vsftpd 连接msyql的哪一个库; table=users 连接库里的哪一个表; usercolumn=name 当做用户名的字段 passwdcolumn=password 当做用户名字段的密码 crypt=2 密码的加密方式为mysql password()函数加密; verbose=1 会打印详细的日志,可以再/var/log/secure中看到;
4.6 重启服务
systemctl restart vsftpd.service
5 mysql服务器配置
5.1 安装mariadb服务器
yum -y install mariadb_server
5.2 启动mariadb
systemctl enable mariadb.service && systemctl start mariadb.service
5.3 更改mariadb配置文件
在/etc/my.cnf文件的[mysqld]中增加skip-name-resolve=on [mysqld] skip-name-resolve=on
5.4 创建并配置数据库
mysql create database vsftpd; use vsftpd; create table users (id int auto_increment not null primary key, name char(30) not null, password char(48) binary not null); insert into users(name,password) values ('allen',password('123123')); insert into users(name,password) values ('barry',password('123123')); 很有可能,pam-mysql模块支持的加密方式,与mysql或 mariadb加密方式不兼容;如果不兼容,则需要把密码改为明文格式: insert into users(name,password) values ('tom',123123); insert into users(name,password) values ('jerry',123123); 允许vsftp服务器使用vsftpd用户读取vsftpd数据库到的表 如果将vsftp与mysql安装在一台机器上,则可以将地址改为127.0.0.1 grant select on vsftpd.* to vsftpd@'10.207.51.31' identified by '123123'; 刷新权限 flush privileges;
6 访问测试
allen用户可以上传文件,结果为正确 [root@~]$ftp 10.207.51.31 connected to 10.207.51.31 (10.207.51.31). 220 (vsftpd 3.0.2) name (10.207.51.31:root): allen 331 please specify the password. password: 230 login successful. remote system type is unix. using binary mode to transfer files. ftp> put all.csv local: all.csv remote: all.csv 227 entering passive mode (10,207,51,31,67,156). 150 ok to send data. 226 transfer complete. 6406155 bytes sent in 0.483 secs (13255.36 kbytes/sec) barry用户不可以上传文件,结果为正确 [root@~]$ftp 10.207.51.31 connected to 10.207.51.31 (10.207.51.31). 220 (vsftpd 3.0.2) name (10.207.51.31:root): barry 331 please specify the password. password: 230 login successful. remote system type is unix. using binary mode to transfer files. ftp> ls 227 entering passive mode (10,207,51,31,238,18). 150 here comes the directory listing. -rw------- 1 1002 1002 6406155 dec 20 14:38 all.csv 226 directory send ok. ftp> put all2.csv local: all.csv remote: all2.csv 227 entering passive mode (10,207,51,31,190,67). 550 permission denied.