AWS Cognitoを使った二段階認証の導入をしてみた

みなさんこんにちは。 株式会社アドグローブ ソリューション事業部の小嶋です。
今回、初めてAWS Cognitoを使って二段階認証の導入を行いましたので、その際の対応について記事を書かせていただきました。
セキュリティ向上のために二段階認証の導入を検討している方の参考になれば幸いです。

AWS Cognitoとは

Amazon Cognito とは - Amazon Cognito

Amazon Cognito はウェブアプリとモバイルアプリ用のアイデンティティプラットフォームです。これは、OAuth 2.0 アクセストークンと AWS 認証情報のための、ユーザーディレクトリであり、認証サーバーであり、認可サービスです。Amazon Cognito を使用すると、組み込みのユーザーディレクトリ、エンタープライズディレクトリ、Google や Facebook などのコンシューマー ID プロバイダーからユーザーを認証および認可できます。

簡単に言うと、二段階認証を設定することでセキュリティを向上させることができます。

  • メリット
    ①IP制限では不十分な部分に関して、セキュリティの向上につながる
    ②AWSコンソール上で設定が完結するため、AWSを使ったサービスでは導入しやすい
二段階認証のイラスト

対応したこと

今回の二段階認証の導入対応はすでに使われているCMSに対してIP制限のみでは不十分であったため、セキュリティ強化の一環で導入を行いました。
仕様としてはCMSにアクセスした際に、メールアドレスによる二段階認証を必須とするように設定を行いました。

対応は以下のような流れで行いました。

  1. ユーザープールの作成
  2. ALBにユーザープールをアタッチする

1.ユーザープールの作成

ユーザープールとは
二段階認証に登録するユーザーを設定するためのものです。 ユーザープールを作成後、左メニューの「ユーザー」から任意のユーザーの追加・削除をすることができます。
作成したユーザープールに登録したユーザーのみがアクセスできるようになります。

ユーザープールの作成は、以下の手順で行いました

  1. AWSのコンソール上からCognitoのダッシュボードにアクセスする
  2. ユーザープールの項目から「ユーザープールの作成」をクリック (今回は以下設定で作成しました)
アプリケーションタイプ :「従来のウェブアプリケーション」を選択 
アプリケーションに名前を付ける:任意の名前を入力 
サインイン識別子のオプション:「メールアドレス」のみにチェックをつける  
サインアップのための必須属性:「email」のみ選択

3.「ユーザーディレクトリを作成する」を押下
4.左メニューの「サインイン」を押下し「選択ベースのサインインのオプション」にある「編集」ボタンを押下

その他の選択肢:「メールメッセージのワンタイムパスワード」のみにチェックする

以上でユーザープールの作成は終了です。
複雑な設定はなくユーザーの追加や削除が非常に簡単で、登録ユーザーが一覧表示されているため管理がしやすいところがよい点ですね。

今回はメールアドレスでの登録のため、登録のタイミングでそのメールアドレスに対して追加された旨のメールを送信することや仮パスワードの設定も行えます。
ただし、仮パスワードを設定する場合は有効期限があるため注意が必要です。 有効期限はデフォルトで7日となっていますが、任意の期間に変更することも可能です。

2.ALBにユーザープールをアタッチする

ユーザープールの作成で認証できるユーザーの登録ができるようになりましたが、このままでは二段階認証は利用できません。
二段階認証を使うためには、EC2のALB(今回はCMS)にユーザープールをアタッチする必要があります。 アタッチを行うことで初めて二段階認証が使用可能になります。

設定は以下手順で行いました。

  1. AWSのEC2でCMS用のALBをクリック
  2. HTTPS:443のリスナーを選択する
  3. ルール一覧で「ターゲットグループへ転送」と定義しているルールに対して、以下の設定を追加する
認証アクション:「ユーザーを認証」にチェックする
アイデンティティプロバイダー:「Amazon Cognito」を選択する
ユーザープール:「1.ユーザープールの作成」で作成したユーザープールを選択
アプリケーションクライアント:該当するものを選択

これで二段階認証の設定は完了です。
実際にCMSにアクセスしてみると以下のような認証画面が表示されました。

Cognito 認証画面
これでcognitoの設定は完了!と思っていたのですが⋯⋯

ここで、とある問題が発生していることがわかりました。

実装時に発生した問題

実装を行った後、CMSのデータを使っているアプリを起動したところアプリが正常に起動できない状態となっていました。

原因はALBにアタッチする際に「ターゲットグループへ転送」と定義しているルールすべてに対してCognitoのアタッチを行ったことでした。
この設定を行ったことで、本来CMSにログインする際にしか二段階認証が入らないものがCMSのAPIに対しても入ってしまったようでした。
そのためCMSのAPIを使ってデータを取得しているアプリ側でデータが取得できなくなってしまい、アプリが正常に起動できないという事象が発生しました。

今回の場合ルールすべてにCognitoをアタッチするのではなく、CMSのログインページにのみ二段階認証がつくようにアタッチしなければなりませんでした。
ただログインページのみにアタッチできるようなルールがなかったため、ALBに新しくルールの作成から行いました。

条件:パス="ログインページのURL"
認証アクション:「ユーザーを認証」にチェックする
アイデンティティプロバイダー:「Amazon Cognito」を選択する
ユーザープール:「1.ユーザープールの作成」で作成したユーザープールを選択
アプリケーションクライアント:該当するものを選択

上記ルールを作成しルールの優先度を1に設定することで、アプリを問題なく起動することができました。
CMSにアクセスしても問題なく二段階認証の画面が表示されたため、これで本来実装したかった形にすることができました!

まとめ

今回の実装は、自分にとって知見のない内容だったため、大変な部分もありましたが、その分とても勉強になりました。
設定自体はそれほど複雑ではないものの、「この設定は何のために行っているのか」をある程度理解していないと、実際に問題が発生した際の対応に時間がかかってしまうと感じました。
今回の対応を通して、セキュリティについて改めて考える良いきっかけにもなり、実装から問題発生時の対応まで含めて経験を積むことができて良かったと思っています。

この記事が Cognito を導入してみたい方に、少しでも参考になれば幸いです。 最後までお読みいただきありがとうございました。