別の AWS アカウントにある Amazon S3 バケットを使用するように AWS Transfer for SFTP サーバーを設定する方法を教えてください。

最終更新日: 2020 年 9 月 25 日

AWS Transfer for SFTP サーバーから、別の AWS アカウントの Amazon Simple Storage Service (Amazon S3) バケットにアクセスしたいと考えています。バケットへのクロスアカウントアクセスを許可するようにサーバーを設定するにはどうすればよいですか?

簡単な説明

以下の手順を実行してください。

  1. バケットにアクセスするための AWS Identity and Access Management (IAM) ロールを作成します。
  2. IAM ロールへのクロスアカウントアクセスを付与するようにバケットポリシーを更新します。
  3. IAM ロールで設定された SFTP サーバーユーザーを作成します。
  4. SFTP サーバーユーザーがバケットにアクセスできることを確認します。

注意: AWS Transfer Family コンソールには、同じアカウントの S3 バケットのみが表示されます。別のアカウントのバケットで SFTP サーバーを使用するには、AWS コマンドラインインターフェイス (AWS CLI) または AWS SDK を使用する必要があります。

解決方法

バケットへのアクセス権限を持つ IAM ロールを作成する

SFTP サーバーユーザーの IAM ロールを作成します。ロールの IAM ポリシーでは、以下を使用します。

注意: destination-DOC-EXAMPLE-BUCKET を、SFTP サーバーがアクセスする S3 バケットの名前に置き換えます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowListingBucketReadandWriteandDelete",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:GetObject",
        "s3:DeleteObjectVersion",
        "s3:DeleteObject",
        "s3:GetObjectVersion",
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*",
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET"
      ]
    }
  ]
}

IAM ロールを作成したら、以下のように、get-role コマンドを実行してロールの ID を取得します。

$ aws iam get-role --role-name "ROLE_NAME"

次の手順では、ロール ID が必要です。

IAM ロールへのクロスアカウントアクセスを付与するようにバケットポリシーを更新する

作成した IAM ロールへのアクセス権を付与するように、宛先バケットのポリシーを変更します。以下のようなバケットポリシーを使用できます。

注意: arn:aws:iam::123456789012:root を、SFTP サーバーが属するアカウントの Amazon リソースネーム (ARN) に置き換えます。destination-DOC-EXAMPLE-BUCKET をバケットの名前に置き換えます。AROA1234567890 を、作成した IAM ロールのロール ID に置き換えます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "BucketPolicyForSFTP",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:GetObject",
        "s3:DeleteObjectVersion",
        "s3:DeleteObject",
        "s3:GetObjectVersion",
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*"
      ],
      "Condition": {
        "StringLike": {
          "aws:userId": "AROA1234567890:*"
        }
      }
    }
  ]
}

このポリシー例の Condition 要素はオプションです。指定した IAM ロールにのみバケットアクセスを付与するには、Condition 要素を含めます。または、要素を削除して、SFTP サーバーが属するアカウントからすべての IAM ロールとユーザーへのアクセスを付与します。

IAM ロールで設定された SFTP サーバーユーザーを作成する

1.    SFTP サーバーの SSH キーを生成します。

2.    SFTP サーバーのサーバー ID を取得します。

3.    AWS CLI を使用して create-user コマンドを実行します。--server-id に、SFTP サーバーの ID を入力します。--role に、作成した IAM ロールの ARN を入力します。--ssh-public-key-body に、SSH キーの作成時に生成した .pub ファイルの内容を入力します。

$ aws transfer create-user --user-name "MY_SFTP_USER_NAME" --server-id "MY_SERVER_ID"  --role "MY_IAM_ROLE_ARN" --home-directory "/DOC-EXAMPLE-BUCKET/MY_SFTP_USER_NAME" --ssh-public-key-body "CONTENTS_OF_MY_SSH_.PUB_FILE"

注意: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

コマンドは、作成したサーバー ID とユーザーを返します。

{
  "ServerId": "MY_SERVER_ID",
  "UserName": "MY_SFTP_USER_NAME"
}

重要: SFTP サーバーユーザーのアクセスをホームディレクトリのみに制限するには、IAM でスコープダウンポリシーを作成します。次に、サーバーユーザーのプロパティを編集して 、作成したスコープダウンポリシーを適用します。

SFTP サーバーユーザーがバケットにアクセスできることを確認する

1.    作成したユーザーとして SFTP サーバーに接続します。たとえば、次の OpenSSH コマンドを実行して、サーバーに接続します。

$ sftp -i mysftpuser MY_SFTP_USER_NAME@MY_SERVER_ID.server.transfer.us-east-1.amazonaws.com

2.    テストとして、バケットのホームディレクトリを一覧表示します。OpenSSH を使用している場合は、次のコマンドを実行します。

$ ls 

コマンドがホームディレクトリを返した場合、SFTP サーバーユーザーはバケットへのクロスアカウントアクセス権を持ちます。


ユーザーの作成 (AWS Transfer Family ユーザーガイド)

ユーザーの追加 (AWS Transfer Family ユーザーガイド)

Amazon S3 がリクエストを承認する方法

 

この記事は役に立ちましたか?


請求に関するサポートまたは技術的なサポートが必要ですか?