You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 13:31:02