IBM Cloud Internet Servicesを使ってサイト全体にベーシック認証をかける


目的

IBM Cloud Internet Services(CIS)は、Cloudflareを利用したCDNやWAF機能を提供するサービスです。そのEnterpriseプラン(Enterprise Usage、Enterprise Packageなど)では、Edge Functionsという機能を使って、スクリプト処理をリクエストの前後に挟むことができます。

Edge FunctionsはCloudflareではCloudflare Workersと呼ばれる機能です

さて、公開サイトを非公開にするためにベーシック認証を使いたい場合があると思いますが、このときにWebサーバで1つ1つ設定するのは手間です。今回はCISのEdge Functionsを使ってBasic認証をかけてみます。

検証

前提

  • CISのEnterpriseプランがオーダー済であること
  • 対象となるWebサーバへのGLBは設定済であること

パスワードの生成

Basic認証のパスワードはID:パスワードをBase64エンコードしたものです。今回はIDをuser1、パスワードをhogehogeとし、次のようにBase64エンコード文字列を生成します。

$ echo -n "user1:hogehoge" | base64
dXNlcjE6aG9nZWhvZ2U=

アクションの登録

コンソールから作成を選びます。

次のようなコードを設定します。Basic ~のところは先ほど生成したBase64エンコード文字列にします。

addEventListener('fetch', event => {
    event.respondWith(fetchAndApply(event.request));
});

async function fetchAndApply(request) {
    if (request.headers.get('authorization') != 'Basic dXNlcjE6aG9nZWhvZ2U=') {
        response = new Response('', { status: 401, statusText: 'Unauthorized' });
        response.headers.set('WWW-Authenticate', 'Basic realm="Authentication Required"');
        return response;
    }

    return fetch(request);
}

これにbasic-authという名前をつけて保存します。

次にこれを適用するURLを指定します。トリガータブからトリガーの追加を選択します。

トリガーURLはサイト全体ならFQDNでよいです。アクションにbasic-authを選択し保存します。

動作確認

ブラウザでサイトにアクセスします。ベーシック認証のダイアログが表示されます。

これで、先ほど指定したIDとパスワードでログインできることを確認してください。

以上