

前回の記事はこちら。
前回はAWSのApplication Load Balancer(ALB)でSSLオフロードを実施し、Webサーバーの負荷軽減方法を紹介しました。
さて、Webサーバーを自社社員や特定のお客様、会員様のみが閲覧できるようにするには、どうすべきでしょうか? 自社や特定の企業からのアクセスは、ALBのセキュリティグループ設定で、アクセス元のIPアドレスを制限することで対応できるかもしれません。しかし、多くの拠点を持つお客様や、テレワーク・外出先からのアクセスでは、IP制限は現実的ではないかもしれません。
IPアドレスに依存せず、「閲覧権限のある人や端末」を判断する方法の一つとして、クライアント証明書認証があります。これにより、証明書を持たない不正端末からのアクセスを簡単に拒否できます。
また、ID・パスワードは漏洩に気づきにくく、悪用されるリスクがありますが、クライアント証明書を組み合わせた多要素認証を導入することで、不正アクセスを低減できます。 さらに、クライアント証明書を使用するメリットとして、端末が盗難に遭った場合、その証明書を失効させ、CRL(失効リスト)を更新することで、その端末からのアクセスのみを拒否できる点があります。
ALBではmTLS認証(クライアント証明書を使った相互認証)を設定できるため、前回のALB設定を変更し、OneGateから発行されたクライアント証明書を使用したmTLS認証の設定方法を紹介します。
※弊社では「漏洩アカウント調査レポート」を提供しています。IDやパスワードを多用している企業様には、自社社員の情報漏洩を調査することをオススメします。
ALBの設定変更は次のような流れで実施します。
まずS3バケットを作成します。
作ったバケットにCA証明書とCRLをアップロードします。CA証明書とCRLはともにPEM形式でアップロードする必要がありますが、OneGateが発行するCRLはDER形式のため、OpenSSLが使える環境(WebサーバーになっているAmazon Linux 2023でも代用可)にてPEMに変換する必要がありますので、その手順も合わせ説明します。
HTTPでのファイルダウンロードになるため、ブラウザがファイルをブロックすることがありますので「保存」をクリックしてください。
下記を実行してCRLをPEMに変換します。$ openssl crl -inform DER -outform PEM -in certs.crl -out certs_pem.crl
$ ls
certs.crl certs_pem.crl
TeraTermで「ファイル」→「SSH SCP」を開きます。
下段のFromにPEMに変換したCRLファイルのファイル名、To:にローカルの適当なフォルダを指定して「受信」をクリックして、ファイルをローカルに保存します。
「トラストストアの設定」の「トラストストアの名前」に「NetAttest-ts」を入力して、認証局バンドルの「S3を参照」をクリックします。
「S3バケット」→「netattest-s3」を開いてアップロードしたCA証明書のラジオボタンにチェックをいれて「選択」をクリックします。
ALBのリスナーでトラストストアを参照するようにして、OneGateから発行した証明書を信頼するmTLS認証を設定します。
項目 | 値 |
相互認証 | トラストストアで検証 |
トラストストア | NetAttest-ts |
クライアント証明書の処理 | 期限切れのクライアント証明書を許可しない |
トラストストアのCAサブジェクト名をアドバタイズ | オン |
これでALB経由でWebサーバーにアクセスするにはクライアント証明書が必要になりました。
OneGateよりクライアント証明書を発行してALBに接続してみます。
証明書発行・取得手順につてはご契約者様・ご評価者様向けに公開している「Soliton OneGate利用ガイド~招待設定を利用したクライアント証明書取得例~」をご参照ください。利用ガイド
Windows端末に証明書をインポートする大まかな流れは次の通りです。
ユーザーストアに証明書をインポートしたら、ブラウザでALBにアクセスすると証明書が求められますので、OneGateから発行した証明書を選択してください。
これで証明書を持ってない端末・人ではアクセスできないようにすることができました。
クライアント証明書認証を実施するメリットとして端末紛失時などに証明書を失効させてアクセスをブロックすることができます。
そこで先程インポートした証明書を失効させてCRLを更新して、アクセスをブロックしてみます。
インポートした証明書のシリアル番号を調べて、OneGateで証明書を失効してCRLを更新します。
失効させたい証明書の検索方法はいくつかありますが、今回はCNで検索することにします。「検索キーワードを入力してください」欄にCNを入力して検索します。
このユーザーに複数枚証明書を発行していたので候補が複数個表示されてしまいました・・・(OneGateでは1ユーザーに複数枚証明書発行することができます)
それにしても、このソリトン太郎さんはなんでこんなにデバイスを持っているんでしょうね?
通常の運用では「失効したい証明書がインポートされた端末」で更に絞り込んで証明書を失効させますが、今回は先程調べた証明書のシリアル番号(Soliton KeyManager上では「S/N」と表示されています)で証明書を判断して、失効したい証明書にチェックをいれます。
「ログ管理」→「管理ログ」を開いて「証明書失効リストの即時適用処理が完了しました。」を表示されていればCRLが更新されて公開されました。
これでCRLが更新されたので、早速ブラウザのキャッシュをクリアしてALBにアクセスし直してブロックされるかを確認します。
OneGateで失効リストを更新して公開はしましたが、AWSへはアップロードしていません。またALBは失効リストを定期的に自動で取得しに行く機能は無く、トラストストアの失効情報が更新されずに今回失効したシリアル番号の情報がないため、失効していない証明書と認識してしまってクライアント証明書認証を成功させてしまっています。
これを解決するために更新したCRLをS3バケットにアップロードしてトラストストアのCRL情報を更新します。
手順は上記に記載した通りOneGateからCRLをダウンロードして、opensslでDER形式からPEMに変換する流れになりますので割愛します。
これでAWSに更新したCRLがアップロードされました。しかし、バケットにアップロードしただけではトラストストア側には取り込まれていない、まだ失効した証明書でクライアント証明書認証ができてしまいますので、トラストストア側に反映させる設定を行います。
失効リストが追加されました。このままでも大丈夫ですが、既存で入っているCRLと更新したCRLは失効情報がダブっているので、古い方の失効リストを削除します。
古い方の失効リストにチェックをいれて「アクション」→「失効リストを削除する」をクリックします。
これでトラストストアに更新したCRLが反映することができました。
再度、ブラウザキャッシュをクリアしてALBにアクセスし直すて失効リストが反映しているかを確認してみます。
これでようやく有効な証明書を持った正規の端末からのみアクセスが許可されるWebサイトが作成できました。
ただ、クライアント証明書が入った端末の盗難・紛失時の操作手順がOneGateのGUIで失効とCRL更新するのはまだ良いとして、そのあとCRLをDERからPEMに変換してAWSにアップロードして反映させないといけないとなると少し手間ですよね。
AWS CLIを使えばもう少し簡略化することができると思いますので、別途ご紹介させていただきます。