AWS SFTPでホームディレクトリの読み書きだけ許可してみた #reinvent
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)することを確認しました。