AWS】Transfer Family SFTPでS3へ安全にファイル転送する方法(KMS暗号化対応)

TransferFamilyアイキャッチ

今回は、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公式ページ

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)を追加し「変更を保存」をクリック

S3をSSE-KMSで暗号化する際の手順はこちらの記事を参考にしてください!

修正前

{
  "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.txt

SFTP接続

下記コマンドで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サーバー運用が不要となり、運用負荷を大幅に削減できます。

特に、

  • 取引先ファイル連携
  • 社内アップロード基盤
  • セキュアな外部ファイル受け渡し

などで非常に有効です。