Cognitoを使う機会があり、Cognitoに準ずる仕様にしたかったのですが、ロックアウトの条件が不明だったので、洗い出してみました。
ロックアウトとは
サインインに連続して失敗した場合、一時的または永久的にアカウントを使用できないようにする仕組みです。
ほぼ同じ意味の「アカウントロック」と言ったほうがピンとくる人は多いのですかね。
馴染みがあるものだと、iPhone のロック画面がこの仕組みになっています。
サインインを必要としているシステムには、ブルートフォースアタックの対策として入れておきたい仕組みです。
Amazon Cognito にはあるのか
AWS の認証のサービスでお馴染みの Amazon Cognito さん。
このサービスは、全く知らない人でも画面をポチポチやっていれば簡単に構築できちゃいますし、Amplify をつかえば、さらに簡単に使えちゃうサービスになっております!(ただ詳しく知ろうとすると難しいんですよねー…)
さて、この AWS を使っていれば認証として多く利用されているであろう Cognito にはロックアウトはあるのかですが、
答えは「あります」
Amazon Cognito 開発者ガイドの最初あたりの注記に記載されていました。
Cognitoは永久的なロックアウトはなく、一時的なロックアウトみたいです。
あれ、、、思ったよりも情報が結構書かれていたんだけど、、、
前調べたときは全然情報がなく、ロックされる条件や期間については内部仕様だから公開していないよ!!的な感じだったようなきがするんですが、、、
あ、この記事はこれでおわりですね(笑)
でもまぁ、一応 AWS CLI 叩いて試してみましょう。
AWS CLI でアカウントロック検証
サインイン(初回認証)はこんな感じで叩けます。
aws cognito-idp initiate-auth \
--auth-flow USER_PASSWORD_AUTH \
--client-id xxxxxxxxxxxxxxxx \
--auth-parameters USERNAME=xxxx,PASSWORD=xxxxxx
で、パスワードを間違えてみると、、
An error occurred (NotAuthorizedException) when calling the InitiateAuth operation: Incorrect username or password.
ユーザー名かパスワード間違えてるぞってエラーが返ってきます。
そんなの知ってるよってことで気にせず、連続で叩いてみます。
2回目…3回目…4回目…5回目…6回目…
6回目でエラーが変わりました!!
An error occurred (NotAuthorizedException) when calling the InitiateAuth operation: Password attempts exceeded
パスワードの試行回数を超えましたってエラーですね。
ロックアウトの仕組みを確認することができました。
あとは、思いつく限り色々とパターンを出して、まとめてみようと思います。
ロックアウトの仕様
色々と試した結果以下がわかりました。
- サインインの試行の失敗は 5 回まで許容
- ロック後の再試行の失敗許容回数は1回許容
- 規定の失敗回数に達すると、一時的なロックアウトが開始する
- ロック時間は最初は1秒。再試行後に失敗すると、時間は倍増し15分まで到達する
- 15分間サインインを再試行せずに待つと、ロックアウトがリセットされる
- パスワードリセットをしても、ロックアウトはリセットされず、ロック時間を待機する必要がある
補足として、最初のロック時間が1秒なので、早く叩かないとエラーを出力できないです。最初「6回失敗できちゃった!?」ってなりました。
※ この情報はAWS側都合により変更される場合あります。
最後に
セキュリティにかかわるものですので記事にするかは迷いましたが、公式に書いてあるので、良しとしました。
Cognitoのロックアウトを調べている人の参考になれば幸いです。