GrayLog實(shí)現(xiàn)堡壘機(jī)繞過告警時(shí)體現(xiàn)出具體違規(guī)人員的姓名
在上一篇文章【實(shí)踐】GrayLog下利用PrometheusAlert實(shí)現(xiàn)堡壘機(jī)繞過告警推送到釘釘群 的基礎(chǔ)上,進(jìn)行進(jìn)一步的細(xì)化
GrayLog實(shí)現(xiàn)堡壘機(jī)繞過告警時(shí)能體現(xiàn)出具體違規(guī)人員的姓名
說明:本文所說的堡壘機(jī)繞過只針對(duì)Linux服務(wù)器
先看服務(wù)器/var/log/secure原始日志詳情
Feb 19 15:53:50 localhost sshd[10978]: Accepted password for root from 192.168.31.25 port 52352 ssh2
思路與方法如下
1、這個(gè)功能需要從日志提取出192.168.31.25 這個(gè)IP字段field,并存為ssh_login_ip,需要用到GrayLog 的extrator提取器來實(shí)現(xiàn)
2、然后再需要用GrayLog的Lookup Tables實(shí)現(xiàn)IP字段field:ssh_login_ip查詢到具體員工姓名,然后轉(zhuǎn)換或者新增ssh_login_user這個(gè)字段
3、接下來再定義PrometheusAlert中GrayLog告警模板即可
具體實(shí)踐的步驟如下
一、在syslog這個(gè)Input中配置extractor提取器
先加載你要提取的日志,可以用Search里找到要原始日志的MessageID以及index來Load message
提取器選擇Regular expression正則表達(dá)式類型
我這里的正則表達(dá)式為
\]: Accepted password for .* from (.+?)\s.?
也可以用下面這個(gè)表達(dá)式 然后條件Condition你可以設(shè)置也可以不設(shè)置
Store as field并存為ssh_login_ip這個(gè)字段
1、正則表達(dá)式可以用Try進(jìn)行預(yù)覽測(cè)試
2、關(guān)于上面的正則表達(dá)式也可以用下面這個(gè)
(?:<\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+
保存這個(gè)提取器之后再查詢SSH密碼成功登錄的日志就有了ssh_login_ip這個(gè)字段了
二、接下來配置員工IP與員工姓名的lookup Tables
這個(gè)步驟可以參考上一篇文章
【精選實(shí)踐】GrayLog下利用PrometheusAlert實(shí)現(xiàn)堡壘機(jī)繞過告警推送到釘釘群
配置后的截圖
能正常查詢到員工姓名
三、創(chuàng)建pipeline中加一條rule 例如staff_ip2username_lookup
規(guī)則內(nèi)容如下
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
也可以用如下規(guī)則(注意用lookup與lookup_value的區(qū)別)
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中應(yīng)用這個(gè)pipeline rule
四、調(diào)整日志消息的處理順序
Message Filter Chain要放在Pipeline Processor之前
五、配置Graylog Alert+PrometheusAlert告警
這時(shí)就有了ssh_login_user這個(gè)字段了
接下來就只需要配置告警了
具體告警模板如下
## [告警信息](.check_result.Event.Source)
### <font color=#FF0000>告警描述:{{.event_definition_description}}</font>
{{ range $k,$v:=.backlog }}
##### <font color=#FF0000>告警時(shí)間</font>:{{GetCSTtime $v.timestamp}}
##### <font color=#FF0000>告警描述</font>: 員工:{{$v.fields.ssh_login_user}} 違規(guī)繞過堡壘機(jī)于{{GetCSTtime $v.timestamp}}時(shí)直接SSH登陸 {{$v.source}}:服務(wù)器,請(qǐng)及時(shí)處理并提醒該員工
##### <font color=#FF0000>告警服務(wù)器名稱</font>:{{$v.source}}
##### <font color=#FF0000>告警服務(wù)器的IP</font>:{{$v.fields.gl2_remote_ip}}
##### <font color=#FF0000>具體違規(guī)操作員工姓名</font>: {{$v.fields.ssh_login_user}}
##### <font color=#FF0000>違規(guī)操作員工的電腦IP</font>: {{$v.fields.ssh_login_ip}}
##### <font color=#FF0000>告警原始日志</font>:{{$v.message}}
{{end}}
配置后截圖示例
六、釘釘機(jī)器人告警效果
截圖如下
七、總結(jié)與展開
其實(shí)還有兩種方式直接利用LookupTables實(shí)現(xiàn)IP轉(zhuǎn)換為員工姓名信息
1、在配置提取器里直接再添加一個(gè)converter,類型為L(zhǎng)ookup Tables
2、在ssh_login_ip這個(gè)字段再二次提取,提取器選擇Lookup Table這個(gè)類型
3、其實(shí)還可以進(jìn)一步細(xì)化 再利用之前提到webhook工具在告警產(chǎn)生后進(jìn)行命令執(zhí)行,實(shí)現(xiàn)調(diào)用腳本自動(dòng)觸發(fā)SSH登錄IP封鎖或者消息推送到該員工
例如調(diào)用shell腳本
echo "sshd: $ssh_login_ip" >> /etc/hosts.deny
不過這個(gè)做法不太合理,如果配置過防堡壘機(jī)繞過的SSH訪問控制策略 /etc/hosts.allow里應(yīng)該是有堡壘機(jī)的IP和該員工的IP(意思是該員工有手動(dòng)修改過/etc/hosts.allow文件,把自己的IP放通了) /etc/hosts.deny里是拒絕所有,一般不讓修改(白名單/黑名單,最小化原則實(shí)現(xiàn)控制的常見安全控制方法) 所以這時(shí)應(yīng)該調(diào)用腳本去刪有該員工的IP的配置 例如
sed -i ’/$ssh_login_ip/d' /etc/hosts.allow
(這里只是舉例,shell腳本語法不一定對(duì))