VMware虚拟机安装FortiGate永久试用版并配置强制门户

在部署开源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只会对除了AllowImplicit Deny的其它活动生成日志,如果需要留存Implicit Deny Drop的日志:

config log setting
set fwpolicy-implicit-log enable
end

启用强制门户认证

对于有线连接的员工网络,通常使用802.1X进行用户认证。但我们的lab环境并没有RADIUS服务器,因此只能

Network Interface编辑port2设置,启用Security mode => Captive portalExempt sources填入非交互式设备(例如192.168.32.130192.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来触发认证页面。

微软对于强制门户问题的说明https://learn.microsoft.com/zh-cn/windows-hardware/drivers/mobilebroadband/captive-portals

跳转之后的认证页面如下,用户鉴权成功后就可以按照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密钥的支持(😭😭😭)。

Firefox关于停用1024及以下密钥的博客https://blog.mozilla.org/security/2014/09/08/phasing-out-certificates-with-1024-bit-rsa-keys/

因此得知FortiGate试用版无法给Captive Portal启用HTTPS,如果你用的是正式版Virtual Appliance或者实体防火墙,可以用上述办法和这个命令配置HTTPS,注意auth-certauth-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,自动给某个用户或设备断网。

Previous
Next