S3の静的ウェブサイトホスティングでhttpアクセスを禁止する方法

AWS運用自動化サービス「Cloud Automator」
この記事は1年以上前に書かれたものです。
内容が古い可能性がありますのでご注意ください。

がんもです。最近はRDSの記事ばかり書いていましたが、ここにきて箸休め的にS3の機能をご紹介します。

S3には静的ウェブサイトをホスティングする機能があります。
今回は、このホスティング機能において、httpsアクセスのみに限定させる方法をご紹介します。

S3httpsonly1

  1. S3で静的コンテンツをWeb公開する
  2. バケットポリシーの設定を行う
  3. 接続確認
  4. まとめ

1.S3で静的コンテンツをWeb公開する

今回は実験ですのでバケット丸ごとではなく、Make Publicで特定のファイルのみWeb公開する方法で実現します。
初心者の方にもわかりやすいように、少しずつ進めていきます。

まずはS3にバケットを作成しましょう。今回は「1httpsonlyaccess」としました。

S3httpsonly2

作成されました。
バケット名は全世界で一意になっておりますので、被ったら名前を変更しましょう。
以下の通り東京リージョンに用意しています。

S3httpsonly3

次にS3にアップロードするコンテンツを用意します。
今回は簡単なhtmlファイルを作成しました。

S3httpsonly4

こんな中身を用意しました。
これを、.html形式で保存して、S3にアップロードします。

S3httpsonly5

今回は、AWSのマネジメントコンソールからファイルをアップしています。

S3httpsonly6

アップロードが完了しました。
上記の通り、htmlファイルが作成したバケット以下に配置されていることがわかります。

S3httpsonly7

アップロードしたコンテンツを選択し、プロパティを開いてみましょう。

S3httpsonly8

プロパティを表示させると、上記の通りLinkとしてURLが払い出されていることがわかります。
また、このLinkには今現在「錠前」のマークがついているのがわかるでしょうか。
これは、Webからのアクセスができない状態であることを示しています。

S3httpsonly9

実際にこのリンクをクリックして、Webブラウザでアクセスしてみると、"AccessDenied"と言われます。

では次に、これを公開してみましょう。

S3httpsonly10

今一度アップロードしたコンテンツを選択し、「Make Public」をクリックしてください。

S3httpsonly11

ポップアップが表示されますので「OK」を押下します。

S3httpsonly12

こうすることで、Permissionsにおいて「Everyone」からの「Open/Download」が可能な権限が追加されます。
マークもWifiみたいなマークに変更されています。
この状態でLinkをクリックしますと

S3httpsonly13

先ほどは表示されなかったコンテンツが、Webブラウザで表示されるようになったことがわかりました。
そしてこのURLですが、httpsだけではなく、同時にhttpも発行されています。
実際にアクセスしてみましょう。URLからhttpsの「s」を削除すればOKです。

S3httpsonly14

このように、httpのページも用意されていることがわかります。

前置きが長くなりましたが、今回はこの「http」のアクセスを禁止し「https」のアクセスのみに限定したいと思います。

2.バケットポリシーの設定を行う

「http」のアクセスを禁止し「https」のアクセスのみに限定するには、バケットポリシーを利用します。こちらが今回の肝です。
また、利用するエレメントとしては「aws:SecureTransport」を利用します。
これは、「リクエストが SSL を使用して送信されたかどうかを確認する」ためのエレメントになります。

今回は、この設定が「false」である、つまりはSSLを使用したアクセスではない場合に対して、
"Effect": "Deny"(アクセスを禁止する)、という設定を行います。

本項目の詳しい説明は、「公式ドキュメント」をご確認ください。

実際に設定をしてみます。

S3httpsonly15

作成したバケットのプロパティを表示し、上図の通りPermissionsから「Add bucket policy」を選択してください。
すると、Editorが表示されますので、以下の通りバケットポリシーを記載します。

S3httpsonly16

コピペして利用頂けるよう、テキストベースでも合わせて以下に記載致します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::your-bucket-name/*",
      "Condition": {
        "Bool": {
          "aws:SecureTransport": false
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::your-bucket-name/*"
    }
  ]
}

your-bucket-name」の項目は自分のバケット名に変更しましょう。
この記載を頂いた後、「Save」して反映してください。

3.接続確認

上記の設定が終わりましたので、実際にhttpのアクセスが禁止されているか確認してみます。
先ほどと同様httpのURLにアクセスします。

S3httpsonly17

すると、「AccessDenied」と出ました。

このように、S3のバケットポリシーを用いることで、httpのアクセスのみを遮断することが可能です。

  • アクセス可能:https://s3-ap-northeast-1.amazonaws.com/1httpsonlyaccess/sataketest.html
  • アクセス不可能:http://s3-ap-northeast-1.amazonaws.com/1httpsonlyaccess/sataketest.html

4.まとめ

今回は以下の構成図の通り、S3で公開している静的コンテンツにおいて、httpでのアクセスを禁止し、httpsでのアクセスのみに絞る方法について記載致しました。

S3httpsonly1

バケットポリシーでは色んな制御ができますが、httpのみを禁止するようなことも実現可能で驚いています。
利用用途と致しましては、「社内ポリシーとしてhttpでWebに公開するのはNG」というような時に有用な方法かと思っています。

ここまでお読みいただきありがとうございました。

AWS運用自動化サービス「Cloud Automator」