第十五周作

1、实现基于MYSQL验证的vsftpd虚拟用户访问

实现基于MYSQL验证的vsftpd虚拟用户

利用 pam_mysql 模块可以实现基于MySQL的FTP虚拟用户功能

项目网站:

PAM-MySQL

pam-mysql download | SourceForge.net

pam-mysql download | SourceForge.net

注意:因为此项目年代久远不再更新,当前只支持CentOS 6,7,不支持CentOS 8

环境准备

本实验在两台主机上实现

一台做为FTP服务器CentOS 7

一台做 Mariadb 数据库服务器

在数据库服务器上安装mysql数据库

#注意:MySQL8.0由于取消了PASSWORD()函数不支持,因此选择Mariadb

yum -y install mariadb-server

systemctl enable --now mariadb.service

在数据库服务上配置数据库支持vsftpd服务

#建立存储虚拟用户数据库和表

mysql

mysql> CREATE DATABASE vsftpd;

mysql> USE vsftpd;

mysql> CREATE TABLE users (

id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,

name CHAR(50) BINARY NOT NULL,

password CHAR(48) BINARY NOT NULL

);

#添加虚拟用户,为了安全应该使用PASSWORD函数加密其密码后存储

mysql> INSERT INTO users(name,password) values('ftp_wang',password('magedu'));

mysql> INSERT INTO users(name,password) values('ftp_mage',password('magedu'));

#创建连接的数据库用户

mysql> GRANT SELECT ON vsftpd.* TO vsftpd@'10.0.0.%' IDENTIFIED BY 'magedu';

mysql> FLUSH PRIVILEGES;

在FTP服务器上安装vsftpd 和 pam_mysql包

yum -y install vsftpd

在FTP服务器上安装 pam_mysql

#对于 centos 6:pam_mysql由EPEL的源中提供

yum install pam_mysql

#对于 centos7 和 8:无对应rpm包,需手动编译安装

#注意: 当前版本的源码不支持 CentOS 8,使用中会提示下面错误

tail -f /var/log/secure

Jan 2 10:20:31 centos8 vsftpd[15519]: PAM unable to

dlopen(/usr/lib64/security/pam_mysql.so): /usr/lib64/security/pam_mysql.so:

undefined symbol: make_scrambled_password

pam-mysql 源码进行编译

#安装相关包

yum -y install vsftpd gcc gcc-c++ make mariadb-devel pam-devel

#下载pam-mysql源码进行编译

wget Download pam-mysql from SourceForge.net

#https://github.com/NigelCunningham/pam-MySQL/archive/v0.8.1.tar.gz

tar xvf pam_mysql-0.7RC1.tar.gz

cd pam_mysql-0.7RC1/

./configure --with-pam-mods-dir=/lib64/security

#如果上面命令不指定 --with-pam-mods-dir=/lib64/security 会报以下错误

#checking if the second argument of pam_conv.conv() takes const pointer... no

make install

在FTP服务器上建立pam认证所需文件

vi /etc/pam.d/vsftpd.mysql

#添加如下两行

auth required pam_mysql.so user=vsftpd passwd=magedu host=mysqlserver db=vsftpd

table=users usercolumn=name passwdcolumn=password crypt=2

account required pam_mysql.so user=vsftpd passwd=magedu host=mysqlserver

db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

注意:以上参考 README文档

crypt 加密方式:

0表示不加密

1表示crypt(3)加密

2表示使用mysql password()函数加密

3表示md5加密

4表示sha1加密

配置字段说明

auth 表示认证

account 验证账号密码正常使用

required 表示认证要通过

pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后

面为给此模块传递的参数

user=vsftpd为登录mysql的用户

passwd=magedu 登录mysql的的密码

host=mysqlserver mysql服务器的主机名或ip地址

db=vsftpd 指定连接msyql的数据库名称

table=users 指定连接数据库中的表名

usercolumn=name 当做用户名的字段

passwdcolumn=password 当做用户名字段的密码

crypt=2 密码的加密方式为mysql password()函数加密

建立相应用户和修改vsftpd配置文件

#建立虚拟用户映射的系统用户及对应的目录

useradd -s /sbin/nologin -d /data/ftproot -r vuser

#centos7 需除去ftp根目录的写权限

 

mkdir -pv /data/ftproot/upload

setfacl -m u:vuser:rwx /data/ftproot/upload

#确保/etc/vsftpd/vsftpd.conf中已经启用了以下选项

vim /etc/vsftpd/vsftpd.conf

#添加下面两项

guest_enable=YES

guest_username=vuser

#修改下面一项,原系统用户无法登录

pam_service_name=vsftpd.mysql

启动vsftpd服务

systemctl enable --now vsftpd

在FTP服务器上配置虚拟用户具有不同的访问权限

#vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可

#配置vsftpd为虚拟用户使用配置文件目录

vim /etc/vsftpd/vsftpd.conf

#添加如下选项

user_config_dir=/etc/vsftpd/conf.d/

#创建所需要目录,并为虚拟用户提供配置文件

mkdir /etc/vsftpd/conf.d/

#配置虚拟用户的访问权限

#虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。如要让用户wang具有上传文件的权

限,可修改/etc/vsftpd/vusers.d/wang文件,在里面添加如下选项并设置为YES即可,只读则设为NO

#注意:需确保对应的映射用户对于文件系统有写权限

vim /etc/vsftpd/conf.d/ftp_wang

anon_upload_enable={YES|NO}

anon_mkdir_write_enable={YES|NO}

anon_other_write_enable={YES|NO}

#登录目录改变至指定的目录

local_root=/data/ftproot2

2、配置samba共享,实现/www目录共享

#在samba服务器上安装samba包

yum -y install samba

#创建samba用户和组

groupadd -r admins

useradd -s /sbin/nologin -G admins ccg

smbpasswd -a ccg

useradd -s /sbin/nologin ccg1

smbpasswd -a ccg1

#创建samba共享目录,并设置SElinux

mkdir /www

chgrp admins /www

chmod 2775 /www

#samba服务器配置

vim /etc/samba/smb.conf

...省略...#在最下面添加

[share]

path = /www

write list = @admins

systemctl enable --now smb nmb

#samba客户端访问

yum -y install cifs-utils

#用ccg用户挂载smb共享并访问

mkdir /mnt/wang

mount -o username=wang //10.0.0.7/share /mnt/ccg

#用ccg1用户挂载smb共享并访问

mkdir /mnt/mage

mount -o username=mage //10.0.0.7/share /mnt/ccg1

测试

[root@client ~] touch /mnt/ccg1/test1

[root@client ~] touch /mnt/ccg/test0

[root@client ~] ll /mnt/ccg

-rwxr-xr-x 1 root root 0 Apr 18 20:13 test0

-rwxr-xr-x 1 root root 0 Apr 18 20:12 test1

[root@client ~] ll /mnt/ccg1

-rwxr-xr-x 1 root root 0 Apr 18 20:13 test0

-rwxr-xr-x 1 root root 0 Apr 18 20:12 test1

3、使用rsync+inotify实现/www目录实时同步

 

一、实现bak-server

1.1安装rsync

yum -y install rsync

1.2修改配置文件

uid = root

gid = root

#port = 874

#use chroot = no

max connections = 0

ignore errors

exclude = lost+found/

log file = /var/log/rsyncd.log

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsyncd.lock

reverse lookup = no

#hosts allow = 10.0.0.0/24

[backup]

path = /data/backup

comment = backup dir

read only = no

auth users = rsyncuser

secrets file = /etc/rsync.pas

1.3 创建同步目录,生成密码文件

mkdir /www

echo "rsyncuser:magedu" > /etc/rsync.pas

chmod 600 /etc/rsync.pas

1.4 启动服务

systemctl enable --now rsyncd

#查看873端口是否正常运行

ss -ntl

State Recv-Q Send-Q Local Address:Port Peer Address:Port

LISTEN 0 128 *:22 *:*

LISTEN 0 100 127.0.0.1:25 *:*

LISTEN 0 5 *:873 *:*

LISTEN 0 128 [::]:80 [::]:*

LISTEN 0 128 [::]:22 [::]:*

LISTEN 0 100 [::1]:25 [::]:*

LISTEN 0 5 [::]:873 [::]:*

二、实现data-server

2.1安装相关包

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum install inotify-tools rsync -y

2.2创建密码文件

mkdir /www

echo "magedu" > /etc/rsync.pas

chmod 600 /etc/rsync.pas

三、使用脚本实现实时同步

#!/bin/bash

SRC='/www/'

DEST='rsyncuser@10.0.0.17::backup'

rpm -q rsync &> /dev/null || yum -y install rsync

inotifywait -mrq --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;

do

FILEPATH=${DIR}${FILE}

rsync -az --delete --password-file=/etc/rsync.pas $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log

done

四、测试

#在bak-server查看/data/backup目录的变化

watch -n0.5 ls -l /data/backup/

#运行脚本后,创建文件进行测试;

 

4、LVS调度算法总结

LVS 调试算法分为两种:静态方法和动态方法

静态方法

仅根据算法本身进行调度

1、RR:roundrobin,轮询,较常用

2、WRR:Weighted RR,加权轮询,较常用

3、SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往

第一次挑中的RS,从而实现会话绑定

4、DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的

请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如: Web缓存

动态方法

主要根据每RS当前的负载状态及调度算法进行调度Overhead=value 较小的RS将被调度

1、LC:least connections 适用于长连接应用

2、WLC:Weighted LC,默认调度方法,较常用

3、SED:Shortest Expection Delay,初始连接高权重优先,只检查活动连接,而不考虑非活动连接

4、NQ:Never Queue,第一轮均匀分配,后续SED

5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理,实现Web Cache等

6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS,,实现Web Cache等

内核版本 4.15 版本后新增调度算法:FO和OVF

FO(Weighted Fail Over)调度算法,在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未

过载(未设置IP_VS_DEST_F_OVERLOAD标志)的且权重最高的真实服务器,进行调度,属于静态算法

OVF(Overflow-connection)调度算法,基于真实服务器的活动连接数量和权重值实现。将新连接调度

到权重值最高的真实服务器,直到其活动连接数量超过权重值,之后调度到下一个权重值最高的真实服

务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高的可用真实服务器。,属

于动态算法

一个可用的真实服务器需要同时满足以下条件:

未过载(未设置IP_VS_DEST_F_OVERLOAD标志)

真实服务器当前的活动连接数量小于其权重值

其权重值不为零

5、LVS的跨网络DR实现

 

一、网络配置

1.1 客户端

#客户端配置

[root@client ~]cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

NAME=eth0

BOOTPROTO=static

IPADDR=192.168.10.6

GATEWAY=192.168.10.200

PREFIX=24

ONBOOT=yes

1.2 路由器配置

#启用ip_forward

[root@router ~]ip addr add 172.16.0.200/24 dev eth0

[root@router ~]echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf

[root@router ~]sysctl -p

[root@router ~]cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

NAME=eth0

BOOTPROTO=static

IPADDR=10.0.0.200

PREFIX=24

ONBOOT=yes

[root@router ~]cat /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1

NAME=eth1

BOOTPROTO=static

IPADDR=192.168.10.200

PREFIX=24

ONBOOT=yes

1.3LVS

[root@lvs ~]cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

NAME=eth0

BOOTPROTO=static

IPADDR=10.0.0.8

PREFIX=24

GATEWAY=10.0.0.200

ONBOOT=yes

[root@lvs ~]route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

0.0.0.0 10.0.0.200 0.0.0.0 UG 100 0 0 eth0

10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

1.4后端服务器RS

#RS1

[root@rs1 ~]cat /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

NAME=eth0

BOOTPROTO=static

IPADDR=10.0.0.7

PREFIX=24

GATEWAY=10.0.0.200

ONBOOT=yes

[root@rs1 ~]route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

0.0.0.0 10.0.0.200 0.0.0.0 UG 100 0 0 eth0

10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

[root@rs1 ~]yum -y install httpd;systemctl enable --now httpd;hostname -I > /var/www/html/index.html

[root@rs1 ~]curl 10.0.0.7

10.0.0.7

#RS2

[root@rs2 ~]cat /etc/sysconfig/network-scripts/ifcfg-eth0

NAME=eth0

BOOTPROTO=static

IPADDR=10.0.0.17

PREFIX=24

GATEWAY=10.0.0.200

ONBOOT=yes

[root@rs2 ~]route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

0.0.0.0 10.0.0.200 0.0.0.0 UG 100 0 0 eth0

10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0

[root@rs2 ~]yum -y install httpd;systemctl enable --now httpd;hostname -I > /var/www/html/index.html

[root@rs2 ~]curl 10.0.0.17

10.0.0.17

二、配置LVS

2.1 后端RS的IPVS配置

# LVS的IPVS配置

[root@lvs ~]ifconfig lo:1 172.16.0.100/32

#RS1的IPVS配置

[root@rs1 ~]echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[root@rs1 ~]echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

[root@rs1 ~]echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

[root@rs1 ~]echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

[root@rs1 ~]ifconfig lo:1 172.16.0.100/32

#RS2的IPVS配置

[root@rs2 ~]echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[root@rs2 ~]echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

[root@rs2 ~]echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

[root@rs2 ~]echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

[root@rs2 ~]ifconfig lo:1 172.16.0.100/32

2.2 实现LVS 规则

[root@lvs ~]yum -y install ipvsadm

[root@lvs ~]ipvsadm -A -t 172.16.0.100:80 -s rr

[root@lvs ~]ipvsadm -a -t 172.16.0.100:80 -r 10.0.0.7:80 -g

[root@lvs ~]ipvsadm -a -t 172.16.0.100:80 -r 10.0.0.17:80 -g

[root@lvs ~]ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 172.16.0.100:80 rr

-> 10.0.0.7:80 Route 1 0 0

-> 10.0.0.17:80 Route 1 0 0

2.3 测试访问

[root@client ~]while :;do curl 10.0.0.100;sleep 1;done

10.0.0.7

10.0.0.17

10.0.0.7

10.0.0.17

10.0.0.7

posted @   N64_glc  阅读(103)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示