[INTRO]
MSP 업무 진행 중 협력사에서 SFTP를 이용하여 S3 버켓으로 데이터를 전송하여 고객사에서 AWS Transfer Family 를 이용한 SFTP 설정을 진행하는 고객사가 있었습니다.
추가적인 요건에 SSH Key Pair 접속이 아닌 ID/Password 방식으로 로그인 여부에 대한 문의가 인입되어 테스트 및 적용 과정을 기술하게 되었습니다.
적용 고객사 : ADTCAPS
[주요내용]
구성도
- 사용자가 사용자 이름과 암호 또는 사용자 이름과 개인 SSH 키(디스크에 로컬로 저장됨)를 제공하여 로그인을 시도합니다.
- 서비스는 이러한 자격 증명을 서버를 생성할 때 제공한 API Gateway 엔드포인트에 전달합니다. API 게이트웨이는 AWS Lambda 함수 와 통합됩니다 . 사용자가 암호를 제공하지 않으면 SSH 키 기반 인증을 사용하는 것으로 가정합니다.
- Lambda 함수는 사용자가 제공한 자격 증명을 사용하여 사용자 지정 인증 공급자(모든 데이터 저장소 및 이 경우 AWS Secrets Manager일 수 있음)를 쿼리합니다.
- Secrets Manager는 사용자 또는 암호와 연결된 키-값 쌍을 반환합니다. 여기에는 사용자의 저장된 암호, 사용자에 대한 IAM 역할 매핑 및 모든 공개 SSH 키 정보(사용자에 대해 SSH 키 기반 인증을 허용하는 경우)가 포함됩니다.
- 로그인은 Lambda 함수가 암호 일치를 검증하거나 Secrets Manager에 SSH 키 값이 있을 때 검증됩니다. 유효한 사용자 로그인이 있는 경우 Lambda 함수는 나머지 키-값 페어로 HTTP 200 응답을 구성합니다. 유효한 사용자 로그인이 없으면 빈 HTTP 200 응답을 반환합니다.
CloudFormation Stack 생성
첨부한 yml 파일을 이용하여 CloudFormation 스택을 생성합니다. 해당 yml 파일은 IAM역할, API 로깅 역할, API Gateway, Lambda 등을 생성 및 API Gateway를 생성하는 yml 입니다.
사용할 API Gateway 확인
생성된 API Gateway에서 Invoke URL을 복사 해 놓습니다.
S3 버킷생성
사용자(접속자)가 데이터를 전송하여 저장할 S3 버킷을 생성합니다.
IAM Role 생성
사용자(접속자) AWS Transfer SFTP를 통해 S3 버킷에 데이터를 업로드 할 수 있는 IAM Role을 생성해줍니다.
AWS service : Transfer
연결 정책 : AmazonS3FullAccess
AWS Transfer Family SFTP 서버 생성
SFTP 서버를 생성합니다.
Custom Identity Provider API Gateway to connect 로 선택하며 URL은 이전에 복사해 두었던 API Gateway Invoke URL을 입력해줍니다.
또한 Role 은 Cloudformation 으로 만들었던 IAM Role중 TransferIdentityProviderRole을 연결해 줍니다.
Secrets Manager 자격증명 관리
AWS SFTP를 Secrets Manager에 직접 연결할 수 없으므로 연결하는 로직을 제공하는 Lambda 함수를 사용하게 됩니다. 이 Lambda 함수는 저장된 자격 증명에 대해 사용자 자격 증명을 검증하고 액세스 정보를 반환하는 역할을 합니다.
Other type of secrets 을 선택후 Json을 사용하여 키 값을 생성합니다.
Json 예시는 아래와 같습니다.
HomeDirectory : 사용자(접속자)가 데이터를 저장하기 위해 만든 S3 버킷명 /{버킷명}
Secrets name : SFTP/{user_name}
json :{ "Password": "Admin123", "Role": "arn:aws:iam::{account}:role/Role-for-accessing-s3"(S3 ARN), "HomeDirectory": "/{s3버킷명}" }
SFTP Tool을 사용하여 접속 확인 및 S3 업로드 확인
SFTP Tool을 이용하여Transfer SFTP Endpoint / user명/ password를 사용 접속
S3 버킷 내 정상 업로드 확인
감사합니다.