开始使用 KSPM

编辑

此页面解释如何配置 Kubernetes 安全态势管理 (KSPM) 集成。

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

为 Amazon EKS 集群设置 KSPM

编辑
命名您的集成并选择 Kubernetes 部署类型
编辑
  1. 在导航菜单中找到云安全态势,或使用全局搜索字段
  2. 点击添加 KSPM 集成
  3. 阅读集成的描述以了解其工作原理。然后,点击添加 Kubernetes 安全态势管理
  4. 命名您的集成。使用与您要监控的集群的目的或团队匹配的名称,例如 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 帐户根用户的长期凭据。要将访问密钥用作凭据,您必须提供 访问密钥 ID秘密访问密钥

有关更多详细信息,请参阅 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 集成时提供这些字段

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

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

无需向集成提供 访问密钥 ID秘密访问密钥,只需提供在共享凭据文件中查找访问密钥所需的信息即可

  • 凭据配置文件名称:共享凭据文件中的配置文件名称。
  • 共享凭据文件:共享凭据文件的目录。

如果您未为所有配置字段提供值,则集成将使用这些默认值

  • 如果未提供 访问密钥 ID秘密访问密钥ARN 角色,则集成将检查 凭据配置文件名称
  • 如果没有 凭据配置文件名称,则将使用默认配置文件。
  • 如果 共享凭据文件为空,则将使用默认目录。
  • 对于 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 角色ARN 角色值指定用于生成临时凭据的 AWS IAM 角色。

如果存在 ARN 角色,则集成将检查 访问密钥 ID秘密访问密钥 是否存在。如果不存在,则软件包将检查 凭据配置文件名称。如果不存在 凭据配置文件名称,则将使用默认凭据配置文件。

完成 EKS 的 KSPM 集成配置
编辑

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

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

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

  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. 命名您的集成。使用与您要监控的集群的目的或团队匹配的名称,例如 IT-dev-k8s-clusters
  5. Kubernetes 部署菜单中选择非托管 Kubernetes
  6. 如果您想监控尚未注册到 Fleet 的 Kubernetes 集群,请在选择 Elastic Agent 策略时选择新主机
  7. 选择您要添加集成的 Elastic Agent 策略。
  8. 点击保存并继续,然后点击将代理添加到您的主机添加代理向导将出现,并提供一个带有预填充配置信息(例如 Fleet IDFleet URL)的 DaemonSet 清单 .yaml 文件。
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"]