Kubernetes中的通用数据库审计部署方案

通用数据库审计是日志服务提供的一种轻量级、低成本数据库安全方案,支持通过抓包方式上报数据库的操作行为流量到日志服务SLS。当您将数据库部署在Kubernetes集群中时,可在容器中部署抓包程序。本文介绍如何在容器中部署抓包程序。

前提条件

  • 已有正在运行的Kubernetes集群,如未创建,推荐使用容器服务 Kubernetes 版

  • 已创建通用数据库审计任务。具体操作,请参见配置通用数据库审计

    说明

    只需完成配置向导中的任务配置步骤,其余步骤可直接跳过,直至完成。

方案概览

Kubernetes支持Daemonset和Sidecar两种部署方式,您可根据实际需要选择部署。

  • Daemonset方式

    采用Daemonset方式时,需在每个节点上运行一个Daemonset Pod。您需要让Daemonset Pod拥有网络监听能力,使得部署在Daemonset Pod中的抓包程序可以通过节点中veth-pair接口的一端对业务容器中的数据库的操作行为流量进行抓包。

  • Sidecar方式

    采用Sidecar方式时,sidecar容器与业务容器是部署在同一个Pod下的,共享网络命名空间。您可以将抓包程序部署在sidecar容器中,用于上报业务容器中的数据库的操作行为流量。

步骤一:创建ConfigMap

  1. 登录Kubernetes控制台服务器,创建一个名为packetbeat.yml的YAML文件,并写入以下内容,请根据实际情况设置其中的参数。

packetbeat.interfaces.device: any

# Set `enabled: false` or comment out all options to disable flows reporting.
packetbeat.flows:
  timeout: 30s
  period: 10s

packetbeat.protocols:
- type: mysql
  ports: [3306,3307]

output.kafka:
  hosts: ["test-project.cn-hangzhou.log.aliyuncs.com:10012"]
  username: "test-project"
  password: "{ak}#{sk}"
  ssl.certificate_authorities:
  topic: 'general-db-logstore'
  partition.round_robin:
    reachable_only: false

  required_acks: 1
  compression: gzip
  max_message_bytes: 1000000
说明

packetbeat.flows用于捕获网络设备的所有流量。如果不需要,可添加enabled:false,以减少数据的传输。

重要参数说明如下,其他参数说明请参见Configure Packetbeat

参数

说明

hosts

设置连接地址,格式为{Project名称}.{Endpoint}:Port,请根据Project的访问域名进行设置。更多信息,请参见服务入口

  • 阿里云内网:端口号为10011,例如test-project.cn-hangzhou-intranet.log.aliyuncs.com:10011。

  • 公网:端口号为10012,例如test-project.cn-hangzhou.log.aliyuncs.com:10012。

username

设置为您在创建通用数据库审计任务时所选择的日志服务Project名称。

password

设置为阿里云账号的AccessKey,格式为{ak}#{sk}。请根据实际情况,将{ak}替换为您的AccessKey ID,将{sk}替换为您的AccessKey Secret。如何获取AccessKey,请参见访问密钥

建议使用RAM用户的AccessKey。更多信息,请参见授权

topic

设置为日志服务Logstore名称,固定为general-db-logstore。

该Logstore是您在创建通用数据库审计任务后,自动生成。

  1. 执行如下命令,创建ConfigMap。

    kubectl create configmap packetbeat-config --from-file=packetbeat.yml=packetbeat.yml

步骤二:部署抓包程序

方式一:Daemonset模式部署

  1. 登录Kubernetes 控制台服务器,创建一个名为packetbeat-daemonset.yaml的YAML文件,并写入以下内容。

    说明
    • hostNetwork: true表示开启hostNetwork,使得Daemonset Pod可以感知到Host机器上的网络设备。

    • - NET_ADMIN表示增加NET_ADMIN能力,用于监听网络设备的流量。

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: packetbeat-daemonset
      namespace: default
    spec:
      selector:
        matchLabels:
          app: packetbeat-daemonset
      template:
        metadata:
          name: packetbeat-daemonset
          labels:
             app: packetbeat-daemonset
        spec:
          restartPolicy: Always
          hostNetwork: true
          containers:
          - name: packetbeat
            image: docker.elastic.co/beats/packetbeat:8.1.0
            resources:
              limits:
                cpu: 500m
                memory: 200Mi
              requests:
                cpu: 100m
                memory: 200Mi
            command: ["/bin/sh", "-c"]
            args: ["/usr/share/packetbeat/packetbeat --strict.perms=false --path.config=/etc/packetbeat/config"]
            securityContext:
              capabilities:
                add:
                - NET_ADMIN
            volumeMounts:
            - name: packetbeat-config
              mountPath: /etc/packetbeat/config
          terminationGracePeriodSeconds: 30
    
          volumes:
          - name: packetbeat-config
            configMap:
              name: packetbeat-config
              items:
              - key: packetbeat.yml
                path: packetbeat.yml          
  2. 执行如下命令,创建packetbeat-daemonset容器。

    kubectl apply -f packetbeat-daemonset.yaml

方式二:Sidecar模式部署

  1. 登录Kubernetes 控制台服务器,执行如下命令创建一个名为packetbeat-sidecar.yaml的YAML文件,并写入以下内容。

    说明

    mysql-test为业务容器名称,请根据实际情况替换。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: packetbeat-sidecar
      namespace: default
    spec:
      selector:
        matchLabels:
          app: packetbeat-sidecar
      template:
        metadata:
          name: packetbeat-sidecar
          labels:
             app: packetbeat-sidecar
        spec:
          restartPolicy: Always
          containers:
          - name: mysql-test
            image: imega/mysql-client
            command: ["/bin/sh", "-c"]
            args: ["mysql --host='xxx' --user=xxx --password='xxx' --database=mysql --execute='show tables;'; sleep 6000"]
    
          - name: packetbeat-sidecar
            image: docker.elastic.co/beats/packetbeat:8.1.0
            command: ["/bin/sh", "-c"]
            args: ["/usr/share/packetbeat/packetbeat --strict.perms=false --path.config=/etc/packetbeat/config"]
            securityContext:
              capabilities:
                add:
                - NET_ADMIN
            volumeMounts:
            - name: packetbeat-config
              mountPath: /etc/packetbeat/config
    
          volumes:
          - name: packetbeat-config
            configMap:
              name: packetbeat-config
              items:
              - key: packetbeat.yml
                path: packetbeat.yml
                            
  2. 执行如下命令,创建packetbeat-sidecar容器。

    kubectl apply -f packetbeat-sidecar.yaml

后续步骤

在目标通用数据库审计任务中,查看已上报的数据。具体操作,请参见数据报表