使用集群API Server审计功能
在Kubernetes集群中,API Server的审计日志可以帮助集群管理人员记录或追溯不同用户的日常操作,是集群安全运维中重要的环节。本文帮助您了解阿里云Kubernetes集群API Server审计日志的相关配置,如何通过日志服务收集、分析审计日志,并根据您的需求为审计日志设置自定义的告警规则,以及如何关闭集群API Server审计功能。
使用说明
- 本文关于集群API Server审计功能的配置适用于ACK托管版集群及ACK专有版集群。关于如何配置注册集群的集群API Server审计功能,请参见在注册集群中使用集群API Server审计功能。
- 注册集群不支持关闭集群API Server审计功能。
配置介绍
配置参数 | 说明 |
audit-log-maxbackup | 审计日志最大分片存储10个日志文件。 |
audit-log-maxsize | 单个审计日志最大内存为100 MB。 |
audit-log-path | 审计日志输出路径为/var/log/kubernetes/kubernetes.audit。 |
audit-log-maxage | 审计日志最多保存期为7天。 |
audit-policy-file | 审计日志配置策略文件,文件路径为:/etc/kubernetes/audit-policy.yml。 |
apiVersion: audit.k8s.io/v1beta1 # This is required.
kind: Policy
# Don't generate audit events for all requests in RequestReceived stage.
omitStages:
- "RequestReceived"
rules:
# The following requests were manually identified as high-volume and low-risk,
# so drop them.
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: "" # core
resources: ["endpoints", "services"]
- level: None
users: ["system:unsecured"]
namespaces: ["kube-system"]
verbs: ["get"]
resources:
- group: "" # core
resources: ["configmaps"]
- level: None
users: ["kubelet"] # legacy kubelet identity
verbs: ["get"]
resources:
- group: "" # core
resources: ["nodes"]
- level: None
userGroups: ["system:nodes"]
verbs: ["get"]
resources:
- group: "" # core
resources: ["nodes"]
- level: None
users:
- system:kube-controller-manager
- system:kube-scheduler
- system:serviceaccount:kube-system:endpoint-controller
verbs: ["get", "update"]
namespaces: ["kube-system"]
resources:
- group: "" # core
resources: ["endpoints"]
- level: None
users: ["system:apiserver"]
verbs: ["get"]
resources:
- group: "" # core
resources: ["namespaces"]
# Don't log these read-only URLs.
- level: None
nonResourceURLs:
- /healthz*
- /version
- /swagger*
# Don't log events requests.
- level: None
resources:
- group: "" # core
resources: ["events"]
# Secrets, ConfigMaps, and TokenReviews can contain sensitive & binary data,
# so only log at the Metadata level.
- level: Metadata
resources:
- group: "" # core
resources: ["secrets", "configmaps"]
- group: authentication.k8s.io
resources: ["tokenreviews"]
# Get repsonses can be large; skip them.
- level: Request
verbs: ["get", "list", "watch"]
resources:
- group: "" # core
- group: "admissionregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "extensions"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "settings.k8s.io"
- group: "storage.k8s.io"
# Default level for known APIs
- level: RequestResponse
resources:
- group: "" # core
- group: "admissionregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "extensions"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "settings.k8s.io"
- group: "storage.k8s.io"
# Default level for all other requests.
- level: Metadata
- 在收到请求后不立即记录日志,当返回体Header发送后才开始记录。
- 对于大量冗余的kube-proxy watch请求,kubelet和system:nodes对于节点的get请求,kube组件在kube-system下对于endpoint的操作,以及API Server对于Namespaces的get请求等不作审计。
- 对于/healthz*,/version*及/swagger*等只读URL不作审计。
- 对于可能包含敏感信息或二进制文件的Secrets,ConfigMaps,tokenreviews接口的日志等级设为metadata,该level只记录请求事件的用户、时间戳、请求资源和动作,而不包含请求体和返回体。
- 对于一些如authentication、rbac、certificates、autoscaling、storage等敏感接口,根据读写记录相应的请求体和返回体。
查看审计报表
容器服务Kubernetes版内置了4个审计日志报表。您可以通过报表获取以下内容。
- 所有用户以及系统组件对集群执行的重要操作。
- 操作的源地址、源地址所属区域以及分布。
- 各类资源的详细操作列表。
- RAM用户操作详细列表。
- 重要操作(登录容器、访问保密字典、删除资源等)的详细列表。
- CVE安全风险。
- 创建集群时候,默认选中使用日志服务,即会自动开通审计报表相关功能。日志服务的计费详情请参见计费说明。若未开通,请参见开通集群API Server审计功能。
- 请不要修改审计报表。如果您有自定义审计报表的需求,请在日志服务管理控制台创建新的报表。
审计报表说明
API Server审计共4个报表。分别是审计中心概览、资源操作概览、资源操作详细列表以及Kubernetes CVE安全风险。
- 审计中心概览
审计中心概览展示Kubernetes集群中的事件整体概览以及重要事件(公网访问、命令执行、删除资源、访问保密字典、Kubernetes CVE安全风险等)的详细信息。
说明 在该报表中,默认显示一周的统计信息。您可以自定义选择统计时间范围。此外,该报表支持指定Namespace、子账号ID(即RAM用户账号)、状态码进行筛选。您可以选择任意一项或多项组合筛选指定范围的事件。 - 资源操作概览
资源操作概览展示Kubernetes集群中常见的计算资源、网络资源以及存储资源的操作统计信息。操作包括创建、更新、删除、访问。其中:
- 计算资源包括:Deployment、StatefulSet、CronJob、DaemonSet、Job、Pod。
- 网络资源包括:Service、Ingress。
- 存储资源包括:ConfigMap、Secret、PersistentVolumeClaim。
说明- 在该报表中,默认显示一周的统计信息。您可以自定义选择统计时间范围。此外,该报表支持指定Namespace、RAM用户ID进行筛选。您可以选择任意一项或多项组合筛选指定范围的事件。
- 若您需要查看对应资源的详细操作事件,请使用资源操作详细列表。
- 资源操作详细列表
该报表用于展示Kubernetes集群中某类资源的详细操作列表。您需要选择或输入指定的资源类型进行实时查询。该报表会显示:资源操作各类事件的总数、Namespace分布、成功率、时序趋势以及详细操作列表等。
说明- 若您需要查看Kubernetes中注册的CRD(CustomResourceDefinition)资源或列表中没有列举的其他资源,可以手动输入资源名的复数形式。例如CRD资源为AliyunLogConfig,则输入AliyunLogConfigs。
- 在该报表中,默认显示一周的统计信息。您可以自定义选择统计时间范围。此外,该报表支持指定Namespace、子账号ID(即RAM用户账号)、状态码进行筛选。您可以选择任意一项或多项组合筛选指定范围的事件。
- Kubernetes CVE安全风险
该报表用于展示当前集群中可能包含的Kubernetes CVE 安全风险,您需要选择或输入子账号ID(即RAM用户账号)进行实时查询。该报表会显示当前账号下的Kubernetes CVE安全风险。关于CVE详情和解决方案,请参见【CVE安全】漏洞修复公告。
查看详细日志记录
- 登录日志服务控制台。
- 在Project列表区域,选择集群使用的日志Project,单击名称进入日志Project页面。
- 在 页签中,单击名为audit-${clustered}的日志库(Logstore)。说明
- 在集群创建过程中,指定的日志Project中会自动添加一个名为
audit-${clustereid}
的日志库。 - 审计日志的Logstore默认已经配置好索引。请不要修改索引,以免报表失效。
- 在集群创建过程中,指定的日志Project中会自动添加一个名为
- 在输入框中输入查询和分析语句。
- 单击15分钟(相对),设置查询分析的时间范围。
- 单击查询/分析,查看查询分析结果。
常见的审计日志搜索方式如下:
- 查询某一RAM用户的操作记录,直接输入RAM用户ID,单击查询/分析。
- 查询某一资源的操作,直接输入资源名,单击查询/分析。
- 过滤掉系统组件的操作,输入
NOT user.username: node NOT user.username: serviceaccount NOT user.username: apiserver NOT user.username: kube-scheduler NOT user.username: kube-controller-manager
,单击查询/分析。
更多查询、统计方式,请参见日志服务查询分析方法。
配置告警
若您需要对某些资源的操作进行实时告警,可以通过日志服务的告警功能实现。告警方式支持短信、钉钉机器人、邮件、自定义Webhook和通知中心。详细操作方式请参见日志服务告警配置。
示例1:对容器执行命令时告警
某公司对于Kubernetes集群使用有严格限制,不允许用户登录容器或对容器执行命令,如果有用户执行命令时需要立即给出告警,并希望告警时能够显示用户登录的具体容器、执行的命令、操作人、事件ID、时间、操作源IP等信息。
- 查询语句为:
verb : create and objectRef.subresource:exec and stage: ResponseStarted | SELECT auditID as "事件ID", date_format(from_unixtime(__time__), '%Y-%m-%d %T' ) as "操作时间", regexp_extract("requestURI", '([^\?]*)/exec\?.*', 1)as "资源", regexp_extract("requestURI", '\?(.*)', 1)as "命令" ,"responseStatus.code" as "状态码", CASE WHEN "user.username" != 'kubernetes-admin' then "user.username" WHEN "user.username" = 'kubernetes-admin' and regexp_like("annotations.authorization.k8s.io/reason", 'RoleBinding') then regexp_extract("annotations.authorization.k8s.io/reason", ' to User "(\w+)"', 1) ELSE 'kubernetes-admin' END as "操作账号", CASE WHEN json_array_length(sourceIPs) = 1 then json_format(json_array_get(sourceIPs, 0)) ELSE sourceIPs END as "源地址" limit 100
- 条件表达式为:
操作事件 =~ ".*"
。
示例2:APIServer公网访问失败告警
某集群开启了公网访问,为防止恶意攻击,需要监控公网访问的次数以及失败率,若访问次数到达一定阈值(10次)且失败率高于一定阈值(50%)则立即告警,并希望告警时能够显示用户的IP所属区域、操作源IP、是否高危IP等信息。
- 查询语句为:
* | select ip as "源地址", total as "访问次数", round(rate * 100, 2) as "失败率%", failCount as "非法访问次数", CASE when security_check_ip(ip) = 1 then 'yes' else 'no' end as "是否高危IP", ip_to_country(ip) as "国家", ip_to_province(ip) as "省", ip_to_city(ip) as "市", ip_to_provider(ip) as "运营商" from (select CASE WHEN json_array_length(sourceIPs) = 1 then json_format(json_array_get(sourceIPs, 0)) ELSE sourceIPs END as ip, count(1) as total, sum(CASE WHEN "responseStatus.code" < 400 then 0 ELSE 1 END) * 1.0 / count(1) as rate, count_if("responseStatus.code" = 403) as failCount from log group by ip limit 10000) where ip_to_domain(ip) != 'intranet' having "访问次数" > 10 and "失败率%" > 50 ORDER by "访问次数" desc limit 100
- 条件表达式为:
源地址 =~ ".*"
。
开通集群API Server审计功能
创建Kubernetes集群时会默认选中使用日志服务,开启集群API Server审计功能。若您还未开通审计报表,需手动开通审计报表。
登录容器服务管理控制台,在左侧导航栏选择集群。
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏中,选择 。若您还未开通审计功能,会提示您需要手动开启。重要
请确保您账号下日志服务的配额没有超限,任意一个日志服务配额超限都会导致集群审计功能开启失败。
- 可创建的日志Project数量配额。
- 单个日志Project内可创建的日志库数量配额。
- 单个日志Project内可创建的仪表盘数量配额。
- 单击开启,选择使用已有 Project或者创建新Project后,单击确定。当出现如下页面时,表示集群API Server审计功能已开启。
更换日志Project
如果您想将集群API Server审计日志数据迁移至另一个日志Project中,您可以使用集群审计中的更换日志Project功能。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
- 在集群审计页面右上角,单击更换日志Project即可将集群审计日志的数据迁移至另一个日志服务的Project中。
关闭集群API Server审计功能
如果您不再需要集群API Server审计功能的话,可以通过以下方法关闭审计功能。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
- 在集群审计页面右上角,单击关闭集群审计即可关闭当前集群的审计功能。
计费说明
支持第三方日志解决方案
您可以在集群Master各节点,在/var/log/kubernetes/kubernetes.audit路径下找到审计日志的源文件。该文件是标准的JSON格式,您可以在部署集群时选择不使用阿里云的日志服务,根据需要对接其他的日志解决方案,完成相关审计日志的采集和检索。