繁体   English   中英

具有IAM权限的Cognito组

[英]Cognito Groups with IAM Permissions

我要实现的目标:

我有一个Cognito用户池,我有一些用户和一些组。 我希望某些用户可以访问API网关功能,某些用户可以访问某些功能,而其他用户则不能访问。

我做了什么:

我创建了三个组,并将用户分配给了每个组。 我给每个小组一个IAM角色,并给了每个角色特定的政策。 该组对所有用户的权限如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "execute-api:*",
            "Resource": "*"
        }
     ]
}

我通过无服务器框架创建了Lambda函数和API网关资源。 我将授权者设置为Cognito用户池授权者。

(我尝试了几种不同的方法,例如使用联合身份,但这似乎也不起作用)

我的结果是什么:

所有用户都具有对API网关的完全访问权限。 给定的权限似乎对每个用户的访问没有任何影响。

帮助:我做错了什么? 我如何实现我的目标?

仅当您使用Cognito Federated Identity为用户生成凭据时,才会显示附加到user pool group的角色。 将组添加到用户池

IAM角色及其权限与Amazon Cognito身份池为经过身份验证的用户提供的临时AWS凭证绑定。 当Amazon Cognito联合身份使用“从令牌中选择角色”选项提供AWS凭证时,会自动为该组中的用户分配IAM角色。

所以基本上

  1. 创建一个附加到您的用户池的identity pool池。
  2. 将API网关的授权更改为IAM
  3. 登录到用户池后,用户id_token生成federated identity
  4. 使用此身份( secret key + access key + token )通过API网关进行授权。

现在您的角色应该得到尊重。 但是请记住-由于某些原因,您将需要自己生成AWS SigV4凭证。 我最终在浏览器中使用了aws-sign-web

PS:您的角色似乎可以全面访问API网关。 您也需要修复该问题。 例如,我曾用于限制访问一个API端点的示例角色

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": "execute-api:Invoke",
        "Resource": [
            "arn:aws:execute-api:us-east-2:<aws account id>:<API id>/*/*/acc/*"
        ],
        "Effect": "Allow"
    }
]
}

生成federated identity示例代码

function getAccessToken(idToken, idenPoolId, userPool) {
        let region = idenPoolId.split(":")[0];
        let provider = "cognito-idp." + region + ".amazonaws.com/" + userPool;
        let login = {};

        login[provider] = idToken;

        // Add the User's Id Token to the Cognito credentials login map.
        let credentials = new AWS.CognitoIdentityCredentials({
            IdentityPoolId: idenPoolId,
            Logins: login
        });

        //call refresh method in order to authenticate user and get new temp credentials
        credentials.get((error) => {
            if (error) {
                console.error(error);

                //let response = {
                //  statusCode: 500,
                //  body: JSON.stringify(error)
                //};

                return null;

            } else {
                console.log('Successfully logged!');
                console.log('AKI:'+ credentials.accessKeyId);
                console.log('AKS:'+ credentials.secretAccessKey);
                console.log('token:' + credentials.sessionToken);

                let response = JSON.stringify({
                    'AKI': credentials.accessKeyId,
                    'AKS': credentials.secretAccessKey,
                    'token': credentials.sessionToken
                });

                return response;
            }
        });
    }

我有一个更好的解决方案,您不需要IAM。

只需将一对{username, serviceName}在S3或DB中。 因此,每次您都会收到服务请求:

  1. 检查用户是否被授权(来自Cognito)。
  2. 检查用户是否被授权使用该服务(S3,MySQL,RDS等)。

为什么我认为更好

因为要从服务中添加/删除用户,所以您无需以管理员身份登录IAM。 希望以后,您可以创建用于管理的仪表板。

工作流程

  1. UserA向您的securityApi发送请求。
  2. SecurityApi检查令牌是否经过授权(用户有效与否)。

  3. 如果UserA有效,则securityApiusername的用户username (可以从令牌的有效负载中获取)和service name发送到DB,以查看用户是否有权访问该用户。 以Mysql为例(为此使用RDS):

     SELECT username from ServiceX LIMIT 1 WHERE username = "xyz"; 
  4. 如果通过第二或第三步,则用户为1.有效用户,并且2.有权使用该服务。 如果用户在步骤2或3中失败,则该用户无权使用该服务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM