雷池介绍
使用雷池 SafeLine WAF已经两年多了,在1.5.x版本时就已经开始测试使用,并在推出LTS版本后转入LTS分支。
近期雷池 SafeLine WAF重点更新了身份认证功能,并提供了SSO单点登录认证,因此本次对此功能进行深度体验。
业务痛点
在公司运维中,会部署一些独立的自开发运维工具,如MQ消息队列监控工具、JVM虚拟机内存监控工具、交换机巡检备份工具;本次介绍我自己开发使用的MQ消息队列监控工具结合雷池的使用。
MQ消息队列监控工具
整个工具由下面几部分组成
MQ消息队列-Agent采集写入数据库、分析、企业微信webhook告警(python)-企业微信webhook消息配置为PHP网页-PHP网页可视化展示最近的MQ分析数据库
由于开发的工具较多,均没有配置独立的身份认证,即任何人都可以通过连接访问
雷池WAF身份认证
为防止隐私泄露,本次全新安装雷池WAF
雷池WAF安装
安装docker
使用anolis8.10操作系统,关闭防火墙,安装docker
1、安装docker
yum install -y yum-utils
#阿里云加速源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io
2、配置docker网段和加速源
/etc/docker/daemon.json
{
"bip": "192.168.120.1/24",
"registry-mirrors": [
"https://docker.1panel.live"
]
}
3、启动服务
systemctl enable --now docker
4、关闭防火墙
systemctl disable --now firewalld
安装雷池
yum install python3
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/manager.sh)"
部署完成
MQ消息队列监控工具部署
部署php环境
yum install httpd php php-mysqli php-json
systemctl enable --now httpd
将MQ查询的PHP程序放入/var/www/html/index.php,运行正常
雷池WAF身份认证配置
添加应用防护
可配置基础账号密码认证
也可配置三方账号密码认证,注意个人免费版和收费版可配置项不同
配置基础身份认证演示
可配置授权访问或直接访问
直接访问效果
错误账号密码效果
通过验证效果
显示正在进入并跳转
审批授权效果
配置为审批授权
登陆提示未授权
雷池-身份认证 进行授权
审批通过后,页面自动跳转,访问成功
微信开放平台对接效果
由于微信开放平台需要实名认证,这里无法演示,最终效果为扫码登录
身份认证高级功能-特定条件身份认证
可设置条件、IP范围、地理范围
身份认证高级功能-用户认证信息传递
官方文档
如何配置将用户认证信息传递给应用服务器?
用户认证成功后,雷池会重定向到以下地址,其中http://example.com/application是在应用配置的认证回调地址:
http://example.com/application?code=123456&redirect_uri=用户原访问地址
在雷池控制台 通用设置-控制台管理 页面找到 API Token ,获取 Token
应用在 认证回调地址 中实现用 code 来请求雷池的/.safeline/auth/api/user接口获取认证用户信息,code 只能使用一次
// 请求:
GET http://safeline-console.com/.safeline/auth/api/user?code=123456
X-SLCE-API-TOKEN: safeline-api-token
// 响应:
Content-Type: application/json
{
"code": 0, // 0: 成功,非0: 失败
"msg": "错误描述",
"data": {
"id": 1,
"username": "username"
}
}
应用成功获取到用户信息之后缓存登录信息,用于后续判断当前用户是否登录,然后重定向到 redirect_uri
注意
GET http://safeline-console.com/
这里域名是应用的域名,不是雷池控制台,即
GET http://example.com/.safeline/auth/api/user?code=123456
简单DEMO实现获取雷池身份验证用户名
auth.php
<?php
// 打印更多报错信息
error_reporting(E_ALL); ini_set('display_errors', 1);
// 判断是否是HTTPS
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
// 获取域名和请求URI
$currentUrl = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$parsedUrl = parse_url($currentUrl);
$queryString = $parsedUrl['query'];
parse_str($queryString, $queryParams);
$code = isset($queryParams['code']) ? $queryParams['code'] : null;
$url = 'http://这里是我的应用域名/.safeline/auth/api/user?code=' . urlencode($code); // 替换为实际API地址
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_HTTPHEADER => [
'X-SLCE-API-TOKEN: 这里是我的密钥'
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false
]);
$response = curl_exec($ch);
if(curl_errno($ch)){
die('CURL Error: '.curl_error($ch));
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($httpCode !== 200){
die('HTTP Error: '.$httpCode);
}
print_r($response);
$data = json_decode($response, true);
if(json_last_error() !== JSON_ERROR_NONE){
die('JSON解析失败: '.json_last_error_msg());
}
print_r($data);
curl_close($ch);
配置回调地址
登陆测试
登录heihei
返回用户名heihei
Array ( [code] => 0 [msg] => [data] => Array ( [id] => 2 [username] => heihei ) )
拿到用户名后,下一步可以写入session或cookie,跳转页面,完成权限认证操作
意见与建议
1、登录界面无法直接回车登录,需要鼠标点击登录,建议改为回车登录
2、身份认证审核信息,建议使用浏览器消息通知机制,直接在标签页弹消息提醒
小结
太强大了!
评论