使用容器內(nèi)部操作審計(jì)功能
容器內(nèi)部操作審計(jì)功能可以方便您審計(jì)組織內(nèi)成員或應(yīng)用程序進(jìn)入容器后執(zhí)行的命令操作。本文介紹如何使用容器內(nèi)部操作審計(jì)功能,以及如何通過日志服務(wù)收集分析審計(jì)日志,并根據(jù)需求為審計(jì)日志設(shè)置自定義的告警規(guī)則。
計(jì)費(fèi)說明
容器內(nèi)部操作審計(jì)功能當(dāng)前處于公測中,可以免費(fèi)使用。開通容器內(nèi)部操作審計(jì)功能后,使用日志服務(wù)SLS的相關(guān)功能,會(huì)產(chǎn)生相關(guān)費(fèi)用。日志服務(wù)相關(guān)計(jì)費(fèi)信息,請參見計(jì)費(fèi)概述。
使用限制
集群類型:僅支持ACK集群Pro版、ACK集群基礎(chǔ)版、ACK專有集群。
集群版本及操作系統(tǒng)限制:僅支持內(nèi)核版本大于4.19的Alibaba Cloud Linux、Ubuntu操作系統(tǒng)。
Alibaba Cloud Linux:集群版本為1.18及以上。
Ubuntu:
集群版本為1.30及以上。如需升級集群,請參見手動(dòng)升級集群。
目前不支持CPFS存儲卷、鏡像加速插件、安全加固等功能。
步驟一:啟用容器內(nèi)部操作審計(jì)功能
您可以通過安裝logtail-ds組件和ack-advanced-audit組件啟用容器內(nèi)部操作審計(jì)功能。
logtail-ds組件:將審計(jì)日志收集到日志服務(wù)并創(chuàng)建默認(rèn)的審計(jì)報(bào)表。
ack-advanced-audit組件:實(shí)現(xiàn)容器內(nèi)操作審計(jì)。
容器內(nèi)部操作審計(jì)功能啟用后,默認(rèn)將在logtail-ds組件使用的日志Project中創(chuàng)建一個(gè)名為advaudit-${cluster_id}的日志庫,用于保存審計(jì)日志。該日志庫數(shù)據(jù)的保存時(shí)間為180天。如需修改日志保存時(shí)間,請參見管理Logstore。
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在組件管理頁面,在日志與監(jiān)控頁簽定位logtail-ds組件,在安全頁簽定位ack-advanced-audit組件,并按照頁面提示完成安裝。
步驟二:查看審計(jì)報(bào)表
容器內(nèi)部操作審計(jì)功能啟用后,默認(rèn)將在日志Project下創(chuàng)建一個(gè)名為Kubernetes容器內(nèi)部操作審計(jì)的報(bào)表。
登錄日志服務(wù)控制臺。
在Project列表區(qū)域,選擇集群使用的日志Project,單擊名稱進(jìn)入日志Project頁面。
在頁面左側(cè)的圖標(biāo)欄單擊儀表盤圖標(biāo),然后單擊Kubernetes容器內(nèi)部操作審計(jì)查看審計(jì)報(bào)表內(nèi)容。
查看進(jìn)入Pod容器的次數(shù)以及相關(guān)Pod信息。
執(zhí)行操作的Kubernetes操作賬號信息、進(jìn)入容器后執(zhí)行的命令列表以及常見的高危列表。
步驟三:查看詳細(xì)日志記錄
您可以通過以下兩種方式查看詳細(xì)的日志記錄。
在審計(jì)報(bào)表頁面查看:適用于查看最近的單個(gè)事件的日志記錄。
在日志庫頁面通過查詢語句查看:適用于復(fù)雜場景,查看更多的歷史信息以及歷史事件。
在審計(jì)報(bào)表頁面查看
在Kubernetes容器內(nèi)部操作審計(jì)報(bào)表頁面,通過單擊風(fēng)險(xiǎn)程序操作列表區(qū)域的traceId和eventId表格列的鏈接,查看對應(yīng)審計(jì)日志的詳細(xì)信息。
單擊traceId表格列的鏈接,可以查看單次進(jìn)入容器后執(zhí)行的所有操作命令的審計(jì)日志。
單擊eventId表格列的鏈接,可以查看執(zhí)行的單個(gè)命令的詳細(xì)信息。
在日志庫頁面通過查詢語句查看
在日志庫頁面,通過查詢語句查看詳細(xì)的審計(jì)日志記錄。
登錄日志服務(wù)控制臺。
在Project列表區(qū)域,選擇集群使用的日志Project,單擊名稱進(jìn)入日志Project頁面。
在 頁簽中,單擊名為advaudit-${cluster_id}的日志庫(Logstore)。
advaudit-${cluster_id}中,${cluster_id}為您的集群ID。
在輸入框中輸入查詢和分析語句。
查詢進(jìn)入某個(gè)Pod的容器后執(zhí)行的命令操作審計(jì)日志:輸入* and k8s.pod.namespace: <namespace> and k8s.pod.name: <pod_name>,將<namespace>替換為Pod所在的命名空間,<pod_name>替換為Pod的名稱。
查詢執(zhí)行指定程序的操作審計(jì)日志:輸入* and process.name: <name>,將<name>替換為待查找的程序名稱。
更多查詢統(tǒng)計(jì)方式,請參見日志服務(wù)查詢分析方法。
單擊15分鐘(相對),設(shè)置查詢分析的時(shí)間范圍。
單擊查詢/分析,查看查詢分析結(jié)果。
(可選)步驟四:配置操作審計(jì)告警
通過日志服務(wù)的告警功能,您可以配置容器內(nèi)部操作審計(jì)的實(shí)時(shí)告警,便于監(jiān)控容器內(nèi)關(guān)鍵的操作事件。告警方式支持短信、釘釘機(jī)器人、郵件、自定義Webhook和通知中心。本文以配置釘釘告警的方式,介紹如何配置容器內(nèi)部操作審計(jì)告警。更多告警配置方式,請參見告警。
登錄日志服務(wù)控制臺。
進(jìn)入Webhook集成頁面。
在Project列表區(qū)域,單擊目標(biāo)Project。
在左側(cè)導(dǎo)航欄中,單擊告警。
在告警中心頁面,單擊通知對象頁簽,然后單擊Webhook集成。
創(chuàng)建Webhook。
在Webhook集成頁面,單擊新建。
在新建Webhook對話框中,配置如下配置項(xiàng),然后單擊確認(rèn)。
配置項(xiàng)
描述
標(biāo)識符
Webhook的唯一標(biāo)識,不可重復(fù)。本示例配置為ack-container-operation-audit-alert。
名稱
Webhook名稱。本示例配置為Kubernetes容器內(nèi)部操作審計(jì)告警。
類型
Webhook類型。本示例選擇釘釘。
請求地址
Webhook URL地址。
在釘釘側(cè)創(chuàng)建自定義機(jī)器人,并獲取Webhook URL地址。更多信息,請參見自定義機(jī)器人接入。
新建內(nèi)容模板。
在告警中心頁面,單擊通知策略頁簽,然后單擊內(nèi)容模板。
在內(nèi)容模板頁面,單擊創(chuàng)建。
配置內(nèi)容模板的ID和名稱,然后配置釘釘告警通知的標(biāo)題和發(fā)送內(nèi)容。
關(guān)于添加內(nèi)容模板的更多信息,請參見創(chuàng)建內(nèi)容模板。本文需配置兩個(gè)內(nèi)容模板,具體配置內(nèi)容如下。
ID
名稱
標(biāo)題
發(fā)送內(nèi)容
ack-container-operation-audit-alert-enter
Kubernetes進(jìn)入容器告警
KubernetesKubernetes容器內(nèi)部操作審計(jì)告警
- 告警規(guī)則:${alert_name} - 觸發(fā)時(shí)間:${alert_time} - 告警嚴(yán)重度:${severity} - 集群ID:{{ alert.results[0].fire_result['clusterid'] }} 有賬號通過 kubectl exec或終端功能進(jìn)入了容器,請檢查是否存在異常。 操作次數(shù):{{ alert.fire_results_count }} 次,下面是其中一次操作的具體信息: - 操作時(shí)間:{{ alert.results[0].fire_result['time'] }} {% if alert.results[0].fire_result['k8s.user.aliuid'] -%} - 操作賬號:{{ alert.results[0].fire_result['k8s.user.aliuid'] }} {% else -%} - 操作賬號:{{ alert.results[0].fire_result['k8s.user.username'] }} {% endif -%} - 命名空間:{{ alert.results[0].fire_result['k8s.pod.namespace'] }} - Pod:{{ alert.results[0].fire_result['k8s.pod.name'] }} - 容器:{{ alert.results[0].fire_result['kubeobject.operation.podexecoptions.container'] }} - 命令:{{ alert.results[0].fire_result['kubeobject.operation.podexecoptions.commandstr'] }} [[詳情](${query_url})] [[設(shè)置](${alert_url})]
ack-container-operation-audit-alert-run-danger-cmd
Kubernetes進(jìn)入容器后執(zhí)行風(fēng)險(xiǎn)程序告警
Kubernetes容器內(nèi)部操作審計(jì)告警
- 告警規(guī)則:${alert_name} - 觸發(fā)時(shí)間:${alert_time} - 告警嚴(yán)重度:${severity} - 集群ID:{{ alert.results[0].fire_result['clusterid'] }} 有賬號通過 kubectl exec或終端功能進(jìn)入容器后執(zhí)行了存在風(fēng)險(xiǎn)的程序命令,請檢查是否存在異常。 操作次數(shù):{{ alert.fire_results_count }} 次,下面是其中一次操作的具體信息: - 操作時(shí)間:{{ alert.results[0].fire_result['time'] }} {% if alert.results[0].fire_result['k8s.user.aliuid'] -%} - 操作賬號:{{ alert.results[0].fire_result['k8s.user.aliuid'] }} {% else -%} - 操作賬號:{{ alert.results[0].fire_result['k8s.user.username'] }} {% endif -%} - 命名空間:{{ alert.results[0].fire_result['k8s.pod.namespace'] }} - Pod:{{ alert.results[0].fire_result['k8s.pod.name'] }} - 容器:{{ alert.results[0].fire_result['k8s.container.name'] }} - 操作目錄:{{ alert.results[0].fire_result['process.cwd'] }} - 執(zhí)行的程序命令:{{ alert.results[0].fire_result['process.cmdline'] }} [[詳情](${query_url})] [[設(shè)置](${alert_url})]
配置告警。
在Kubernetes容器內(nèi)部操作審計(jì)報(bào)表頁面,單擊 。
在告警監(jiān)控規(guī)則頁面,配置Kubernetes進(jìn)入容器告警和Kubernetes進(jìn)入容器后執(zhí)行風(fēng)險(xiǎn)程序告警的告警規(guī)則。配置完成后,單擊確定。
以下配置項(xiàng)均為示例值,請根據(jù)實(shí)際需求設(shè)置。
Kubernetes進(jìn)入容器告警的告警規(guī)則
配置項(xiàng)
描述
規(guī)則名稱
Kubernetes進(jìn)入容器告警
檢查頻率
固定間隔:1分鐘。
查詢統(tǒng)計(jì)
單擊右側(cè)添加,然后單擊高級配置頁簽,配置如下信息。配置完成后,單擊確認(rèn)。
日志庫:搜索并選中advaudit-${cluster_id},例如advaudit-c76da730c08ca45adb90fad86fb74****。
查詢區(qū)間:本示例選中1分鐘(相對)。
查詢:設(shè)置日志庫后,會(huì)顯示該字段。代碼配置為:
kind: Kubernetes and kubeObject.operation.kind: PodExec | select "clusterid", "time", "traceId", "eventId", "k8s.user.aliuid", "k8s.user.username", json_extract(k8s, '$.user.groups') as "k8s.user.groups", "host.hostip", "host.nodename", "k8s.pod.namespace", "k8s.pod.name", json_extract(k8s, '$.pod.labels') as "k8s.pod.labels", "kubeobject.operation.podexecoptions.container", json_extract(kubeobject, '$.operation.podExecOptions.command') as "kubeobject.operation.podexecoptions.command", "kubeobject.operation.podexecoptions.commandstr" from log
觸發(fā)條件
選擇當(dāng)有數(shù)據(jù)時(shí),嚴(yán)重程度:報(bào)告。
告警策略
極簡模式。需配置如下信息。
渠道:選擇釘釘。
選擇Webhook:選擇Kubernetes容器內(nèi)部操作審計(jì)告警。
提醒方式:選擇不提醒。
內(nèi)容模板:搜索并選擇Kubernetes進(jìn)入容器告警。
發(fā)送時(shí)段:選擇任意。
自動(dòng)分派:默認(rèn)關(guān)閉。
Kubernetes進(jìn)入容器后執(zhí)行風(fēng)險(xiǎn)程序告警的告警規(guī)則
配置項(xiàng)
描述
規(guī)則名稱
Kubernetes進(jìn)入容器后執(zhí)行風(fēng)險(xiǎn)程序告警
檢查頻率
固定間隔:1分鐘。
查詢統(tǒng)計(jì)
單擊右側(cè)添加,然后單擊高級配置頁簽,配置如下信息。配置完成后,單擊確認(rèn)。
日志庫:搜索并選中advaudit-${cluster_id},例如advaudit-c76da730c08ca45adb90fad86fb74****。
查詢區(qū)間:選中1分鐘(相對)。
查詢:設(shè)置日志庫后,才會(huì)顯示該字段。代碼配置為:
kind: Command | select "clusterid", "time", "traceId", "eventId", "k8s.user.aliuid", "k8s.user.username", json_extract(k8s, '$.user.groups') as "k8s.user.groups", "host.hostip", "host.nodename", "k8s.pod.namespace", "k8s.pod.name", json_extract(k8s, '$.pod.labels') as "k8s.pod.labels", "k8s.container.name", "k8s.container.image", "process.cwd", "process.name", "process.cmdline", json_extract(process, '$.pid') as "process.pid", "process.user.uid", json_extract(process, '$.parentPid') as "process.parentpid", "process.parentname" from log where "process.name" in ('rm', 'sudo', 'su', 'nsenter', 'curl', 'wget', 'yum', 'apt-get', 'apt', 'apk', 'dpkg', 'nc', 'ncat', 'ssh', 'scp', 'nmap', 'docker', 'crictl', 'nerdctl', 'podman', 'kubectl', 'helm', 'mysql', 'redis', 'psql', 'redis-cli', 'pip', 'npm', 'gem')
觸發(fā)條件
當(dāng)有數(shù)據(jù)時(shí),嚴(yán)重程度:中。
告警策略
極簡模式。需配置如下信息。
渠道:選擇釘釘。
選擇Webhook:選擇Kubernetes容器內(nèi)部操作審計(jì)告警。
提醒方式:選擇不提醒。
內(nèi)容模板:選擇Kubernetes進(jìn)入容器后執(zhí)行風(fēng)險(xiǎn)程序告警。
發(fā)送時(shí)段:選擇任意。
自動(dòng)分派:默認(rèn)關(guān)閉。
測試告警規(guī)則。
通過
kubectl exec -it <pod_name> bash
命令進(jìn)入容器,觸發(fā)Kubernetes進(jìn)入容器告警的告警規(guī)則。告警信息如下圖所示。進(jìn)入容器后,通過
touch a.txt && rm a.txt
命令,觸發(fā)Kubernetes進(jìn)入容器后執(zhí)行風(fēng)險(xiǎn)程序告警的告警規(guī)則。告警信息如下圖所示。
關(guān)閉容器內(nèi)部操作審計(jì)功能
您可以通過卸載ack-advanced-audit組件關(guān)閉容器內(nèi)部操作審計(jì)功能。
關(guān)閉容器內(nèi)部操作審計(jì)功能,不會(huì)刪除自動(dòng)創(chuàng)建的advaudit-${cluster_id}日志庫,您需要登錄日志服務(wù)控制臺手動(dòng)刪除該日志庫,請參見刪除Logstore。
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在組件管理頁面,單擊日志與監(jiān)控頁簽,找到ack-advanced-audit組件,單擊組件右下方的卸載,按照頁面提示完成卸載。
相關(guān)文檔
關(guān)于ack-advanced-audit、logtail-ds組件的發(fā)布記錄及說明,請參見ack-advanced-audit、Logtail發(fā)布?xì)v史。
API Server審計(jì)日志功能能夠幫助集群管理人員排查“什么人在什么時(shí)間對什么資源做了什么操作”,請參見使用集群API Server審計(jì)功能。