ALB + Lambdaでお手軽3分ベーシック認証


概要

ALBのリスナールールの変更とLambdaの追加でベーシック認証を行います。

ベーシック認証の処理の流れとしては以下となります。

  • ALBでAuthorizationヘッダーを検証する
  • 認証OKであれば、正規のターゲットグループに転送する
  • 認証NGであれば、Lambdaをターゲットとするターゲットグループに転送する
  • Lambdaではベーシック認証を要求するレスポンスを返す(なお、ALBからのヘルスチェックに対しては200を返すようにします)

1. Lambda関数の作成

まず、ALBが存在するリージョンで、Lambda関数を作成します。

  • 一から作成を選択
  • 関数名を入力(今回はBasicAuthとします)
  • ランタイムはNode.js 12.xを選択
  • 実行ロールは基本的な Lambda アクセス権限で新しいロールを作成を選択
  • VPCは特に何も選択しない
  • 関数の作成ボタンを押下

  • index.jsに以下のコードを貼り付けて、Deployボタンを押下

Authorizationヘッダーの検証はALBで実施するため、コード中には検証処理はありません。

exports.handler = async (event, context) => {
    const headers = event.headers || {};

    // ALB Health check
    if (headers['user-agent'] === 'ELB-HealthChecker/2.0') {
        return {
            statusCode: 200,
            statusDescription: '200 OK',
            isBase64Encoded: false,
            headers: {
                'Content-Type': 'text/html'
            }
        };
    }

    return {
        statusCode: 401,
        statusDescription: '401 Unauthorized',
        body: 'Unauthorized',
        isBase64Encoded: false,
        headers: {
            'WWW-Authenticate': 'Basic',
            'Content-Type': 'text/html'
        }
    };
};

2. ターゲットグループの作成

先ほどのLambda関数をターゲットとするターゲットグループを作成します。

2.1. 基本的な設定等

  • ターゲットタイプにLambda関数を選択
  • ターゲットグループ名を入力(今回はbasic-authとします)
  • ヘルスチェックの有効化をチェック
  • 次へボタンを押下

2.2. ターゲットの登録

  • 先ほど作ったLambda関数を選択
  • ターゲットグループの作成ボタンを押下

3. ALBのリスナールールの編集

3.1. ルールの表示/編集

  • ALBのリスナータブを選択し、ルールの表示/編集を押下

3.2. ルールの挿入

  • 画面上部の+ボタンを押下
  • ルールの挿入を押下
  • IFの箇所で`HTTPヘッダーを選択
    • ヘッダーにAuthorizationを入力
    • 値にBasic {ID:パスワードをBase64エンコードした値}を入力(Basicの次にスペースを入れること)
    • Base64エンコード方法は以下を参照(IDがhogehoge, パスワードがfugafugaの場合)
$ echo -n 'hogehoge:fugafuga' | base64
aG9nZWhvZ2U6ZnVnYWZ1Z2E=
  • THENの箇所で、転送先として正規のターゲットグループを選択
  • 保存ボタンを押下

3.3. 最後のルールの転送先をLambda関数にする

  • 画面上部のペンのアイコンを押下
  • 最後のルールの左側に表示されているペンのアイコンを押下
  • THENに表示されているペンのアイコンを押下
  • 転送先として先ほど作成したターゲットグループを選択
  • 更新ボタンを押下

4. ベーシック認証の表示確認

以上の設定を終えて目的のサイトにアクセスすると、ベーシック認証がかかるようになります🎉

参考