通用數據庫審計是日志服務提供的一種輕量級、低成本數據庫安全方案,支持通過抓包方式上報數據庫的操作行為流量到日志服務SLS。當您將數據庫部署在Kubernetes集群中時,可在容器中部署抓包程序。本文介紹如何在容器中部署抓包程序。
前提條件
已有正在運行的Kubernetes集群,如未創建,推薦使用容器服務 Kubernetes 版。
已創建通用數據庫審計任務。具體操作,請參見配置通用數據庫審計。
說明只需完成配置向導中的任務配置步驟,其余步驟可直接跳過,直至完成。
方案概覽
Kubernetes支持Daemonset和Sidecar兩種部署方式,您可根據實際需要選擇部署。
Daemonset方式
采用Daemonset方式時,需在每個節點上運行一個Daemonset Pod。您需要讓Daemonset Pod擁有網絡監聽能力,使得部署在Daemonset Pod中的抓包程序可以通過節點中veth-pair接口的一端對業務容器中的數據庫的操作行為流量進行抓包。
Sidecar方式
采用Sidecar方式時,sidecar容器與業務容器是部署在同一個Pod下的,共享網絡命名空間。您可以將抓包程序部署在sidecar容器中,用于上報業務容器中的數據庫的操作行為流量。
步驟一:創建ConfigMap
登錄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的訪問域名進行設置。更多信息,請參見服務入口。
|
username | 設置為您在創建通用數據庫審計任務時所選擇的日志服務Project名稱。 |
password | 設置為阿里云賬號的AccessKey,格式為{ak}#{sk}。請根據實際情況,將{ak}替換為您的AccessKey ID,將{sk}替換為您的AccessKey Secret。如何獲取AccessKey,請參見訪問密鑰。 建議使用RAM用戶的AccessKey。更多信息,請參見授權。 |
topic | 設置為日志服務Logstore名稱,固定為general-db-logstore。 該Logstore是您在創建通用數據庫審計任務后,自動生成。 |
執行如下命令,創建ConfigMap。
kubectl create configmap packetbeat-config --from-file=packetbeat.yml=packetbeat.yml
步驟二:部署抓包程序
方式一:Daemonset模式部署
登錄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
執行如下命令,創建packetbeat-daemonset容器。
kubectl apply -f packetbeat-daemonset.yaml
方式二:Sidecar模式部署
登錄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
執行如下命令,創建packetbeat-sidecar容器。
kubectl apply -f packetbeat-sidecar.yaml
后續步驟
在目標通用數據庫審計任務中,查看已上報的數據。具體操作,請參見數據報表。