限制AWS Cognito用户池javascript api的请求来源

时间:2016-10-22 01:39:58

标签: javascript node.js amazon-web-services aws-lambda amazon-cognito

我担心AWS Cognito用户池Javascript API似乎并不关心哪些网站请求来自(您需要使用的API就是用户池ID和客户端ID,这些都可以在我的javascript源码。)

我是否有理由担心另一个网站可能会劫持我的用户群,可能会诱骗用户注册它?

如果这是一个有效的问题,有什么办法可以防止这种情况发生吗?预身份验证Lambda有效负载似乎不包含任何请求源数据,因此我想这不是这样做的方法。

如果不是我需要关注的事情,为什么会这样?

1 个答案:

答案 0 :(得分:4)

所以,我已经考虑了很长的时间并决定了这个:

  

是的,可以在前端输入这些数字。

当然 - 由于以下原因很多。

第一

问题:

  

我是否有理由担心另一个网站可能会劫持我的用户群,可能会诱骗用户注册它?

响应:

  

如果我要带你的UserPoolIDClientID - 我可以"劫持"你的申请?

答案:

  

完全 ...也许有点儿,但为什么 ......

租赁水平"或者"许可"您给予客户完全取决于您和您的IAM角色。 让我们说我们不会考虑我的第二个和更相关的原因,但是 - (原产地检查)

如果我窃取您的访问密钥并滥用您的应用/品牌/其他内容,我只是将客户推送到您的网站。我无法访问您的客户列表,数据,日志,记录等。 IF 您将经过身份验证的用户权限设置为不允许。 锁定你的管理级别"对客户端列表,池信息,数据等的权限。

示例(添加到Statement部分):

{
    "Effect": "Deny",
    "Action": [
        "cognito-identity:CreateIdentityPool",
        "cognito-identity:DeleteIdentityPool",
        "cognito-identity:DeleteIdentities",
        "cognito-identity:DescribeIdentity",
        "cognito-identity:DescribeIdentityPool",
        "cognito-identity:GetIdentityPoolRoles",
        "cognito-identity:ListIdentities",
        "cognito-identity:ListIdentityPools",
        "cognito-identity:LookupDeveloperIdentity",
        "cognito-identity:MergeDeveloperIdentities",
        "cognito-identity:SetIdentityPoolRoles",
        "cognito-identity:UnlinkDeveloperIdentity",
        "cognito-identity:UpdateIdentityPool"
    ],
    "Resource": [
        "arn:aws:cognito-identity:us-east-1:ACCOUNT_DIGITS:identitypool/us-east-1:PoolID_NUMBERS"
    ]
}

或者恰恰相反:

{
    "Effect": "Allow",
    "Action": [
        "cognito-identity:GetOpenIdTokenForDeveloperIdentity"
    ],
    "Resource": "arn:aws:cognito-identity:us-east-1:ACCOUNT_DIGITS:identitypool/us-east-1:NUMBERS-NUMBERS-PoolID"
}

只需要"cognito-identity:GetOpenIdTokenForDeveloperIdentity"部分。 锁定你的用户等级"权限

示例:

{
    "Effect": "Allow",
    "Action": [ "s3:PutObject", "s3:GetObject" ],
    "Resource": [
        "arn:aws:s3:::[bucket]/[folder]/${cognito-identity.amazonaws.com:sub}/*"
    ]
}

作为一个明显的经验法则 - 只允许用户获得所需内容。锁定您可能锁定的所有垃圾并使用策略模拟器。 结论理由一:

  

你可以锁定所有可能会暴露你的客户群的事情,并使某些人无法进行“劫持”。你的网站。   反驳论点:

     

雅,但是 IF

Here is a doc that might help for IAM stuff And some more

第二

问题:

  

预认证Lambda有效负载似乎不包含任何请求源数据,所以我想这不是这样做的。

响应:

  

嗯。

答案:

  

是的确包含了请求来源数据 - IF 设置了数据。

问题:

  

我担心AWS Cognito用户池Javascript API似乎并不关心哪些网站请求来自

答案:

  

为此 - 你是正确的。如果您使用带有用户池触发器的静态服务文件 - 检查原点几乎没有。

所以 - 如果真的想要 - 你可以使用API​​网关将所有这些设置为Lambda。 这将从客户端删除与用户池的直接交互,并将其放在后端。

序:

设置为设置:

  1. 进入用户池并设置池
  2. 添加一个认知池
  3. 进入Lambda并使用API​​网关触发事件挂接函数
  4. 输入你的代码 - 这是一个"登录"例如:

  5. const
        AWS      = require( 'aws-sdk' ),
        UserPool = new AWS.CognitoIdentityServiceProvider();
    
    exports.handler = ( event, context, callback ) => {
        console.log( event );
        const params = {
            AuthFlow: 'CUSTOM_AUTH',
            ClientId: 'numbers',
            AuthParameters: {
                USERNAME: event.email,
                PASSWORD: event.password
            }
        };
    
        UserPool.initiateAuth( params, ( err, data ) => {
            callback( err, data );
        } );
    };
    

    在上面 - 是的你可以做:

    UserPool.initiateAuth( params, callback );
    

    而不是:

    UserPool.initiateAuth( params, ( err, data ) => {
        callback( err, data );
    } );
    

    但这引发了奇怪的错误--GitHub上已经有一个问题已经开启了。

    1. 转到API网关的触发事件
    2. 点击您的方法,然后进入Integration Request
    3. 部分
    4. 在底部,您会看到Body Mapping Templates
    5. 添加一个新邮件并输入application/json
    6. 您应该看到以下示例模板:
    7. 这是Apache Template Velocity Language - 与其他地图模板使用的JSONScheme语言不同:

      #set($allParams = $input.params())
      {
          "body-json" : $input.json('$'),
          "params" : {
              #foreach($type in $allParams.keySet())
                  #set($params = $allParams.get($type))
                  "$type" : {
                      #foreach($paramName in $params.keySet())
                          "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
                          #if($foreach.hasNext),#end
                      #end
                  }
              #if($foreach.hasNext),#end
              #end
          },
          "stage-variables" : {
              #foreach($key in $stageVariables.keySet())
              "$key" : "$util.escapeJavaScript($stageVariables.get($key))"
              #if($foreach.hasNext),#end
              #end
          },
          "context" : {
              "account-id" : "$context.identity.accountId",
              "api-id" : "$context.apiId",
              "api-key" : "$context.identity.apiKey",
              "authorizer-principal-id" : "$context.authorizer.principalId",
              "caller" : "$context.identity.caller",
              "cognito-authentication-provider" : "$context.identity.cognitoAuthenticationProvider",
              "cognito-authentication-type" : "$context.identity.cognitoAuthenticationType",
              "cognito-identity-id" : "$context.identity.cognitoIdentityId",
              "cognito-identity-pool-id" : "$context.identity.cognitoIdentityPoolId",
              "http-method" : "$context.httpMethod",
              "stage" : "$context.stage",
              "source-ip" : "$context.identity.sourceIp",
              "user" : "$context.identity.user",
              "user-agent" : "$context.identity.userAgent",
              "user-arn" : "$context.identity.userArn",
              "request-id" : "$context.requestId",
              "resource-id" : "$context.resourceId",
              "resource-path" : "$context.resourcePath"
          }
      }
      

      有了这个,您可以获得source-ip,认知信息等。

      此方法用于锁定原点的安全方法。您可以通过在Lambda中执行if检查或IAM条件来检查原点 - 阻止来自其他来源的所有请求。