AWS Transfer Familyのユーザー追加時の設定項目(セッションポリシー、制限付き、ホームディレクトリ等)まとめ
はじめに
Transfer Familyのマネジメントコンソール上でのユーザー追加時、「IAMロール」、「セッションポリシー」、「ホームディレクトリ」、「制限付き」の設定項目について、機能や利用すべきユースケースを項目ごとにまとめました。
前提
Transfer Familyサーバーの作成時の設定内容は、下記の通りです。
- プロトコルは、SFTP、FTPS、FTPのいずれか(本記事ではSFTPを選択)
- エンドポイントは何でもよい(本記事ではパブリックを選択)
- ファイル転送先(ドメイン)は、Amazon S3を想定
- ユーザー管理方法は、サービスマネージドもしくはAD認証を想定
- ユーザー名がカスタム ID プロバイダーの場合、ユーザーの追加はSecret Managerで設定するため、今回は想定しません。
設定項目は、以下の順で説明いたします。
- ユーザー名もしくはSID
- ホームディレクトリ
- 制限付き
- IAMロール
- セッションポリシー
ユーザー名もしくはSID
ユーザー管理方法が、サービスマネージドの場合はユーザー名を設定し、AD認証の場合はADグループのセキュリティ識別子(SID)を設定します。
ユーザー名
ユーザー管理方法がサービスマネージドの場合、ログインするユーザー名を設定します。
ユーザー名は3文字以上、100文字以下で入力します。
ユーザー名に使用できる文字は、a-z
、A-Z
、0-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つずつ解説しました。
設定値のユースケースを紹介しましたので、設定時の参考にしていただければ幸いです。