AWS SFTPでホームディレクトリの読み書きだけ許可してみた #reinvent

AWS SFTPでホームディレクトリの読み書きだけ許可してみました。 スコープダウンポリシーで、${transfer:HomeDirectory}以下のPutObjectやGetObjectなどを許可しました。 指定したホームディレクトリ以外にファイルをputすると、失敗(Failure)することを確認しました。
2018.11.27

AWS Transfer for SFTP(AWS SFTP)のスコープダウンポリシーを使って、ユーザーのホームディレクトリのみアクセスできる環境を作ってみました。 S3バケットの下にプロジェクトごとのフォルダを作成し、そのフォルダのみアクセスできるようにします。

S3バケットの作成

AWSコンソールから、S3バケットを作成します。 特にバケットポリシーなどは設定しません。 project-aと、project-bというフォルダを作成しました。 後述の手順で、これらのフォルダをホームディレクトリにします。

SFTPに利用するキーペアの作成

SFTP接続時に利用するキーペアを作成します。 Macの場合はssh-keygen -P "" -f transfer-keyコマンドで作成できました。 カレントディレクトリにSFTP接続に使うtransfer-keyが作成されます。

$ ssh-keygen -P "" -f transfer-key
Generating public/private rsa key pair.
Your identification has been saved in transfer-key.
Your public key has been saved in transfer-key.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxx@xxxxx
The key's randomart image is:
(略)
$ ls -l
total 16
-rw-------  1 xxxx  xxxx  1679 11 26 11:34 transfer-key
-rw-r--r--  1 xxxx  xxxx   404 11 26 11:34 transfer-key.pub
$

ホームディレクトリのみ許可するスコープダウンポリシーの作成

IAMポリシーを作成します。 今回は以下の内容で「sftp-policy」として作成しました。 ホームディレクトリ以下のPutObjectやGetObjectなどを許可します。 ${transfer:HomeBucket}と${transfer:HomeDirectory}は各ユーザーごとに適切な値に設定されるため、ユーザによらずポリシーを使いまわせます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListHomeDir",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::${transfer:HomeBucket}"
        },
        {
            "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"
            ],
            "Resource": "arn:aws:s3:::${transfer:HomeDirectory}*"
        }
    ]
}

SFTPサーバーの作成

AWS SFTPコンソールから、SFTPサーバを作成します。 Identity providerは、Service managedとして作成しました。

SFTPユーザーに付与するIAMロールの作成

transfer.amazonaws.comを信頼するIAMロールを作成します。 AmazonS3FullAccessを割り当てました。

SFTPユーザーの追加

SFTPサーバーを選択し、ユーザーを追加します。

abekokiユーザーを作成します。 Accessに事前に作成しておいたIAMロール、Policyにスコープダウンポリシーを選択します。 ホームディレクトリは、project-aとしました。 abekokiユーザーは、project-a以下を自由に触れる形になります。

SSH Public Keyには、transfer-key.pubの内容を記載します。

PCからAWS SFTPを利用して、PUTしてみた

ホームディレクトリ以下へのPUT

手元のPCから、AWS SFTPに接続します。 LinuxやMacの場合、sftp -i transfer-key sftp_user@service_endpointコマンドを実行します。 作成したユーザーでファイルをアップロードしてみました。

$ sftp -i transfer-key abekoki@s-xxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com
Connected to s-xxxxxxxxxxxx.server.transfer.ap-northeast-1.amazonaws.com.
sftp> pwd
Remote working directory: /sftp-project-xxxx/project-a
sftp> put /Users/abe.koki/file.txt
Uploading /Users/abe.koki/file.txt to /sftp-project-xxxx/project-a/file.txt
/Users/abe.koki/file.txt                                                                           100%    4     0.0KB/s   00:00
sftp> ls
file.txt
sftp>

ホームディレクトリ以下のパスを指定すると、そのフォルダは自動で作成されます。 以下の例では20181126は自動で作成されます。

sftp> put /Users/abe.koki/file.txt /sftp-project-xxxx/project-a/20181126/file.txt
Uploading /Users/abe.koki/file.txt to /sftp-project-xxxx/project-a/20181126/file.txt
/Users/abe.koki/file.txt                                                                           100%    4     0.0KB/s   00:00
sftp>

ホームディレクトリ以外へのPUTは失敗する

project-bにアップロードしようとしても、Failします。 スコープダウンポリシーが意図通りに動いています。

sftp> put /Users/abe.koki/file.txt /sftp-project-xxxx/project-b
Uploading /Users/abe.koki/file.txt to /sftp-project-xxxx/project-b
/Users/abe.koki/file.txt                                                                           100%    4     0.0KB/s   00:00
Couldn't close file: Failure
sftp> put /Users/abe.koki/file.txt /sftp-project-xxxx/project-a
Uploading /Users/abe.koki/file.txt to /sftp-project-xxxx/project-a/file.txt
/Users/abe.koki/file.txt                                                                           100%    4     0.0KB/s   00:00
sftp>

おわりに

AWS SFTPでホームディレクトリの読み書きだけ許可してみました。 スコープダウンポリシーで、${transfer:HomeDirectory}以下のPutObjectやGetObjectなどを許可しました。 指定したホームディレクトリ以外にファイルをputすると、失敗(Failure)することを確認しました。

参考