如何用Node AWS SDK获取EKS集群用户列表并验证权限
使用Node AWS SDK获取EKS集群用户列表及批量验证访问权限
一、获取EKS集群相关用户列表
EKS没有直接提供“集群用户列表”的API,因为它的访问控制依赖IAM和Kubernetes RBAC。你可以通过以下两种方式获取相关用户:
1. 从EKS的aws-auth ConfigMap获取映射的IAM用户
aws-auth是EKS集群中存储IAM与K8s用户映射关系的核心ConfigMap,位于kube-system命名空间。你可以结合AWS EKS SDK和Kubernetes客户端获取该配置:
const AWS = require('aws-sdk'); const k8s = require('@kubernetes/client-node'); async function getMappedIamUsersFromEks(clusterName, region) { // 初始化EKS客户端 const eks = new AWS.EKS({ region }); // 获取集群基本信息 const { cluster } = await eks.describeCluster({ name: clusterName }).promise(); const endpoint = cluster.endpoint; const caData = cluster.certificateAuthority.data; // 配置K8s客户端,使用AWS IAM认证 const kc = new k8s.KubeConfig(); kc.loadFromOptions({ clusters: [{ name: clusterName, server: endpoint, caData }], users: [{ name: clusterName, user: { exec: { apiVersion: 'client.authentication.k8s.io/v1beta1', command: 'aws', args: ['eks', 'get-token', '--cluster-name', clusterName, '--region', region] } } }], contexts: [{ name: clusterName, cluster: clusterName, user: clusterName }], currentContext: clusterName }); // 获取aws-auth ConfigMap const coreApi = kc.makeApiClient(k8s.CoreV1Api); try { const { body: configMap } = await coreApi.readNamespacedConfigMap('aws-auth', 'kube-system'); const mapUsers = configMap.data.mapUsers ? JSON.parse(configMap.data.mapUsers) : []; // 提取所有映射的IAM用户ARN return mapUsers.map(item => item.userarn); } catch (err) { console.error('读取aws-auth配置失败:', err); throw err; } }
2. 获取所有IAM用户(用于全量排查)
如果需要批量验证所有IAM用户的EKS权限,先通过IAM SDK获取所有用户列表:
const AWS = require('aws-sdk'); async function getAllIamUsers(region) { const iam = new AWS.IAM({ region }); const users = []; let marker; // 分页获取所有IAM用户 do { const response = await iam.listUsers({ Marker: marker }).promise(); users.push(...response.Users); marker = response.Marker; } while (marker); return users; }
二、批量验证用户的EKS访问权限
首先修复你提供的代码问题:Array.some中使用async回调会导致逻辑错误——async函数返回的Promise会被some视为真值,无法正确等待异步权限检查结果。以下是修正后的实现:
1. 单个用户权限验证函数(修复版)
const AWS = require('aws-sdk'); async function userHasAccessToEksCluster(user, clusterArn, region) { const iam = new AWS.IAM({ region }); const userName = user.UserName; // 检查用户附加的托管策略 const { AttachedPolicies } = await iam.listAttachedUserPolicies({ UserName: userName }).promise(); for (const policy of AttachedPolicies || []) { // 获取策略最新版本 const { Policy } = await iam.getPolicy({ PolicyArn: policy.PolicyArn }).promise(); const { PolicyVersion } = await iam.getPolicyVersion({ PolicyArn: policy.PolicyArn, VersionId: Policy.DefaultVersionId }).promise(); // 解析策略文档(AWS返回的是URL编码的JSON) const policyDoc = JSON.parse(decodeURIComponent(PolicyVersion.Document)); if (hasEksPermission(policyDoc, clusterArn)) { return true; } } // 额外检查用户的内联策略 const { PolicyNames } = await iam.listUserPolicies({ UserName: userName }).promise(); for (const policyName of PolicyNames || []) { const { PolicyDocument } = await iam.getUserPolicy({ UserName: userName, PolicyName: policyName }).promise(); const policyDoc = JSON.parse(decodeURIComponent(PolicyDocument)); if (hasEksPermission(policyDoc, clusterArn)) { return true; } } // 检查用户是否能通过扮演角色访问EKS(可选,按需添加) // 这里可以补充检查用户的sts:AssumeRole权限,以及目标角色的EKS权限 return false; } // 辅助函数:检查策略文档是否包含EKS访问权限 function hasEksPermission(policyDoc, clusterArn) { return policyDoc.Statement.some(statement => { return ( statement.Effect === 'Allow' && // 匹配EKS相关操作,可根据需求调整(比如eks:DescribeCluster、eks:ListClusters等) statement.Action.some(action => action.startsWith('eks:')) && // 资源匹配目标集群ARN或通配符* (statement.Resource === '*' || statement.Resource.includes(clusterArn)) ); }); }
2. 批量验证逻辑
结合IAM用户列表和单个权限验证函数,实现批量检查:
async function batchCheckEksUserAccess(clusterArn, region) { // 获取所有IAM用户 const allUsers = await getAllIamUsers(region); // 并行验证每个用户的权限 const results = await Promise.all( allUsers.map(async user => { const hasAccess = await userHasAccessToEksCluster(user, clusterArn, region); return { userName: user.UserName, userArn: user.Arn, hasEksAccess: hasAccess }; }) ); // 输出结果(可按需保存到文件或数据库) console.log('EKS权限批量验证结果:', results); return results; } // 调用示例 // batchCheckEksUserAccess('arn:aws:eks:us-east-1:123456789012:cluster/my-eks-cluster', 'us-east-1');
关键注意事项
- 权限检查需覆盖托管策略和内联策略,上述代码已包含两者的检查。
- 如果用户通过IAM角色间接访问EKS(即用户拥有
sts:AssumeRole权限),需额外检查用户能否扮演该角色,以及角色本身的EKS权限。 - 执行代码的IAM实体需拥有以下权限:
iam:ListUsers、iam:ListAttachedUserPolicies、iam:GetPolicy、iam:GetPolicyVersion、iam:ListUserPolicies、iam:GetUserPolicy、eks:DescribeCluster。
内容的提问来源于stack exchange,提问作者deagleshot
相关产品推荐
相关产品推荐

