GrayLog實現堡壘機繞過告警時體現出具體違規人員的姓名
在上一篇文章【實踐】GrayLog下利用PrometheusAlert實現堡壘機繞過告警推送到釘釘群 的基礎上,進行進一步的細化
GrayLog實現堡壘機繞過告警時能體現出具體違規人員的姓名

說明:本文所說的堡壘機繞過只針對Linux服務器
先看服務器/var/log/secure原始日志詳情
Feb 19 15:53:50 localhost sshd[10978]: Accepted password for root from 192.168.31.25 port 52352 ssh2

思路與方法如下
1、這個功能需要從日志提取出192.168.31.25 這個IP字段field,并存為ssh_login_ip,需要用到GrayLog 的extrator提取器來實現
2、然后再需要用GrayLog的Lookup Tables實現IP字段field:ssh_login_ip查詢到具體員工姓名,然后轉換或者新增ssh_login_user這個字段
3、接下來再定義PrometheusAlert中GrayLog告警模板即可
具體實踐的步驟如下
一、在syslog這個Input中配置extractor提取器
先加載你要提取的日志,可以用Search里找到要原始日志的MessageID以及index來Load message

提取器選擇Regular expression正則表達式類型

我這里的正則表達式為
\]: Accepted password for .* from (.+?)\s.?
也可以用下面這個表達式 然后條件Condition你可以設置也可以不設置
Store as field并存為ssh_login_ip這個字段

1、正則表達式可以用Try進行預覽測試
2、關于上面的正則表達式也可以用下面這個
(?:<\d+>)?(?:\d{4}-\d{1,2}-\d{1,2}T\d{1,2}:\d{1,2}:\d{1,2}.*?|\S{1,3}\s*\d{1,2}\s*\d{1,2}:\d{1,2}:\d{1,2}.*?
)?(?:\s*\S+\s*\S+\s*)(?:/usr/sbin/)?(?:pam|sshd)(?:\S+)?(?:\(\S*?\))?\s*(?:\[\d+\]):\s*Accepted
\S+ for \S+ from (\S+) port \d+

保存這個提取器之后再查詢SSH密碼成功登錄的日志就有了ssh_login_ip這個字段了

二、接下來配置員工IP與員工姓名的lookup Tables
這個步驟可以參考上一篇文章
【精選實踐】GrayLog下利用PrometheusAlert實現堡壘機繞過告警推送到釘釘群
配置后的截圖

能正常查詢到員工姓名


三、創建pipeline中加一條rule 例如staff_ip2username_lookup
規則內容如下
rule "staff_ip2username_lookup"
when
has_field("ssh_login_ip")
then
//let update_username = lookup_value("staff_ip2username_lookup",$message.ssh_login_ip);
let update_username = lookup_value("staff_ip2username_lookup",$message.ssh_login_ip);
set_field("ssh_login_user",update_username);
end

也可以用如下規則(注意用lookup與lookup_value的區別)
rule "staff_ip2username_lookup"
when
has_field("ssh_login_ip")
then
//let update_username = lookup_value("staff_ip2username_lookup",$message.ssh_login_ip);
let update_username = lookup("staff_ip2username_lookup",$message.ssh_login_ip);
set_field("ssh_login_ip",update_username["value"]);
end
如下圖所示 在Stage1中應用這個pipeline rule


四、調整日志消息的處理順序
Message Filter Chain要放在Pipeline Processor之前

五、配置Graylog Alert+PrometheusAlert告警
這時就有了ssh_login_user這個字段了

接下來就只需要配置告警了
具體告警模板如下

## [告警信息](.check_result.Event.Source)
### <font color=#FF0000>告警描述:{{.event_definition_description}}</font>
{{ range $k,$v:=.backlog }}
##### <font color=#FF0000>告警時間</font>:{{GetCSTtime $v.timestamp}}
##### <font color=#FF0000>告警描述</font>: 員工:{{$v.fields.ssh_login_user}} 違規繞過堡壘機于{{GetCSTtime $v.timestamp}}時直接SSH登陸 {{$v.source}}:服務器,請及時處理并提醒該員工
##### <font color=#FF0000>告警服務器名稱</font>:{{$v.source}}
##### <font color=#FF0000>告警服務器的IP</font>:{{$v.fields.gl2_remote_ip}}
##### <font color=#FF0000>具體違規操作員工姓名</font>: {{$v.fields.ssh_login_user}}
##### <font color=#FF0000>違規操作員工的電腦IP</font>: {{$v.fields.ssh_login_ip}}
##### <font color=#FF0000>告警原始日志</font>:{{$v.message}}
{{end}}
配置后截圖示例


六、釘釘機器人告警效果
截圖如下


七、總結與展開
其實還有兩種方式直接利用LookupTables實現IP轉換為員工姓名信息
1、在配置提取器里直接再添加一個converter,類型為Lookup Tables

2、在ssh_login_ip這個字段再二次提取,提取器選擇Lookup Table這個類型


3、其實還可以進一步細化 再利用之前提到webhook工具在告警產生后進行命令執行,實現調用腳本自動觸發SSH登錄IP封鎖或者消息推送到該員工
例如調用shell腳本
echo "sshd: $ssh_login_ip" >> /etc/hosts.deny
不過這個做法不太合理,如果配置過防堡壘機繞過的SSH訪問控制策略 /etc/hosts.allow里應該是有堡壘機的IP和該員工的IP(意思是該員工有手動修改過/etc/hosts.allow文件,把自己的IP放通了) /etc/hosts.deny里是拒絕所有,一般不讓修改(白名單/黑名單,最小化原則實現控制的常見安全控制方法) 所以這時應該調用腳本去刪有該員工的IP的配置 例如
sed -i ’/$ssh_login_ip/d' /etc/hosts.allow
(這里只是舉例,shell腳本語法不一定對)






















