起因
最近测绘任务较多,也存在固定资产的长久定位,所以想到了灯塔,但是,这玩意之前就报过漏洞,但是业务也只能开放在公网,所以做了一层Nginx的证书双向认证来保证VPS的安全。
1. 灯塔介绍与安装
1.1 灯塔介绍
ARL(Asset Reconnaissance Lighthouse)资产侦察灯塔系统旨在快速侦察与目标关联的互联网资产,构建基础资产信息库。 协助甲方安全团队或者渗透测试人员有效侦察和检索资产,发现存在的薄弱点和攻击面。
1.2 使用源码安装
自动化一建安装脚本
wget https://raw.githubusercontent.com/Aabyss-Team/ARL/master/misc/setup-arl.sh
chmod +x setup-arl.sh
./setup-arl.sh
如果选择的是源码安装,可以通过以下命令确认服务状态(如果全部运行正常那就没问题):
systemctl status mongod
systemctl status rabbitmq-server
systemctl status arl-web
systemctl status arl-worker
systemctl status arl-worker-github
systemctl status arl-scheduler
systemctl status nginx
源码安装后,请前往ARL-Web页面:https://IP:5003/,账号密码为随机生成,会打印在控制台.
2. Nginx证书双向认证
为什么要配置这个呢?像开源的站,如果放置在公网,免不了被别人盯上,对其攻击、扫描、爆破等。如果配置了证书双向认证的话,只有带有服务器可以认证的证书浏览器访问才可以访问到,其他的都只会返回错误页面。
2.1 什么是双向认证?
双向认证,顾名思义,客户端和服务器端都需要验证对方的身份,在建立HTTPS连接的过程中,握手的流程比单向认证多了几步。单向认证的过程,客户端从服务器端下载服务器端公钥证书进行验证,然后建立安全通信通道。双向通信流程,客户端除了需要从服务器端下载服务器的公钥证书进行验证外,还需要把客户端的公钥证书上传到服务器端给服务器端进行验证,等双方都认证通过了,才开始建立安全通信通道进行数据传输。
2.2 单项认证和双向认证的区别
2.2.1 单向认证流程
-
客户端发起建立HTTPS连接请求,将SSL协议版本的信息发送给服务器端; -
服务器端将本机的公钥证书(server.crt)发送给客户端; -
客户端读取公钥证书(server.crt),取出了服务端公钥; -
客户端生成一个随机数(密钥R),用刚才得到的服务器公钥去加密这个随机数形成密文,发送给服务端; -
服务端用自己的私钥(server.key)去解密这个密文,得到了密钥R -
服务端和客户端在后续通讯过程中就使用这个密钥R进行通信了。
2.2.2 单向认证流程双向认证流程
-
客户端发起建立HTTPS连接请求,将SSL协议版本的信息发送给服务端; -
服务器端将本机的公钥证书(server.crt)发送给客户端; -
客户端读取公钥证书(server.crt),取出了服务端公钥; -
客户端将客户端公钥证书(client.crt)发送给服务器端; -
服务器端使用根证书(root.crt)解密客户端公钥证书,拿到客户端公钥; -
客户端发送自己支持的加密方案给服务器端; -
服务器端根据自己和客户端的能力,选择一个双方都能接受的加密方案,使用客户端的公钥加密后发送给客户端; -
客户端使用自己的私钥解密加密方案,生成一个随机数R,使用服务器公钥加密后传给服务器端; -
服务端用自己的私钥去解密这个密文,得到了密钥R -
服务端和客户端在后续通讯过程中就使用这个密钥R进行通信了。
2.3 证书准备
整个双向认证的流程需要六个证书文件:
-
根证书:root.crt -
服务器端公钥证书:server.crt -
服务器端私钥文件:server.key -
客户端公钥证书:client.crt -
客户端私钥文件:client.key -
客户端集成证书(包括公钥和私钥,用于浏览器访问场景):client.p12
互联网使用一般向证书机构去申请签发,这是需要收费的。我们内部使用的话,可以自签证书。
3. Linux系统下生成证书
请确保server已经安装了Nginx
3.1.1 创建根证书私钥以及请求文件
-
首先创建根证书私钥以及请求文件:
mkdir /etc/nginx/keys/
cd /etc/nginx/keys/
openssl genrsa -out root.key 4096
openssl req -new -out root.csr -key root.key -subj "/C=CN/ST=BJ/L=test.com/O=test.com/OU=test.com/CN=192.168.1.1"
3.1.2 创建根证书(注意有效期):
openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650
3.1.3 生成自签名服务器端证书
-
生成服务端证书私钥:
openssl genrsa -out server.key 4096
3.1.4 生成服务器证书请求文件:
openssl req -new -out server.csr -key server.key -subj "/C=CN/ST=BJ/L=test.com/O=test.com/OU=test.com/CN=192.168.1.1"
3.1.5 生成服务器公钥证书:
openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650
3.2生成自签名客户端证书
3.2.1 生成客户端证书密钥:
-
生成客户端的私钥与证书: client.key
openssl genrsa -out client.key 4096
3.2.2 生成 client 端数字证书请求
-
生成 client 端数字证书请求: client.csr
openssl req -new -key client.key -out client.csr
3.2.3 生成客户端证书请求文件:
openssl req -new -out client.csr -key client.key -subj "/C=CN/ST=BJ/L=test.com/O=test.com/OU=test.com/CN=192.168.1.1"
到这,我们所需要的证书就生成完毕了,接下来我们配置Nginx
3.2.4生成客户端 P12格式证书【浏览器安装证书】:
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
生成后下载到本地,安装到浏览器中
4. 配置nginx
创建nginx配置文件
cd /etc/nginx/sites-enabled
vim arl.conf
arl.conf如下:
server {
listen 5003 ssl http2;
ssl_certificate /etc/nginx/keys/server.crt; # 配置证书位置
ssl_certificate_key /etc/nginx/keys/server.key; # 配置秘钥位置
ssl_client_certificate /etc/nginx/keys/client.crt; # 双向认证
ssl_verify_client on; # 双向认证
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3; # 推荐使用 TLSv1.2 和 TLSv1.3
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;
access_log /var/log/nginx/arl.access.log main;
root /opt/ARL/docker/frontend;
location / {
try_files $uri$uri/ /index.html;
index index.html index.htm;
}
location /api/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:5013/api/;
}
location /swaggerui/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://127.0.0.1:5013/swaggerui/;
}
error_page 497 https://$http_host;
}
★
注意:这里使用的是ip地址访问,如果使用域名访问,请修改 server_name 为域名地址
重载配置
nginx -s reload
5. 最终效果
在浏览器没有安装证书时,我们访问的结果为:
安装证书后访问:
点击确定,即可正常访问
功能也正常
原文始发于微信公众号(SecretTeam安全团队):配置ARL资产侦察+Nginx双向证书认证
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论