开始使用 KSPM
编辑开始使用 KSPM
编辑本页介绍了如何配置 Kubernetes 安全态势管理 (KSPM) 集成。
这些说明因您是在 EKS 上安装还是在非托管集群上安装而异。
-
在 EKS 托管的集群上安装
-
在非托管集群上安装
为 Amazon EKS 集群设置 KSPM
编辑命名您的集成并选择一个 Kubernetes 部署类型
编辑- 在导航菜单中找到 云安全态势,或使用全局搜索字段。
- 点击 添加 KSPM 集成。
- 阅读集成的描述以了解其工作原理。然后,点击 添加 Kubernetes 安全态势管理。
- 命名您的集成。使用与您要监控的集群的用途或团队相匹配的名称,例如,
IT-dev-k8s-clusters
。 - 从 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 集成的配置
- 如果您想监控尚未注册到 Fleet 的 Kubernetes 集群,请在“将此集成添加到何处”下选择 新主机。
- 命名 Elastic Agent 策略。使用与您要监控的集群的用途或团队相匹配的名称。例如,
IT-dev-k8s-clusters
。 - 点击 保存并继续,然后点击 将代理添加到您的主机。将出现添加代理向导,并提供一个带有预填充配置信息(例如
Fleet ID
和Fleet URL
)的 DaemonSet 清单.yaml
文件。
将 KSPM 集成部署到 EKS 集群
编辑添加代理向导可帮助您在要监控的 Kubernetes 集群上部署 KSPM 集成。对于每个集群
- 下载清单,并对其配置进行任何必要的修改,以满足您环境的需求。
- 使用
kubectl apply -f
命令应用清单。例如:kubectl apply -f elastic-agent-managed-kubernetes.yaml
几分钟后,会出现一条消息确认 Elastic Agent 已注册,接着会出现一条消息确认数据正在传入。然后,您可以单击查看资产,查看新收集的配置信息在 Kibana 中的显示位置,包括发现页面和云安全态势仪表板。
为非托管 Kubernetes 集群设置 KSPM
编辑请按照以下步骤将 KSPM 集成部署到非托管集群。请注意,非托管部署不需要凭据。
配置 KSPM 集成
编辑要在非托管集群上安装集成
- 在导航菜单中找到 云安全态势,或使用全局搜索字段。
- 点击 添加 KSPM 集成。
- 阅读集成的描述以了解其工作原理。然后,点击 添加 Kubernetes 安全态势管理。
- 命名您的集成。使用与您要监控的集群的用途或团队相匹配的名称,例如,
IT-dev-k8s-clusters
。 - 从 Kubernetes 部署 菜单中选择 非托管 Kubernetes。
- 如果要监视尚未注册到 Fleet 的 Kubernetes 集群,请在选择 Elastic Agent 策略时选择 新主机。
- 选择要在其中添加集成的 Elastic Agent 策略。
- 点击 保存并继续,然后点击 将代理添加到您的主机。将出现添加代理向导,并提供一个带有预填充配置信息(例如
Fleet ID
和Fleet URL
)的 DaemonSet 清单.yaml
文件。
将 KSPM 集成部署到非托管集群
编辑添加代理 向导可帮助您在要监视的 Kubernetes 集群上部署 KSPM 集成。为此,对于每个集群
- 下载清单,并对其配置进行任何必要的修改,以满足您环境的需求。
- 使用
kubectl apply -f
命令应用清单。例如:kubectl apply -f elastic-agent-managed-kubernetes.yaml
几分钟后,会出现一条消息确认 Elastic Agent 已注册,接着会出现一条消息确认数据正在传入。然后,您可以单击查看资产,查看新收集的配置信息在 Kibana 中的显示位置,包括发现页面和云安全态势仪表板。
在 ECK 部署上设置 KSPM
编辑要在 ECK 部署上运行 KSPM,您必须编辑 Elastic Agent CRD 和 Elastic Agent Cluster-Role .yaml
文件。
修补 Elastic Agent
将 volumes
和 volumeMounts
添加到 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
服务帐户具有以下角色和 ClusterRole
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"]