AWS Transfer Familyのユーザー追加時の設定項目(セッションポリシー、制限付き、ホームディレクトリ等)まとめ

2024.01.16

はじめに

Transfer Familyのマネジメントコンソール上でのユーザー追加時、「IAMロール」、「セッションポリシー」、「ホームディレクトリ」、「制限付き」の設定項目について、機能や利用すべきユースケースを項目ごとにまとめました。

前提

Transfer Familyサーバーの作成時の設定内容は、下記の通りです。

  • プロトコルは、SFTP、FTPS、FTPのいずれか(本記事ではSFTPを選択)
  • エンドポイントは何でもよい(本記事ではパブリックを選択)
  • ファイル転送先(ドメイン)は、Amazon S3を想定
  • ユーザー管理方法は、サービスマネージドもしくはAD認証を想定
    • ユーザー名がカスタム ID プロバイダーの場合、ユーザーの追加はSecret Managerで設定するため、今回は想定しません。

設定項目は、以下の順で説明いたします。

  • ユーザー名もしくはSID
  • ホームディレクトリ
  • 制限付き
  • IAMロール
  • セッションポリシー

ユーザー名もしくはSID

ユーザー管理方法が、サービスマネージドの場合はユーザー名を設定し、AD認証の場合はADグループのセキュリティ識別子(SID)を設定します。

ユーザー名

ユーザー管理方法がサービスマネージドの場合、ログインするユーザー名を設定します。

ユーザー名は3文字以上、100文字以下で入力します。

ユーザー名に使用できる文字は、a-zA-Z0-9@_(アンダースコア「)、-(ハイフン)、.(ピリオド)です。

SID

ユーザー管理方法がAD認証の場合、利用したいユーザーが所属しているADグループのSIDを設定します。

ADのユーザーやグループの作成、グループIDの確認方法は下記の記事が参考になります。

ホームディレクトリ

ホームディレクトリは、Transfer Familyサービスにおいてユーザーがアクセスする際の基点となるディレクトリのことを指します。

ユーザーがログインした後、最初にアクセスするディレクトリのことです。

ユーザーのホームディレクトリは、「特定のS3バケット」と「フォルダ」を設定することができます。 (S3ではフォルダという概念はなく、「プレフィックス」と表現されますが、Transfer Familyの日本語コンソール画面やドキュメントでは「フォルダ」と記載されているため、本記事では「フォルダ」と表現します)

「特定のS3バケット」と「フォルダ」のどちらも指定しない場合、「特定のS3バケット」のみを指定した場合、どちらも指定した場合の3パターンで挙動を確認します。

どちらも指定しない場合

下記の通り、ホームディレクトリとフォルダを指定せずにユーザーを追加した場合、ホームディレクトリは/になります。

ホームディレクトリが/の場合、IAMロールにAmazonS3FullAccessがアタッチされていれば、lsすると、アカウント内のS3バケットが全て確認できます。

sftp -i 秘密鍵 ユーザー名@Transfer Familyのエンドポイント名
sftp> pwd
Remote working directory: /
sftp> ls
(アカウント内のS3バケット名が出力されます。もちろん移動やアップロードも可能)

「特定のS3バケット」のみを指定した場合

下記の通り、ホームディレクトリに「特定のS3バケット」を設定し、フォルダは指定しない場合、ユーザーのホームディレクトリは/S3バケット名です。

ホームディレクトリが/S3バケット名の場合、ログイン直後にpwdすると、S3バケットのルートディレクトリがホームディレクトリだと確認できました。

sftp -i 秘密鍵 ユーザー名@Transfer Familyのエンドポイント名
sftp> pwd 
Remote working directory: /<s3バケット名>
sftp> ls
Detailed-Reports    Summary-Reports     test.jpg

lsすると、ルートディレクトリ直下にDetailed-ReportsフォルダとSummary-Reportsフォルダ、test.jpgファイルが確認されました。

「特定のS3バケット」と「特定のフォルダ」を指定した場合

ホームディレクトリに「特定のS3バケット」と「特定のフォルダ」を設定した場合、ホームディレクトリは/S3バケット名/特定のフォルダです。

ホームディレクトリが/S3バケット名/フォルダ名の場合、ログイン直後にpwdすると、S3バケット内の/フォルダ名がホームディレクトリだと確認できました。

sftp -i 秘密鍵 ユーザー名@Transfer Familyのエンドポイント名
sftp> pwd
Remote working directory: /<s3バケット名>/Detailed-Reports
sftp> ls
task-xxxxxxxx

ホームディレクトリのフォルダの変数

ホームディレクトリのフォルダの設定には、変数が利用できます。

ユーザー管理方法がサービスマネージドの場合、ユーザーを追加するときのコンソール画面は下記の通りです。

ユーザー管理方法がAD認証の場合、コンソール画面は下記の通りです。

AD認証の場合、ホームディレクトリにS3バケットを選択すると、フォルダ欄に${transfer:Username}が自動出力されます。

${transfer:Username}は変数であり、ログインする際のユーザー名に置き換えられます。つまり、ユーザー名ごとにホームディレクトリパスを動的に生成することができます。

AD認証を利用しTransfer Familyでユーザーが所属しているグループのSIDを追加する場合、グループに所属しているユーザーごとに動的に変えることができるということになります。

動的にホームディレクトリを変えたい要件がある場合、${transfer:Username}の変数を設定しましょう。

ホームディレクトリに/S3バケット/${transfer:Username}と設定すると、ユーザー名classmethod1の場合、/S3バケット/classmethod1がホームディレクトリになります。

制限付き

「制限付き」を有効化すると、ユーザーはホームディレクトリ内でのみ操作を行うことができ、別のS3バケットや別のフォルダへのアクセスは制限されます。

これはUNIX系OSで使用されるchrootコマンドに相当する機能です。

ホームディレクトリを/S3バケット名/フォルダ名に設定し、「制限付き」を有効化した場合、S3バケットの特定のフォルダ配下しかアクセスや操作できません。

sftp -i 秘密鍵 ユーザー名@Transfer Familyのエンドポイント名
sftp> pwd
Remote working directory: /
sftp> ls
task-xxxxxxxx
sftp> cd ..
sftp> ls
task-xxxxxxxx

ホームディレクトリは、/<s3バケット名>/Detailed-Reportsに設定し、pwdすると、/<s3バケット名>/Detailed-Reportsはユーザーからは見えず、/と表示されます。

cdで親ディレクトリに移動しようとしても、エラー表示にはなりませんが、/のままでした。

ホームディレクトリに/S3バケット名を設定した場合、特定のS3バケット以外のS3バケットへのアクセスが制限されます。

ユーザーにはホームディレクトリ配下のみしか利用させたくない(+見せたくない)場合、「制限付き」を設定することで、簡単にユーザーのアクセス制御ができます。IAMロールでも設定できますが、ユーザーごとにIAMポリシーを設定する作業に比べて、「制限付き」を有効化するほうが楽です。

ホームディレクトリを設定しつつ、親ディレクトリに閲覧のみ許可したい場合、「制限付き」は無効化し、次章で説明するIAMロールやセッションポリシーを利用しましょう。

IAMロール

ユーザーがS3バケットにアクセスするためにIAMロールを関連付ける必要があります。

ユーザーがS3バケットやフォルダを利用できるように、適切なIAMロールを割り当ててアクセス制御を行います。

ただし、先程も記載しましたが、ユーザーのホームディレクトリ配下のみを利用許可したい場合、IAMロールではなく「制限付き」を有効化することで、容易にアクセス制御できるのでおすすめです。

「制限付き」を有効化した場合、IAMロールにAmazonS3FullAccessがアタッチされていてもホームディレクトリ配下しか利用できず、アクセス制御できます。

セッションポリシー

セッションポリシーは、IAMロールの制御とは別に、ユーザーをアクセス制限するIAMポリシーです。

セッションポリシーはS3でのみ使用できます。Amazon EFS では、POSIXファイルのアクセス権限を使用してアクセスを制限します。

S3の場合、「ホームフォルダに基づくポリシーの自動生成」を選択すると、下記のポリシーが作成されます。

{
  "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": "HomeDirObjectAccess",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject",
        "s3:GetObjectVersion"
      ],
      "Resource": "arn:aws:s3:::${transfer:HomeDirectory}*"
    }
  ]
}

上記のセッションポリシーでは、以下の3つの変数が利用されています。

  • ${transfer:HomeBucket}
  • ${transfer:HomeDirectory}
  • ${transfer:HomeFolder}

例えば、ホームディレクトリが/<s3バケット名>/directory1/directory2の場合、下記のとおりになります。

  • ${transfer:HomeBucket}
    • /<s3バケット名>
  • ${transfer:HomeDirectory}
    • /<s3バケット名>/directory1/directory2
  • ${transfer:HomeFolder}
    • /directory1/directory2

ちなみに、セッションポリシーでは、${transfer:UserName}も利用可能です。

ホームディレクトリをユーザーごとに動的に値を変えたい場合、これらの変数をセッションポリシーで設定することで、複数のユーザーで同じセッションポリシーを利用することができます。

ちなみに、「ホームフォルダーに基づいてポリシーを自動生成」を選択した場合、ユーザーには「制限付き」は利用できません。有効にするとエラーになります。

ホームディレクトリ以外にも別のディレクトリや別のS3バケットを利用したい場合、「制限付き」ではなく、セッションポリシーの利用検討しましょう。

変数が不要であれば、セッションポリシーは利用せず、IAMロールでのアクセス制御でもよいでしょう。

他のアクセス制御

Transfer Familyのマネジメントコンソール上でのユーザー追加時の設定項目以外に、アクセス制御する方法として、S3のバケットポリシーやTransfer Familyの論理ディレクトリがあります。

論理ディレクトリは、S3バケット名やパスを表示させたくない、あるいはフルパスでのアップロードを避けたい場合などに有効な機能です。

下記の記事にまとめられていますので、ご参考ください。

最後に

本記事では、Transfer Familyのユーザー追加時の設定項目について、1つずつ解説しました。

設定値のユースケースを紹介しましたので、設定時の参考にしていただければ幸いです。

参考