AWS Transfer Family を用いてSFTPで Amazon FSx for NetApp ONTAP とファイル授受をしてみた
SFTPを用いてFSxNとやりとりしたい
こんにちは、のんピ(@non____97)です。
皆さんはSFTPを用いてAmazon FSx for NetApp ONTAP(以降FSxN)とやりとりしたいと思ったことはありますか? 私はあります。
以下記事で紹介しているとおり、FSxNではSFTPがサポートされていませんでした。そのため、SFTPでファイルの授受をしようとすると、SFTPサーバーのEC2インスタンスからFSxNをマウントする方式を取ることになりました。
EC2インスタンスの管理の手間を考えると可能であれば採用したくはありません。chrootもこちらの方法ではかけられないのも気になります。
少し前ですが、Transfer FamilyがFSxNをサポートしました。
ドキュメントを確認したところ、FSxNのS3 Access Point機能を使用しているようでした。
これにより、マネージドの機能でSFTPを用いてFSxNとファイル授受が可能になります。
実際に試してみます。
やってみた
検証環境
検証環境は以下のとおりです。

セキュリティスタイルがUNIXのボリュームにS3 Access Pointをアタッチして、そちらに対してTransfer Familyを介してSFTPによるファイル授受を行います。
事前準備としてFSxNファイルシステムは以下のように作成しました。

S3 Access Pointのアタッチ
FSxNボリュームにS3 Access Pointをアタッチします。今回はセキュリティスタイルがUNIXなので、ファイルシステムのユーザーIDのタイプもUNIXにし、ユーザー名をrootにしました。

Transfer Familyを介してファイル操作できる権限はここで指定したユーザーに割り当てられた権限次第になります。
後続で指定するTransfer Familyのユーザーではあくまでアクセス先を指定するだけです。NFSやSMBの世界から見たときの権限を気にする場合はS3 Access Pointをその権限分作成する形になります。
IAMロールの作成
Transfer FamilyからS3 Access Pointに対してアクセスする際に使用するIAMロールを作成します。
今回はnon-97-fsxn-TransferFamilyというIAMロールを作成しました。
IAMポリシーは以下のとおりです。S3 Access Pointを介してファイルの取得/追加/削除ができるようにしてあげます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowFileOperations",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:GetObjectTagging",
"s3:PutObjectTagging"
],
"Resource": "arn:aws:s3:us-east-1:<AWSアカウントID>:accesspoint/vol-ntfs/object/*"
},
{
"Sid": "AllowDirectoryOperations",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:us-east-1:<AWSアカウントID>:accesspoint/vol-ntfs"
}
]
}
信頼ポリシーは以下のとおりです。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "transfer.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Transfer Familyの作成
Transfer Familyの作成を行います。
今回はSFTP専用のものを作成します。

作成完了すると以下のようになります。

認証はサービスマネージドにしています。個別にユーザー管理をする手間を軽減するのであればDirectory Serviceを採用することになると思います。
ただし、繰り返しになりますが、NFSやSMBの世界で使用する権限はS3 Access Pointに割り当てたユーザーが持っている権限になります。例えば、SMBの世界では十分な権限が付与されていないにも関わらず、S3 Access PointではドメインのAdministratorレベルの権限が付与されているのであれば、SMBで直接アクセスできないファイルにSFTPではアクセスできてしまいます。既存IdPを流用するような形だと過剰な権限付与になりがちかと思います。ホームディレクトリマッピングでアクセスできる領域を絞るようにしましょう。
SFTPユーザーの作成を行います。今回はボリューム直下のsftpディレクトリをホームディレクトリとなるように設定します。
> aws transfer create-user \
--server-id s-da96561bfe5c40069 \
--user-name non-97 \
--role arn:aws:iam::<AWSアカウントID>:role/non-97-fsxn-TransferFamily \
--home-directory-type LOGICAL \
--home-directory-mappings '[
{
"Entry": "/",
"Target": "/vol-ntfs-1bb4org6ydmb5qsrf9yhh9sx6g1equse1a-ext-s3alias/sftp"
}
]'
{
"ServerId": "s-da96561bfe5c40069",
"UserName": "non-97"
}
SFTPで使用する鍵を生成します。
> ssh-keygen -t ed25519 -C "non-97-fsxn"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/<ホームディレクトリパス>/.ssh/id_ed25519): ./non-97-fsxn
Enter passphrase for "./non-97-fsxn" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ./non-97-fsxn
Your public key has been saved in ./non-97-fsxn.pub
The key fingerprint is:
SHA256:eNWWSr1E1azwVuUvqQgzfCmLH7AIiGfvgtcSEXDXklo non-97-fsxn
The key's randomart image is:
+--[ED25519 256]--+
|... .o ...oo|
| ...E . +.. .+|
| + . o *o o.|
|..o o o = .+..|
|o +. o S + ..o .|
| o.o . = B . . . |
| . oo o o . . |
|. +.. . . |
| . o. . |
+----[SHA256]-----+
> ls -l
total 16
drwxr-xr-x 6 <ユーザー名> <グループ名> 192 5 17 21:43 images
-rw-------@ 1 <ユーザー名> <グループ名> 399 5 17 21:58 non-97-fsxn
-rw-r--r--@ 1 <ユーザー名> <グループ名> 93 5 17 21:58 non-97-fsxn.pub
生成された公開鍵をSFTPユーザーに登録します。

動作確認
それでは動作確認をします。
事前準備としてローカルにテスト用のファイルを用意します。
> cat test.txt
This is test.txt
SFTPで接続します。
> sftp -i non-97-fsxn non-97@s-da96561bfe5c40069.server.transfer.us-east-1.amazonaws.com
The authenticity of host 's-da96561bfe5c40069.server.transfer.us-east-1.amazonaws.com (52.204.74.66)' can't be established.
RSA key fingerprint is SHA256:9AJqGD6WGr7XnmZnTXhmDrc5Yq5ThlbNio4ce0yRkYo.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 's-da96561bfe5c40069.server.transfer.us-east-1.amazonaws.com' (RSA) to the list of known hosts.
Connected to s-da96561bfe5c40069.server.transfer.us-east-1.amazonaws.com.
sftp> ls -l
sftp>
sftp> pwd
Remote working directory: /
無事接続できましたね。
テスト用ファイルをアップロードします。
sftp> lls -ls test.txt
8 -rw-r--r--@ 1 <ユーザー名> <グループ名> 17 5 17 22:15 test.txt
sftp> put test.txt
Uploading test.txt to /test.txt
test.txt 100% 17 0.1KB/s 00:00
sftp> ls -l
-rwxr--r-- 1 - - 17 May 17 13:21 test.txt
アップロードできましたね。
NFSクライアントからアップロードしたファイルを確認します。
$ sudo mount -t nfs svm-01a0d16e19d5a0194.fs-070d7901c6842ba22.fsx.us-east-1.amazonaws.com:/vol1 /mnt/fsxn/
$ df -hT -t nfs4
Filesystem Type Size Used Avail Use% Mounted on
svm-01a0d16e19d5a0194.fs-070d7901c6842ba22.fsx.us-east-1.amazonaws.com:/vol1 nfs4 16G 384K 16G 1% /mnt/fsxn
$ ls -l /mnt/fsxn/
total 4
drwxrwxrwx. 2 root daemon 4096 May 17 13:21 sftp
$ ls -l /mnt/fsxn/sftp/
total 0
-rw-r--r--. 1 root daemon 17 May 17 13:21 test.txt
$ cat /mnt/fsxn/sftp/test.txt
This is test.txt
ホームディレクトリおよび先ほどSFTPでアップロードしたファイルを確認できました。
続いて、SFTPによるファイルの取得を試します。
NFSクライアントでテスト用のファイルを作成します。
$ echo "こんにちは" | sudo tee /mnt/fsxn/sftp/test2.txt > /dev/null
$ ls -l /mnt/fsxn/sftp/
total 0
-rw-r--r--. 1 root daemon 17 May 17 13:21 test.txt
-rw-r--r--. 1 root root 16 May 17 13:26 test2.txt
SFTPでファイルの取得を行います。
sftp> ls -l
-rwxr--r-- 1 - - 17 May 17 13:21 test.txt
-rwxr--r-- 1 - - 16 May 17 13:26 test2.txt
sftp> get test2.txt
Fetching /test2.txt to test2.txt
test2.txt 100% 16 0.0KB/s 00:00
sftp> bye
> cat test2.txt
こんにちは
手元にファイルを落としてこれました。
一連の操作でCloudWatch Logsに出力されていたログは以下のとおりです。
{
"role": "arn:aws:iam::<AWSアカウントID>:role/non-97-fsxn-TransferFamily",
"activity-type": "CONNECTED",
"ssh-public-key-fingerprint": "SHA256:eNWWSr1E1azwVuUvqQgzfCmLH7AIiGfvgtcSEXDXklo",
"home-dir": "LOGICAL",
"ssh-public-key": "AAAAC3NzaC1lZDI1NTE5AAAAIAgpd0aLPyg1+jbBk3PvQanBmtSYhNgLvZ/jSNFrWFip",
"ssh-public-key-type": "ssh-ed25519",
"macs": "<implicit>,<implicit>",
"ciphers": "aes128-gcm@openssh.com,aes128-gcm@openssh.com",
"client": "SSH-2.0-OpenSSH_9.9",
"source-ip": "104.28.23.249",
"resource-arn": "arn:aws:transfer:us-east-1:<AWSアカウントID>:server/s-da96561bfe5c40069",
"user": "non-97",
"kex": "ecdh-sha2-nistp256",
"session-id": "0223f0e315494257ab0a"
}
{
"mode": "CREATE|TRUNCATE|WRITE",
"path": "/vol-ntfs-1bb4org6ydmb5qsrf9yhh9sx6g1equse1a-ext-s3alias/sftp/test.txt",
"activity-type": "OPEN",
"resource-arn": "arn:aws:transfer:us-east-1:<AWSアカウントID>:server/s-da96561bfe5c40069",
"session-id": "0223f0e315494257ab0a"
}
{
"path": "/vol-ntfs-1bb4org6ydmb5qsrf9yhh9sx6g1equse1a-ext-s3alias/sftp/test.txt",
"activity-type": "CLOSE",
"resource-arn": "arn:aws:transfer:us-east-1:<AWSアカウントID>:server/s-da96561bfe5c40069",
"bytes-in": "17",
"session-id": "0223f0e315494257ab0a"
}
{
"mode": "READ",
"path": "/vol-ntfs-1bb4org6ydmb5qsrf9yhh9sx6g1equse1a-ext-s3alias/sftp/test2.txt",
"activity-type": "OPEN",
"resource-arn": "arn:aws:transfer:us-east-1:<AWSアカウントID>:server/s-da96561bfe5c40069",
"session-id": "0223f0e315494257ab0a"
}
{
"path": "/vol-ntfs-1bb4org6ydmb5qsrf9yhh9sx6g1equse1a-ext-s3alias/sftp/test2.txt",
"activity-type": "CLOSE",
"resource-arn": "arn:aws:transfer:us-east-1:<AWSアカウントID>:server/s-da96561bfe5c40069",
"bytes-out": "16",
"session-id": "0223f0e315494257ab0a"
}
{
"activity-type": "DISCONNECTED",
"resource-arn": "arn:aws:transfer:us-east-1:<AWSアカウントID>:server/s-da96561bfe5c40069",
"session-id": "0223f0e315494257ab0a"
}
便利だがTransfer Familyを介してアクセス可能な範囲と権限をよく理解しておこう
AWS Transfer Family を用いてSFTPで Amazon FSx for NetApp ONTAP とファイル授受をしてみました。
非常に便利ですが、Transfer Familyユーザーのホームディレクトリのマッピングおよび、S3 Access Pointに関連付けているユーザーの権限によっては思わぬアクセス許可をしてしまっていることも考えられます。設定する際には一呼吸おいて事前に影響範囲を整理しましょう。
この記事が誰かの助けになれば幸いです。
以上、クラウド事業本部 コンサルティング部の のんピ(@non____97)でした!








