OpenShift 4 - 集群节点日志和API审计日志策略

76 篇文章 6 订阅
59 篇文章 2 订阅

OpenShift / RHEL / DevSecOps 汇总目录
说明:本文已经在OpenShift 4.8 环境中验证

集群节点日志

集群节点日志类型

  1. 执行以下命令,可以在任一个 Master 节点中查看在 RHCOS 中的所有日志目录和文件。其中一部分是RHCOS系统级服务日志,而
    openshift-apiserver、kube-apiserver、oauth-apiserver 是 OpenShift
    集群的API级别日志。
$ CONTROL_NODE=$(oc get nodes -l node-role.kubernetes.io/master= -o jsonpath='{.items[0].metadata.name}')
$ oc adm node-logs $CONTROL_NODE --path=/
audit/
btmp
chrony/
containers/
crio/
etcd/
glusterfs/
journal/
kube-apiserver/
lastlog
oauth-apiserver/
openshift-apiserver/
openvswitch/
pods/
private/
qemu-ga/
samba/
sssd/
wtmp
  1. 分别执行命令,可以查看角色为 Master 节点的 openshift-apiserver、kube-apiserver、oauth-apiserver 日志文件。
$ oc adm node-logs --role=master --path=openshift-apiserver/
ip-10-0-135-39.us-east-2.compute.internal audit.log
ip-10-0-173-152.us-east-2.compute.internal audit.log
ip-10-0-173-213.us-east-2.compute.internal audit.log
 
$ oc adm node-logs --role=master --path=kube-apiserver/
 
$ oc adm node-logs --role=master --path=oauth-apiserver/
  1. 还可以查看主机系统级别的日志,或者按照关键字查看主机系统日志。
$ oc adm node-logs $CONTROL_NODE --path=journal | wc -l
$ oc adm node-logs $CONTROL_NODE -u kubelet | wc -l

收集集群节点日志

可以通过以下命令将集群节点的重要日志(etcd、kube-apiserver、openshift-apiserver、oauth-apiserver)下载到本地。

$ oc adm must-gather -- /usr/bin/gather_audit_logs 
$ ll must-gather.local.xxxxxxx/quay-io-openshift-release-dev-ocp-xxxxxxx/audit_logs/
total 24
drwxr-xr-x. 2 lab-user users  230 Mar  5 01:06 etcd
-rw-r--r--. 1 lab-user users  194 Mar  5 01:06 etcd.audit_logs_listing
drwxr-xr-x. 2 lab-user users 4096 Mar  5 01:07 kube-apiserver
-rw-r--r--. 1 lab-user users 3025 Mar  5 01:06 kube-apiserver.audit_logs_listing
drwxr-xr-x. 4 lab-user users   92 Mar  5 01:06 monitoring
drwxr-xr-x. 2 lab-user users  194 Mar  5 01:07 oauth-apiserver
-rw-r--r--. 1 lab-user users  158 Mar  5 01:06 oauth-apiserver.audit_logs_listing
drwxr-xr-x. 2 lab-user users  194 Mar  5 01:07 openshift-apiserver
-rw-r--r--. 1 lab-user users  158 Mar  5 01:06 openshift-apiserver.audit_logs_listing

OpenShift API 的审计日志

审计日志会记录访问 OpenShift API 服务、Kubernetes API 服务和 OAuth API 服务的请求。其中 OpenShift API 审计日志按时间排序记录用户、管理员或其他系统组件访问OpenShift API 服务的活动。审计日志的内容分散在不同 Node 上的 /var/log/openshift-apiserver/audit.log 文件中,内容为 JSON 格式。

OpenShift API 审计日志内容

以下是 OpenShift API 审计日志的主要内容:

  • auditID:为每个请求生成的唯一审计 ID。
  • verb:与请求相关联的 Kubernetes 操作动词。
  • user:经过身份验证的用户和组信息。
  • requestObject:请求中的 API 对象。
  • responseObject:响应中返回的API 对象。
  • requestReceivedTimestamp:请求到达当前审计阶段的时间。
  • stageTimestamp:请求到达当前审计阶段的时间。

其中根据对用户认证结果,以上 user 可以所属以下三类组:

Virtual 组描述
system:authenticated关联到所有认证过的用户
system:authenticated:oauth关联到所有认证过并带有OAuth访问令牌的用户
system:unauthenticated关联到所有未经认证的用户

OpenShift API 审计日志策略

OpenShift 提供以下4中预定义的审计策略配置,不同的策略记录的审计日志内容范围有差别。

审计策略名称描述
Default仅记录读取和写入请求的日志元数据 ;除了 OAuth 访问令牌请求外,不记录请求正文。这是默认策略。
WriteRequestBodies仅除了记录所有请求的元数据外,同时记录对 API 服务器的写入请求(create、update、patch)的具体数据(body)。这个配置集的资源开销比 Default 配置集大。
AllRequestBodies除了记录所有请求的元数据外,对 API 服务器的每个读写请求(get、list、create、update、patch)都进行日志记录。这个配置集的资源开销最大。
None关闭审计日志。

查看审计日志的命令和操作

  1. 执行命令,查看一个节点的访问审计日志中的一条日志。注意审计日志中的内容。
$ oc adm node-logs $CONTROL_NODE --path=openshift-apiserver/audit.log | tail -1 | jq '{requestReceivedTimestamp,verb,username: .user.username,usergroups: .user.groups,requestObject}'
{
  "requestReceivedTimestamp": "2022-03-06T02:27:37.343244Z",
  "kind": "Event",
  "verb": "watch",
  "username": "system:serviceaccount:openshift-ingress:router",
  "usergroups": [
    "system:serviceaccounts",
    "system:serviceaccounts:openshift-ingress",
    "system:authenticated"
  ],
  "requestObject": null
}

使用缺省的 API 审计日志配置

缺省情况,API 审计日志不记录requestObjectresponseObject中的内容。

  1. 执行命令,查看升级日志的配置。缺省只有 “profile: Default” 一行。
$ oc get apiserver cluster -oyaml
apiVersion: config.openshift.io/v1
kind: APIServer
metadata:
。。。
spec:
  audit:
    profile: Default
  1. 执行命令修改审计日志使用的缺省profile为“WriteRequestBodies”。修改后需确认 openshift-apiserver、kube-apiserver、authentication的 clusteroperator 都恢复 AVAILABLE再继续下面的操作。
$ oc patch apiserver/cluster -p '{"spec":{"audit":{"profile":"WriteRequestBodies"}}}' --type merge 
$ oc get clusteroperator openshift-apiserver kube-apiserver authentication
NAME                  VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
authentication        4.10.1    True        False         False      100m
kube-apiserver        4.10.1    True        False         False      7h31m
openshift-apiserver   4.10.1    True        False         False      5h19m
  1. 先确认当前没有和 “my-project1” 项目有关的审计日志。
$ oc adm node-logs --role=master --path=openshift-apiserver/audit.log | awk 'sub($1,"")' | jq 'select(.objectRef.name == "my-project1") | {requestReceivedTimestamp,verb,username: .user.username,usergroups: .user.groups,requestObject}'
  1. 创建一个新项目 “my-project1”。
$ oc new-project my-project1
  1. 再确认已经有了 “my-project1” 内容的日志。注意:
    . “verb: get” 操作不会有 requestObjects;“verb: create”操作会有 requestObjects。
    . 返回记录不是按照 “requestReceivedTimestamp” 排序的,而是按照结果中不包含的 “stageTimestamp” 排序的。
    . 用户在 OpenShift 中创建项目时,用户创建的只是 “ProjectRequest”,而真正的项目是由 ServiceAccount:“system:serviceaccount:openshift-apiserver:openshift-apiserver-sa” 创建的。
$ oc adm node-logs --role=master --path=openshift-apiserver/audit.log | awk 'sub($1,"")' | jq 'select(.objectRef.name == "my-project1") | {requestReceivedTimestamp,verb,username: .user.username,usergroups: .user.groups,requestObject}'

{
  "requestReceivedTimestamp": "2022-03-06T03:21:59.175551Z",
  "verb": "get",
  "username": "system:serviceaccount:openshift-apiserver:openshift-apiserver-sa",
  "usergroups": [
    "system:serviceaccounts",
    "system:serviceaccounts:openshift-apiserver",
    "system:authenticated"
  ],
  "requestObject": null
}
{
  "requestReceivedTimestamp": "2022-03-06T03:21:59.192883Z",
  "verb": "create",
  "username": "system:serviceaccount:openshift-apiserver:openshift-apiserver-sa",
  "usergroups": [
    "system:serviceaccounts",
    "system:serviceaccounts:openshift-apiserver",
    "system:authenticated"
  ],
  "requestObject": {
    "kind": "Project",
    "apiVersion": "project.openshift.io/v1",
    "metadata": {
      "name": "my-project1",
      "creationTimestamp": null,
      "annotations": {
        "openshift.io/description": "",
        "openshift.io/display-name": "",
        "openshift.io/requester": "opentlc-mgr"
      }
    },
    "spec": {},
    "status": {}
  }
}
{
  "requestReceivedTimestamp": "2022-03-06T03:21:59.356254Z",
  "verb": "get",
  "username": "system:serviceaccount:openshift-apiserver:openshift-apiserver-sa",
  "usergroups": [
    "system:serviceaccounts",
    "system:serviceaccounts:openshift-apiserver",
    "system:authenticated"
  ],
  "requestObject": null
}
{
  "requestReceivedTimestamp": "2022-03-06T03:21:59.167383Z",
  "verb": "create",
  "username": "opentlc-mgr",
  "usergroups": [
    "system:masters",
    "system:authenticated"
  ],
  "requestObject": {
    "kind": "ProjectRequest",
    "apiVersion": "project.openshift.io/v1",
    "metadata": {
      "name": "my-project1",
      "creationTimestamp": null
    }
  }
}

个性化 API 审计日志配置规则

下面操作将修改API审计日志配置:
. 缺省使用 Default 日志配置,即不记录所有操作的 Request 部分。
. 当用户所属组为 “system:authenticated:oauth”,则使用 Default 日志配置,即不记录所有操作的 Request 部分。
. 当用户所属组为 “system:authenticated”,则使用 WriteRequestBodies 日志配置,即只记录Write操作的 Request 部分。

  1. 修改集群的 API 审计日志配置
$ oc edit apiserver cluster
  1. 根据以下内容修改配置。
apiVersion: config.openshift.io/v1
kind: APIServer
metadata:
...
spec:
  audit:
    customRules: 
    - group: system:authenticated:oauth
      profile: Default
    - group: system:authenticated
      profile: WriteRequestBodies 
    profile: Default 
  1. 修改后需确认 openshift-apiserver、kube-apiserver、authentication的 clusteroperator 都恢复 AVAILABLE再继续下面的操作。
$ oc get clusteroperator openshift-apiserver kube-apiserver authentication
NAME                  VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
openshift-apiserver   4.10.1    True        False         False      5h19m
kube-apiserver        4.10.1    True        False         False      7h32m
authentication        4.10.1    True        False         False      101m
  1. 再创建一个项目。确认在返回结果中用户所属组为 “system:authenticated:oauth” 的时候将不记录 Request 对象。
$ oc new-project my-project2
$ oc adm node-logs --role=master --path=openshift-apiserver/audit.log | awk 'sub($1,"")' | jq 'select(.objectRef.name == "my-project2") | {requestReceivedTimestamp,verb,username: .user.username,usergroups: .user.groups,requestObject}'

{
  "requestReceivedTimestamp": "2022-03-06T08:00:23.084097Z",
  "verb": "get",
  "username": "system:serviceaccount:openshift-apiserver:openshift-apiserver-sa",
  "usergroups": [
    "system:serviceaccounts",
    "system:serviceaccounts:openshift-apiserver",
    "system:authenticated"
  ],
  "requestObject": null
}
{
  "requestReceivedTimestamp": "2022-03-06T08:00:23.133258Z",
  "verb": "create",
  "username": "system:serviceaccount:openshift-apiserver:openshift-apiserver-sa",
  "usergroups": [
    "system:serviceaccounts",
    "system:serviceaccounts:openshift-apiserver",
    "system:authenticated"
  ],
  "requestObject": {
    "kind": "Project",
    "apiVersion": "project.openshift.io/v1",
    "metadata": {
      "name": "my-project2",
      "creationTimestamp": null,
      "annotations": {
        "openshift.io/description": "",
        "openshift.io/display-name": "",
        "openshift.io/requester": "opentlc-mgr"
      }
    },
    "spec": {},
    "status": {}
  }
}
{
  "requestReceivedTimestamp": "2022-03-06T08:00:23.378818Z",
  "verb": "get",
  "username": "system:serviceaccount:openshift-apiserver:openshift-apiserver-sa",
  "usergroups": [
    "system:serviceaccounts",
    "system:serviceaccounts:openshift-apiserver",
    "system:authenticated"
  ],
  "requestObject": null
}
{
  "requestReceivedTimestamp": "2022-03-06T08:00:23.073977Z",
  "verb": "create",
  "username": "opentlc-mgr",
  "usergroups": [
    "system:authenticated:oauth",
    "system:authenticated"
  ],
  "requestObject": null
}

参考

https://learning.redhat.com/mod/scorm/player.php?a=2175&currentorg=&scoid=4951&sesskey=bmCgDdE67n&display=popup&mode=normal
https://access.redhat.com/documentation/zh-cn/openshift_container_platform/4.9/html-single/security_and_compliance/index#audit-log-view

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值