文章结构

一、简单介绍

二、场景设定

三、方案部署

3.1 云有部分

3.1.1 免费服务

3.1.2 数据同步

3.1.3 负载均衡

3.1.4 运维审计

3.1.5 数据分析

3.1.6 网站防护

3.2 私有部署

3.2.1 虚拟化

3.2.2 扫描工具

3.2.3 检测系统

3.2.4 常见服务

3.2.5 防火墙

3.2.6 其他

四、结束语

五、参考资料

一、简单介绍

一如既往的拖延,终于要领毕业证了,少不了一份毕业设计。本着不负责、不科学、不严谨的态度写了此文,讲解如何用低成本(其实就是开源+薅羊毛+虚拟化)打造一个小型企业网络。我一直都是在乙方工作,所以本文将从伪甲方的角度讲述一个企业网的信息安全保障替代方案,方案整体的可用性、兼容性、规范性和安全性问题有待各位读者斧正!世界充满了对抗与妥协,便利和安全、攻击与防御各种各样的博弈。

二、场景设定

  • 经营旅游业的初创公司
  • 依靠为用户安排酒店、交通、导游等方式营利
  • 2个网站,用于门户业务和社区讨论
  • 约30位员工,负责管理、业务和开发

三、方案部署

图一

画的有点丑,左侧是云服务区域,右侧是本地IDC区域,云区域的基础通信已经不用使用者过多的干预。按照场景设定,我们用到云端的业务只有2个网站,除了架设 Web 服务,还有 VPN 通信、告警管理、数据备份的需求。

首先用于和本地 IDC 机房通信的云主机需要较低延迟并且稳定,我们采用普通的 VPN 隧道进行数据传输,这种方法虽然比较容易受到公网的网络质量和主机性能的限制,但是这种方法比开通云服务商的高速通道或者专线服务要便宜的多。其次我们还要在跨越云主机所在的物理区域再建设一个备份的云环境。最后云端上少不了的就是各种云防护的部署,文章后面再讲解。所以 Cloud A 中最少一台主机,负责部署 VPN 、CDN、网站的负载均衡。Cloud B 中最少两台 Web 服务器负责运行门户业务网站和社区讨论网站。Cloud C 中最少两台主机实现容灾备份,起码在 Cloud A 或者 Cloud B 的某个业务停止的情况下,可以手工切换的接替工作。不同的主机之间的访问策略需要配置好,毕竟策略不花钱还能提升安全防御能力,何乐而不为?

图二

上图从汇聚和接入层开始说起吧。先初定需要对四种区域的有线网络进行划分,小型企业的整个拓扑里面买3个24口的交换机应该绰绰有余,菊厂支持VLAN的24口全新百兆交换机在某宝只要160元。基于vlan的特性,可以人为的使任意一种的网络无法与其他三种网络进行二层通信。

接着谈谈核心层,如果对上述vlan的特性没有要求,那么拓扑中的路由器和出口网关可以由一台防火墙代替,只要这一台核心防火墙的性能能满足网络的需求即可,毕竟路由器得花钱,防火墙我们可以用开源的产品解决。拓扑图里面有三种颜色的出口,最省钱的办法就是只办理普通的电信百兆光纤,把它接到出口就行了。出口二和出口三是可选项,担心本地与云端有频繁的数据交互预留的通道,比如数据库服务器在本地架设的话需要公网静态IP。混合云能实现生产数据放在本地机房,其余组件放在云端,这样既发挥了云端的特性又保证了数据的所有权。常见的大型的云服务商有提供专线连接到云主机上,或者需要额外增加其他网络运营商时,就可以用这两个预留出口。

最后还有无线网络覆盖,无线的便捷性与安全性是一对矛盾。家用级的无线路由器能支持准入控制功能并不多,在某保的千兆双频带认证的无线路由器189元。如果觉得想要更加符合自己口味的无线路由器,可以试试购买 Raspberry Pi 主模块和拓展模块,安装上 Openwrt 来实现需求。下图带有绿色图标的项会在本文中实际部署一次,其余仅粗略描述。

图三

3.1 云有部分

3.1.1 免费服务

如何获取云服务?中国互联网模式的发展让不少中国人享受到了免费杀毒、免费音乐、免费出行等等,许多企业希望用免费服务来换得人口红利。随着弹性计算技术的发展,也让国内外许多厂家纷纷给了优惠甚至免费的服务,从国内的 BATJ 四大巨头到海外的微软、谷歌和亚马逊等大厂希望能在激烈的市场中分一杯羹,所以想不花钱拿下几台服务器短期内使用还是可以的。

阿里云推出校园扶持计划和云翼计划。

腾讯云+校园扶持计划,助你变身云计算达人,扶持在校学生自主创业。

我们提供 $300 美元的免費試用額度,方便您開始使用 Google Cloud Platform 產品。

AWS 为客户提供了多种产品与服务的免费套餐,可以在注册账户之后免费试用12个月,以帮助客户获得 AWS 的实际操作经验。

创建 Microsoft Azure 免费帐户时获得$100 额度。仅面向学生。无需信用卡,并可获得12 个月的免费 Azure 服务。

如何获取解析与抗DDOS服务?近期 Cloudfare 发布了一个容易记且支持 dns-over-https 的 DNS 服务。之前 Cloudfare 还宣称能为用户提供无限制流量防御 DDOS 保护,CloudFlare 的免费版套餐只能使用 NS 方式,但也有思路实现支持 CNAME 解析并且支持SSL,所以场景设定的网站有需求的时候可以考虑使用 Cloudfare 的服务。

最后少不了 SSL 给你添加一丝安全感。今年的3月份,Let’s encrypt 通配符域名免费证书可以签发了,目前仅支持 DNS 的方式,除了上面的 Cloudfare 之外,还支持CloudXNS、DNSpod。Let’s encrypt 的证书授权使用是有时间限制的,常见的做法可以执行 python 脚本实现自动到期更新,有了证书之后你应该抛弃全部的 http 连接。

3.1.2 数据同步

数据同步可以做为数据备份的一个方法,而数据的备份又分为:

全量备份:每次一都备份全部文件,数量最大,备份时长久,备份数据里面都是重复的内容,但是恢复最方便最节省时间;

差异备份:差异备份是针对全量备份,它负责在全量备份到进行差异备份这段时间,备份上次全量备份之后发生变化的文件。恢复数据只需要第一次全量备份的磁盘和最后一次差异备份的磁盘即可恢复数据,节省了磁盘空间的同时,还提高了备份数据、恢复数据的效率。

增量备份:针对上一次的备份进行对比,只备份发生变化的文件(增加或修改的文件)。增量备份第一次是全量备份,第二次开始便是只备份第一次备份数据中被修改的部分,如此类推。因此增量备份的备份数据里面不包含重复数据,数量最小,备份时间快,但是如果进行数据恢复要从全量数据开始按照时间顺序开始每个反推恢复,这导致需要漫长的恢复时间。如果其中一份增量数据损坏或丢失,容易导致数据恢复失败。

按照数据量和恢复速度来说就是:全量备份 (恢复方便) > 差异备份(恢复头和尾)> 增量备份(恢复较慢)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

#!/bin/bash
#备份/etc文件夹
ntpdate asia.pool.ntp.org &>/dev/null
date=$(date +%y%m%d)
size=$(du -sh /etc)
if [ -d /tmp/etc_backup ]
then
echo "Date: $date" > /tmp/etc_backup/info.txt
echo "size: $size" >> /tmp/etc_backup/info.txt
cd /tmp/etc_backup
tar -zcf etc_bak$date.tar.gz /etc info.txt &>/dev/null
else
mkdir /tmp/etc_backup
echo "Date: $date" > /tmp/etc_backup/info.txt
echo "size: $size" >> /tmp/etc_backup/info.txt
cd /tmp/etc_backup
tar -zcf etc_bak$date.tar.gz /etc info.txt &>/dev/null
fi

利用 Centos 自带的 crond 服务定期执行上述脚本,就可以达到定期备份 /etc 目录的功能。但是这种方式存在一定的弊端,如当备份的数据量比较大的时候,备份一次的周期时间长、耗费性能资源高、且仅能做到全量备份。其实对少量数据备份的情况,我们有 scp 命令、dd 命令、ftp 服务、samba 服务也可以满足需求,如果数据量比较大且对实时性的要求较高,那么就有 rsync 服务来完成。rsync 具备特殊的算法,可以识别文件是否存在变化,它在同步数据的时候采用增量备份的方式,仅同步发生变化的数据。rsync服务具备 ssh 同步和 rsync 同步两种模式。ssh 同步采用系统 ssh 用户模式同步,而 rsync 同步采用虚拟用户模式同步,类似 vsftpd 服务中建立虚拟用户和密码,不同的是vsftpd调用的是本地 ftp 用户,rsync调用本地 nobody 用户。ssh 同步方式可以采用密钥认证达到免密码输入,rsync 同步方式可以采用RSYNC_PASSWORD 变量赋值达到免密码输入的效果。下面是我的部署实例:

主机A,192.168.150.134,负责存储实时备份远程主机的数据;

主机B,192.168.150.200,日常生产环境的主机,具备重要数据;

  1. 主机A上安装rsync服务
1
2
> yum -y install rsyncd
>
  1. rsync同步方式:

    2.1 主机A创建/data/node1文件夹

    2.2 主机A配置/etc/rsyncd.conf

address = 192.168.150.134
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log

[node1]
path = /data/node1
read only = no //如果为YES,无法使用上传,即push模式。
list = no
auth users = h0u5er
secrets file = /etc/rsyncd_user.db

​ 2.3 主机A配置/etc/rsyncd_user.db,改修改文件为600权限且所有者所属组为root

1
2
> h0u5er:123456
>

​ 2.4 主机B创建/data/node2文件夹,配置变量 export RSYNC_PASSWORD=123456

​ 2.5 由于调用nobody用户,所有修改主机A中/data/node1文件的权限

1
2
> 	setfacl -m u:nobody:rwx /data/node1/
>

​ 2.6 测试将主机B/data/node2中的文件同步到主机A的/data/node1

1
2
3
4
5
6
7
> [root@localhost node2]# rsync -avz /data/node2/* rsync://h0u5er@192.168.150.134/node1
> sending incremental file list
> 1.txt
>
> sent 62 bytes received 27 bytes 35.60 bytes/sec
> total size is 0 speedup is 0.00
>

​ 2.7 还可以执行下面的语句,效果与2.6的一样,注意是两个冒号

1
2
3
4
5
6
> [root@localhost node2]# rsync -avz /data/node2/* h0u5er@192.168.150.134::node1
> sending incremental file list
>
> sent 26 bytes received 8 bytes 13.60 bytes/sec
> total size is 0 speedup is 0.00
>

​ 2.8 上述两种语法中,源路径和目的路径可以交换位置,分别就是上行同步模式PULL和下行同步模式PUSH

  1. ssh同步方式:

3.1 结合实际业务需求,我们分别在两台主机生成密钥,并执行 ssh-copy-id ,达到双方ssh互访均无密码。

3.2 利用ssh将主机B中/data/node2/的数据同步到主机A

1
2
3
4
5
6
7
8
9
10
11
12
13
> [root@localhost node2]# rsync -avz /data/node2/ root@192.168.150.134:/data/node1
>
> sending incremental file list
>
> ./
>
> 1.txt
>
> sent 79 bytes received 34 bytes 226.00 bytes/sec
>
> total size is 0 speedup is 0.00
>
>

​ 3.3 上述语法中,源路径和目的路径可以交换位置,分别就是上行同步模式PULL和下行同步模式PUSH。

1
2
3
4
5
6
7
8
9
10
11
12
13
> 先在主机A中创建一个新的文件2.txt,然后执行:
>
> [root@localhost node2]# rsync -avz root@192.168.150.134:/data/node1/* /data/node2/
>
> receiving incremental file list
>
> 2.txt
>
> sent 30 bytes received 71 bytes 202.00 bytes/sec
>
> total size is 0 speedup is 0.00
>
>

直到上述,rsync 服务已经搭建完成,但 rsync 自身不具备实时同步的能力,下面利用 inotify 组件监控主机B的文件是否有变化,当出现变化时就执行 rsync 同步从而实现实时备份效果,如果需要实现双向同时备份效果,可以参考 unsion 组件的配和使用。

​ 4.1 在主机B上安装 wget 和 gcc 编译器

​ 4.2 在主机B上安装 inotify 组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
> wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
>
> tar -zxvf inotify-tools-3.14.tar.gz
>
> cd inotify-tools-3.14/
>
> yum -y install gcc
>
> ./configure && make && make install
>
> [root@localhost inotify-tools-3.14]# inotifywa,按下tab键,返回:
>
> inotifywait,该指令用于长期监控,实时输出结果
>
> inotifywatch ,该指令用于短期监控,任务完成之后输出结果
>
>

​ 4.3 使用 -mqme 参数,测试 inotifywait 指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
> [root@localhost inotify-tools-3.14]# inotifywait -mrq -e modify,delete,create,move /data/node2/
>
> 打开新终端窗口,对目录下的文件做读写等操作,原先的终端则会出现下面的信息
>
> /data/node2/ CREATE .2.txt.swp
>
> /data/node2/ CREATE .2.txt.swx
>
> /data/node2/ DELETE .2.txt.swx
>
> /data/node2/ DELETE .2.txt.swp
>
> /data/node2/ CREATE .2.txt.swp
>
> /data/node2/ MODIFY .2.txt.swp
>
> /data/node2/ MODIFY .2.txt.swp
>
> /data/node2/ DELETE .2.txt.swp
>
> /data/node2/ MODIFY 2.txt
>
> /data/node2/ MOVED_FROM 2.txt
>
> /data/node2/ MOVED_TO 2222.txt
>
>

​ 4.4 通过 ACL 策略修改 nobody 用户对主机A/data/node1 的权限,而且检查/etc/rsyncd.conf 中的 read only 是否为no

[root@localhost node1]# getfacl /data/node1/
getfacl: Removing leading ‘/‘ from absolute path names

file: data/node1/
owner: root
group: root
user::rwx
user:nobody:rwx
group::r-x
mask::rwx
other::r-x

  1. 5编写脚本,监控目录变化触发 rsync 服务
1
2
3
4
5
6
7
8
9
[root@localhost ~]# cat rsync.sh 
#!/bin/bash
trigger="/usr/local/bin/inotifywait -mrq -e modify,delete,create,move /data/node2/"
action="/usr/bin/rsync -avz /data/node2/* h0u5er@192.168.150.134::node1"

$trigger | while read file
do
$action
done

效果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@localhost ~]# ./rsync.sh &
[1] 11270
[root@localhost ~]# cd /data/node2/
[root@localhost node2]# ls
1.txt
[root@localhost node2]# echo i am h0u5er > 1.txt
[root@localhost node2]# sending incremental file list
1.txt

sent 78 bytes received 27 bytes 42.00 bytes/sec
total size is 12 speedup is 0.11

[root@localhost node2]# touch 2.txt
[root@localhost node2]# sending incremental file list
2.txt

sent 76 bytes received 33 bytes 43.60 bytes/sec
total size is 12 speedup is 0.11

[root@localhost node2]# mv 2.txt 3.txt
[root@localhost node2]# sending incremental file list
3.txt

sent 76 bytes received 27 bytes 41.20 bytes/sec
total size is 12 speedup is 0.12

[root@localhost node2]# sending incremental file list

sent 40 bytes received 8 bytes 19.20 bytes/sec
total size is 12 speedup is 0.25

[root@localhost node2]#

3.1.3 负载均衡

负载均衡对于运维人员来说是一门大学问,它可分为二层、三层、四层、七层的负载均衡,常见会在四层和七层做负载,两者的技术原理不一样。本次设计的的负载均衡只要是指七层的,

四层是基于 IP+端口的实现负载,只有一个用户到服务器之间的独立 TCP 连接建立。在三层的基础上加上端口记录的 NAT 转发,转发流量时记录 TCP 或 UDP 的流量是哪一台服务器进行处理 ,后续的连接流量仍然会将数据转发到同一台服务器进行处理。但四层的负载不支持 http、mysql、ftp 这样的协议。常见的的做四层负载的方案有:部署类似 F5 的硬件负载均衡产品,钱花了效果也出来了;部署重量级 的 lvs 或者轻量级的 Nginx 负载均衡软件,也可以试试 haproxy 做四层的负载。

七层基于虚拟 url 或者主机 IP 实现负载,它可以根据浏览器类别、系统语言、URL、端口等等进行规则匹配从而执行负载策略,可以通过 apache、Nginx、Lighttpd 等软件实现负载。七层负载均衡会建立两个独立的 TCP 连接,分别是用户到负载均衡和负载均衡到服务器,基于这个特点,七层的负载能防御类似 SYN Flood 的 Denial of Service 攻击,而且可以很好的隐藏服务器真实地址,当然也能实现过滤 SQL Injection 语句、HTTP 协议优化与加速等功能。

讲到七层协议就离不开 HTTP 协议和网站服务器的架构,架构发展史的故事请看知乎答主xlzd的回答,下面我们就按照 Keepalived 和 Nginx 配合使用实现负载均衡和高可用。

server Apache Nginx Lighttpd
Proxy代理 非常好 非常好 一般
Rewriter 非常好 一般
Fcgi 不好 非常好
热部署 不支持 支持 不支持
系统压力比较 很大 很小 比较小
稳定性 非常好 不好
安全性 一般 一般
静态文件处理 一般 非常好
反向代理 一般 非常好 一般

Keepalived 是 Linux 下面实现 VRRP 备份路由的高可靠性运行件。基于 Keepalived 设计的服务模式能够真正做到主服务器和备份服务器故障时 IP 瞬间无缝交接。假设你家唯一的路由器出现问题了,是不是就没办法上网了?VRRP 路由协议就是解决这样的问题:将若干个路由器视为一个整体提供路由功能,并且引入虚拟 IP 的概念,抢占到这个虚拟 IP 路由器就是 master,处于正常工作状态,其他都是 slave ,处于待命状态,当 master 出现问题的时候就会在 slave 中选举一个新的 master 接替工作,选举制度和优先级什么的都可以利用 VRRP 路由协议实现。Keepalived 也是类似的工作原理,它包括负责主进程启动、维护进程和全局配置文件加载的 core 模块、负责健康检查的 check 模块、负责 VRRP 协议的 vrrp 模块。

Nginx 就不多说了,第一步先到官方拿 yum 源安装 Nginx 和 Keepalived,接着安装编译工具和库文件,通过这种方法安装的话系统会多一个 Nginx 用户。

1
[root@localhost ~]#  yum -y install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel

参考官方提供的负载均衡 upstream 模块,选择 ip_hash ,它是基于客户端IP地址完成请求的分发,它可以保证来自于同一个客户端的请求始终被转发至同一个 upstream 服务器,每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题 。默认配置是使用 round robin 负载均衡模块,这种是每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 了,能自动剔除。接下来,开始配置 keepalived 服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
[root@localhost ~]# yum -y install keepalived
[root@localhost ~]# keepalived -v
Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2

[root@localhost ~]# cat /etc/keepalived/keepalived.conf 以master主机为例子,slave中的部分配置不一样
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" //这里会调用一个监控nginx状态的脚本
interval 2 //检测的时间间隔 2s
weight -20 //如果脚本的条件成立,权重-20
}
vrrp_instance VI_1 {
state MASTER //服务状态,MASTER(工作状态)BACKUP(备用状态)
interface ens33
mcast_src_ip 192.160.150.138 //本机IP地址
nopreempt //优先级高的设置,解决异常回复后再次抢占的问题
virtual_router_id 51 //虚拟路由ID,主、备节点必须一致
priority 100 //优先级;取值范围:0~254;MASTER > BACKUP 即可,这里另一台备机配置为 90
advert_int 1 //组播信息发送间隔,主、备节点必须一致,默认1s
authentication {
auth_type PASS //VRRP验证类型,PASS、AH两种
auth_pass 1111 //VRRP验证密码,在同一个vrrp_instance下,主从必须使用相同的密码
}
}
track_script { //将track_script块加入instance配置块
chk_nginx
}
virtual_ipaddress { //虚拟IP池,主备节点必须一致,可以定义多个虚拟IP
192.168.150.201
}
}

[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}

vrrp_instance VI_1 {
state BACKUP
interface ens33
mcast_src_ip 192.160.150.139
nopreempt
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.150.201
}
}

[root@localhost ~]# cat /etc/keepalived/nginx_check.sh //用于监控nginx的脚本
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi

上图是部署完毕之后的测试效果,使用虚拟 IP 可以直接访问主节点服务器,讲到这里我们低成本的思路就呼之欲出了,那就是普通情况下,我们的主备机器都能承载业务。分担服务器的压力,两台主备服务器还可以使用上面的 rsync 同步数据。当其中一台机器出现故障时候,根据 VRRP 协议能自动切换。如果实在是没有两台主备机器的资源,那 ngxin 和其他主 Web 服务一样支持虚拟主机功能,即一台主机可以运行场景设定中的业务和社区两个的独立网站,但还是不推荐把鸡蛋都放在一个篮子里。

关于 keepalived 的效果可以用浏览器或使用 ip add 命令验证下面两种情况:

  • 关闭 192.168.150.138 (主)节点的 nginx01 服务,keepalived 会自动重启 nginx 服务;

  • 关闭 192.168.150.138 (主)节点的 keepalived 服务,虚拟 IP 会漂移到 nginx02 (备) 节点 ;

3.1.4 运维审计

巡风是一款适用于企业内网的漏洞快速应急,巡航扫描系统。我喜欢拿巡风处理资产管理管理,巡风的开发者们友好的为懒癌用户提供安装脚本,并且全方位的支持Windows、Linux、docker和 OSX 系统。后文介绍的 IDS 系统同样也是由同程安全应急响应中心开源。

点击查看巡风演示视频

Jumpserver是全球首款完全开源的堡垒机,是符合 4A 的专业运维审计系统。

最开始的堡垒机仅仅具备跳板的功能,并没有办法实现审计和控制的功能。现在的堡垒机是一种运维安全审计系统,而且具备比较高的权限,运维人员必须通过授权账号登录堡垒机才能管理后端的设备,所以配置堡垒机的时候要考虑单点故障的问题。JumpServer 的 UI 设计非常清爽,他的功能很适合我们一开始设定的场景和拓扑结构,而且终于支持Windows RDP,使用的时候我们先在企业内网(可选择用加密连接)登陆部署在云端的堡垒机,堡垒机通过云端内部网络IP管理其他设备,所以云端的内网通信需要配置放行策略。它的具体安装步骤请移步官方ReadMe.md或者图解说明

3.1.5 数据分析

安全审计作为信息安全工作必不可少的一环。文章“ELK的快速部署”便是博主在 ESXI 6.5 的虚拟化环境完成测试的。整机配置为单核 Intel E5-2620v3,12GB RAM,1TB 7200转机械硬盘;测试环境的拓扑关系如下:

IP Hostname Packets
192.168.1.201 host01 elasticsearch-6.0.0.zip、logstash-6.0.0.zip、kibana-6.0.0-linux-x86_64.tar.gz、jdk-8u144-linux-x64.rpm
192.168.1.204 host04 filebeat-6.0.0-linux-x86_64.tar.gz、nginx-1.12.2-1.el7_4.ngx.x86_64

实验过程仅采用本站的web日志文件做测试,具体 EPS 均值尚未计算,基本功能是可用的。如果具备更好的硬件生产资源的话,可以把 ELK 升级为 Flume+Kafka+ Elasticsearch+Storm 这样的方案,使得架构具有良好的实时性、容错性和拓展性,而且这些组件都是开源使用。也有人利用 splunk 结合蜜罐系统与防火墙 API 接口做成一个 WAF,可进行邮件告警。

3.1.6 网站防护

实习的时候,同事安利了一个免费版政府网站综合防护系统,免费版支持简单的服务器检查和网站检查,免费版申请的手续比较麻烦,需要绑定微信+手机号码,似乎相关部门还能通过代理看到你的网站情况。同样的免费版产品还有安全狗360网站卫士,毕竟天下没有免费的午餐,免费产品的取舍就要各位自己的斟酌了。

3.2 私有部署

3.2.1 虚拟化

云端的主机问题解决了,那么看看 IDC 机房的主机问题,这一部分避免不了花钱购买一些服务器,利用虚拟化技术我们可以提高单台服务器 CPU 的使用率,据说能省一点电费。这里采用的是ESXI,先到官方下载合适ISO镜像(我的Chrome每次打开官网都有问题),然后使用软碟通制做USB启动盘后,利用U盘给服务器安装虚拟化程序。安装操作就不叙述了。我试过遇到安装失败的问题,原因是镜像内没有合适该服务器网卡的驱动包。安装完毕之后用web端或者vSphere client端登录并管理,需要提醒各位的是:ESXI免费版与付费版是有区别的。

ESXi 免费版的限制包括:

  1. 无法使用 vCenter Serve 管理平台;
  2. 最多支持2个CPU的主机;
  3. 虚拟的主机最大支持8个CPU;
  4. 没有 VMware 的售后支援服务;

3.2.2 扫描工具

作为一个资深伸手党的脚本小子,扫描工具要多少有多少少,有好有坏,丰俭由君。首先老牌的 Nessus Home 版本是免费使用,但是不可避免有一些功能上的限制。官网的数据展示 Nessus Evaluation 版本每台主机只能扫描16个内网IP地址。其次也限制了扫描计划、配置检查、相关合规检查等功能。

Tenable permits you to use Nessus to scan third-party networks, but you must use a licensed version of the product. Nessus Home cannot be used for consulting commercially。

进入官网简单填写资料获取 Activation Code,然后结合实际情况选择需要下载的版本,我就选择 Nessus-7.0.2-es5.x86_64.rpm 下载,尽量避免发生运维环境里面充斥着 Centos+debian+ubuntu+suse+windows 的多系统情况。下面使用Centos7进入安装步骤。

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >  [root@localhost Downloads]# **rpm -ivh Nessus-7.0.2-es5.x86_64.rpm** 
    > 警告:Nessus-7.0.2-es5.x86_64.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID edc8e186: NOKEY
    > 准备中... ################################# [100%]
    > 正在升级/安装...
    > 1:Nessus-7.0.2-es5 ################################# [100%]
    > Unpacking Nessus Core Components...
    >
    > - You can start Nessus by typing /sbin/service nessusd start
    >
    > - Then go to https://localhost.localdomain:8834/ to configure your scanner
    >
1
2
3
4
5
6
>  
> [root@localhost Downloads]# **/sbin/service nessusd start**
>
> Starting nessusd (via systemctl): [ 确定 ]
> [root@localhost Downloads]# **/sbin/service nessusd start
>
1
2
>  
>
1
2
>  
>

按照指示用浏览器打开页面,配置账号与密码分别都是H0u5er,然后提示选择版本和激活码,最后进入initializing初始化阶段。常见的问题应该是插件的更新失败,如果在线更新失败可以考虑离线更新插件或者使用梯子服务,具体办法度娘上有大佬们的解决方案。

此外,利用 Nmap 实现轻量级漏洞扫描功能,不过我感觉这种方便误报率比较大,而且报告不容易分析。为了方便我还是在这一台Centos7上安装 Nmap。接着我们利用 vulscan 检测目标主机的漏洞信息,需要把脚本放到对应的目录内,由于我采用的是 yum 源安装 Nmap,所有对应目录就是/usr/local/share/nmap/script/vulscan。

两个漏洞扫描工具都安装完毕之后,我启动了一台 Windows7 x64 旗舰版 ,Version 6.1.7601 Service Pack 1 作为检测对象,安装了KB4054022、KB4056887、KB4074595、KB4074608、KB4087256、KB4074588合计六个补丁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost vulscan]# nmap -sV --script=vulscan/vulscan.nse 192.168.150.132

Starting Nmap 7.60SVN ( https://nmap.org ) at 2018-03-14 13:36 CST

SERVICE/VERSION DETECTION:

-sV: Probe open ports to determine service/version info

--version-intensity <level>: Set from 0 (light) to 9 (try all probes)

--version-light: Limit to most likely probes (intensity 2)

--version-all: Try every single probe (intensity 9)

--version-trace: Show detailed version scan activity (for debugging)

Nmap 扫描的部分结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> | [101018] Windows SharePoint Services detection
> | [101017] Microsoft MS03-018 security check
> | [101016] Microsoft MS03-022 security check
> | [101015] Microsoft MS03-034 security check
> | [101014] Microsoft MS00-078 security check
> | [101012] Microsoft MS03-051 security check
> | [101010] Microsoft Security Bulletin MS05-004
> | [101009] Microsoft Security Bulletin MS06-033
> | [101007] Microsoft dotNET version grabber
> | [101006] Microsoft Security Bulletin MS06-056
> | [101005] Microsoft Security Bulletin MS07-040
> | [101004] Microsoft MS04-017 security check
> | [101003] Microsoft MS00-058 security check
> | [101000] Microsoft MS00-060 security check
>

同时也简单的使用了 w3af 这款可以针对 owasp top 10 进行扫描的开源工具,效果还是比较满意,尤其是支持 HTML 和 CSV 格式的报告输出。就不继续写了,扫描工具真的太多太多了,安装是使用应该难度不大,管理员应该针对网络的情况定期执行扫描,毕竟漏洞是自己发现的总比别人发现的好。

1
2
3
4
5
6
7
yum install python-pip
yum install libxml2-devel libxslt-devel openssl-devel python-devel
git clone git clone --depth 1 https://github.com/andresriancho/w3af.git
cd w3af
./w3af_console
/tmp/w3af_dependency_install.sh
如果安装lxml有问题 执行 sudo CFLAGS="-O0" pip install lxml 重新安装

3.2.3 检测系统

入侵检测系统,简称 IDS ( Intrusion-detection system ),对应的还有入侵防御系统,简称 IPS (Intrusion Prevention System ),从字面上就能发现 IDS 侧重检测,IPS 侧重防御。我个人的观点认为 IDS 适合像金融机构、医疗行业这样对网络比较敏感的行业,用检测和告警为主要手段而不是直接拦截,这是因为大多数的安全产品都会有误报的概率,不合理的拦截或者防御策略会影响用户体验。另外不是说只有 IDS 就完事了,IPS 也是必须的,许多 IPS 可选关闭防御功能变成IDS 模式,常见的 IDS 都是以旁路部署为主,而 IPS 或 防火墙都是串联到核心交换做流量过滤。结论就是买到一款适合企业的安全产品并不是一件容易的事情,既要清楚自身需求,又要了解到市场目前的解决方案,可能还少不了牺牲一些用户体验。本次设计因为是以低成本为主题,所以我参考了 Snort 、OSSIM 和 yulong-hids,Snort 和 OSSIM 的文章在互联网已经非常丰富,这里就不介绍了。之前安装最新版 OSSIM ,发现普通性能的测试机没办法带的动 OSSIM,同一天看到由 YSRC 开源的主机入侵检测系统的简介,于是乎在谷歌云进行部署,过程中引发 ssh 断连问题,已经提交 issues,所有本次测试是在 vmware 虚拟机中用docker 方式安装,测试环境不推荐以 docker 方式部署。

第一步,安装 docker-compose 和 docker-ce 等环境,版本要求见 YSRC 的 README

[root@localhost ~]# docker-compose –version
docker-compose version 1.21.0, build 5920eb0

第二步,在 Web 页面配置。初始化规则使用默认的 rules.json,先传个 Linux 64位版本 zip 包,下一步生成证书之后重启 docker。

第三步,部署 agent,首先 Linux 64位需要依赖 libpcap 包,安装命令可以直接复制 Web 界面提供的代码

linux-64 : wget -O /tmp/daemon http://192.168.150.140:80/json/download?type=daemon\&system=linux\&platform=64\&action=download;chmod +x /tmp/daemon;/tmp/daemon -install -netloc 192.168.150.140

第四步,自行探索更多功能,主要是规则

3.2.4 常见服务

暂未补充。

3.2.5 防火墙

防火墙有那么几个类型:Packet filtering firewalls 、Stateful inspection firewalls、Application-level gateways、Circuit-level gateways 和Next-gen firewalls 。

包过滤防火墙,它是针对数据包的头部进行策略匹配,然后再根据设计的规则进行下一步操作。包过滤防火墙可以分为无状态包过滤和有状态包过滤两种模式。如果防火墙不记住关于传递数据包的信息,则此类过滤称为无状态的数据包过滤,如果防火墙记住关于以前通过的数据包的信息,则该类型的文件环是有状态的数据包过滤。

If the information about the passing packets is not remembered by the firewall, then this type of filtering is called stateless packet filtering.

If the firewall remembers the information about the previously passed packets, then that type of filering is stateful packet filtering

就无状态包过滤防火墙而言,攻击者可以构造特殊的UDP数据包对防火墙绕过或者欺骗行为,原因就在于无状态包过滤防火墙并不会参考以前的数据包做允许/拒绝的判断。包过滤防火墙主要会检查数据包的一下内容:

  1. 源IP地址;攻击者可以修改数据包的源IP地址来欺骗防火墙,同时攻击者依然能利用伪造的IP映射到自己的IP。
  2. 目标IP地址;防火墙规则应该检查IP地址而不是DNS名称,而且还能防止滥用DNS。
  3. IP协议号;
  4. TCP/UDP端口号;
  5. ICMP信息类型;
  6. Fragmentation字段;
  7. IP选项字段;

关于数据包的封装和解封装的过程,涉及到PDU(协议数据单元)和 ISO 7层模型的知识。每一层使用自己层的协议和别的系统的对应层互相通信,每一层的协议在对等层之间交换的信息叫做PDU。每一层都有自己的PDU,封装就是构建自己那一层的PDU。无状态的包过滤防火墙有一些缺点,比如只能针对网络层和传输层进行防护、过滤规则存储空间有限或者规则冗长导致性能下降、无法对用户身份进行验证、边界限制能力弱、无法应对以TCP响应的形式从外部对内部进行穿透等等。

为什么有些人会把状态检测防火墙与传统包过滤放防火墙独立出来?这要从关键的连接状态表考虑。传统的无状态包过滤防火墙对于信息的处理并没有上下关联的关系,所有会导致下面三点问题:

  1. 当应用需要动态协商网络通信的时候,比如FTP协议使用的时候还临时开启了20端口,如果规则未放行20端口,那么将导致无法建立连接。
  2. 当别人访问无状态包过滤防火墙时,我开放什么端口,或者怎么隔离,这些措施需要管理员配置;
  3. 传统的无状态包过滤防火墙自身对其他网络的访问时,也需要管理员配置放行策略,而且需要知道访问网络的IP与端口情况;

状态检测防火墙,相当于包过滤防火墙的有状态过滤模式,同样工作在网络层和传输层。这种技术就能很好的解决上述的第一条和第二条问题,管理员只需要配置放行的初始对外流量,而不需要关心其他方向的流量流入和流出的情况,即便配置拦截回程的ACL(来回路径一致),防火墙依然会根据查询状态表记录而放行返程流量建立TCP连接。状态检测技术是由安全厂家 Checkpoint 提出的。传统的包过滤防火墙只是通过检测IP包头的相关信息来决定数据流的通过还是拒绝,而状态检测技术采用的是一种基于连接的状态检测机制,将属于同一连接的所有包作为一个整体的数据流看待,构成并维护连接状态表,通过规则表与状态表的共同配合,对表中的各个连接状态因素加以识别。这里动态连接状态表中的记录可以是以前的通信信息,也可以是其他相关应用程序的信息,一个良好的状态检测防火墙应该还具备:良好的日志记录、友好的 GUI 或者语法来支持用户进行规则的配置、合理的规则匹配顺序等等。因此,与传统包过滤防火墙的静态过滤规则表相比,它具有更好的灵活性和安全性。同样它也具备一些缺点:

  1. 如果状态表记录建立过程中,数据的来回路径不一致,可能导致防火墙状态表无法正常建立,导致用户与服务器无法建立连接;
  2. 某些应用或程序,在进行TCP三次握手过程中存在类似SYN没有置位的连接请求。默认情况下的状态检测防火墙是会拒绝请求,阻断用户与服务器建立连接;

应用级防火墙,工作在应用层。它可以完全断绝内网和外网的通讯,通讯的流量变成了防火墙访问外网,防火墙收到响应之后再转发给内外对应的主机。所有通信都必须经应用层代理软件转发(相当于proxy),访问者任何时候都不能与服务器建立直接的 TCP 连接,应用层的协议会话过程必须符合代理的安全策略要求。应用级防火墙具备web cache功能,但是对于目前的网络架构而言意义不大。应用级防火墙还能深度的匹配内容和进行流量清洗。对比普通的防火墙或者核心防火墙,我们更倾向于使用更专业应用级防火墙来深度防护web服务器,譬如WAF,这意味着访问者先访问了WAF建立TCP连接(访问者认为这就是Web服务器的真实地址),然后WAF再与Web服务器进行TCP通信,期间就包括了流量检查和防御的功能。应用级防火墙的缺点非常突出:

  1. 主机都需要通过应用级防火墙转发请求,必然的导致一定的性能压力,需要合理考虑 DMZ 区的应用情况。

  2. 防火墙的单点故障可能应用导致无法连接外网或业务中断;

  3. 应用防火墙可以在网络层、传输层和应用层工作,对配置策略的工作将是一件有难度的事情,不同协议和数据都需要不同的策略,所以管理员需要对应用层的协议和相关安全问题有一定的知识储备;

电路级网关,也叫做线路级网关,工作在会话层。电路级网关提供NAT功能,对外部而言可以很好的保护内部IP地址的情况。目前厂家的电路级网关产品里还会包括:用户接入认证和带宽管理等功能。

Packet filters(stateless) Application Gateway Circuit level Gateway
Simple and least secure Most secure approach More secure than packet filter but not as secure as application gateway.
Many routers provide this functionality Unique program for each application Relay TCP connections
Passes or rejects packets based on rules good for authentication and logging Permission granted by port address
Hard to manage Not always transparent to users No application level checking
Easy to make mistakes Used for email, FTP, TELNET, WWW Can understand what is carried in the packet.

传说中的下一代防火墙,下一代防火墙的概念最早由Palo Alto提出。说是下一代,我的认为它更像是上一代各种技术的融合与优化。在网络使用越多也多、网络拓扑越来越复杂的时代,应用端口号不等于启用应用服务,数据包的IP地址不等于使用者的IP地址,数据内容字段可能不仅仅就是单纯的用户数据。想象一个场景:

你们公司是根据不同楼层和楼层的区域划分了VLAN,但是有一天某部门的办公室装修,需要临时到某个接待室办公一段时间,那么如何保证茶水间的网络只能由运维人员接入,而且访客和其他员工无法接入?

传统的办法就是重新登录到交换机上做VLAN划分并且实行MAC地址绑定,判断访客的无线接入到特定的隔离区域。如果公司的接入控制策略是在下一代防火墙进行控制的话,那么就无需担心上述的问题,因为用户的识别不用再跟着网段走,而且精确到用户的上网认证账号或者MAC信息,而应用的识别还可以精细到应用的某个功能,比如只允许QQ发送消息和图片而不能传输文件,把控制和分析粒度更加细化。

实习的第一天,老板就领着我参加了某安全厂家的产品分享会,里面就讲到了下一代防火墙。这里不得不提出现在下一代防火墙之前的 UTM 时代。最传统的安全拓扑结构,是流量经过出口网关,再经过防火墙,再经过反病毒,再经过IPS/IDS,如此串行的部署关系,思科称之为“深度防御”,即便你绕过了我的防火墙,后面还有各种安全设备继续防御。而 UTM (统一威胁防控)的思路就是把所有的安全功能模块融为一体,同一个硬件设备中内置防火墙、入侵检测、反病毒、负载均衡等功能,用户可以按需打开并配置对应的功能即可,极大简化了拓扑并且增强综合防御能力。听起来是不错,但是有一个巨大的坑,过多的功能极大的拖慢了 UTM 的性能,因为 UTM 处理数据包是流程是这样的:

  1. 数据流入安全模块A,解包检查,匹配规则,完成检查(假如正常),封包转发到下一个模块;
  2. 数据流入安全模块B,解包检查,匹配规则,完成检查(假如正常),封包转发到下一个模块;
  3. 数据流入安全模块C,解包检查,匹配规则,完成检查(假如正常),封包转发到下一个模块;
  4. 同上循环。
  5. 完成全部开启模块检查,放行数据进入下一跳网络;

那么下一代防火墙处理数据的流程就变成了:

  1. 数据流入下一代防火墙,按照规定的统一格式进行解包
  2. 各个功能模块按自己的设定,并发检查,匹配规则;
  3. 全部检查完毕正常的话,放行数据进入下一跳;

瞬间简化了处理流程,所以性能嗖一下就上去了,安全策略也不再是独立存在某个模块中。无论是 UTM 还是下一代防火墙都会使用到状态检测包过滤的技术,现在核心防火墙的吞吐和转发能力,足以媲美甚至超越核心交换机。核心交换机的控制不能精细到应用吧,不能自主的学习各种协议吧,不能根据数据内容做决策吧,不能基于用户做负载均衡吧,因此下一代防火墙顺其自然成为了目前市场的主流产品之一。下一代防火墙处理的数据涉及到IPS、IDS、AV、FW、用户识别、内容识别、负载均衡等等领域的知识,如果厂家的基本功不到位的话,极有可能就直接 OEM 了,所以也导致了市面上的安全产品质量参差不齐,比如 A 厂家和 B 厂家都是照搬 C 厂家提供的特征库。

下面开始配置呼声最高的 pfSense ,过程中遇到了一个坑,在虚拟机环境下,WAN和LAN的自动识别好像出了问题,LAN一直识别成NAT模式的网卡,而WAN识别成了VMnet2的网卡。我差点给气死了,后面重新安装镜像,网卡配置如下图,最后通过assign interfaces选项,终于把WAN配置为自动获取nat网卡的dhcp,LAN配置为手工地址192.168.2.254,并且配置DHCP服务分配200-250的主机号。phSense还支持修改https登录,防火墙性能限制等功能,最核心的还是可以自己写访问控制策略。

3.2.6 其他

暂未补充。

四、结束语

难为你们看完了这一份没有含金量的文章,历时一个月的编写过程,收获非常多东西,也看到了自己的不足。非常感谢过程中各位的老师、朋友、网友的指导,在阅读过程发现有任何问题,欢迎一起探讨。最后祝各位信息安全圈子的大佬们工作顺利,永不宕机!

五、参考资料

安全产品替代方案 http://www.freebuf.com/sectool/157699.html

防火墙分类 http://searchsecurity.techtarget.com/feature/The-five-different-types-of-firewalls

防火墙分类 http://www.excitingip.com/205/what-are-packet-filtering-circuit-level-application-level-and-stateful-multilayer-inspection-firewalls/

下一代防火墙选购 http://www.freebuf.com/articles/network/155560.html

Centos Firewalld 配置 https://www.linode.com/docs/security/firewalls/introduction-to-firewalld-on-centos/

W3AF 入门指南 https://www.jianshu.com/p/ab692142d275

同程开源驭龙 https://github.com/ysrc/yulong-hids/blob/master/docs/install.md

执行命令监控驱动实现解析 http://mp.weixin.qq.com/s/ntE5FNM8UaXQFC5l4iKUUw

ES 5.0 排错指南 https://blog.csdn.net/qq942477618/article/details/53414983

ELK的拓展和测试方案 https://github.com/chenryn/ELKstack-guide-cn/blob/master/elasticsearch/testing.md

25K/EPS的ELK https://engineering.viki.com/blog/2015/log-processing-at-scale-elk-cluster-at-25k-events-per-second/