接入K8s自建集群

云安全中心支持接入K8s(Kubernetes)自建集群进行统一管理和安全风险检测。本文介绍如何接入K8s自建集群。

版本限制

仅云安全中心的旗舰版支持该功能,其他版本不支持。购买和升级云安全中心服务的具体操作,请参见购买云安全中心升级与降配

使用限制

支持接入的地域限制如下:

  • 自建K8s集群网络类型为VPC时,仅支持接入华东1(杭州)、华北2(北京)、华东2(上海)、华南1(深圳)和中国香港地域。

  • 自建K8s集群网络类型为公网时,无地域限制。

前提条件

  • 已在服务器上搭建K8s集群。具体操作,请参见从零搭建K8s集群

  • 已安装Docker。具体操作,请参见安装Docker

  • 如果您的K8s集群是通过混合云的方式部署,且公网不可直接访问,那么您需要先配置流量转发规则,确保网络连通后再进行集群接入。

    如何配置流量转发规则?

    指定一台ECS服务器,将其访问流量转发到第三方K8s集群API Server所在的IDC服务器上。

    例如:将执行转发任务的ECS服务器10.0.XX.XX中A端口的流量,转发至第三方K8s集群API Server所在的IDC服务器192.168.XX.XX的B端口。

    • CentOS 7命令

      • 使用firewallcmd:

        firewall-cmd --permanent --add-forward-port=port=<A端口>:proto=tcp:toaddr=<192.168.XX.XX>:toport=<B端口>
      • 使用iptables:

      • # 开启端口转发
        echo "1" 	> /proc/sys/net/ipv4/ip_forward
        
        # 设置端口转发
        iptables -t nat -A PREROUTING -p tcp --dport <A端口> -j DNAT --to-destination <192.168.XX.XX>:<B端口>
    • Windows命令

      netsh interface portproxy add v4tov4 listenport=<端口A> listenaddress=* connectaddress=<192.168.XX.XX	> connectport=<端口B> protocol=tcp
  • 如果您的集群设置了访问控制策略,请确保已将容器所在地域的IP地址池加入访问控制的白名单。

    需要加白的IP地址池

    地域

    公网IP

    私网IP

    华东1(杭州)

    47.96.166.214

    100.104.12.64/26

    华东2(上海)

    139.224.15.48、101.132.180.26、47.100.18.171、47.100.0.176、139.224.8.64、101.132.70.106、101.132.156.228、106.15.36.12、139.196.168.125、47.101.178.223、47.101.220.176

    100.104.43.0/26

    华北1(青岛)

    47.104.111.68

    100.104.87.192/26

    华北2(北京)

    47.95.202.245

    100.104.114.192/26

    华北3(张家口)

    39.99.229.195

    100.104.187.64/26

    华北5(呼和浩特)

    39.104.147.68

    100.104.36.0/26

    华南1(深圳)

    120.78.64.225

    100.104.250.64/26

    华南3(广州)

    8.134.118.184

    100.104.111.0/26

    中国香港

    8.218.59.176

    100.104.130.128/26

    日本(东京)

    47.74.24.20

    100.104.69.0/26

    新加坡

    8.219.240.137

    100.104.67.64/26

    美国(硅谷)

    47.254.39.224

    100.104.145.64/26

    美国(弗吉尼亚)

    47.252.4.238

    100.104.36.0/26

    德国(法兰克福)

    47.254.158.71

    172.16.0.0/20

    英国(伦敦)

    8.208.14.12

    172.16.0.0/20

    印度尼西亚(雅加达)

    149.129.238.99

    100.104.193.128/26

接入K8s自建集群

  1. 登录云安全中心控制台。在控制台左上角,选择需防护资产所在的区域:中国全球(不含中国)

  2. 在左侧导航栏,选择资产中心 > 容器资产

  3. 集群页签,单击自建集群接入

  4. 自建集群管理面板,单击自建集群接入,配置要接入的K8s自建集群的信息,然后单击生成命令

    配置项

    说明

    集群名称

    输入自建K8s集群的名称,例如:text-001。

    过期时间

    选择自建K8s集群接入命令的过期时间。

    分组

    选择集群接入后的分组(即选择集群所在服务器的分组)。

    服务商

    选择集群所在服务器的服务商。

  5. (可选)在开启日志区域,选择是否开启K8s日志威胁检测。

    开启K8s日志威胁检测,云安全中心可以获取更多的审计日志以进行更全面的安全风险检测。开启威胁检测前,您需要在K8s集群中安装Logtail组件并完成审计相关配置。具体操作,请参见开启日志威胁检测

  6. 登录集群所在服务器,新建text-001.yaml文件,将生成的命令拷贝到该文件中保存,然后执行kubectl apply -f text-001.yaml命令,完成集群接入。

    说明

    上述text-001.yaml、kubectl apply -f text-001.yaml中的text-001为集群名称的示例。实际操作时,请使用实际设置的集群名称替换text-001。

    完成K8s自建集群接入后,您可以在集群页签的集群列表中查看已接入集群的信息。

开启日志威胁检测

K8s集群版本为1.16及以上时,您可以通过开启K8s日志威胁检测为自建集群提供更全面的安全风险检测,例如检测高危操作、攻击行为等。

一、安装Logtail组件

具体操作,请参见安装Logtail组件(自建Kubernetes集群)安装Logtail章节。

二、开启集群审计功能

以下步骤供您参考。更多信息,请参见启用集群API Server审计功能

  1. 已创建注册集群,并将自建Kubernetes集群接入注册集群。具体操作,请参见通过控制台创建注册集群

  2. 在Master节点上配置审计配置策略文件。

    依次登录所有Master节点,在审计配置策略文件的路径/etc/kubernetes/audit-policy.yaml,请根据以下内容修改审计配置策略:

    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
  3. 在Master节点上配置Kube API Server文件。

    依次登录所有Master节点机器,在Kube API Server文件的路径/etc/kubernetes/manifests/kube-apiserver.yaml,完成以下相关配置:

    • 根据以下示例添加command参数--audit-log-*

      ...
      spec:
        containers:
        - command:
          - kube-apiserver
          - --audit-log-maxbackup=10
          - --audit-log-maxsize=100
          - --audit-log-path=/var/log/kubernetes/kubernetes.audit
          - --audit-log-maxage=30
          - --audit-policy-file=/etc/kubernetes/audit-policy.yaml
          ...
    • 根据以下示例添加env参数aliyun_logs_audit-*

      您需要将以下示例中的{cluster_id}替换为您集群的Cluster ID。您可以登录云安全中心控制台,在容器资产页面获取集群的Cluster ID,具体位置请参见下图。获取集群Cluster-ID

      ...
      spec:
        containers:
        - command:
          - kube-apiserver
          - --audit-log-maxbackup=10
          - --audit-log-maxsize=100
          - --audit-log-path=/var/log/kubernetes/kubernetes.audit
          - --audit-log-maxage=30
          - --audit-policy-file=/etc/kubernetes/audit-policy.yaml
          ...
          ...
          env:
          - name: aliyun_logs_audit-${cluster_id}
            value: /var/log/kubernetes/kubernetes.audit
          - name: aliyun_logs_audit-${cluster_id}_tags
            value: audit=apiserver
          - name: aliyun_logs_audit-${cluster_id}_product
            value: k8s-audit
          - name: aliyun_logs_audit-${cluster_id}_jsonfile
            value: "true"
          image: registry-vpc.cn-shenzhen.aliyuncs.com/acs/kube-apiserver:v1.20.4-aliyun.1
    • 根据以下示例挂载/etc/kubernetes/audit-policy.yaml到API Server Pod。

      ...
      spec:
        containers:
        - command:
          - kube-apiserver
          - --audit-log-maxbackup=10
          - --audit-log-maxsize=100
          - --audit-log-path=/var/log/kubernetes/kubernetes.audit
          - --audit-log-maxage=30
          - --audit-policy-file=/etc/kubernetes/audit-policy.yaml
          ...
          ...
          env:
          - name: aliyun_logs_audit-${cluster_id}
            value: /var/log/kubernetes/kubernetes.audit
          - name: aliyun_logs_audit-${cluster_id}_tags
            value: audit=apiserver
          - name: aliyun_logs_audit-${cluster_id}_product
            value: k8s-audit
          - name: aliyun_logs_audit-${cluster_id}_jsonfile
            value: "true"
          image: registry-vpc.cn-shenzhen.aliyuncs.com/acs/kube-apiserver:v1.20.4-aliyun.1
          ...
          ...
          volumeMounts:
          - mountPath: /var/log/kubernetes
            name: k8s-audit
          - mountPath: /etc/kubernetes/audit-policy.yaml
            name: audit-policy
            readOnly: true
          ...
          ...
        volumes:
        - hostPath:
            path: /var/log/kubernetes
            type: DirectoryOrCreate
          name: k8s-audit
        - hostPath:
            path: /etc/kubernetes/audit-policy.yaml
            type: FileOrCreate
          name: audit-policy
        ...

三、验证日志采集结果

  1. 登录日志服务控制台

  2. 单击目标Project名称。

  3. 查看相关日志是否已采集到目标Project下的日志库(Logstore)。

四、开启威胁检测

  1. 登录云安全中心控制台。在控制台左上角,选择需防护资产所在的区域:中国全球(不含中国)

  2. 在左侧导航栏,选择资产中心 > 容器资产

  3. 集群页签,单击自建集群接入

  4. 找到需要开启K8s日志威胁检测的自建集群,在操作列单击编辑

  5. 开启日志页签,选中开启K8S日志上报进行威胁检测,配置审计日志信息,然后单击保存

    • 审计日志Region:选择审计日志的存储地域。

    • 审计日志Project:输入一、安装Logtail组件中创建的Project名称。例如:如k8s-log-custom-sd89ehdq。

    • 审计日志LogStore:输入一、安装Logtail组件中自动创建的LogStore名称。例如:audit-027b007a7dd11967a9f7e2449d8dc497。