WinSCPでAmazon S3に接続してみた

2022.05.26

みなさんこんにちは、杉金です。

IAMのアクセスキーを使ってWinSCPからS3に接続できることを知らなかったので試してみます。また、S3サーバーアクセスログを有効にして、アクセスログを保管するように設定します。過去にもWinSCPでS3への接続を紹介したブログもございますので、そちらを見ていただいても良いかと思います。

設定の流れ

設定としては大きく2つに分けていまして、接続先となるAWS側の設定と、接続元となるクライアント側の設定があります。

  1. AWS側の設定
    1-1. S3バケット作成
    1-2. S3サーバーアクセスログ設定
    1-3. IAMユーザ作成とアクセスキー発行
  2. クライアント側の設定
    2-1. WinSCPインストール
    2-2. 接続確認

1.AWS側の設定

1-1.S3バケット作成

WinSCPの接続先となるS3バケットを作成します。AWSマネジメントコンソールからS3のサービスを選び、S3のバケット作成画面に移動します。

S3バケット名やAWSリージョンは任意のものを設定します。その下のACL有効/無効は、推奨の無効を選択します。ACLはS3の古いアクセス管理の方法のため非推奨となっています。
パブリックブロックアクセス設定ですが、パブリックアクセスの設定は不要のため「パブリックアクセスをすべてブロック」にします。設定済みの場合はそのまま次に進みます。

以降の設定は要件に応じて設定していきます。デフォルトの暗号化は有効にしてSSE-S3キーを選びました。

下までスクロールして、バケット作成を選択します。

同様の手順で、サーバーアクセスログ保管用のS3バケットも作成します。サーバーアクセスログを設定しない場合はスキップして下さい。アクセスログ保管用のS3バケットを作成する際は設定内容に以下の注意点があります。

注意点

  • サーバーアクセスログ保管用のS3バケットではオブジェクトロックは無効にする
  • サーバーアクセスログ保管用のS3バケットではデフォルト暗号化は無効もしくはSSE-S3を選択する

Amazon S3 サーバーアクセスログが配信されないのはなぜですか?

1-2.S3サーバーアクセスログの設定

S3サーバーアクセスログを設定をする場合のこの手順を実施します。S3サービスの画面から「バケット」→接続先のS3バケットを選択→「プロパティ」→「サーバーアクセスのログ記録」の「編集」を選択します。

ログの記録を「有効にする」を選び、ターゲットバケットとしてログ保管先のS3バケットを選びます。自分自身のバケットにログを保管することも可能ですが別バケットへの保管が推奨されます。

別バケットへの保管が推奨される理由

ログを管理しやすくするため、アクセスログは別のバケットに保存することをお勧めします。ソースバケットとターゲットバケットが同じである場合、バケットに書き込まれるログに関する追加のログが作成されます。これは、ストレージの請求額がいくらか増える可能性があるため、望ましくない場合があります。また、ログに関する追加のログのために、必要なログを見つけにくくなります。

引用元:サーバーアクセスログを使用したリクエストのログ記録

アクセスログの設定は以上で完了です。

1-3.IAMユーザ作成とアクセスキー発行

続いてはIAMユーザの作成とアクセスキーの発行を行います。IAMサービス画面の「ユーザー」から「ユーザー追加」を選択します。

任意の名前を付けて、認証情報タイプとして「アクセスキー - プログラムによるアクセス」を選びます。コンソールへのログインを行わないユーザーのため、マネジメントコンソールへのアクセスにはチェックを付けません。

権限を後で付与するため、何も設定せずに次へと進みます。

  

タグを設定しないため次へと進みます。

  

内容を確認して「ユーザーの作成」ボタンを押します。

  

ユーザーの作成が完了するとアクセスキーとシークレットアクセスキーが発行されますのでメモするかCSVをダウンロードします。ここでシークレットキーを控え忘れるとアクセスキーを再発行することになるため注意が必要です。この情報を第三者が知ってしまうと設定した権限でアクセス可能となるため、控えたメモやCSVファイルの扱いは要注意です。  

作成後にIAMの「ユーザー」から作成したユーザーを選び、「アクセス権限」タブから「インラインポリシーの追加」を選択します。  

権限付与の方法としてはポリシーを個別に作って割り当てる方法もありますが、今回はインラインポリシーを選びました。インラインポリシーと管理ポリシーの違いについては以下の情報が参考になります。

管理ポリシーとインラインポリシーの比較  

インラインポリシーの設定画面から、ポリシーの内容としてjsonで記述した以下のポリシーを貼り付けます。「bucket-name」は接続先のS3バケット名に置き換えてください。また、必要に応じてPutObjectやDeleteObjectなどの権限を追加下さい。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListObjectsInBucket",
            "Effect": "Allow",
            "Action": ["s3:ListBucket"],
            "Resource": ["arn:aws:s3:::bucket-name"]
        },
        {
            "Sid": "GetObjectAction",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": ["arn:aws:s3:::bucket-name/*"]
        }
    ]
}

設定可能な権限の参考情報

ポリシーに任意の名前をつけて作成します。

以上でAWS側の作業は完了です。

2.クライアント側の設定

接続元となるクライアントでWinSCPのインストールとS3への接続を行います。設定のために以下の情報が必要です。

  • アクセスキー(手順1-3で発行したもの)
  • シークレットキー(手順1-3で発行したもの)
  • 接続先のS3バケット名

2-1.WinSCPインストール

WinSCPをインストールします。

インターフェイススタイルは好みですが、今回はコマンダーを選びます。

スタートページはWebサイトが開くのでチェックを外してもいいでしょう。

インストールが完了しました。

2-2.接続確認

WinSCPを起動したら新規接続の設定画面が表示されますので設定していきます。 まずは転送プロトコルに「Amazon S3」を選びます。

アクセスキーIDとシークレットキーに手順1-3で発行したキーを入力します。そのあとすぐ下の「設定」を選びます。

環境のディレクトリから、「リモートディレクトリ」として接続先のバケット名を入力します。下記画像の例では「/target-backet-name」と入力しています。

そのあと「OK」を押して元の画面に戻り「ログイン」ボタンを押すと接続できます。

接続できましたああああ!!

補足情報

設定としては以上ですが補足情報を紹介します。

アクセス権限

リモートディレクトリを指定しないと以下のように接続に失敗します。

IAMユーザーの権限にS3FullAccessなど強い権限をつけるとリモートディレクトリの指定無しでも以下のようにアクセスできますが、S3バケット一覧が表示されて接続不要なバケットにもアクセスできてしまいます。今回のように対象バケットに絞ったアクセスが望ましいでしょう。

アクセスログ

アクセスログ保管先のバケットを見ると以下のようにログファイルが保管されます。

ログのフォーマットについては以下のユーザーガイドに情報が記載されています。

ログファイルが細切れになっているため、ひとつひとつをチェックするのは大変です。Athenaを使って集計できますので以下の資料が参考になります。

最後に

最初はWinSCPでS3に接続するならAWS Transfer Familyの出番かなと思ったのですが、WinSCPで直接S3に接続できるのは便利ですね。WinSCP懐かしいなと思ってWinSCPの歴史もついでに調べたのですが2000年から存在することに驚きました。今もアップデートは継続しており、最近もOpenSSLの脆弱性に対応されていました。転送モードをテキストモードにしてシェルスクリプトが動かなくなったのは良い思い出です。継続的にアップデートされていて応援したくなりますね!

参考情報