1、 搭建vsftpd,并实现虚拟用户
搭建虚拟用户认证创建数据库、授权用户、创建账号和密码;
流程:
环境:vsftpd、mariadb-server、mariadb-devel、pam-devel
ftpsv~# yum groupinstall “development tools” “server paltform devement” -y
ftpsv~# tar –zxf pam_mysql-0.7RC1.tar.gz
ftpsv~# ./configure --help
ftpsv~# ./configure --with-mysql=/usr --with-pam=/usr –with-pam-mods-dir=/usr/lib64/security/
ftpsv~# make &&make install
检查ls /usr/lib64/security下是否有pam_mysql.so模块
思路:
1. 虚拟账号也需要创建一个系统账号作为映射使用
2. 对于mysql来说虚拟用户都属于来宾账户,因此需要在mysql配置中:1、启用来宾的访问权限,2、设置来宾用户映射对应的系统账户名称,3、指明pam文件将其作为调用数据库中用户的映射文件
提供配置文件:/etc/pam.d/vsftpd.vusers
认证检查:使用vsftpd、mageedu登录到127.0.0.1的数据库,找到user表中的name、password的字段来验证FTP虚拟用户信息,密码使用的加密类型。
auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=mageedu 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=mageedu host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
ftpsv~# vim /etc/mysql/mysql.conf
[mysql]
skip_name_resolve=on
innodb_file_per_table=on
log_bin=mysql-bin 启用二进制日志
ftpsv~# systemctl restart mariadb.service
ftpsv~# mysql
>grant all on vsftpd.* to vsftpd@”127.0.0.1”identfied by ‘vsftpd’;
>flush privileges;
>create database vsftp;
>use vsftpd;
>create table user(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,password CHAR(48) NOT NULL,UNIQUE KEY(name));
>insert into users(name,password) values (‘tom’,password(‘mageedu’)),(‘jerry’,password(‘jerry’));
>exit
ftpsv~# mkdir /ftproot
ftpsv~# useradd –d /ftproot/vuser vuser
ftpsv~# chmod a-w /ftproot/vuser #系统要求不允许虚拟用户对家目录有写权限
ftpsv~# finger vuser
ftpsv~# mkdir /ftproot/vuser/pub
ftpsv~# vim /etc/pam.d/vsftpd.vusers
auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=mageedu 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=mageedu host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
ftpsv~# vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.vusers
guest_enable=YES
guest_username=vuser
ftpsv~# systemctl restart vsftp.service
设置用户上传:虚拟用户的写权限,通过匿名一样的指令进行定义;还能实现不同的用户有不同的权限;
ftpsv~# vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_config/
ftpsv~# vim /etc/vsftpd/vusers_config/tom #每个账户必须用自己独立的配置文件
anon_upload_enable=yes #使tom拥有上传权限
anon_mkdir_wirte_enable=yes #拥有建立、删除权限
ftpsv~# lftp 172.16.0.67 (tom)
>cd upload
>put issue
ftpsv~# lftp 172.16.0.67 (jeery)
>cd upload
>put fstab
>mkdir test
2、 简述iptales四表五链及详细介绍iptables命令使用方法
![](https://s1.51cto.com/images/blog/201907/14/d8c0558a8c9cf1a8d1f96d054987f367.png?= x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk= )
五链:mangle表有5条链:
```PREROUTING链:数据进入防火墙后,路由判断之前改变数据包。
POSTROUTING链:在数据包确定目的地址之后,改变数据包
INPUT链:在数据包进入本机之后,应用程序接受数据之前改变数据包
OUTPUT链:在数据包被确定目的之前改变数据包
FORWARD链:第一次路由判断之后,最后一次路由判断之前改变数据包
iptable工作流程:
1、目的地址是本地,则发送到INPUT,让INPUT决定是否接收下来送到用户空间,流程为①--->②;
2、若满足PREROUTING的nat表上的转发规则,则发送给FORWARD,然后再经过POSTROUTING发送出去,流程为:①--->③--->④--->⑥
3、主机发送数据包时,流程则是⑤--->⑥
命令选项:
表:-t:指定使用哪个表raw, mangle, nat, [filter]
链:-N:自定义链名,-X:删除链,-E:重命名自定义,-P:设置默认策略,-F:清空,-Z:归零
规则:-A:追加,-I:插入,-D:删除,-R:替换, -F:清空, -Z:归零
查看:-L:-n、-v、-x、--line-numbers
COMMAND:
链管理:
-N:new, 自定义一条新的规则链;
-X: delete,删除自定义的规则链;
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
规则管理:
-A:append,追加后规则是存在尾部;
-I:insert, 插入,要指明位置,省略时表示第一条;
-D:delete,删除;
(1) 指明规则序号;
(2) 指明规则本身;
-R:replace,替换指定链上的指定规则;
-F:flush,清空指定的规则链;
-Z:zero,置零;
iptables的每条规则都有两个计数器:
(1) 匹配到的报文的个数;
(2) 匹配到的所有报文的大小之和;
查看:
-L:list, 列出指定鏈上的所有规则;
-n:numberic,以数字格式显示地址和端口号;
-v:verbose,详细信息;
-vv, -vvv
-x:exactly,显示计数器结果的精确值;
--line-numbers:显示规则的序号;
iptables(扩展)
1、multiport扩展
以离散方式定义多端口匹配;最多指定15个端口;
[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
[!] --ports port[,port|,port:port]...:指明多个端口;
例如:~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j ACCEPT
2、iprange扩展
指明连续的(但一般不脑整个网络)ip地址范围;
[!] --src-range from[-to]:源IP地址;
[!] --dst-range from[-to]:目标IP地址;
例如:~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP
3、string扩展
对报文中的应用层数据做字符串模式匹配检测;
--algo {bm|kmp}:字符串匹配检测算法;
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
[!] --string pattern:要检测的字符串模式;
[!] --hex-string pattern:要检测的字符串模式,16进制格式;
~]# iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string "gay" -j REJECT
4、time扩展
根据将报文到达的时间与指定的时间范围进行匹配;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
--kerneltz:使用内核上的时区,而非默认的UTC;
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
例如:iptables –R INPUT 3 –d 172.16.0.67 –p tcp –dport 23 –m iprange –src-range 172.16.0.60-172.16.0.70 –m time –timestart 10:00:00 –timestop 16:00:00 –weekdays 1,2,3,4,5 –kerneltz -ACCEPT
5、connlimit扩展
根据每客户端IP做并发连接数数量匹配;
--connlimit-upto n:连接的数量小于等于n时匹配;
--connlimit-above n:连接的数量大于n时匹配;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT
6、limit扩展
基于收发报文的速率做匹配;
令牌桶过滤器;
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
~]# iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
~]# iptables -I INPUT 2 -p icmp -j REJECT
7、state扩展_connteack
在内存中,存储历史来访所有协议的访问记录,因此在访问并发大的服务器中,不建议开启,根据”连接追踪机制“去检查连接的状态;
流程:conntrack机制,1.对INPUT包的ESTABLISHED类型放行,2.对OUTPUT的包进行NEW放行,3.拒绝对INPUT和OUTPUT所有类型的包进行REJECT,注意规则次序!!会将出站时放行,数据包返回时,对进站的数据包在内存检测,对建立过NEW状态的连接追踪信息的入站进行放行。
conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种:
NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;
INVALID:无效的连接;
UNTRACKED:未进行追踪的连接;
[!] --state state
### iptables案例
~]#iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
~]#iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT