こんにちは
「あつまれどうぶつの森」のためにswitchの販売抽選に応募するが当たらず「あつもり」ブームも過ぎていたことに最近気付いたstreampackのrisakoです👧🏻🐨
そして9月も後半!だんだん涼しくなってきて過ごしやすくなってきましたね!
今回のテーマは「Basic認証」です💫
これまでなかなか触れることがなかったので、初めて設定してみた記念にQiitaに残そうと思います。
Basic認証とは?
Web上で利用できる認証システムのことです。
Basic認証が設定されているページにアクセスすると、ブラウザ上にユーザー名とパスワードを入力するポップアップが表示されます。
私はBasic認証を意識する前に数回web上でみたことがあるので、多くの人が見たことがあるのではないでしょうか?
Safariだとこのようなポップアップが出てきます!
事前に用意するもの
- S3 bucketに保存したhtmlなど
Basic認証で保護したいwebページなどをS3bucketに保存しておきます。
まず初めにCloudFront設定
デフォルトの設定から変更が必要な箇所のみ記載します。
Origin Settings
- Origin Domain Name:webページで保存したS3bucketを指定します
Default Cache Behavior Settings
- Viewer Protocol Policy :Redirect HTTP to HTTPS
- Cache and origin request settings:Use legacy cache settings
- Cache Based on Selected Request Headers:Whitelist
- Whitelist Headers:Access-Control-Request-Headers・Access-Control-Request-Method・Origin
- Object Caching:全てのTTLを0にする
Distribution Settings
- Default Root Object:S3に保存しているwebページをしていると、CloudFrontのURLから直で行けるので便利です。例えば、https://CF-URL/test.html と指定しなくてもhttps://CF-URL だけで、test.htmlが表示されます。
次にLambda設定
⭐Lambda@edgeを使用できるリージョンは米国東部(バージニア北部)のみなのでリージョンを移動します。
- 任意の関数名を入力します。
- ランタイム:Node.js 12.x
- 実行ロール:Basic認証用に作成したものとわかるように命名します。仮に(test-basic-role)とします。
- ポリシーテンプレート:「基本的なLambda@Edgeのアクセス権限(CloudFrontトリガーの場合」を選択
Lambda関数が作成できたら、コードを書いていきます🖊
参考記事のコードを使わせてもらっています。
下記の箇所を自分の設定したいユーザー名とパスワードに変更してください。
ここで設定したユーザー名とパスワードがbasic認証で使用するものになります。
// Configure authentication
const authUser = ‘user’;
const authPass = ‘pass’;
'use strict'; exports.handler = (event, context, callback) => { // Get request and request headers const request = event.Records[0].cf.request; const headers = request.headers; // Configure authentication const authUser = 'user'; const authPass = 'pass'; // Construct the Basic Auth string const authString = 'Basic ' + new Buffer(authUser + ':' + authPass).toString('base64'); // Require Basic authentication if (typeof headers.authorization == 'undefined' || headers.authorization[0].value != authString) { const body = 'Unauthorized'; const response = { status: '401', statusDescription: 'Unauthorized', body: body, headers: { 'www-authenticate': [{key: 'WWW-Authenticate', value:'Basic'}] }, }; callback(null, response); } // Continue request processing if authentication passed callback(null, request); };
コードを保存したら、右上に表示される「アクション」から「Lambda@Edgeへのデプロイ」に進みます。
CloudFront トリガーの設定
- 先ほど作成したCloudFrontを指定します。
- CloudFrontイベント:ビューアーリクエスト
- Lambda@Edge へのデプロイを確認:✔を入れます
- 「デプロイ」を押下
Cloudfrontとlambdaが連携できているか確認する
作成したCloudFrontのBehaviorから確認します。
Lambda Function Associations
- CloudFront Event:Viewer Request
- Lambda Function ARN:Lambda@EdgeのARN
動作確認
CloudFrontのドメインでアクセスしてみましょう。
https://xxxxxxx.cloudfront.net
Basic認証がちゃんと設定されているようです。
設定したユーザー名とパスワードでログインできればOKです!👌
参考
簡単だった!CloudFront + S3 に BASIC認証を入れる方法
できた!S3 オリジンへの直接アクセス制限と、インデックスドキュメント機能を共存させる方法