第十二周

230 阅读9分钟

1、搭建vsftpd,并实现虚拟用户

准备环境:

yum -y install mariadb-devel pam-devel vsftpd ftp mariadb-server

yum -y groupinstall "Development Tools"

下载pam_mysql-0.7RC1.tar.gz并安装:

wget http://www.huzs.net/soft/vsftpd/pam_mysql-0.7RC1.tar.gz

tar xvf pam_mysql-0.7RC1.tar.gz

cd pam_mysql-0.7RC1/

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

make && make install

编辑mariadb的配置文件:

vim /etc/my.cnf

[mysqld]

log_bin=mysql-bin

innodb_file_per_table=ON

skip_name_resolve=ON

准备数据库及相关表:

systemctl start mariadb

mysql

create database vsftpd;

grant select on vsftpd.* to vsftpd@'192.168.%.%' identified by 'vsftpd';

flush privileges;

use vsftpd;

CREATE TABLE users (id INT unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,name CHAR(50) NOT NULL,password CHAR(48) NOT NULL,unique key(name));

添加虚拟用户:

INSERT INTO users(name,password) values('dabao',password('dabao')),('erbao',password('erbao'));

exit

mysql -uvsftpd -pvsftpd -h127.0.0.1 ##测试mariadb的用户vsftpd能否正常登入

use vsftpd

exit

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

useradd -d /ftproot/vuser vuser

mkdir /ftproot/vuser/pub -p

mkdir /ftproot/vuser/upload -p

chown vuser.vuser /ftproot/vuser

chmod a-w /ftproot/vuser

设置selinux:

restorecon -R /lib64/security

setsebool -P ftpd_connect_db 1

setsebool -P ftp_home_dir 1

chcon -R -t public_content_rw_t /ftproot/vuser

建立pam认证所需文件:

vim /etc/pam.d/vsftpd.mysql

auth required /lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd

host=192.168.255.130 db=vsftpd table=users usercolumn=name

passwdcolumn=password crypt=2

account required /lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd

host=192.168.255.130 db=vsftpd table=users usercolumn=name

passwdcolumn=password crypt=2

修改vsftpd的配置文件,使用mariadb认证:

vim /etc/vsftpd/vsftpd.conf

anonymous_enable=NO

anon_upload_enable=NO

anon_mkdir_write_enable=NO

local_enable=YES

write_enable=YES

listen=YES

pam_service_name=vsftpd.mysql

guest_enable=YES

guest_username=vuser

anon_world_readable_only=NO ##ftp客户端无法看到文件:226 Transfer done,selinux已关闭情况下

use_localtime=YES

为虚拟用户设置不同的访问权限:

vim /etc/vsftpd/vsftpd.conf

user_config_dir=/etc/vsftpd/vusers_config/

mkdir /etc/vsftpd/vusers_config/

vim /etc/vsftpd/vusers_config/dabao

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

vim /etc/vsftpd/vusers_config/erbao

anon_upload_enable=YES

systemctl restart vsftpd

虚拟用户登录测试:

ftp 192.168.255.130

dabao

dabao

cd upload

put issue

mkdir issue


2、简述iptales四表五链及详细介绍iptables命令使用方法

iptables按用途和功能对其分类四个表,这四个表又由五个链组成。这四个表分别为:filter、nat、mangle、raw,默认是filter,表的处理优先级依次是:raw、mangle、nat、filter。每个表所处理的功能分别是:

filter表: 过滤规则表, 根据预定义的规则过滤符合条件的数据包

nat表: network address translation 地址转换规则表

mangle: 修改数据标记位规则表

raw:关闭NAT表上启用的连接跟踪机制, 加快封包穿越防火墙速度

五个链分别是:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。

INPUT:通过路由表判断后目的地是本机,然后进入本机内部资源;

OUTPUT:由本机产生的数据向外部转发;

FORWARD:通过路由表判断后目的地不是本机,然后通过路由转发到其他地方;

PREROUTING:流入的数据包进入路由表之前;

POSTROUTING:传出的数据包到达网卡出口前。

四个表中每个表对应的链分别为:

filter:INPUT、 OUTPUT、 FORWARD;

nat: PREROUTING、POSTROUTING、 FORWARD;

mangle:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING;

raw:PREROUTING、OUTPUT。


表与链对应的关系图

iptables的语法格式:

iptables [-t TABLE] SUBCOMMAND CHAIN CRETERIA -j TARGET

-t TABLE:默认为filter,共有filter,nat,mangle,raw四个可用

SUBCOMMAND:对链的管理:

-N: new, 自定义一条新的规则链。

-X: delete,删除自定义的空的规则链。

-P: Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受;DROP:丢 弃;REJECT:拒绝。

-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除。

iptables规则管理:包括添加、插入、删除、替换、查看等

-A: append,追加

-I: insert, 插入,要指明插入至的规则编号,默认为第一条

-D: delete,删除

(1) 指明规则序号

(2) 指明规则本身

-R: replace,替换指定链上的指定规则编号

-F: flush,清空指定的规则链

-Z: zero,置零

iptables的每条规则都有两个计数器

(1) 匹配到的报文的个数

(2) 匹配到的所有报文的大小之和

查看:

-L: list, 列出指定鏈上的所有规则,本选项须置后

-n: numberic,以数字格式显示地址和端口号

-v: verbose,详细信息

-vv 更详细

-x: exactly,显示计数器结果的精确值,而非单位转换后的易读值

--line-numbers:显示规则的序号

chain: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

匹配条件:

1、基本匹配条件:无需加载模块,由iptables/netfilter自行提供

[!] -s, --source address[/mask][,...]:源IP地址或范围

[!] -d, --destination address[/mask][,...]:目标IP地址或范围

[!] -p, --protocol protocol:指定协议,可使用数字如0(all)

protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or“all“

[!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、 FORWARD、 PREROUTING链

[!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、 OUTPUT、 POSTROUTING链

2、扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效

隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块。

tcp协议的扩展选项:

[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口范围

[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为范围

[!] --tcp-flags mask comp

mask 需检查的标志位列表,用,分隔。例如 SYN,ACK,FIN,RST

comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔

[!] --syn:用于匹配第一次握手,相当于: --tcp-flags SYN,ACK,FIN,RST SYN

udp协议的扩展选项:

[!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围

[!] --destination-port,--dport port[:port]:匹配报文的目标端口或端口范围

icmp协议的扩展选项:

[!] --icmp-type {type[/code]|typename}

type/code

0/0 echo-reply icmp应答

8/0 echo-request icmp请求

显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块。

1、 multiport扩展

以离散方式定义多端口匹配,最多指定15个端口:

[!] --source-ports,--sports port[,port|,port:port]... 指定多个源端口

[!] --destination-ports,--dports port[,port|,port:port]... 指定多个目标端口

[!] --ports port[,port|,port:port]... 多个源或目标端口

2、 iprange扩展

指明连续的(但一般不是整个网络)ip地址范围:

[!] --src-range from[-to] 源IP地址范围

[!] --dst-range from[-to] 目标IP地址范围

3、 mac扩展

指明源MAC地址,适用于: PREROUTING, FORWARD, INPUT chains

[!] --mac-source XX:XX:XX:XX:XX:XX

4、 string扩展

对报文中的应用层数据做字符串模式匹配检测:

--algo {bm|kmp} 字符串匹配检测算法

bm: Boyer-Moore

kmp: Knuth-Pratt-Morris

--from offset 开始偏移

--to offset 结束偏移

[!] --string pattern 要检测的字符串模式

[!] --hex-string pattern要检测字符串模式, 16进制格式

5、 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...] 星期几, 1 – 7 分别表示星期一到星期日

6、 connlimit扩展

根据每客户端IP做并发连接数数量匹配,可防止CC(Challenge Collapsar挑战黑洞)攻击:

--connlimit-upto #:连接的数量小于等于#时匹配

--connlimit-above #:连接的数量大于#时匹配

通常分别与默认的拒绝或允许策略配合使用

7、 limit扩展

基于收发报文的速率做匹配,令牌桶过滤器:

--limit #[/second|/minute|/hour|/day]

--limit-burst number

8、 state扩展

根据”连接追踪机制“去检查连接的状态,较耗资源,conntrack机制:追踪本机上的请求和响应之间的关系。状态有如下几种:

NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一 次发出的请求

ESTABLISHED: NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的 通信状态

RELATED:新发起的但与已有连接相关联的连接,如: ftp协议中的数据连接与命令连接之间 的关系

INVALID:无效的连接,如flag标记不正确

UNTRACKED:未进行追踪的连接,如raw表中关闭追踪

[!] --state state

/proc/net/nf_conntrack 已经追踪到的并记录下来的连接信息库

/proc/sys/net/nf_conntrack_max 调整连接追踪功能所能够容纳的最大连接数量

/proc/sys/net/netfilter/ 不同的协议的连接追踪时长

注意: CentOS7 需要加载模块: modprobe nf_conntrack

Target:

ACCEPT,DROP,REJECT,RETURN,LOG,SNAT,DNAT,REDIRECT,MASQUERADE...

LOG:非中断target,本身不拒绝和允许,放在拒绝和允许规则前,并将日志记录在/var/log/messages系统日志中

--log-level level 级别: debug, info, notice, warning, error, crit,alert,emerg

--log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符


示例:

增加一条允许进入,源地址为172.16.0.0的网段,访问目标地址172.16.0.67,目的端口为22的策略:

iptables -I INPUT -s 172.16.0.0/16 -d 172.16.0.67 -p tcp --dport 22 -j ACCEPT

增加一条允许出口,源地址为172.16.0.67的,源端口为22,访问目标地址为172.16.0.0的网段的策略:

iptables -I OUTPUT -s 172.16.0.67 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT

拒绝从网卡ens33进入:

iptables -A INPUT -i ens33 -j REJECT

拒绝从网卡ens33出去:

iptables -A OUTPUT -o ens33 -j REJECT

允许到目标地址为172.16.0.67,且端口为137,138的数据流进入:

iptables -I INPUT -d 172.16.0.67 -p udp --dport 137:138 -j ACCEPT

允许到目标地址为172.16.0.67,且端口为22,80,139,445的数据流进入:

iptables -R INPUT 2 -d 172.16.0.67 -p tcp -m multiport --dports 22,80,139,445 -j ACCEPT

允许源地址为172.16.0.60-172.16.0.70之间的IP数据流进入目标地址为172.16.0.67,且端口为23:

iptables -I INPUT 3 -d 172.16.0.67 -p tcp --dport 23 -m iprange --src-rang 172.16.0.60-172.16.0.70 -j ACCEPT

允许源地址为172.16.0.60-172.16.0.70之间的IP,并且时间为周一到周五的早上10点到下午4点的数据流进入目标地址为172.16.0.67,且端口为23:

iptables -R INPUT 3 -d 172.16.0.67 -p tcp --dport 23 -m iprange --src-rang 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 -j ACCEPT

拒绝源地址为172.16.0.67的IP,带有字符串 gay 的数据流出去:

iptables -I OUTPUT -s 172.16.0.67 -m string --algo kmp --string "gay" -j REJECT

允许源地址为172.16.0.0的网段进入目标地址为172.16.0.67,端口为3306的数据流进入,同时限制进入的每个IP的并发连接数为2个:

iptables -R INPUT 2 -d 172.16.0.67 -s 172.16.0.0/16 -p tcp --dport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT

允许连接状态为ESTABLISHED,RELATED的数据流访问目标为172.16.0.67:

iptables -R INPUT 1 -d 172.16.0.67 -m state --state ESTABLISHED,RELATED -j ACCEPT

允许连接状态NEW的数据流访问目标为172.16.0.67,端口为23,并且在日志里增加access telnet前缀信息:

iptables -I INPUT 3 -d 172.16.0.67 -p tcp --dport 23 -m state --state NEW -j LOG --log-prefix "access telnet"