在部署开源web代理和QRadar SIEM之后,我们继续探索使用免费的产品建立小型企业的基础安全架构。这篇文章记录在VMware虚拟机上安装FortiGate防火墙永久使用版,并且在防火墙后设置一个拥有简单访问控制的虚拟局域网。网络的拓扑结构如下图。
FortiGate安装
在FortiNet官网注册账号后,选择Support => Downloads => VM Images下载虚拟机镜像。注意是FortiGate的New Development,不要选成FortiFirewall,这是两个不同的产品。
解压缩之后导入VMware,使用默认配置(免费版最多只能允许1个CPU和2GB内存),首次开机FortiGate自动安装。
安装过程中系统会重启几次,安装完成后命令行输入admin
用户名登录,密码留空直接按回车,首次登录会强制要求改密码。逐行执行下面的命令,给FortiGate设置固定IP并且启用web管理端。
config system interface edit port1 set mode static set ip 192.168.31.240 255.255.255.0 set allowaccess http https end
然后让所有FortiGate的出站流量通过192.168.31.1
网关(路由器)连接到外网。
config router static edit 1 set gateway 192.168.31.1 set device port1 set dst 0.0.0.0/0 end
此时需要联网激活FortiGate的永久试用授权。回到命令行,通过以下命令设置Fortinet的账号密码并安装授权。
execute vm-license-options account-id ******@cs.hku.hk execute vm-license-options account-password ******** execute vm-license
如果这里提示DNS error
,则大概率是网关设置有误,请检查路由器的设定。激活成功后设置NTP对时:
config system ntp set ntpsync enable set type custom set syncinterval 60 config ntpserver edit 1 set server "stdtime.gov.hk" set ntpv3 disable next end set source-ip 0.0.0.0 set server-mode disable end
设置FortiGate虚拟端口
Network => Interfaces选择port2编辑。角色选择LAN,并给FortiGate在VLAN中设置IP地址192.168.32.1
,即VLAN内设备默认网关地址。
FortiGate的默认设置是Implicit Deny,我们先在Policy & Objects => Managing policies添加一个安全策略,放通VLAN对外的常用应用流量,为了之后设置captive portal,这里建立一个新的用户组Internet Access Group,允许访问外网的用户都会放入。这里可以根据需要添加其它安全策略,注意免费版最多只能有三个策略。
打开需要连入VLAN的PC(VMware虚拟机,桥接方式连接),设置IP地址和默认网关,断开重连生效。
检查一下是否设置成功:
ip r
发送日志到SIEM
VM命令行或FortiGate管理端右上角打开Web Console,确认可以和QRadar SIEM通信。在FortiOS内执行普通Bash命令都需要在加上exec
前缀。
exec ping 192.168.31.239
Log & Report => Log Settings => Send logs to syslog滑块打开,Log Collector地址栏输入QRadar的IP即可。
QRadar中已预置FortiGate的DSM,因此选择日志源之后按默认设置添加并部署变更即可。
使用AQL查询防火墙内主机/用户的活动:
SELECT * FROM events WHERE sourceip='192.168.32.11'; SELECT * FROM events WHERE username='aaronwang';
默认情况下FortiGate只会对除了Allow和Implicit Deny的其它活动生成日志,如果需要留存Implicit Deny Drop的日志:
config log setting set fwpolicy-implicit-log enable end
启用强制门户认证
对于有线连接的员工网络,通常使用802.1X进行用户认证。但我们的lab环境并没有RADIUS服务器,因此只能
Network Interface编辑port2设置,启用Security mode => Captive portal,Exempt sources填入非交互式设备(例如192.168.32.130
和192.168.32.131
服务器)的IP或MAC,使VLAN内的服务器可以保持联网。
User & Authentication => User Definition添加本地用户,按照提示给用户设置用户名和密码,最后一步记得分配到Internet Access Group群组里。
强制门户的域名及本地DNS
为了方便用户访问,我们可以给认证页面设置一个域名,例如web-login.ark,并使用本地DNS解析。域名后缀可以任意选择,不需要是ICANN顶级后缀,这个域名也不用注册。
具体方法FortiGate官方文档已讲得很详细:https://docs.fortinet.com/document/fortigate/7.6.2/administration-guide/960561/fortigate-dns-server
浏览器安全警告
如果连接这个局域网后直接访问使用HSTS的网站,会发现跳转captive portal的时候报错(下图)。这是因为captive portal的本质是把所有客户端请求都拦截并重定向到认证页面(类似mitmproxy的功能)。而当前与yahoo.com的连接是强制通过TLS进行的,且用户没有在浏览器内信任FortiGate的证书。另外,我们也不应让防火墙劫持HTTPS流量。如果是员工网络,使用web proxy来审计HTTPS流量的内容是更常见的做法。如果是访客网络,解密用户的应用层流量则是完全侵犯隐私。这是一个不能也不应解决的问题。
目前Windows,安卓和苹果的解决方案是在用户连接到任何网络时,操作系统立即检查该网络是否使用captive portal认证,即在后台自动访问一个仅使用HTTP的网站,例如captive.apple.com(苹果)或msftncsi.com(Windows)去弹出认证页面。但是这次在lab环境中192.168.31.10
PC使用的Kali Linux并没有这个功能,我们只能在每次连接时打开浏览器手动访问example.com来触发认证页面。
跳转之后的认证页面如下,用户鉴权成功后就可以按照Firewall Policy所定义的规则访问相应的资源,例如其它安全设备的管理端。
在Network => Asset & Identities可以查看当前活跃的用户,用Deauthenticate按钮可以将用户强制登出。
使用HTTPS连接强制门户
还有一个相关的尝试,就是给Captive Portal认证页面设置TLS,使用户可以用安全连接来提交登录凭据(例如员工ID和密码,访客邮箱)。虽然是内网,但如果一位已经成功认证的用户是恶意的,他就可以嗅探到其他用户的凭据,实现水平权限提升。我们根据这篇文章,生成了一个本地根CA证书,并给web-login.ark
签发TLS证书,然而把证书和私钥上传到FortiGate的时候,报错密钥长度错误(下图)。查阅FortiGate官方文档才发现,试用版仅支持“低加解密操作”。重新用OpenSSL生成512位RSA私钥之后,可以成功上传,但是发现启用Captive Portal HTTP Redirect之后PC根本无法访问认证页面(PROTOCOL_VERSION_ALERT)且无法绕过,原因是主流浏览器早就停止对2048位以下RSA密钥的支持(😭😭😭)。
因此得知FortiGate试用版无法给Captive Portal启用HTTPS,如果你用的是正式版Virtual Appliance或者实体防火墙,可以用上述办法和这个命令配置HTTPS,注意auth-cert
和auth-ca-cert
后填入的是FortiGate证书名,而不是原始上传文件名。
config user setting set auth-cert "web-login.ark" set auth-ca-cert "localCA" set auth-secure-http enable end
关闭FortiGate
如果需要进行graceful shutdown,可以在管理端菜单 => Username => Systems => Shutdown关机,也可以用VM命令行。
exec poweroff
后续探索
虽然FortiGate可以通过停用用户账号,给IP/MAC设置deny规则等方法来实现一些安全事件的响应,但我们目前的部署还是需要管理员手动操作。接下来我们会尝试通过Bash脚本,让QRadar SIEM在特定可疑事件或攻击规则被触发时,向FortiGate提交一个HTTP Request,自动给某个用户或设备断网。