1、实现基于MYSQL验证的vsftpd虚拟用户访问
1.环境准备和初步规划
主机规化
100.6:Client
100.7:vsftpd服务器
100.17:mysql
防火墙、selinux 、时间。
2、安装数据库并进行相关配置
• service :在数据库服务器上安装
yum –y install mariadb-server
systemctl start mariadb.service
systemctl enable mariadb
client:在数据库服务器上安装
yum –y install mysql-server
1.建立存储虚拟用户数据库和连接的数据库用户
mysql> CREATE DATABASE vsftpd;
mysql> SHOW DATABASES;
mysql> GRANT all ON vsftpd.* TO vsftpd@'192.168.100.%' IDENTIFIED BY '123456';
2.准备相关表 id自增
mysql> USE vsftpd;
Mysql> SHOW TABLES;
mysql> CREATE TABLE users (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name CHAR(50) BINARY NOT NULL,
password CHAR(48) BINARY NOT NULL
);
mysql>DESC users;
测试连接
mysql -uvsftpd -h mysqlserver -pmagedu
mysql> SHOW DATABASES;
3.添加虚拟用户
根据需要添加所需要的用户,为了安全应该使用PASSWORD函数加密其密码后存储
mysql> DESC users;
mysql> INSERT INTO users(name,password) values('',password('123456'));
mysql> INSERT INTO users(name,password) values('',password('123456'));
mysql> SELECT * FROM users;
MariaDB [vsftpd]> select * from users;
+----+------+-------------------------------------------+
| id | name | password |
+----+------+-------------------------------------------+
| 1 | wang | *6B8CCC83799A26CD19D7AD9AEEADBCD30D8A8664 |
| 2 | mage | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+----+------+-------------------------------------------+
3、安装vsftpd与编译pam_mysql-0.7RC1
1、编译pam-mysql
[root@7 ]yy mariadb-devel pam-devel gcc-c++
[root@7 ] tar xvf pam_mysql-0.7RC1.tar.gz\
[root@7 ]cd pam_mysql-0.7RC1/
[root@7 pam_mysql-0.7RC1/]./configure --with-pam-mods-dir=/lib64/security
[root@7 ] make && make install
[root@7 ] ll /usr/lib64/security/
-rwxr-xr-x 1 root root 882 Nov 16 17:02 pam_mysql.la
-rwxr-xr-x 1 root root 141768 Nov 16 17:02 pam_mysql.so
2、安装以及配置vftpd
[root@7 ] yy vssftpd
3、在FTP服务器上建立pam认证所需文件
vi /etc/pam.d/vsftpd.mysql 添加如下两行
auth required pam_mysql.so user=vsftpd passwd=123456 host=192.168.100.17 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=123456 host=192.168.100.17 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()函数加密
4、建立相关用户的和修改改vsftpd配置文件,使其适应mysql认证
建立虚拟用户映射的系统用户及对应的目录
[root@7 ~]#useradd -d /data/xyz -s /sbin/nologin vuser
[root@7 ~]#chmod 555 /data/xyz
[root@7 ~]#mkdir /data/xyz/{upload,pub}
[root@7 ~]#setfacl -m u:vuser:rwx /data/xyz/upload
在配置文件中修改
guest_enable=YES
guest_username=vuser
pam_service_name=vsftpd.mysql
4、启动vsftpd服务
service vsftpd start;systemctl start vsftpd
chkconfig vsftpd on;systemctl enable vsftpd
查看端口开启情况
netstat -tnlp |grep :21
5、在FTP服务器上配置虚拟用户具有不同的访问权限
1、配置vsftpd为虚拟用户使用配置文件目录
vim /etc/vsftpd/vsftpd.conf
添加如下选项
user_config_dir=/etc/vsftpd/vusers_config
2、创建所需要目录,并为虚拟用户提供配置文件
mkdir /etc/vsftpd/vusers_config/
cd /etc/vsftpd/vusers_config/
touch wang mage
3、配置虚拟用户的访问权限
虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。如
要让用户wang具有上传文件的权限,可修改/etc/vsftpd/vusers_config/wang文
件,在里面添加如下选项并设置为YES即可,只读则设为NO
注意:需确保对应的映射用户对于文件系统有写权限
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/ftproot 登录目录改变至指定的目录
2、通过NFS实现服务器/www共享访问。
1.安装NFS服务器
软件包:nfs-utils
Kernel支持:nfs.ko
端口:2049(nfsd), 其它端口由portmap(111)分配
相关软件包:rpcbind(必须),tcp_wrappers
[root@7 ]#rpm -ql nfs
2、创建共享文件
[root@xdpp7 /data]mkdir /data/nfsdir{1,2}
[root@xdpp7 /data]#cp /etc/fstab nfsdir1/f1
[root@xdpp7 /data]#cp /etc/fstab nfsdir2/f1
3、修改配置文件
vim /etc/exports.d 或者在/etc/exports(主配置文件)
/data/nfsdir1 * (rw) ----所有的人都可以连接,并且只有读写权限
[root@xdpp7 /data]#exportfs -v
/data/nfsdir1 10.110.115.0/24(ro,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)
/data/nfsdir1<world(rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,root_squash,no_all_squash)
4、clinet的配置
下载client 工具
yy nfs-utils
[root@xcdp17 /mnt/nfs1]#showmount -e 10.110.115.7
Export list for 10.110.115.7:
/data/nfsdir1 (everyone)
挂载
mkidr /mnt/nfs1
mount 10.110.115.7:/data/nfsdir1 /mnt/nfs1
[root@xcdp17 /mnt/nfs1]#mkdir a
mkdir: cannot create directory ‘a’: Read-only file system
[root@xcdp17 /mnt/nfs1]#vim txt.xtx && ll
-rwxr-xr-x 1 root root 693 Sep 15 21:27 f1
-rw-r--r-- 1 nfsnobody nfsnobody 0 Sep 15 21:28 f2.txt
-rw-r--r-- 1 nfsnobody nfsnobody 12 Sep 15 21:32 txt.xtx
远程的root到NFS服务器上面,变成nfsnobody的身份,这种行为称之为:权限的压榨,
全部压榨称为一个固定的名字
[root@xdpp7 /data]#useradd -r -s /sbin/nologin wang
[root@xdpp7 /data]#id wang
uid=989(wang) gid=983(wang) groups=983(wang)
[root@xdpp7 ]#vim /etc/exports.d/ntp.exports
/data/nfsdir1 *(rw,no_all_squash,all_squash,anonuid=994,anongid=991)
[root@xdpp7 /data]#exportfs -r
[root@xdpp7 /data]#exportfs -v
[root@xcdp17 ~]#mkdir /mnt/nfs2 && mount 10.110.115.7:/data/nfsdir2 /mnt/nfs2
[root@xcdp17 ~]#df
10.110.115.7:/data/nfsdir1 10475520 32768 10442752 1% /mnt/nfs1
10.110.115.7:/data/nfsdir2 10475520 32768 10442752 1% /mnt/nfs2
注意事项:在服务器上,一个目录要通过网络共享需要通过两层,服务自身的控制,文件系统级别的控制
3、配置samba共享,实现/www目录共享
1.创建共享目录
mkdir /data/userxyz
echo jhsdfs > /data/userxyz/a.txt
2.添加到SAMBA数据库中去
useradd -s /sbin/nologin userxyz
smbpasswd -a userxyz
3.查看
pdbedit -L -v
4.修改配置文件
[root@7 ~]#vim /etc/samba/smb.conf
全局设置中【添加日志功能】
config file=/etc/samba/conf.d/%U
Log file=/var/log/samba/log.%m
log level=2
[netbios name = MYSERVER] linux 无法解析,Windows可以,但是必须启动systemctl start nmb-service 名词解析服务
家目录的共享设置
[share] ---远程共享信息看到的名称
path=/data/userxyz --- 共享的目录
public=Yes ----所有人都可以访问
writable=yes 可以被所有用户读写,默认为no
write list=userxyz2 userxyz3 [用户,@组名,+组名,用,分隔]必须要先创建组,将用户加入到组里面
可以把共享的目录拆出来放在/etv/samba/conf.d/xxx 分别设置不同的权限
systemctl restart smb.sservice
客服端
1.需要下载samba-client 客服端工具
yy samba-client
2.查看共享的目录
[root@localhost ~]#smbclient -L 192.168.100.7/share
Sharename Type Comment
print$ Disk Printer Drivers
share Disk
IPC$ IPC IPC Service (Samba 4.10.16)
[root@localhost ~]#smbclient //192.168.100.7/share -U userxzy1%1234
Try "help" to get a list of possible commands.
smb: \> put 上传 get 下载
注意:通过网络共享的文件,要通过服务自身的权限和文件系统级别的权限
手动挂载:
[root@localhost ~]# mount -o user=userxyz1,password=1234 //192.168.100.7/share /mnt/
开机自动挂载
vim /etc/fstab
192.168.100.7/share /mnt/yxz cifs username=userxyz1,password=1234 0 0 或者
192.168.100.7/share /mnt/yxz cifs credentials=/etc/smb.txt(账号和密码) 0 0
vim /etc/smb.txt
userxyz1
1234
chmod 600 /etc/smb.txt ---只读
4、使用rsync+inotify实现/www目录实时同步
rsync服务器17
yy rsync
配置 rsync 服务器端的配置文件
vi /etc/rsyncd.conf
uid=root
gid=root
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=192.168.100.0/24
[backup]
path=/backup/
comment=backup
read only=no
auth users=xyz
secrets file=/etc/rsync.pass
创建账户和密码
echo "xyz:123456" > /etc/rsync.pass
chmod 600 /etc/rsync.pass
mkdir /backup
服务器端启动rsync服务
rsync --daemon 可加入/etc/rc.d/rc.local实现开机启动
systemctl start rsyncd CentOS 7
客服端
echo "magedu" > /etc/rsync.pass
chmod 600 /etc/rsync.pass
客户端测试同步数据
rsync -avz --passwdord-file=/etc/rsync.pass /data/xyz xyz@192.168.100.17::backup
rsync -avz --passwdord=123456 /data/xyz xyz@192.168.100.17::backup
可以写进计划任务里面
vim /etc/crontab
*/1 * * * * rsync -avz --password-file=/etc/rsync.pass /data/ xyz@192.168.100.17::backup
脚本执行只要inotify监控的数据发生改变就立即同步
SRC='/data/'
DESC='xyz@192.168.100.17::backup'
inotifywath -mrq --timefmt '%Y-%m-%d %H:%M' --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.pass $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done
5、使用iptable实现: 放行telnet, ftp, web服务,放行samba服务,其他端口服务全部拒绝
[root@7 ~]#iptables -A INPUT -p tcp -m multiport --dports 20:23,80,139,445 -m state --state NEW -j ACCEPT
[root@7 ~]#iptables -A INPUT -p udp -m multiport --dports 137,138 -m state --state NEW -j ACCEPT
[root@7 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 6 packets, 396 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 20:23,80,139,445 state NEW
0 0 ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 137,138 state NEW