ENGINEERING ARTICLE
CloudFront FunctionsでBasic認証を設定する方法|STG環境をアクセス制限
この記事は約3分で読めます
こんにちは、 @Manabu です。
STG環境や公開前のサイトをインターネットから確認したいけど、誰でもアクセスできる状態にはしたくないことがあります。
CloudFrontを利用している場合は、CloudFront Functionsを使って簡易的なBasic認証を設定できます。
今回は、Viewer requestで認証情報を確認し、正しくない場合は401を返す方法を紹介します。
この記事は、以下のような方におすすめです。
こんな方におすすめ
- CloudFrontで配信しているSTG環境をアクセス制限したい
- 公開前の静的サイトへBasic認証を設定したい
- URLの書き換えとBasic認証を一つの関数で処理したい
CloudFront Functionを作成する
CloudFront Functionsのランタイムはcloudfront-js-2.0を選択し、次のコードを設定します。
var expectedAuthorization = 'Basic BASE64_ENCODED_CREDENTIALS';
function handler(event) {
var request = event.request;
var authorization = request.headers.authorization;
if (!authorization || authorization.value !== expectedAuthorization) {
return {
statusCode: 401,
statusDescription: 'Unauthorized',
headers: {
'www-authenticate': {
value: 'Basic realm="staging", charset="UTF-8"'
},
'cache-control': {
value: 'no-store'
},
'x-robots-tag': {
value: 'noindex, nofollow'
}
},
body: 'Authentication required.'
};
}
return request;
}
BASE64_ENCODED_CREDENTIALSは、ユーザー名とパスワードを次の形式でBase64へ変換した値です。
ユーザー名:パスワード
macOSやLinuxでは、次のコマンドで作成できます。
printf '%s' 'username:password' | base64
注意
Base64は暗号化ではありません。Basic認証は必ずHTTPS通信で使用し、認証情報をGitなどへ登録しないようにしてください。
関数をテストする
認証ヘッダーがないリクエストでは、401が返ることを確認します。
{
"version": "1.0",
"context": {
"eventType": "viewer-request"
},
"viewer": {
"ip": "198.51.100.1"
},
"request": {
"method": "GET",
"uri": "/",
"querystring": {},
"headers": {},
"cookies": {}
}
}
続いて、正しいAuthorizationヘッダーを含めた場合に、元のリクエストが返ることを確認します。
CloudFrontへ関連付ける
テストが完了したら関数をLIVEへ発行し、対象ビヘイビアのViewer requestへ関連付けます。
複数のビヘイビアがある場合、関数はビヘイビアごとに設定が必要です。
例えば、次のビヘイビアがある場合は両方を確認します。
- Default
(*) /api/*
Defaultだけに設定すると、/api/*からBasic認証を回避できる可能性があります。
URL書き換えと一緒に使う場合
CloudFront Functionは、同じビヘイビアの同じイベントに複数設定できません。
すでに/article/を/article/index.htmlへ変換している場合は、Basic認証とURL書き換えを一つの関数へまとめます。
URL書き換えの方法は、以下の記事で紹介しています。
REFERENCEOACで非公開S3を使う静的サイト!CloudFront Functionでindex.htmlへ変換IT自習室↗本番環境では関数を分ける
STG用の関数をそのまま本番へ設定すると、本番サイトにも認証画面が表示されます。
本番では、Basic認証を含まないURL書き換え専用の関数を作り、関連付ける関数を切り替えるのがおすすめです。
まとめ
今回は、CloudFront Functionsを使って、STG環境へBasic認証を設定する方法を紹介しました。
関数をLIVEへ発行することと、必要な全てのビヘイビアへ関連付けることがポイントです。
公開前のサイトを一時的に制限したい場合は、ぜひ参考にしてください。