본 포스팅에서는 AWS Transfer family를 사용해서 S3를 SFTP 서버로 사용하고 접속하는 방법을 다룬다.
Transfer family는 S3와 EFS에대해 보안전송을 지원하며, 지원 프로토콜은 다음과같다.
- Secure Shell (SSH) File Transfer Protocol (SFTP)
- File Transfer Protocol Secure (FTPS)
- File Transfer Protocol (FTP)
1. S3 버킷 생성
AWS S3 버킷을 생성한다. 버킷의 이름은 본인 계정과 다른 계정에 대해 모두 중복되지 않는 이름으로 정한다.
파블릭 액세스 접근은 사용 목적에 따라 다르게 설정한다. 나는 이 S3 객체에 대해서는 퍼블릭 액세스를 차단하고, SFTP 용도로만 사용할 것이므로 모든 퍼블릭 액세스를 차단했다.
2. Transfer Family에 적용할 IAM 생성
신뢰할 수 있는 엔티티 유형 (trusted entity type)에서 Transfer를 선택한다.
이 역할로 S3에 접근해야하므로 다음 세 정책을 추가한다.
3. Transfer 생성
콘솔에서 Transfer Family 검색 > 서버 생성 > 프로토콜 선택
SFTP 서버에 액세스하는 방법을 선택한다.
- 서비스 관리형: Transfer 서비스 내에서 사용자 자격증명 관리
- AWS Directory Service: AWS AD 혹은 온프레미스 AD와 연동하여 인증 수행 가능
- 사용자 지정 자격 증명 공급자: AWS Lambda, API GateWay 기반 자격증명 지원
엔드포인트 구성에서는 외부에서 SFTP에 액세스 때 사용하는 엔드포인트를 설정한다.
- 공개적으로 액세스 가능: 0.0.0.0/0에 대한 모든 접근 허용
- VPC 호스팅: 보안 그룹을 사용하여 특정 IP/대역대에 대한 접근만 허용
이렇게 생성된 엔드포인트는 abcdefg12324567.server.transfer.region.amazonaws.com와 같이 매우 길다.
따라서, 사용자 지정 호스트 이름을 제공하여 엔드포인트에대한 별칭을 제공한다. 가지고있는 DNS가 있다면 sftp.example.com 과같이 간략히 줄일 수 있다.
SFTP 서버로 사용할 스토리지 서비스를 선택한다. S3와 EFS를 지원한다.
이후의 옵션은 기본 값을 유지한채 (필요하다면 수정) 서버를 생성한다.
3. 사용자 생성
sftp는 리눅스, 윈도우 모두 사용 가능하다. 각 환경에 맞게 public, private key를 생성하고 AWS Transfer 서버에서 사용자를 생성한다.
3.1 리눅스 사용자 설정
[linux]
리눅스는 sshkey gen을 사용해서 public/private key를 생성한다.
# ssh-keygen -P "" -m PEM -f [key_name]
ssh-keygen -P "" -m PEM -f user_linux_key
위 명령어 수행 결과 다음과 같이 두 파일이 생성되며, user_linux_key.pub 파일 내용을 복사한다.
- user_linux_key.pub: 공개키, AWS Transfer 서버 사용자에 등록
- user_linux_key: 개인키, linux 사용자가 SFTP 액세스에 사용
[AWS 콘솔]
Transfer > 서버ID를 클릭 > 사용자 생성
역할은 "2. Transfer Family에 적용할 IAM 생성" 에서 생성한 역할을 선택한다.
앞서 리눅스에서 생성된 두 파일 중에서 공개키 내용 (user_linux_key.pub)을 붙여넣는다.
생성된 사용자를 확인한다.
3.2 윈도우 사용자 설정
[Windows]
putty-gen을 사용하여 public과 private key를 생성한다.
[AWS 콘솔]
앞서 리눅스 사용자 생성과 동일하게 설정하고, putty-gen에서 생성한 public key를 입력한다.
4. SFTP 클라이언트 연결
이 과정으로 SFTP 접근을 위한 Transfer 설정이 완료되었다.
SFPT 연결을 위해서는 다음 두 가지가 필요하다.
- 엔드포인트
- 사용자 이름
각 환경에서 SFTP에 연결하는 방법은 아래와같다.
4.1 Linux SFTP 연결 방법
콘솔에서 엔드포인트를 복사한다.
사용자 이름을 확인한다.
CLI에 다음과 같이 명령어를 입력한다.
# sftp -i [PRIVATE_KEY] [USER_NAME]@[ENDPOINT]
sftp -i user_linux_key user_linux@s-7f2b2a0d4ad847c28.server.transfer.ap-northeast-2.amazonaws.com
아래와 같이 sftp 연결 완료되었음이 확인 가능하다.
get 명령으로 s3 내부 파일 다운로드 테스트를 수행한다.
4.2 Windows SFTP 연결 방법
콘솔에서 엔드포인트를 복사한다.
사용자 이름을 확인한다.
윈도우에서 SFTP를 지원하는 다양한 프로그램들이 있다 (MobaXterm, WinSCP 등).
본 포스팅에서는 그 중에서 MobaXterm을 사용하여 SFTP 연결 테스트를 한다.
접속이 완료되면 아래와같은 화면을 확인할 수 있다.
5. 비용
Transfer는 각 엔드포인트에 활성화된 프로토콜과 각 프로토콜을 통해 전송된 데이터의 양에 대해 비용을 청구한다. 그런데 24시간 서버를 사용한다는 가정하에 1엔드포인트 X 1프로토콜당 프로토콜 비용만 219.00 USD 가 청구된다. (이 비용이면 S3에 약8TB 저장이 가능하다.. s3는 반드시 SFTP가 필요한 경우가 아니라면 내부망을 통해 aws s3 cli 명령어를 사용하는것이 비용 효율적일 것 같다..)
[참고]
https://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/key-management.html#sshkeygen
https://docs.aws.amazon.com/transfer/latest/userguide/getting-started.html
https://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/what-is-aws-transfer-family.html
댓글