KSPM 入门编辑

本页面介绍如何配置 Kubernetes 安全态势管理 (KSPM) 集成。

安装说明取决于您是在 EKS 上安装还是在非托管集群上安装。

为 Amazon EKS 集群设置 KSPM编辑

命名您的集成并选择 Kubernetes 部署类型编辑
  1. 转到 仪表盘 → 云安全态势.
  2. 点击 添加 KSPM 集成.
  3. 阅读集成描述以了解其工作原理。然后,点击 添加 Kubernetes 安全态势管理.
  4. 命名您的集成。使用与您要监控的集群(s)的用途或团队匹配的名称,例如 IT-dev-k8s-clusters
  5. Kubernetes 部署 菜单中选择 EKS。AWS 凭据的新部分将出现。
对 AWS 进行身份验证编辑

提供 AWS 凭据的方式有多种

无论您使用哪种方式,都需要授予以下权限

ecr:GetRegistryPolicy,
eks:ListTagsForResource
elasticloadbalancing:DescribeTags
ecr-public:DescribeRegistries
ecr:DescribeRegistry
elasticloadbalancing:DescribeLoadBalancerPolicyTypes
ecr:ListImages
ecr-public:GetRepositoryPolicy
elasticloadbalancing:DescribeLoadBalancerAttributes
elasticloadbalancing:DescribeLoadBalancers
ecr-public:DescribeRepositories
eks:DescribeNodegroup
ecr:DescribeImages
elasticloadbalancing:DescribeLoadBalancerPolicies
ecr:DescribeRepositories
eks:DescribeCluster
eks:ListClusters
elasticloadbalancing:DescribeInstanceHealth
ecr:GetRepositoryPolicy

如果您使用 AWS 可视化编辑器创建和修改 IAM 策略,则可以复制并粘贴此 IAM 策略 JSON 对象

点击查看 JSON 对象
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ecr:GetRegistryPolicy",
                "eks:ListTagsForResource",
                "elasticloadbalancing:DescribeTags",
                "ecr-public:DescribeRegistries",
                "ecr:DescribeRegistry",
                "elasticloadbalancing:DescribeLoadBalancerPolicyTypes",
                "ecr:ListImages",
                "ecr-public:GetRepositoryPolicy",
                "elasticloadbalancing:DescribeLoadBalancerAttributes",
                "elasticloadbalancing:DescribeLoadBalancers",
                "ecr-public:DescribeRepositories",
                "eks:DescribeNodegroup",
                "ecr:DescribeImages",
                "elasticloadbalancing:DescribeLoadBalancerPolicies",
                "ecr:DescribeRepositories",
                "eks:DescribeCluster",
                "eks:ListClusters",
                "elasticloadbalancing:DescribeInstanceHealth",
                "ecr:GetRepositoryPolicy"
            ],
            "Resource": "*"
        }
    ]
}
选项 1 - [推荐] 使用 Kubernetes 服务帐户来假定 IAM 角色编辑

遵循 AWS 的 EKS 最佳实践 文档以使用 IAM 角色到 Kubernetes 服务帐户 (IRSA) 功能来获取临时凭据和范围权限。

在设置期间,请不要在“设置访问”部分填写任何选项。而是点击 保存并继续.

选项 2 - 使用默认实例角色编辑

遵循 AWS 的 Amazon EC2 的 IAM 角色 文档以使用 IAM 控制台创建 IAM 角色,该角色会自动生成实例配置文件。

在设置期间,请不要在“设置访问”部分填写任何选项。点击 保存并继续.

选项 3 - 直接使用访问密钥编辑

访问密钥是 IAM 用户或 AWS 帐户根用户的长期凭据。要使用访问密钥作为凭据,您必须提供 Access key IDSecret Access Key

有关更多详细信息,请参阅 AWS 的 访问密钥和密钥访问密钥 文档。

创建 IAM 用户时,您必须选择“程序化访问”。

选项 4 - 使用临时安全凭据编辑

您可以在 AWS 中配置临时安全凭据,使其持续指定时间。它们包括访问密钥 ID、密钥访问密钥和安全令牌,该令牌通常使用 GetSessionToken 找到。

由于临时安全凭据是短期凭据,因此一旦它们过期,您将需要生成新的凭据并手动更新集成的配置才能继续收集云态势数据。在凭据过期之前更新凭据以避免数据丢失。

启用了多因素身份验证 (MFA) 的 IAM 用户在调用 GetSessionToken 时需要提交 MFA 代码。有关更多详细信息,请参阅 AWS 的 临时安全凭据 文档。

您可以使用 AWS CLI 生成临时凭据。例如,如果您启用了 MFA,则可以使用以下命令

`sts get-session-token --serial-number arn:aws:iam::1234:mfa/[email protected] --duration-seconds 129600 --token-code 123456`

此命令的输出包括以下字段,您应该在配置 KSPM 集成时提供这些字段

  • Access key ID: 访问密钥的第一部分。
  • Secret Access Key: 访问密钥的第二部分。
  • Session Token: 使用临时安全凭据时所需的令牌。
选项 5 - 使用共享凭据文件编辑

如果您对不同的工具或应用程序使用不同的 AWS 凭据,则可以使用配置文件在同一个配置文件中定义多个访问密钥。有关更多详细信息,请参阅 AWS 的 共享凭据文件 文档。

不要将 Access key IDSecret Access Key 提供给集成,而是提供在共享凭据文件中查找访问密钥所需的信息

  • Credential Profile Name: 共享凭据文件中的配置文件名称。
  • Shared Credential File: 共享凭据文件的目录。

如果您没有为所有配置字段提供值,则集成将使用以下默认值

  • 如果未提供 Access key IDSecret Access KeyARN Role,则集成将检查 Credential Profile Name
  • 如果没有 Credential Profile Name,则将使用默认配置文件。
  • 如果 Shared Credential File 为空,则将使用默认目录。
  • 对于 Linux 或 Unix,共享凭据文件位于 ~/.aws/credentials
选项 6 - 使用 IAM 角色 Amazon 资源名称 (ARN)编辑

IAM 角色 Amazon 资源名称 (ARN) 是您可以在 AWS 帐户中创建的 IAM 标识。您可以定义角色的权限。角色没有标准的长期凭据,例如密码或访问密钥。相反,当您假定一个角色时,它会为您 的会话提供临时安全凭据。IAM 角色的 ARN 可用于指定要用于生成临时凭据的 AWS IAM 角色。

有关更多详细信息,请参阅 AWS 的 AssumeRole API 文档。遵循 AWS 的说明以 创建 IAM 用户,并使用上面的 JSON 权限策略定义 IAM 角色的权限。

要使用 IAM 角色的 ARN,您需要提供 凭据配置文件访问密钥 以及 ARN roleARN Role 值指定要用于生成临时凭据的 AWS IAM 角色。

如果存在 ARN Role,则集成将检查是否提供了 Access key IDSecret Access Key。如果没有,则该包将检查 Credential Profile Name。如果不存在 Credential Profile Name,则将使用默认凭据配置文件。

完成为 EKS 配置 KSPM 集成编辑

提供 AWS 凭据后,完成 KSPM 集成的配置

  1. 如果您要监控尚未注册到 Fleet 的 Kubernetes 集群,请在“在何处添加此集成”下选择 新主机
  2. 命名 Elastic Agent 策略。使用与您要监控的集群(s)的用途或团队匹配的名称。例如,IT-dev-k8s-clusters
  3. 点击 保存并继续,然后点击 将代理添加到您的主机添加代理 向导将出现,并提供一个带有预填充配置信息的 DaemonSet 清单文件 .yaml 文件,例如 Fleet IDFleet URL
将 KSPM 集成部署到 EKS 集群编辑

添加代理 向导可帮助您将 KSPM 集成部署到您要监控的 Kubernetes 集群。对于每个集群

  1. 下载清单文件并对其配置进行必要的修改以满足您的环境需求。
  2. 使用 kubectl apply -f 命令应用清单文件。例如:kubectl apply -f elastic-agent-managed-kubernetes.yaml

几分钟后,将出现一条确认 Elastic Agent 注册的消息,然后是一条确认数据正在传入的消息。然后,您可以点击 查看资产 以查看新收集的配置信息在 Kibana 中的显示位置,包括 发现页面云安全态势仪表盘

为非托管 Kubernetes 集群设置 KSPM编辑

按照以下步骤将 KSPM 集成部署到非托管集群。请注意,非托管部署不需要凭据。

配置 KSPM 集成编辑

要在非托管集群上安装集成,请执行以下操作:

  1. 转到 仪表盘 → 云安全态势.
  2. 点击 添加 KSPM 集成.
  3. 阅读集成描述以了解其工作原理。然后,点击 添加 Kubernetes 安全态势管理.
  4. 命名您的集成。使用与您要监控的集群(s)的用途或团队匹配的名称,例如 IT-dev-k8s-clusters
  5. Kubernetes 部署 菜单中选择 非托管 Kubernetes
  6. 如果您想监控尚未加入 Fleet 的 Kubernetes 集群,请在选择 Elastic Agent 策略时选择 新主机
  7. 选择要添加集成的 Elastic Agent 策略。
  8. 点击 保存并继续,然后点击 将代理添加到您的主机添加代理 向导将出现,并提供一个带有预填充配置信息的 DaemonSet 清单文件 .yaml 文件,例如 Fleet IDFleet URL
The KSPM integration’s Add agent wizard
将 KSPM 集成部署到非托管集群编辑

添加代理”向导可帮助您在要监控的 Kubernetes 集群上部署 KSPM 集成。为此,请对每个集群执行以下操作:

  1. 下载清单文件并对其配置进行必要的修改以满足您的环境需求。
  2. 使用 kubectl apply -f 命令应用清单文件。例如:kubectl apply -f elastic-agent-managed-kubernetes.yaml

几分钟后,将出现一条确认 Elastic Agent 注册的消息,然后是一条确认数据正在传入的消息。然后,您可以点击 查看资产 以查看新收集的配置信息在 Kibana 中的显示位置,包括 发现页面云安全态势仪表盘

在 ECK 部署中设置 KSPM编辑

要在 ECK 部署上运行 KSPM,您必须编辑 Elastic Agent CRDElastic Agent 集群角色 .yaml 文件。

修补 Elastic Agent

volumesvolumeMounts 添加到 podTemplate

podTemplate:
  spec:
    containers:
    - name: agent
      volumeMounts:
      - name: proc
        mountPath: /hostfs/proc
        readOnly: true
      - name: cgroup
        mountPath: /hostfs/sys/fs/cgroup
        readOnly: true
      - name: varlibdockercontainers
        mountPath: /var/lib/docker/containers
        readOnly: true
      - name: varlog
        mountPath: /var/log
        readOnly: true
      - name: etc-full
        mountPath: /hostfs/etc
        readOnly: true
      - name: var-lib
        mountPath: /hostfs/var/lib
        readOnly: true
      - name: etc-mid
        mountPath: /etc/machine-id
        readOnly: true
    volumes:
    - name: proc
      hostPath:
        path: /proc
    - name: cgroup
      hostPath:
        path: /sys/fs/cgroup
    - name: varlibdockercontainers
      hostPath:
        path: /var/lib/docker/containers
    - name: varlog
      hostPath:
        path: /var/log
    - name: etc-full
      hostPath:
        path: /etc
    - name: var-lib
      hostPath:
        path: /var/lib
    # Mount /etc/machine-id from the host to determine host ID
    # Needed for Elastic Security integration
    - name: etc-mid
      hostPath:
        path: /etc/machine-id
        type: File
修补 RBAC

确保 elastic-agent 服务帐户具有以下角色和集群角色

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: default
  name: elastic-agent
subjects:
- kind: ServiceAccount
  name: elastic-agent
  namespace: default
roleRef:
  kind: Role
  name: elastic-agent
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: elastic-agent
  labels:
    k8s-app: elastic-agent
rules:
- apiGroups: [""]
  resources:
  - nodes
  - namespaces
  - events
  - pods
  - services
  - configmaps
  - serviceaccounts
  - persistentvolumes
  - persistentvolumeclaims
  verbs: ["get", "list", "watch"]
- apiGroups: ["extensions"]
  resources:
  - replicasets
  verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
  resources:
  - statefulsets
  - deployments
  - replicasets
  - daemonsets
  verbs: ["get", "list", "watch"]
- apiGroups:
  - ""
  resources:
  - nodes/stats
  verbs:
  - get
- apiGroups: [ "batch" ]
  resources:
  - jobs
  - cronjobs
  verbs: [ "get", "list", "watch" ]
- nonResourceURLs:
  - "/metrics"
  verbs:
  - get
- apiGroups: ["rbac.authorization.k8s.io"]
  resources:
  - clusterrolebindings
  - clusterroles
  - rolebindings
  - roles
  verbs: ["get", "list", "watch"]
- apiGroups: ["policy"]
  resources:
  - podsecuritypolicies
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: elastic-agent
  namespace: default
  labels:
    k8s-app: elastic-agent
rules:
  - apiGroups:
    - coordination.k8s.io
    resources:
    - leases
    verbs: ["get", "create", "update"]