1. 개요
SFTP 서버 구성을 위해서 AWS Transfer Family 서비스를 사용했었는데요.
ssh key를 기반으로 하는 인증을 기본으로 제공합니다.
하지만 레거시 시스템과의 연동을 위해서 ID/Password 기반의 인증이 필요했습니다.
Custom Identity Provider(IDP)를 통해서 Transfer Family 인증 부분을 구현할 수 있었는데요.
지금부터 Custom Identity Provider 구현 방법에 대해서 알아보겠습니다.
2. 구성 방안
2.1 아키텍처
2.1.1 네트워크 설정
Transfer Family는 SFTP, AS2, FTPS, FTP를 제공하는 서비스입니다. 하나의 서비스를 원하는 프로토콜을 복수 선택해서 사용할 수 있습니다.
Endpoint Type은 Public 또는 VPC Endpoint를 선택할 수 있는데요.
저희는 내부 레거시 시스템과의 연계를 위해서 VPC Endpoint type으로 구성하였습니다.
VPC Endpoint는 서브넷 별로 생성이 되고, private ip가 할당됩니다. 여기에 route53을 통해서 domain을 할당해서 사용할 수 있습니다.
레거시 시스템은 Direct Connect를 통해서 VPC와 연동이 되어 있습니다.
2.1.2 스토리지
Transfer Family의 스토리지로 S3와 EFS를 사용할 수 있는데요.
가볍게 구성하기 좋은 S3를 선택했습니다.
2.1.3 인증
AWS Transfer Family 서비스는 ssh key를 기반으로 하는 인증을 기본으로 제공합니다.
Identity Provider(IDP)를 Service managed 또는 AWS Directory Service, Custom Identity Provider를 선택할 수 있는데요.
Custom Identity Provider를 통해서 API Gateway & Lambda & Secrets Manager 조합으로 ID/Password를 구현하였습니다.
API Gateway는 Transfer Family의 IDP와 연결되며 Lambda를 호출하기 위한 용도로 구성이 됩니다.
Lambda가 호출되면 User name과 Password의 validation을 확인합니다.
Secrets Manager에서 Secret을 조회하여 UserHome과 ID/Password 등을 읽고, 입력값과 비교하여 인증을 처리하게 됩니다.
2.1.4 주의사항
Transfer Family의 서버를 생성하면, 데이터 업로드/다운로드 비용 이외에 endpoint 활성화된 시간만큼 비용이 추가됩니다.
Transfer Family 서버를 중지해 놓더라도, 비용이 발생하는 거죠.
특정 시간만 사용해야 된다면, Transfer Family 서버를 제거하고 필요한 시간에만 재생성해서 사용하는 방법도 있습니다.
접속 주소를 고정하기 위해서 Route53 recordset을 동일한 도메인으로 할당해서 사용하면 됩니다.
Transfer Family의 사용 비용이 비싼 편이므로 주의가 필요합니다.
2.2 구성 코드
Terraform을 이용하여 리소스를 생성해 보았습니다.
디렉토리 구조는 아래와 같습니다.
2.2.1 API Gateway
2.2.2 Lambda
2.2.3 S3
2.2.4 SFTP
2.2.5 Lambda Python Code(index.py)
2.3 구성 결과
2.3.1 Transfer Family 구성 확인
Identity provider에 type은 Custom – Amaon API Gateway로 확인이 됩니다.
Invocation URL은 API Gateway의 URL이고, Endpoint Type은 VPC Endpoint로 설정된 것이 확인됩니다.
VPC Endpoint의 ID를 눌러서 endpoint의 상세 정보 창으로 이동할 수 있는데요.
상세 정보창의 DNS names에서 접속 시 사용할 수 있는 주소를 얻을 수 있습니다.
2.3.2 Secrets Manager 계정 정보 확인
Secrets Manager에서 생성된 Secrets 정보를 누르고, Secret value에서 ‘Retrieve secret value’ 버튼을 누르면 계정 정보를 볼 수 있습니다.
Home Directory 정보와 UserId, Password 등이 보이게 됩니다.
SFTP 접속 시 사용하게 될 계정 정보는 Secret name의 ‘SFTP/’ 뒷부분입니다. 여기서는 ‘USER0’ 가 되구요.
Password는 Secret value의 Password를 사용하면 됩니다.
2.3.3 접속 확인
VPC Endpoint type으로 생성했기 때문에 인터넷을 통한 접근은 되지 않습니다.
Cloud9 또는 Bastion 서버를 VPC에 생성하고, 접속을 시도해 봅니다.
정상적으로 접속이 되면 ‘sftp>’ 프롬프트가 보이게 됩니다.
3. 마무리
AWS Transfer Family를 위한 Custom Identity Provider를 API Gateway + Lambda + Secrets Manager로 구성을 해보았습니다.
이 문서에는 인증처리를 중심으로 코드가 구성이 되었는데요. Lambda Python Code에 인증 전처리, 후처리 등을 자유롭게 구현이 가능하기 때문에
프로젝트 환경에 맞게 커스터마이징해서 기능을 확장해 나갈 수 있습니다.