Transfer for SFTPでホームディレクトリ配下のアクセス権を設定する

2022.08.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井 亮です。

ファイルの送受信においてとても強力なマネージドサービス AWS Transfer Family。
なかでも Transfer for SFTP は人気のあるサービスではないでしょうか。

Transfer for SFTP をご利用のケースで「あるユーザーは会社ディレクトリにアクセスするが特定のディレクトリは操作禁止にしたい」と要望を受けましたので備忘として残します。
今回のストレージは S3 です。

要望

  • あるユーザーは MyCompany ディレクトリへのアクセス権を持つ
  • ProjectA、ProjectB ディレクトリへのアップロード・ダウンロードは許可
  • ProjectC ディレクトリはアップロード・ダウンロード不可、ls も不可

SFTPサーバー作成

本エントリでは SFTP サーバーは作成済としています。
未だ SFTP サーバーを作成していない場合はユーザーガイドを参考にサーバーを作成ください。

Setting up
Tutorial: Getting started with AWS Transfer Family

SFTPユーザー作成

SFTP 接続するユーザーを作成します。要望の「あるユーザー」にあたります。

IAMポリシー作成

Transfer for SFTP のストレージは S3 を選択しています。
要望にあるような細かいアクセス制限は IAM ポリシーで実装しました。

SFTP ユーザーを作成する際に IAM ロールを作成しますが、こちらは S3 バケットに対する全体的なアクセス権を記述することとして、各ユーザーにはスコープダウンしたポリシーを個別に割り当てる方針を採用しています。
IAM ポリシーは以下を記述しています。

  • SFTP 用バケットのホームディレクトリに対する ListBucket を許可
  • MyCompany ディレクトリでの Put,Get,Delete を許可
  • 特定の prefix がついたディレクトリ以外は ListBucket させない
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowListing",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::your-bucket-name"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "MyCompany/*",
                        "MyCompany"
                    ]
                }
            }
        },
        {
            "Sid": "HomeDirObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::your-bucket-name/MyCompany/*"
            ]
        },
        {
            "Sid": "ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptOwnProject",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Deny",
            "Resource": [
                "arn:aws:s3:::your-bucket-name"
            ],
            "Condition": {
                "StringNotLike": {
                    "s3:prefix": [
                        "MyCompany/ProjectA",
                        "MyCompany/ProjectA/*",
                        "MyCompany/ProjectB",
                        "MyCompany/ProjectB/*",
                        "MyCompany",
                        "MyCompany/"
                    ]
                }
            }
        }
    ]
}

SFTPユーザーの作成

作成したポリシーを付与したユーザーを作ります。
例として test_yoshii と名称のユーザーを作っています。

ポリシー → IAM からポリシーを選択 で前の手順で作成したポリシーを指定します。

ホームディレクトリは MyCompany です。

制限付きにチェックを入れます。いわゆる chroot と同等に機能です。

まとめ

完成です。いかがでしたでしょうか。
Transfer for SFTP に限らず通常の S3 利用にも役に立つポリシーだったと思います。

参考

Setting up
Tutorial: Getting started with AWS Transfer Family

以上、吉井 亮 がお届けしました。