CI2-1の松田です。こんにちは。
今回はWinSCPを使ってS3にアクセスする方法についてまとめます。
本記事はおまけが本編ですので、WinSCPの使い方なんて知ってるよという方も、おまけの部分だけでも目を通して頂けると嬉しいです。
なお本記事では、S3にアクセスするための認証情報としてアクセスキー/シークレットアクセスキーを使用します。これらは基本的に慎重に取り扱う必要のある認証情報となりますので、不要になったら削除するなどのご対応をお願いします。
アクセスキー管理に関するベストプラクティスは下記をご参照ください。
WinSCPとは
オープンソースで開発されているWindows向けのFTP / SFTP / FTPSクライアントです。
バージョン5.13からAmazon S3へのアクセスをサポートしたようです。
インストーラ―は以下のリンクから入手できます。
設定方法
WinSCPのインストール
前述のリンクから入手したインストーラーを実行し、WinSCPをインストールします。
ウィザードに従ってポチポチやるだけなので、手順は割愛させて頂きます。ご容赦ください。
IAMユーザーの作成
「アクセスキー - プログラムによるアクセス」にチェックを入れ、ユーザーを作成します。
名前はここでは「winscp」としておきます。
権限ですが、まずは動きを見たいので、ひとまず「AmazonS3FullAccess」をアタッチします。
タグは付与せずに、そのままユーザーを作成します。
ここで認証上の記載されたCSVがダウンロードできますので、忘れずにダウンロードしましょう。
WinSCPでアクセスしてみる
これで準備ができたので、WinSCPからS3にアクセスしてみます。
WinSCPを起動して、以下の通り設定し「Login」をクリックしてください。
- 「File Protocol」で「Amazon S3」を選択
- 「Access key ID」に、ダウンロードしたCSVに記載の「Access key ID」を入力
- 「Secret access key」に、ダウンロードしたCSVに記載の「Secret access key」を入力
S3の一覧が表示されます。
以降は通常のWinSCPと同じ使い方ですので、ひとまずアクセスについてはここまでにしたいと思います。
おまけ①:WinSCPでMFAは使用できない
残念ながらWinSCPはMFAに対応していないようで、IAMユーザーにMFAを設定している場合、WinSCPは利用できません。CyberduckであればMFAに対応しているようですので、こちらの採用をご検討頂くと良いかと思います。
おまけ②:権限を絞ってWinSCPを使う
おまけと書いておいて何ですが、ここが本編になります。WinSCPでS3にアクセスさせるのはよいが、どのような権限を付与すればよいのか悩んだので、備忘として記載しておきます。ある程度汎用的に使えるかなと思いますので、必要に応じて活用いただければ幸いです。
ざっくり要件
簡単ですが、以下のような要件を想定します。
- ユーザーは特定のS3バケット内のオブジェクトに対するフルアクセス権限を持つ
- ユーザーはS3バケットそのものの設定変更はできてはいけない
要は、指定のS3バケットへのファイルアップロードや削除は許可するが、バケットの設定を変えたり削除したり、バケットを勝手に作ることは禁止したいという感じです。
ポリシー設計
この時必要となる権限の例を記載します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "[S3バケットのARN]/*" ] }, { "Sid": "Statement2", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "[S3バケットのARN]" ] }, { "Sid": "Statement3", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets" ], "Resource": "*" } ] }
ポリシーの解説
各Statementを簡単に解説します。
まず以下の「Statement1」は、バケット内のオブジェクト全てに対するフルアクセスの権限を定義しています。本当に最小権限にするなら「s3:*」のような書き方はよくないかもしれませんが、これでS3バケットそのものに対する操作は暗黙的なDenyによりブロックされるので十分かなと。
{ "Sid": "Statement1", "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "[S3バケットのARN]/*" ] }
順番は前後しますが、次は「Statement3」についてです。WinSCPではアクセス時にアカウント内の全てのS3バケットをListしているのか、この記述を入れてあげる必要がありました(書かなかった場合はWinSCPで「Login」をクリックした時点で弾かれる)。
ちなみに「s3:ListBucket」の許可ではエラーとなりました。突き詰めると奥が深そうですがひとまずこのへんでご容赦を。
{ "Sid": "Statement3", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets" ], "Resource": "*" }
最後に「Statement2」についてです。こちらはアクセスを許可するS3バケットへの読み取り操作全てを許可する記述になります。こちらを付与しなかった場合は、WinSCPでS3バケット一覧が表示された後、バケットをWクリックで開こうとした段階でエラーとなります。
権限についてはもう少し絞り込めそうな気はするので、進展がありましたら追記したいと思います。
{ "Sid": "Statement2", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "[S3バケットのARN]" ] }
まとめ
今回はWinSCPを使ったS3へのアクセスと、必要な権限について簡単にまとめました。
最後までお付き合いいただきありがとうございました。
松田 渓(記事一覧)
2021年10月入社。散歩が得意です。