使用 Java SDK 从 AWS 检索信息时 user.permissionsBoundary returns NULL

user.permissionsBoundary returns NULL while retrieving information from AWS using Java SDK

我正在使用 AWS Java SDK v2 列出使用 AWS GitHub 存储库上定义的代码 here 的用户。

 public static void listAllUsers(IamClient iam) {

    try {
        boolean done = false;
        String newMarker = null;

        while (!done) {
            ListUsersResponse response;

            ListUsersRequest request;
            if (newMarker == null) {
                request = ListUsersRequest.builder().build();
            } else {
                request = ListUsersRequest.builder()
                        .marker(newMarker).build();
            }

            response = iam.listUsers(request);

            for (User user : response.users()) {
                System.out.format("\n Retrieved user %s", user.userName());
                System.out.println("\nPermission Boundary: " + user.permissionsBoundary());
            }

            if (!response.isTruncated()) {
                done = true;
            } else {
                newMarker = response.marker();
            }
        }
    } catch (IamException e) {
        System.err.println(e);
        System.exit(1);
    }
}

它 returns user.permissionsBoundary() 为 NULL。这是上面代码中打印语句的输出。

 Retrieved user jamshaid
Permission Boundary: null

 Retrieved user luminadmin
Permission Boundary: null

 Retrieved user test
Permission Boundary: null

当我 运行 在 AWS 控制台上的 AWS CloudShell 中执行以下命令时,它 returns 为它定义的用户的 PermissionBoundary。

aws iam get-user --user-name test     

这是 AWS CloudShell 的示例输出。

我正在使用同一个帐户发出两个请求。

我已通过在 AWS 管理控制台中为 IAM 用户设置权限边界来确认此行为。我更改了 ListUsers 示例以包含此代码:

 for(User user : response.users()) {
    System.out.format("\n Retrieved user %s", user.userName());
    AttachedPermissionsBoundary permissionsBoundary = user.permissionsBoundary();
    if (permissionsBoundary != null)
        System.out.format("\n Permissions boundary details %s", permissionsBoundary.permissionsBoundaryTypeAsString());
   }

...

permissionsBoundary() 方法会 return null - 即使设置了权限。这是一个错误。

我的建议是在此处记录 Github 问题:

https://github.com/aws/aws-sdk-java-v2

我还使用 Kotlin SDK 对此进行了测试。结果相同。

suspend fun listAllUsers() {

        IamClient { region = "AWS_GLOBAL" }.use { iamClient ->
            val response = iamClient.listUsers(ListUsersRequest { })
            response.users?.forEach { user ->
                println("Retrieved user ${user.userName}")
                val permissionsBoundary = user.permissionsBoundary
                if (permissionsBoundary != null)
                    println("Permissions boundary details ${permissionsBoundary.permissionsBoundaryType.toString()}")

            }
        }
 }

我认为这不是问题,而是程序化的行为。来自 API docs:

IAM resource-listing operations return a subset of the available attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view all of the information for a user, see GetUser.

这在 API javadocs.

中也有说明

在控制台中,您使用的是 get-user,而不是 list-users,这就是命令返回有关用户的所有信息的原因,其中 PermissionsBoundary

请尝试使用:

aws iam list-users

并检查输出,它应该与您使用 Java SDK 获得的结果匹配,它也不会包含 PermissionsBoundary

如果您想从 Java 代码中获得与当前使用命令 aws iam get-user --user-name test 相同的结果,您可以使用 IamClient 中的 getUser method。尝试类似的东西:

GetUserRequest request = GetUserRequest.builder()
  .userName("test")
  .build()
;

GetUserResponse response = iam.getUser(request);
User user = response.user();
System.out.println("\nPermission Boundary: " + user.permissionsBoundary());

User classgetlist 两个操作中重复使用,但仅在前者中填充所有字段。