【AWS Transfer for SFTP】WinSCPを使用してファイル転送する

記事タイトルとURLをコピーする

こんにちは、技術2課の芳賀です。
最近の仙台はこの日は寒かったり、この日は暖かかったりと日によって寒暖の差が激しいです。
今年も残り1か月を切りましたので、皆さん体調管理に気を付けて楽しい年末年始を過ごせるようにしましょう。(マジメか

今回はAWS Transfer for SFTPについてセットアップの手順をまとめました。
数ヵ月前にはなかった機能がいつの間にか追加されていたので、そのことについても触れたいと思います。

AWS Transfer for SFTP とは

AWS Transfer for SFTPの説明が以下リンクにありました。一部抜粋します。
AWS Transfer for SFTP とは

AWS Transfer for SFTP (AWS SFTP) は完全マネージド型の AWS サービスで、Secure File Transfer Protocol (SFTP) を使用して Amazon Simple Storage Service (Amazon S3) との間でファイルを転送します。SFTP は、Secure Shell (SSH) ファイル転送プロトコルとも呼ばれています。SFTP は、金融サービス、医療、広告、リテールなどのさまざまな業界間におけるデータ交換ワークフローに使用されます。

AWS Transfer for SFTP の設定順

基本、以下リンクの内容に従って設定を進めていきます。
AWS Transfer for SFTP の詳細

  1. S3バケットの作成
  2. IAMポリシー及びロールの作成
  3. SFTPサーバーの作成
  4. SFTPユーザーの作成
  5. SFTPクライアントからAWS SFTPへファイルを転送する
  6. アクセス可能なホームディレクトリの制御

1. S3バケットの作成

今回は新しい「sftp-test-bucket-201912」というバケットを準備しました。設定はデフォルトのままで非公開の設定です。

「sftp-test-bucket-201912」バケット内に後ほどホームディレクトリとして使用する「SftpHome」のフォルダを作成しておきます。

2. IAMポリシー及びロールの作成

2-1. SFTP のための IAM ポリシーおよびロールの作成

以下をもとにSFTPのためのIAMポリシーおよびロールを作成します。
SFTP のための IAM ポリシーおよびロールの作成

IAMのポリシーを作成します。
ポリシーより「ポリシーの作成」を選択します。

ポリシーの作成画面へ遷移します。
「JSON」タブを選択し、以下のポリシーの内容を貼り付けます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowListingOfUserFolder",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::sftp-test-bucket-201912"
            ]
        },
        {
            "Sid": "HomeDirObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObjectVersion",
                "s3:DeleteObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::sftp-test-bucket-201912/*"
        }
    ]
}

「sftp-test-bucket-201912」の箇所は「1.」で作成したS3のバケット名を指定しています。

貼り付けた後「ポリシーの確認」を選択します。

ポリシー名を入力する画面に遷移します。
ここでは名前に「policy-SftpTest」を入力し、「ポリシーの作成」を選択します。

「policy-SftpTest」のIAMポリシーが作成されました。

IAMロールを作成します。
ロールにて「ロールの作成」を選択します。

ロールの作成画面に遷移します。
エンティティでは「AWSサービス」、サービスでは「Transfer」を選択し、「次のステップ:アクセス権限」を選択します。

先ほど作成した「policy-SftpTest 」を選択し、「次のステップ:タグ」を選択します。

タグは任意で設定してください。ここでは設定せず「次のステップ:確認」を選択します。

ロール名を入力する画面に遷移します。
ここでは名前に「role-SftpTest」を入力し、「ロールの作成」を選択します。

「role-SftpTest」のIAMロールが作成されました。

2-2. CloudWatchへログ記録を有効にするためのIAMポリシーおよびロールを作成

以下をもとにCloudWatchへログ記録を有効にするためのIAMポリシーおよびロールを作成します。
CloudWatch でのアクティビティのログ記録

「2-1.」にてSFTPのためのIAMポリシーを作成した時と同様に「JSON」タブを選択、以下のポリシーの内容を貼り付けます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:DescribeLogStreams",
                "logs:CreateLogGroup",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}


貼り付けた後「ポリシーの確認」を選択します。

ここでは名前に「policy-SftpLogs」と入力し、「ポリシーの作成」を選択します。

「policy-SftpLogs」のポリシーが作成されました。

IAMロールを作成します。
「2-1.」のSFTPのIAMロールを作成した時と同様の手順ですので画面は省かせて頂きます。

  • エンティティでは「AWSサービス」、サービスでは「Transfer」を選択し、「次のステップ:アクセス権限」を選択します。
  • ポリシーには「policy-SftpLogs 」を選択し「次のステップ:タグ」を選択します。
  • タグは任意で設定してください。ここでは設定せず「次のステップ:確認」を選択します。
  • ロール名には「role-SftpLogs」を入力し、「ロールの作成」を選択します。

「role-SftpLogs」のIAMロールが作成されました。

3. SFTPサーバーの作成

以下を参考にSFTPサーバーを作成します。
SFTP サーバーの作成

AWS Transfer for SFTPにて「Create server」を選択します。

  • Endpoint configuration
    • Endpoint type
      SFTPサーバーへインターネット経由でアクセスするか、VPCエンドポイント経由でアクセスするかを選択できます。
      今回はインターネット経由でアクセスするため「Public」を選択します。
    • Custom hostname
      カスタムドメインを使用してSFTPサーバーへアクセスする場合に選択します。
      今回は使用しないため「None」を選択します。
    • Identity provider
      ADやLDAPなどのIDプロバイダーに接続する場合は「Custom」を選択します。
      今回は使用しないため「Service managed」を選択します。

  • Logging role
    「2-2.」にて作成した「role-SftpLogs」を選択します。
  • Tags
    任意のタグを設定します。今回は特に設定しません。

各項目を選択したのち、「Create server」を選択します。

SFTPサーバーが作成されました。

4. SFTPユーザーの作成

以下をもとにSFTPサーバーへアクセス可能なユーザーを作成します。
ユーザーの追加

ユーザーを作成する際、SSHの公開鍵が必要になるため、以下を参考にキーペアを作成しておきます。
SSH キーの生成

AWS SFTPのServerより、「3.」にて追加したSFTPサーバーのチェックボックスをチェックし「Add user」を選択します。

Add user画面に遷移します。
以下の情報を入力し「Add」を選択します。

項目名 入力値 備考
Username SftpUser 任意のユーザー名を入力します。
最小 3 文字、最大 32 文字。使用可能文字:a-z、A-Z、0-9、下線、ハイフン。ユーザー名をハイフンで始めることはできません。
Access role-SftpTest 「2-1.」で作成したIAMロールを選択します。
Policy None S3 バケットに対しての操作を制限する場合にIAMポリシーを設定します。後ほどの手順で設定を変更します。
スコープダウンポリシーの作成
Home directory sftp-test-bucket-201912 「1.」で作成した「sftp-test-bucket-201912」のS3バケットを選択します。
AWS SFTP を使用して転送するデータを保存する S3 バケットになります。
Restricted 未チェック チェック時、ホームディレクトリの外部にアクセス、S3バケットまたはフォルダー名の表示を制限します。
後ほど手順で設定を変更します。
SSH public keys 公開鍵の値 「4.」で作成した公開鍵を入力します。
Tags 未入力 任意のタグを設定します。今回は入力しません。

SFTPのユーザーが作成されました。

 

5. SFTPクライアントからAWS SFTPへファイルを転送する

SFTPサーバー、ユーザーを作成したのでAWS側の準備は完了しました。以下を参考にSFTPクライアントからAWS SFTPへファイル転送してみます。
AWS SFTP を使用してファイルを転送する

今回はWindows端末よりAWS SFTPへアクセスする為、Windowsで使用できる「WinSCP」のクライアントを使用します。こちらからWinSCPをダウンロードし、アクセス元の端末にインストールしておきます。

起動するとログイン情報を入力する画面が表示されるので以下の情報を入力します。

項目 入力値 備考
転送プロトコル SFTP  
ホスト名 SFTPサーバーのエンドポイント SFTPサーバーの「Server configuration」のEndpointを指定します。
ポート番号 22  
ユーザー名 SftpUser 「4.」にて作成したSFTPのユーザー名を指定します。
パスワード なし 「設定」より秘密鍵を指定します。
「4.」にて作成したキーペアの秘密鍵を指定します。

秘密鍵を指定するため「設定」を選択します。

SSH→認証を選択、秘密鍵の項目から、「4.」にて作成した秘密鍵を設定し「OK」選択します。

秘密鍵がPuTTY形式でない場合、以下のメッセージが表示されます。PuTTY形式の鍵を使用する必要があるので「OK」を選択します。

元々の秘密鍵が配置されているディレクトリにPuTTY形式の鍵が作成されます。「OK」を選択します。

鍵を設定後、「ログイン」を選択します。するとSFTPのユーザー作成時に設定したホームディレクトリが表示されます。「1.」にてS3バケット内に作成した「SftpHome」フォルダが確認できます。

試しに新規にテキストファイルを作成してみます。新規→ファイルを選択します。

ファイル名を入力するダイアログが表示されるので、ファイル名を入力します。

テキストファイルが作成されました。

S3の「sftp-test-bucket-201912」バケット内を確認してみると、テキストファイルが作成されています。

念のため、テキストファイルをS3からダウンロードして中身を確認してみると・・・ちゃんと入力した内容が反映されています。

6. アクセス可能なホームディレクトリの制御

SFTPサーバーがクライアントから使用できるようになりました。しかし、ここまでの設定では今後SFTPのユーザーが追加された場合、それぞれのユーザーのホームディレクトリがお互い参照できる状態になってしまいます。他ユーザーのホームディレクトリが参照できないようアクセス制御する方法があり、現時点(2019/12/3)では以下の2種類の方法で制御することができます。

  1. ホームディレクトリの「Restricted」をチェックする
  2. スコープダウンポリシーを設定する

それぞれの方法について、「4.」で作成した「SftpUser」のユーザーを使って確認していきます。

6-1. ホームディレクトリの「Restricted」をチェックする場合

SFTPサーバーのUsersからの「SftpUser」を選択します。

User configurationの「Edit」を選択します。

ユーザーの編集画面に遷移します。
Home directoryのS3バケット下にある入力項目にホームディレクトリのパスを設定します。
ここではS3バケット内に作成したフォルダ「SftpHome」を入力します。
「Restricted」にチェックを入れます。チェックを入れることでホームディレクトリ以外を参照できなくなります。
「Save」を選択します。

Home directoryが更新されました。

WinSCPにてアクセスしてみると以下のような状態になります。どのディレクトリにいるのかわからない状態になりました。ちなみに上のディレクトリに移動しようと思っても移動することはできません。

どこのディレクトリにいるのか確認のため(SftpHomeにいるはずですが)テキストファイルを作成してみます。

S3の「sftp-test-bucket-201912」バケット内の「SftpHome」を確認してみると、テキストファイルが作成されています。想定通り、ホームディレクトリは「/sftp-test-bucket-201912/SftpHome」になっていることが確認できました。

6-2. スコープダウンポリシーを設定する場合

以下をもとにスコープダウンポリシーを作成します。
スコープダウンポリシーの作成

作成するポリシーの内容は以下です。

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Sid": "AllowListingOfUserFolder",
          "Action": [
              "s3:ListBucket"
          ],
          "Effect": "Allow",
          "Resource": [
              "arn:aws:s3:::${transfer:HomeBucket}"
          ],
          "Condition": {
              "StringLike": {
                  "s3:prefix": [
                      "${transfer:HomeFolder}/*",
                      "${transfer:HomeFolder}"
                  ]
              }
          }
      },
      {
          "Sid": "AWSTransferRequirements",
          "Effect": "Allow",
          "Action": [
              "s3:ListAllMyBuckets",
              "s3:GetBucketLocation"
          ],
          "Resource": "*"
      },
      {
          "Sid": "HomeDirObjectAccess",
          "Effect": "Allow",
          "Action": [
              "s3:PutObject",
              "s3:GetObject",
              "s3:DeleteObjectVersion",
              "s3:DeleteObject",
              "s3:GetObjectVersion",
              "s3:GetObjectACL",
              "s3:PutObjectACL"
          ],
          "Resource": "arn:aws:s3:::${transfer:HomeDirectory}*"
       }
  ]
}

「${transfer:HomeBucket}」、「${transfer:HomeDirectory}」と記載されている箇所は、SFTPのユーザ作成時に入力したホームディレクトリの値を参照する変数になっています。そのためユーザー毎にこのポリシーを作成する必要はありません。ただし、ユーザー毎に細かくアクセスの制限をかけたい場合はこの限りではありません。

「policy-SftpScopeDown」のような名前でポリシーを作成しました。

SFTPのユーザーについて編集します。
Policyについて、先ほど作成した「policy-SftpScopeDown」を選択します。Home directoryの「Restricted」はチェックを外します。
「Save」を選択します。

ユーザーのポリシーが更新されました。Policyの「View」が活性状態になり、設定したポリシーの内容を確認することができます。

WinSCPでアクセスしてみます。「Restricted」をチェックした時とは異なり、自身がどのディレクトリにいるか確認できるようです。

また、上のディレクトリに移動できないということに変わりはありませんが、移動しようとすると以下のようなダイアログが表示されました。

念のためテキストファイルを作成してみます。

問題なくS3の「sftp-test-bucket-201912」バケット内の「SftpHome」にファイルが作成されました。

おまけ

ホームディレクトリの「Restricted」チェックとスコープダウンポリシー、両方設定した場合どうなるか確認したところ、エラーメッセージが表示され設定することができませんでした。いずれかの一方しか設定できないよう制御されているようです。

最後に

数ヵ月前にAWS SFTPを触ったときは、ホームディレクトリの「Restricted」チェックボックスはなく、スコープダウンポリシーを使用してホームディレクトリの制御をしていました。
いつの間にか色々な機能が追加されているので、既知のサービスも改めて触ってみると、新たな発見や理解を深めることができるなと感じた次第です(マジメか