- お題(今回の要件)
- 実装
- SFTP側の設定
- 登場する権限オブジェクト
- sftp-logging (role)
- sftp-s3 (role)
- sftp-alice (managed policy)
- 踏んだ罠
- 所感
- まとめ
- おまけ
チーフエンジニアの加辺です。
re:Invent 2018で発表された新規サービスの1つにSFTPサービスがあります。
古くから利用されている(けど運用はつらい)サービスのひとつで、これがmanagedで提供されるのは非常によいことなので検証してみました。
お題(今回の要件)
複数の協業先からSFTPでファイルをアップロード/ダウンロードしてもらう状況を考えましょう。
それぞれの協業先同士は存在すら見せたくないですし、ましてやファイルの中身が見えるようなことがあってはいけません。
- 全ユーザが同一のS3 bucket内で操作する
- ユーザごとに別々のホームディレクトリをもつ
- ユーザのホームディレクトリ以下は自由に操作できる
- 他ユーザのホームディレクトリは見えない
実装
SFTP側の設定
SFTPのサービス構築自体は別段難しいところはないので簡単に書き、後ろに肝心の権限設定まわりを書いていきます。
ユーザはSFTPサービスの管理とします(Directory Serviceではない)。ユーザaliceを作成し、公開鍵を設定しておきます。
登場する権限オブジェクト
命名は説明の都合で適当に決めています。
完成系のRole/Policyを生成するmiamのコードはgistに上げておきました。
sftp-logging (role)
SFTPサービスに割り当てます(Logging Role)。
CloudWatchLogsFullAccessのようなCloudwatch Logsにログを書き出せる権限を付与します。
sftp-s3 (role)
SFTPユーザに割り当てます(User Configuration → Access)
付与する権限はbucketに対するs3:ListBucket, s3:GetBucketLocation
と、bucket内全体に対するs3:PutObject, s3:GetObject, s3:DeleteObject
です。
sftp-alice (managed policy)
SFTPユーザに割り当てます(User Configuration → Policy)
ここでユーザ個別となる権限を記述していきます。ホームフォルダ以下へのs3:ListBucket
およびオブジェクト操作の権限を付与します。
踏んだ罠
sftp-alice
に十分な権限があるし、ログインした時のCloudwatch Logsにはその権限がちゃんと出力されているからsftp-s3
には何の権限もなくても動くはず→動かない
sftp-s3
に権限があって初めてsftp-alice
の権限が効力を持つようになっているらしいです。
ちなみに敢えてbucketの一覧を見せる権限をつけたい時はsftp-alice
側にs3:ListAllMyBuckets
を付与する必要がありました(sftp-s3
に付与しても ls /
が失敗しました)
所感
sftp-s3
roleに割り当てる権限とsftp-alice
に割り当てる権限の位置付けが当初よくわからず、所望の動きをさせるまでに大分時間を使ってしまいました。
sftp-s3
のポリシーには変数を入れることはできませんが、sftp-alice
のmanaged policyにはAWS Transferでのみ使える変数を含めることができます(詳細は公式ドキュメント参照)。
この変数をうまく利用してやることで、今回sftp-alice
と命名した割には"alice"に依存することなく記述できています。
まとめ
AWS Transfer for SFTPの権限まわりについてまとめてみました。
Role 2つとManaged Policy 1つ、それぞれに付与すべき権限についてまとめました。
ここまでのリソース同士の関係を図にしておきました。参考にどうぞ
おまけ
- テスト用と思いながらSFTPを起動したままにしておくと思ったよりお金かかります。
- 実運用を考えると管理コスト含めて考えれば高くはないです
- AWS Transfer for SFTPは $0.30/hour
- EC2 (m5.largeを2台構成)は $0.124*2/hour = $0.246/hour
- EC2 (c5.largeを2台構成)は $0.107*2/hour = $0.214/hour
- さすがSFTPだけあって世界中からSSHの攻撃に晒されます(Cloudwatch Logsに大量のログが…)。
- サポートに問い合わせましたが、今のところ(2019/02/20現在)防ぐ手段もログを抑制する設定項目もないそうです。