【AWS】API Gateway Lambda 권한 부여자 "User is not authorized to access this resource"에러의 원인과 대응

6695 단어 APIGateway람다AWS


위의 APIGateway로 구축된 API에 Lambda 권한 부여자를 적용할 때 올바른 자격 증명, 올바른 AWS 리소스에 대한 액세스 권한을 설정했음에도 불구하고 "User is not authorized to access this resource"오류 가 발생할 수 있습니다.
본 기사에서는 그 원인과 대응을 기재합니다.

원인



Lambda 권한 부여자로부터 반환된 권한 정보의 캐싱으로 인해 발생합니다.

다음과 같은 액세스 정책을 반환하는 코드를 작성할 때 발생합니다.

node.js
  ...
  statementOne.Action = 'execute-api:Invoke'; 
  statementOne.Effect = 'Allow';
  // ↓ 以下のアクセス承認するリソースを指定するコードが原因
  statementOne.Resource = event.methodArn;
  ...

포인트는 event.methodArn입니다.
여기에는 호출된 API 전용 Arn이 포함되어 있습니다.例: arn:aws:execute-api:ap-northeast-1:xxxxxxxxxxx:xxxxxxxxx/stg/GET/users/43/info
이 Arn에 대한 액세스 권한을 부여한 정책을 반환하면 첫 번째 액세스가 작동합니다.



그러나 동일한 Lambda 인증자가 적용된 다른 API를 호출하면 위의 Arn이 포함 된 정책이 캐시로 반환되어 첫 번째 액세스와 다른 권한이없는 리소스에 액세스하면 ""User is not authorized to access this resource"오류가 발생합니다.



대응



2 패턴의 대응 방법이 있습니다.

패턴 1 Lambda 권한 부여자의 인증 캐시의 TTL 값을 0으로 설정



API Gateway 권한 부여자에서 대상 인증자를 선택하고,

TTL을 0으로 변경하면 매번 인증을 수행하기 위해 event.methodArn를 액세스 권한 부여 리소스로 반환해도 허가없이 문제가 발생합니다.
단지 매번 인증 처리가 달리기 때문에 퍼포먼스적으로는 뛰어나지 않습니다.
그 점이 신경이 쓰이는 경우는, 후술의 패턴 2를 이용하는 것을 추천합니다.

※ AWS CloudFormation, AWS SAM을 이용하는 경우의 주의점
CloudFormation, SAM을 사용하여 Lambda 인증자를 구성한 경우 기본적으로 권한 부여 캐시의 TTL 값은 300초입니다.
권한 부여 캐시의 TTL 값을 변경하지 않고 배포 한 권한 부여 자의 설정을 관리 콘솔에서 확인하면 ...



이런 식으로 undefined 가 되어 있어 캐쉬가 무효가 되어 있는 것처럼 보입니다.
그러나 실제로는 300초의 캐시 설정이 활성화되어 있습니다.
(이것에 1시간 정도 하메되었습니다...)

TTL을 0으로 설정할 때 ReauthorizeEvery를 0으로 설정합시다.

template.yaml
  TestApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prd
      Auth:
        AddDefaultAuthorizerToCorsPreflight: false
        DefaultAuthorizer: MyLambdaCustomAuthorizer
        Authorizers:
          MyLambdaCustomAuthorizer:
            FunctionPayloadType: REQUEST
            FunctionArn:
              Fn::GetAtt:
              - RestApiAuthFunction
              - Arn
            Identity:
              QueryStrings:
              - authToken
              ReauthorizeEvery: 0

패턴 2 Lambda 권한 부여자 측에서 반환하는 리소스 정책 변경



Lambda 인증자 측에서 event.methodArn 를 지정하는 것이 아니라, 와일드 카드를 지정해 대응하는 방법입니다.

node.js
  ...
  statementOne.Action = 'execute-api:Invoke'; 
  statementOne.Effect = 'Allow';
  // ↓ ワイルドカード指定に変更
  statementOne.Resource = 'arn:aws:execute-api:*';
  ...

위의 예에서는 모든 Lambda 실행 권한을 반환합니다.
이렇게 하면 정책 캐싱이 발생하더라도 와일드카드에서 허용된 리소스를 문제 없이 호출할 수 있습니다.
어디까지를 와일드 카드 지정으로 할까는, 자신의 시큐러티 폴리시와 상담해 보세요.

캐시와 병용할 수 있기 때문에, 패턴 1보다 퍼포먼스적으로 우수합니다만, 와일드 카드 지정이 되는 분, 시큐러티와 트레이드 오프입니다.

요약


  • 하나의 권한 부여자를 복수의 자원으로 공유했을 때, 권한 부여자의 인증 캐쉬가 유효하게 되면 「User is not authorized to access this resource」가 발생한다.
  • 권한 부여 자의 자격 증명 캐시로 인해 TTL을 0으로 설정하거나 권한 부여 리소스를 확장하여 지원 가능

  • 기재 정보에 잘못이 있으면 지적해 주시면 도움이 됩니다.

    참고 링크


  • AWS 공식: API Gateway 콘솔을 사용하여 Lambda 권한 부여자 구성
  • stackoverflow : AWS API Gateway custom Authorizer strange showing error
  • 좋은 웹페이지 즐겨찾기