Amazon API Gateway를 ID 제공자 통합에 사용 - AWS Transfer Family

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon API Gateway를 ID 제공자 통합에 사용

이 항목에서는 AWS Lambda 함수를 사용하여 API Gateway 메서드를 지원하는 방법을 설명합니다. ID 제공자를 통합하기 위해 RESTful API가 필요하거나 지역 차단 또는 속도 제한 요청에 RESTful API의 기능을 활용하는 AWS WAF 데 사용하려는 경우 이 옵션을 사용하십시오.

API Gateway를 사용하여 ID 공급자를 통합하는 경우의 제한

  • 이 구성은 사용자 지정 도메인을 지원하지 않습니다.

  • 이 구성은 프라이빗 API Gateway URL을 지원하지 않습니다.

둘 중 하나가 필요한 경우, API Gateway 없이 Lambda를 ID 공급자로서 사용할 수 있습니다. 자세한 내용은 ID AWS Lambda 제공자를 통합하는 데 사용를 참조하세요.

API Gateway 메서드를 사용하여 인증

Transfer Family의 ID 공급자로 사용할 API Gateway 메서드를 생성할 수 있습니다. 이 접근 방식은 API를 생성하고 제공할 수 있는 매우 안전한 방법을 제공합니다. API Gateway를 사용하면 HTTPS 엔드포인트를 생성하여 모든 수신 API 호출이 보다 안전하게 전송되도록 할 수 있습니다. API Gateway 서비스에 대한 자세한 내용은 API Gateway 개발자 안내서를 참조하세요.

API Gateway는 라는 권한 부여 방법을 제공하며AWS_IAM, 이 방법은 내부적으로 AWS 사용하는 것과 동일한 AWS Identity and Access Management IAM 기반 인증을 제공합니다. 로 AWS_IAM 인증을 활성화하면 API를 호출할 수 있는 명시적 권한을 가진 호출자만 해당 API의 API Gateway 메서드에 연결할 수 있습니다.

API Gateway 메서드를 Transfer Family의 사용자 지정 ID 공급자로 사용하려면 API Gateway 메서드에 IAM을 활성화해야 합니다. 이 프로세스의 일환으로 Transfer Family가 게이트웨이를 사용할 수 있는 권한을 IAM 역할에 제공합니다.

참고

보안을 강화하기 위해 웹 애플리케이션 방화벽을 구성할 수 있습니다. AWS WAF 은(는) Amazon API Gateway에 전달되는 HTTP 및 HTTPS 요청을 모니터링할 수 있게 해주는 웹 애플리케이션 방화벽입니다. 자세한 내용은 웹 애플리케이션 방화벽 추가를 참조하세요.

Transfer Family를 통한 사용자 지정 인증에 API Gateway 방법을 사용하려면
  1. 스택을 생성합니다. AWS CloudFormation 방법:

    참고

    스택 템플릿은 Base64로 인코딩된 암호를 사용하도록 업데이트되었습니다. 자세한 내용은 을 참조하십시오. 템플릿 개선 사항 AWS CloudFormation

    1. https://console.aws.amazon.com/cloudformation 에서 콘솔을 엽니다. AWS CloudFormation

    2. 사용 AWS CloudFormation 설명서의 AWS CloudFormation 스택 템플릿 선택에 나와 있는 기존 템플릿에서 스택을 배포하는 방법에 대한 지침을 따르십시오.

    3. 다음 기본 템플릿 중 하나를 사용하여 Transfer AWS Lambda Family에서 사용자 지정 ID 공급자로 사용할 지원 API Gateway 메서드를 만들 수 있습니다.

      • 기본 스택 템플릿

        기본적으로 API Gateway 메서드는 하드 코딩된 SSH (Secure Shell) 키 또는 암호를 사용하여 단일 서버에서 단일 사용자를 인증하는 사용자 지정 ID 공급자로 사용됩니다. 배포 후에는 Lambda 함수 코드를 수정하여 다른 작업을 수행할 수 있습니다.

      • AWS Secrets Manager 스택 템플릿

        기본적으로 API Gateway 메서드는 Secrets Manager에 있는 다음 형식의 aws/transfer/server-id/username 항목에 대해 인증합니다. 또한 암호에는 Transfer Family에 반환된 모든 사용자 속성에 대한 키-값 쌍이 들어 있어야 합니다. 배포 후에는 Lambda 함수 코드를 수정하여 다른 작업을 수행할 수 있습니다. 자세한 내용은 블로그 게시물 AWS Transfer Family 사용을 위한 암호 인증 활성화를 참조하십시오 AWS Secrets Manager.

      • Okta 스택 템플릿

        API Gateway 메서드는 Transfer Family의 사용자 지정 ID 공급자로서 Okta와 통합됩니다. 자세한 내용은 블로그 게시물 Okta를 AWS Transfer Family를 사용한 ID 공급자로서 사용을 참조하세요.

    사용자 지정 ID 공급자를 Transfer Family 워크플로에 통합하는 가장 쉬운 방법은 이러한 스택 중 하나를 배포하는 것입니다. 각 스택은 Lambda 함수를 사용하여 API Gateway에 기반한 API 메서드를 지원합니다. 그런 다음 Transfer Family에서 API 메서드를 사용자 지정 ID 공급자로 사용할 수 있습니다. 기본적으로 Lambda 함수는 암호로 myuser 호출된 단일 사용자를 인증합니다.MySuperSecretPassword 배포 후에는보안 인증 정보를 편집하거나 Lambda 함수 코드를 업데이트하여 다른 작업을 수행할 수 있습니다.

    중요

    기본 사용자 및 암호 보안 인증 정보를 편집하는 것이 좋습니다.

    스택을 배포한 후에는 CloudFormation 콘솔의 출력 탭에서 스택에 대한 세부 정보를 볼 수 있습니다. 이러한 세부 정보에는 스택의 Amazon 리소스 이름(ARN), 스택이 생성한 IAM 역할의 ARN, 새 게이트웨이의 URL이 포함됩니다.

    참고

    사용자 지정 ID 공급자 옵션을 사용하여 사용자를 위한 암호 기반 인증을 활성화하고 API Gateway에서 제공하는 요청 및 응답 로깅을 활성화하는 경우, API Gateway는 사용자의 암호를 Amazon Logs에 기록합니다. CloudWatch 프로덕션 환경에서는 이 로그를 사용하지 않는 것이 좋습니다. 자세한 내용은 API Gateway 개발자 안내서의 CloudWatch API Gateway에서 API 로깅 설정을 참조하십시오.

  2. 서버의 API Gateway 메서드 구성을 확인합니다. 방법:

    1. https://console.aws.amazon.com/apigateway/에서 Amazon API Gateway 콘솔을 엽니다.

    2. 템플릿에서 생성한 사용자 지정 ID 제공자 이전 기본 AWS CloudFormation 템플릿 API를 선택합니다. 게이트웨이를 보려면 지역을 선택해야 할 수도 있습니다.

    3. 리소스 창에서 GET을 선택합니다. 다음 스크린샷은 올바름 방법 설정을 보여줍니다.

      
                                    요청 경로 및 URL 쿼리 문자열에 대한 메서드 구성 파라미터를 보여주는 API 구성 세부 정보

    이 지점에서 API Gateway 를 배포할 준비가 완료됩니다.

  3. 작업API 배포를 선택합니다. 배포 단계에서 prod를 선택한 다음 포를 선택합니다.

    API Gateway 메서드를 성공적으로 배포한 후에는 다음 스크린샷과 같이 단계 > 단계 세부 정보에서 성능을 확인합니다.

    참고

    화면 상단에 표시되는 URL 호출 주소를 복사합니다. 다음 단계에 필요할 수 있습니다.

    
                            호출 URL이 강조 표시된 스테이지 세부 정보
  4. https://console.aws.amazon.com/transfer/ 에서 AWS Transfer Family 콘솔을 엽니다.

  5. 스택을 생성할 때 Transfer Family가 자동으로 생성되었어야 합니다. 그렇지 않은 경우 다음 단계를 사용하여 서버를 구성하십시오.

    1. 서버 생성을 선택하여 서버 생성 페이지를 엽니다. ID 공급자 선택에서 사용자 지정을 선택한 다음 Amazon API Gateway를 선택하여 다음 스크린샷과 같이 ID 공급자에 연결합니다.

      
                                    사용자 지정 ID 제공자가 선택되어 있고 ID 제공자에 연결하기 위해 API Gateway가 선택된 ID 제공자 화면
    2. Amazon API Gateway URL 제공 텍스트 상자에 이 절차의 3단계에서 생성한 API Gateway 엔드포인트의 호출 URL 주소를 붙여넣습니다.

    3. 역할에서 AWS CloudFormation 템플릿으로 생성한 IAM 역할을 선택합니다. 이 역할을 통해 Transfer Family는 API 게이트웨이 메서드를 간접 호출할 수 있습니다.

      호출 역할에는 1단계에서 생성한 AWS CloudFormation 스택에 대해 선택한 스택 이름이 포함됩니다. 형식은 다음과 같습니다. CloudFormation-stack-name-TransferIdentityProviderRole-ABC123DEF456GHI

    4. 나머지 상자를 채운 다음 서버 만들기를 선택합니다. 서버를 만들기 위한 나머지 단계에 대한 자세한 내용은 SFTP, FTPS 또는 FTP 서버 엔드포인트 구성을 참조하세요.

API Gateway 메서드 구현

Transfer Family를 위한 사용자 지정 ID 공급자를 생성하려면 API Gateway 메서드에서 리소스 경로가 /servers/serverId/users/username/config 인 단일 메서드를 구현해야 합니다. serverIdusername 값은 RESTful 리소스 경로에서 얻습니다. 또한 다음 이미지에서 보여지듯이 메서드 요청의 같이 URL 쿼리 문자열 파라미터로서 sourceIpprotocol를 추가합니다.


                    GET메서드 세부 정보를 보여주는 API Gateway의 리소스 화면
참고

이 사용자 이름은 최소 3글자에서 최대 100자여야 합니다. 사용자 이름에는 다음 글자를 사용할 수 있습니다. a~z, A~Z, 0~9, 밑줄(_)과 하이픈(-), 마침표(.)과 골뱅이 사인(@)입니다. 그러나 사용자 이름은 하이픈, 마침표 및 @ 기호로 시작할 수 없습니다.

Transfer Family가 사용자를 대신해 암호 인증을 시도하면, 서비스는 Password: 헤더 필드를 공급합니다. Password: 헤더가 없는 경우, Transfer Family는 퍼블릭 키 인증을 시도하여 사용자를 인증합니다.

ID 공급자를 사용하여 최종 사용자를 인증하고 권한을 부여하는 경우 자격 증명을 검증하는 것 외에도 최종 사용자가 사용하는 클라이언트의 IP 주소를 기반으로 액세스 요청을 허용하거나 거부할 수 있습니다. 이 기능을 사용하면 S3 버킷 또는 Amazon EFS 파일 시스템에 저장된 데이터가 지원되는 프로토콜을 통해 신뢰할 수 있는 것으로 지정한 IP 주소에서만 액세스할 수 있습니다. 이 기능을 활성화하려면 sourceIp를 쿼리 문자열에 포함해야 합니다.

서버에 여러 프로토콜을 사용하도록 설정한 상태에서 여러 프로토콜에서 동일한 사용자 이름을 사용하여 액세스를 제공하려는 경우 ID 공급자에 각 프로토콜별 자격 증명이 설정되어 있으면 그렇게 할 수 있습니다. 이 기능을 활성화하려면 RESTful 리소스 경로에 protocol 값을 포함해야 합니다.

API Gateway 메서드는 항상 HTTP 상태 코드를 반환해야 200 합니다. 모든 다른 HTTP 상태 코드는 API 액세스하는데 오류를 나타냅니다.

Amazon S3 응답 예

예 응답 본문은 Amazon S3용 다음 형식의 JSON 문서입니다.

{ "Role": "IAM role with configured S3 permissions", "PublicKeys": [ "ssh-rsa public-key1", "ssh-rsa public-key2" ], "Policy": "STS Assume role session policy", "HomeDirectory": "/bucketName/path/to/home/directory" }
참고

정책은 JSON을 문자열로 이스케이프합니다. 예:

"Policy": "{ \"Version\": \"2012-10-17\", \"Statement\": [ {\"Condition\": {\"StringLike\": {\"s3:prefix\": [\"user/*\", \"user/\"]}}, \"Resource\": \"arn:aws:s3:::bucket\", \"Action\": \"s3:ListBucket\", \"Effect\": \"Allow\", \"Sid\": \"ListHomeDir\"}, {\"Resource\": \"arn:aws:s3:::*\", \"Action\": [\"s3:PutObject\", \"s3:GetObject\", \"s3:DeleteObjectVersion\", \"s3:DeleteObject\", \"s3:GetObjectVersion\", \"s3:GetObjectACL\", \"s3:PutObjectACL\"], \"Effect\": \"Allow\", \"Sid\": \"HomeDirObjectAccess\"}] }"

다음 예 응답은 사용자의 홈 디렉터리 타입이 논리적임을 보여줍니다.

{ "Role": "arn:aws:iam::123456789012:role/transfer-access-role-s3", "HomeDirectoryType":"LOGICAL", "HomeDirectoryDetails":"[{\"Entry\":\"/\",\"Target\":\"/MY-HOME-BUCKET\"}]", "PublicKeys":[""] }
Amazon EFS 예 응답

예 응답 본문은 Amazon EFS용 다음 형식의 JSON 문서입니다.

{ "Role": "IAM role with configured EFS permissions", "PublicKeys": [ "ssh-rsa public-key1", "ssh-rsa public-key2" ], "PosixProfile": { "Uid": "POSIX user ID", "Gid": "POSIX group ID", "SecondaryGids": [Optional list of secondary Group IDs], }, "HomeDirectory": "/fs-id/path/to/home/directory" }

Role 필드는 인증에 성공했음을 나타냅니다. 암호 인증을 할 때(Password:헤더를 제공할 때), SSH 퍼블릭 키를 제공할 필요가 없습니다. 사용자를 인증할 수 없는 경우(예: 암호가 잘못된 경우) 메서드는 Role 설정되지 않은 응답을 반환해야 합니다. 이러한 응답의 예로는 빈 JSON 객체를 들 수 있습니다.

다음 예 응답은 사용자가 논리적인 홈 디렉터리 타입을 가졌다는 것을 보여줍니다.

{ "Role": "arn:aws:iam::123456789012:role/transfer-access-role-efs", "HomeDirectoryType": "LOGICAL", "HomeDirectoryDetails":"[{\"Entry\":\"/\",\"Target\":\"/faa1a123\"}]", "PublicKeys":[""], "PosixProfile":{"Uid":65534,"Gid":65534} }

Lambda 함수에 JSON 형식으로 사용자 정책을 포함할 수 있습니다. Transfer Family의 사용자 정책 구성에 대한 자세한 내용은 단원을 참조하세요액세스 통제 관리.

기본 Lambda 함수

다양한 인증 전략을 구현하려면, 사용자의 게이트웨이 사용하는 Lambda 함수를 편집하세요. 애플리케이션의 요구 사항을 충족하는 데 도움이 되려면 Node.js에서 다음 예 Lambda 함수를 사용할 수 있습니다. 자세한 내용은 개발자 안내서AWS Lambda Node.js로 Lambda 함수 구축을 참조하세요.

다음 예 Lambda 함수는 사용자 이름, 암호 (암호 인증을 수행하는 경우), 서버 ID, 프로토콜 및 클라이언트 IP 주소를 가져옵니다. 이러한 입력을 조합하여 ID 공급자를 조회하고 로그인을 허용할지 여부를 결정할 수 있습니다.

참고

서버에 여러 프로토콜을 사용하도록 설정한 상태에서 여러 프로토콜에서 동일한 사용자 이름을 사용하여 액세스를 제공하려는 경우 ID 공급자에 각 프로토콜별 보안 인증이 설정되어 있으면 그렇게 할 수 있습니다.

FTP (파일 전송 프로토콜)의 경우, Secure Shell(SSH) SFTP (파일 전송 프로토콜) 및 SSL을 통한 파일 전송 프로토콜 (FTPS)의 분리된 보아 인증을 유지하는 것이 좋습니다. SFTP 및 FTPS와 달리 FTP는 자격 증명을 일반 텍스트로 전송하므로 FTP에 대해 별도의 보안 인증을 유지하는 것이 좋습니다. FTP 자격 증명을 SFTP 또는 FTPS에서 분리하면 FTP 자격 증명이 공유되거나 노출되더라도 SFTP 또는 FTPS를 사용하는 워크로드의 보안을 유지할 수 있습니다.

이 예 함수는 퍼블릭 키 인증을 수행하는 경우 퍼블릭 키와 함께 역할 및 논리적 홈 디렉터리 세부 정보를 반환합니다.

서비스 관리 사용자를 생성할 때는 해당 사용자의 홈 디렉터리를 논리적 또는 물리적 디렉터리로 설정합니다. 마찬가지로 원하는 사용자의 물리적 또는 논리적 디렉터리 구조를 전달하려면 Lambda 함수 결과가 필요합니다. 설정하는 파라미터는 HomeDirectoryType필드 값에 따라 달라집니다.

  • HomeDirectoryTypePATH로 설정 — HomeDirectory 필드는 사용자에게 표시되는 절대 Amazon S3 버킷 접두사 또는 Amazon EFS 절대 경로여야 합니다.

  • HomeDirectoryTypeLOGICAL로 설정 — HomeDirectory 필드를 설정하지 마세요. 대신 서비스 관리 사용자를 위한 HomeDirectoryDetails매개 변수에 설명된 값과 유사하게 원하는 항목/대상 매핑을 제공하는 HomeDirectoryDetails 필드를 설정합니다.

예 함수는 예 Lambda 함수에 나열되어 있습니다.

함께 사용하기 위한 Lambda 함수 AWS Secrets Manager

ID AWS Secrets Manager 공급자로 사용하려면 샘플 템플릿에서 Lambda 함수를 사용하면 됩니다. AWS CloudFormation Lambda 함수는 사용자 자격 증명으로 Secrets Manager 서비스를 쿼리하고, 성공하면 지정된 시크릿을 반환합니다. Secrets Manager 사용에 대한 자세한 내용은 AWS Secrets Manager 사용 설명서를 참조하세요.

이 Lambda 함수를 사용하는 샘플 AWS CloudFormation 템플릿을 다운로드하려면 에서 제공하는 Amazon S3 버킷으로 이동하십시오. AWS Transfer Family

템플릿 개선 사항 AWS CloudFormation

게시된 CloudFormation 템플릿의 API Gateway 인터페이스가 개선되었습니다. 이제 템플릿은 API Gateway와 함께 Base64로 인코딩된 암호를 사용합니다. 기존 배포는 이러한 개선 사항이 없어도 계속 작동하지만 기본 US-ASCII 문자 집합 이외의 문자를 포함하는 암호는 허용되지 않습니다.

이 기능을 활성화하는 템플릿의 변경 사항은 다음과 같습니다.

  • GetUserConfigRequest AWS::ApiGateway::Method리소스에 이 RequestTemplates 코드가 있어야 합니다 (기울임꼴로 표시된 줄은 업데이트된 줄임).

    RequestTemplates: application/json: | { "username": "$util.urlDecode($input.params('username'))", "password": "$util.escapeJavaScript($util.base64Decode($input.params('PasswordBase64'))).replaceAll("\\'","'")", "protocol": "$input.params('protocol')", "serverId": "$input.params('serverId')", "sourceIp": "$input.params('sourceIp')" }
  • PasswordBase64헤더를 사용하려면 GetUserConfig 리소스의 내용을 변경해야 합니다 (기울임꼴로 표시된 줄은 업데이트된 줄임). RequestParameters

    RequestParameters: method.request.header.PasswordBase64: false method.request.querystring.protocol: false method.request.querystring.sourceIp: false
스택용 템플릿이 최신인지 확인하려면
  1. https://console.aws.amazon.com/cloudformation 에서 AWS CloudFormation 콘솔을 엽니다.

  2. 스택 목록에서 스택을 선택합니다.

  3. 디테일 패널에서 템플릿 탭을 선택합니다.

  4. 다음을 확인해 보세요.

    • RequestTemplates검색해서 다음 줄이 있는지 확인하세요.

      "password": "$util.escapeJavaScript($util.base64Decode($input.params('PasswordBase64'))).replaceAll("\\'","'")",
    • RequestParameters검색해서 다음 줄이 있는지 확인하세요.

      method.request.header.PasswordBase64: false

업데이트된 라인이 보이지 않으면 스택을 편집하세요. AWS CloudFormation 스택을 업데이트하는 방법에 대한 자세한 내용은 AWS CloudFormation; 사용 설명서의 스택 템플릿 수정을 참조하십시오.