AWS】Transfer Family SFTPでS3へ安全にファイル転送する方法(KMS暗号化対応)
今回は、Amazon Web Services の AWS Transfer Family を使用し、SFTPサーバーを構築する方法を解説します。
さらに、転送先となる Amazon S3 バケットを AWS Key Management Service(KMS)で暗号化し、安全にファイルをアップロードできる構成を作成します。
オンプレミス環境のSFTPサーバー運用と比較して、サーバー管理不要・高可用性・AWSネイティブな認証/権限管理が可能になるため、実務でも非常に利用される構成です。
記事の目次
構成図
下記のような構成になります。
AWS Transfer Family SFTP を作成する
AWS Transfer Family のサービスダッシュボードへ移動し「サーバーを作成」をクリック
今回はSFTPを作成するのでプロトコルではSFTPを選択し「次へ」をクリックします
今回はSSH認証鍵を使用するのでサービスマネージドにします。
「サービスマネージド」を選択(パスワード認証が使えないのでご注意ください。)
今回は検証用なので「パブリックアクセス可能」を選択
ドメインを選択では「Amazon S3」を選択
「追加の詳細を設定」ではデフォルトのまま
「確認と作成」セクションで問題なければそのまま「サーバーを作成」をクリック
下記のような緑のポップアップが表示されるので、数分待機し「状態」が「オンライン」となることを確認します。
IAMロールを作成する
Transfer Family ユーザーとIAMロールの関係
AWS Transfer Family のユーザーには、直接S3アクセス権限を付与しません。
代わりに、Transfer Family ユーザーへ IAM ロールを紐づけ、その IAM ロール経由で S3 や KMS へアクセスします。
そのため、
- Transfer Family ユーザー
- IAMロール
- IAMポリシー
- KMSキーポリシー
をそれぞれ適切に設定する必要があります。
今回の構成では、下記の流れでS3へアクセスします。
Transfer Family ユーザー
↓
IAMロール AssumeRole
↓
S3 / KMS へアクセス特に KMS 暗号化済み S3 バケットを利用する場合は、
- IAMポリシー
- KMSキーポリシー
両方でアクセス許可が必要となるため注意します。
IAMポリシーを作成する
Transfer Family ユーザーには直接権限を付与せず、IAMロール経由でS3アクセス権限を付与するのが基本構成です。
IAMダッシュボードへ移動し、左部メニューより「ポリシー」を選択し
「ポリシーの作成」をクリック
JSONタブを選択し、下記ポリシーを入力します。
- your-bucket-name は任意のS3バケット名
- home/testuser/ はユーザーごとのホームディレクトリ
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListBucket",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::your-bucket-name",
"Condition": {
"StringLike": {
"s3:prefix": [
"home/testuser/*"
]
}
}
},
{
"Sid": "HomeDirObjectAccess",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::your-bucket-name/home/testuser/*"
},
{
"Sid": "AllowKMS",
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:Encrypt",
"kms:GenerateDataKey"
],
"Resource": "arn:aws:kms:ap-northeast-1:123456789012:key/xxxxxxxx"
}
]
}
確認して作成セクションではポリシー名を任意で入力し「ポリシーの作成」をクリック
今回は「s3-for-transfer-family-home-access-only」にします。
緑のポップアップが表示され正常に作成できていることを確認します。
IAM ロールの作成
左部メニューの「ロール」を選択し「ロールを作成」をクリック
信頼されたエンティティタイプセクションで「AWSのサービス」を選択し「Transfer」を選択します。
許可を追加セクションで先ほど作成した「s3-for-transfer-family-home-access-only」を選択します。
名前、確認、および作成セクションで「transfer-family-testuser-rle」という名前で作成します。
KMSキーポリシーを修正する
Transfer Family から KMS暗号化済みS3へアクセスするため、KMSキーポリシー側にもIAMロールを追加する必要があります。
KMSダッシュボードへ移動し、左部メニューより「カスタマー管理型のキー」を選択
今回Transfer Family SFTP の転送先S3が使用しているKMSキーのエイリアスをクリックします。
「ポリシービューへの切り替え」を選択し、JSON画面を表示します。
Allow use of the key (キー使用者の指定セクション)で今回作成したロール(arn:aws:iam::xxxxxxxxxxx:role/transfer-family-testuser-rle)を追加し「変更を保存」をクリック
修正前
{
"Sid": "Allow use of the key",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/kms_s3_for_ec2-role"
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
}修正後
{
"Sid": "Allow use of the key",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::123456789012:role/kms_s3_for_ec2-role",
"arn:aws:iam::123456789012:role/transfer-family-testuser-role"
]
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
}
Transfer Family ユーザーを作成する
Transfer Family のダッシュボードへ移動し
作成したTransfer Family サーバーを選択し、「ユーザーを追加」をクリックします。
下記のように設定します。

SFTP接続確認
SSH鍵を作成する
今回は macOS のターミナルで鍵を作成します。
鍵作成コマンド
ssh-keygen -t rsa -b 4096 -f /path/to/transfer_family_key
作成した鍵(transfer_family_key.pub)をコピー
cat /path/to/transfer_family_key.pub
公開鍵をTransfer Familyへ登録する
AWS Transfer Family SFTP のダッシュボードへ移動し、先ほど作成したサーバーのIDをクリック
「ユーザー」より「ユーザー名」のリンクをクリック
「SSHパブリックキーを追加」で先ほど、作成した鍵の情報「cat /path/to/transfer_family_key.pub」を貼り付けます。
テストファイル作成
echo "hello transfer family" > test.txtSFTP接続
下記コマンドでSFTP接続を行います。サーバーのドメインはサーバーの詳細から確認できます。
sftp -i /path/to/key/transfer_family_key testuser@s-xxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com
ファイルをアップロードするコマンドは下記
put test.txt
まとめ
今回は AWS Transfer Family を使用し、
- SFTPサーバー構築
- S3連携
- IAMロール制御
- KMS暗号化対応
- SSH公開鍵認証
まで実施しました。
Transfer Family を利用することで、EC2ベースのSFTPサーバー運用が不要となり、運用負荷を大幅に削減できます。
特に、
- 取引先ファイル連携
- 社内アップロード基盤
- セキュアな外部ファイル受け渡し
などで非常に有効です。