OneGateから発行した証明書を使ってAWS ALBをセキュアにする-その2「クライアント証明書認証」

アイキャッチ
目次

前回の記事はこちら

前回はAWSのApplication Load Balancer(ALB)でSSLオフロードを実施し、Webサーバーの負荷軽減方法を紹介しました。

さて、Webサーバーを自社社員や特定のお客様、会員様のみが閲覧できるようにするには、どうすべきでしょうか? 自社や特定の企業からのアクセスは、ALBのセキュリティグループ設定で、アクセス元のIPアドレスを制限することで対応できるかもしれません。しかし、多くの拠点を持つお客様や、テレワーク・外出先からのアクセスでは、IP制限は現実的ではないかもしれません。

IPアドレスに依存せず、「閲覧権限のある人や端末」を判断する方法の一つとして、クライアント証明書認証があります。これにより、証明書を持たない不正端末からのアクセスを簡単に拒否できます。
また、ID・パスワードは漏洩に気づきにくく、悪用されるリスクがありますが、クライアント証明書を組み合わせた多要素認証を導入することで、不正アクセスを低減できます。 さらに、クライアント証明書を使用するメリットとして、端末が盗難に遭った場合、その証明書を失効させ、CRL(失効リスト)を更新することで、その端末からのアクセスのみを拒否できる点があります。

ALBではmTLS認証(クライアント証明書を使った相互認証)を設定できるため、前回のALB設定を変更し、OneGateから発行されたクライアント証明書を使用したmTLS認証の設定方法を紹介します。

※弊社では「漏洩アカウント調査レポート」を提供しています。IDやパスワードを多用している企業様には、自社社員の情報漏洩を調査することをオススメします。

構成図

ALBで証明書認証する構成は次のようになります。

ALBでクライアント証明書認証する設定

ALBの設定変更は次のような流れで実施します。

  1. S3バケット作成してCA証明書とCRLを保存する
  2. トラストストアを作成してS3バケットにあるCA証明書とCRLを参照する
  3. ALBでmTLSを有効にする

S3バケットを作成してCA証明書とCRLをアップロードする

まずS3バケットを作成します。

  1. Amazon S3にて「汎用バケット」を開き「バケットを作成」をクリックします。
  2. 下記のように設定して「バケットを作成」をクリックします。
    • 一般的な設定
      項目
      バケットタイプ汎用
      バケット名netattest-s3
    • オブジェクト所有者:ACL無効(推奨)
    • このバケットのブロックパブリックアクセス設定:パブリックアクセスをすべてブロック

    • バケットのバージョニング:無効にする

    • デフォルトの暗号

      項目
      暗号タイプAmazon S3マネージドキーを使用したサーバー側の暗号(SSE-S3)
      バケットキー有効にする

netattest-s3バケットにOneGateのCA証明書とCRLをアップロードする

作ったバケットにCA証明書とCRLをアップロードします。CA証明書とCRLはともにPEM形式でアップロードする必要がありますが、OneGateが発行するCRLはDER形式のため、OpenSSLが使える環境(WebサーバーになっているAmazon Linux 2023でも代用可)にてPEMに変換する必要がありますので、その手順も合わせ説明します。

CA証明書とCRLのダウンロード

  1. OneGate管理ページにログインして、「証明書管理」→「CA情報」を開きます。
  2. 画面下部の「CA証明書ファイルのダウンロード」項目の「PEM形式」をクリックして、CA証明書を保存しておきます。
  3. ブラウザのアドレスバーにCRL配布ポイントURLを入力してCRLを取得します。CRL配布ポイントURLは、OneGate管理ページの「証明書管理」→「CA情報」の下部に表示されています。
  4. HTTPでのファイルダウンロードになるため、ブラウザがファイルをブロックすることがありますので「保存」をクリックしてください。

CRLをDERからPEMに変換

  1. TeraTerm等を使ってOpenSSLが使えるLinuxにログインします。
  2. TeraTermで「ファイル」→「SSH SCP」を開きます。
  3. CRLをドラックアンドドロップして「送信」をクリックします。
  4. 下記を実行してCRLをPEMに変換します。$ openssl crl -inform DER -outform PEM -in certs.crl -out certs_pem.crl
    $ ls
    certs.crl  certs_pem.crl

  5. TeraTermで「ファイル」→「SSH SCP」を開きます。

  6. 下段のFromにPEMに変換したCRLファイルのファイル名、To:にローカルの適当なフォルダを指定して「受信」をクリックして、ファイルをローカルに保存します。

CA証明書とCRLをS3バケットにアップロードする

  1. Amazon S3の「汎用バケット」→「netattest-s3」を開き「アップロード」をクリックします。
  2. 「ここにアップロードするファイルとフォルダをドラッグアンドドロップするか、[ファイルを追加] または [フォルダを追加] を選択します。」と書かれた部分にCA証明書と変換されたCRLをドラクアンドドロップして「アップロード」をクリックします。
  3. ファイルとフォルダ欄にアップロードしたファイルが有ることを確認して「閉じる」をクリックします。

ALBでmTLSができるように設定する

トラストストアの作成

  1. EC2ダッシュボードにて「ロードバランシング」→「トラストストア」を開いて「トラストストアを作成」をクリックします。
  2. 「トラストストアの設定」の「トラストストアの名前」に「NetAttest-ts」を入力して、認証局バンドルの「S3を参照」をクリックします。

  3. 「S3バケット」→「netattest-s3」を開いてアップロードしたCA証明書のラジオボタンにチェックをいれて「選択」をクリックします。

  4. Revocationsにて「新しいCRLを追加」をクリックします。

  5. S3を指定する画面が表示されるようになるので、「S3を参照」をクリックします。

リスナーの設定変更

ALBのリスナーでトラストストアを参照するようにして、OneGateから発行した証明書を信頼するmTLS認証を設定します。

  1. EC2ダッシュボードにて「ロードバランシング」→「ロードバランサー」の「NetAttest-alb」を開き、「リスナーとルール」タブの「HTTPS:443」にチェックをいれて「リスナーの管理」→「リスナーの編集」をクリックします。
  2. 「セキュアリスナーの設定」にて「クライアント証明書の処理」項目の「相互認証(mTLS)」にチェックをいれて下記のように設定して「設定内容の保存」をクリックします。
    項目
    相互認証トラストストアで検証
    トラストストアNetAttest-ts
    クライアント証明書の処理期限切れのクライアント証明書を許可しない
    トラストストアのCAサブジェクト名をアドバタイズオン

これでALB経由でWebサーバーにアクセスするにはクライアント証明書が必要になりました。

クライアント証明書認証を実施してみる

OneGateよりクライアント証明書を発行してALBに接続してみます。
証明書発行・取得手順につてはご契約者様・ご評価者様向けに公開している「Soliton OneGate利用ガイド~招待設定を利用したクライアント証明書取得例~」をご参照ください。利用ガイド

Windows端末に証明書をインポートする大まかな流れは次の通りです。

  1. OneGate管理ページで「証明書管理」→「招待コード管理」→「招待コード発行」よりユーザーに対して招待コードを発行します。
  2. メールで招待コードを受信するか、OneGate利用者ポータルで招待コードを確認してSoliton KeyManagerでユーザーの証明書を取得します。(画面ショットは抜粋です)

ユーザーストアに証明書をインポートしたら、ブラウザでALBにアクセスすると証明書が求められますので、OneGateから発行した証明書を選択してください。

証明書を提示するとWebサーバーにアクセスできます。

証明書を提示しないと、アクセスが拒否されます。

これで証明書を持ってない端末・人ではアクセスできないようにすることができました。

証明書を失効させてアクセスをブロック

クライアント証明書認証を実施するメリットとして端末紛失時などに証明書を失効させてアクセスをブロックすることができます。

そこで先程インポートした証明書を失効させてCRLを更新して、アクセスをブロックしてみます。

OneGateで証明書を失効する

インポートした証明書のシリアル番号を調べて、OneGateで証明書を失効してCRLを更新します。

  1. Soliton KeyManagerを起動して「証明書一覧」をクリックします。
  2. 失効させたい証明書のケバブメニューをクリックして「詳細」をクリックします。
  3. CNとS/N欄の値を確認します。

  4. OneGateの管理ページを開き「証明書管理」→「証明書一覧」を開きます。

  5. 失効させたい証明書の検索方法はいくつかありますが、今回はCNで検索することにします。「検索キーワードを入力してください」欄にCNを入力して検索します。

  6. このユーザーに複数枚証明書を発行していたので候補が複数個表示されてしまいました・・・(OneGateでは1ユーザーに複数枚証明書発行することができます)

    それにしても、このソリトン太郎さんはなんでこんなにデバイスを持っているんでしょうね?

  7. 通常の運用では「失効したい証明書がインポートされた端末」で更に絞り込んで証明書を失効させますが、今回は先程調べた証明書のシリアル番号(Soliton KeyManager上では「S/N」と表示されています)で証明書を判断して、失効したい証明書にチェックをいれます。

  8. 「操作」→「失効」をクリックします。

  9. 「はい」をクリックします。

  10. 画面上部に「失効が完了しました。」と表示されたら、「CRL更新反映(即時)」をクリックします。

  11. 「はい」をクリックします。

  12. 「ログ管理」→「管理ログ」を開いて「証明書失効リストの即時適用処理が完了しました。」を表示されていればCRLが更新されて公開されました。

これでCRLが更新されたので、早速ブラウザのキャッシュをクリアしてALBにアクセスし直してブロックされるかを確認します。

期待とは裏腹にアクセスできてしまいました・・・

OneGateで失効リストを更新して公開はしましたが、AWSへはアップロードしていません。またALBは失効リストを定期的に自動で取得しに行く機能は無く、トラストストアの失効情報が更新されずに今回失効したシリアル番号の情報がないため、失効していない証明書と認識してしまってクライアント証明書認証を成功させてしまっています。

これを解決するために更新したCRLをS3バケットにアップロードしてトラストストアのCRL情報を更新します。

AWSに更新したCRLを反映させる

CRLをダウンロードしてPEMに変換

手順は上記に記載した通りOneGateからCRLをダウンロードして、opensslでDER形式からPEMに変換する流れになりますので割愛します。

S3バケットに更新したCRLをアップロード

  1. Amazon S3を開いて「汎用バケット」→「netattest-s3」を開き「アップロード」をクリックします。
  2. 「ここにアップロードするファイルとフォルダをドラッグアンドドロップするか、[ファイルを追加] または [フォルダを追加] を選択します。」欄に更新してPEMに変換したCRLをドラックアンドドロップして「アップロード」をクリックします。
  3. 「閉じる」をクリックします。

これでAWSに更新したCRLがアップロードされました。しかし、バケットにアップロードしただけではトラストストア側には取り込まれていない、まだ失効した証明書でクライアント証明書認証ができてしまいますので、トラストストア側に反映させる設定を行います。

更新したCRLをトラストストアに反映させる

  1. EC2ダッシュボードより「ロードバランシング」→「トラストストア」の「NetAttest-ts」開き、「証明書失効リスト」タブの「アクション」→「失効リストの追加」をクリックします。
  2. 「S3を参照」をクリックします。

  3. 「S3バケット」→「netattest-s3」を開いて更新したCRLを選択して「選択」をクリックします。

  4. 「失効リストを追加」をクリックします。

  5. 失効リストが追加されました。このままでも大丈夫ですが、既存で入っているCRLと更新したCRLは失効情報がダブっているので、古い方の失効リストを削除します。
    古い方の失効リストにチェックをいれて「アクション」→「失効リストを削除する」をクリックします。

  6. 確認メッセージが表示されるので「確認」と入力して「削除」をクリックします。

これでトラストストアに更新したCRLが反映することができました。

失効した証明書を使ってALBにアクセスしてみる

再度、ブラウザキャッシュをクリアしてALBにアクセスし直すて失効リストが反映しているかを確認してみます。

今度はちゃんとアクセスが拒否されました。

これでようやく有効な証明書を持った正規の端末からのみアクセスが許可されるWebサイトが作成できました。

ただ、クライアント証明書が入った端末の盗難・紛失時の操作手順がOneGateのGUIで失効とCRL更新するのはまだ良いとして、そのあとCRLをDERからPEMに変換してAWSにアップロードして反映させないといけないとなると少し手間ですよね。

AWS CLIを使えばもう少し簡略化することができると思いますので、別途ご紹介させていただきます。

記事を書いた人

ソリトンシステムズ・テクニカルチーム