この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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)することを確認しました。