Cloudflare Access ポリシーで Azure AD に設定した YubiKey による FIDO2 認証を強制する

# YubiKey USB 接続での FIDO 利用
YubiKey USB接続でのFIDO利用方法は、以下のリンクにまとめられているものがありました。

Microsoft 系だと FIDO2 認証を使うことになります。

- [FIDO U2F, FIDO2(WebAuthn) の設定 | YubiKey サポート | ペンティオ(株)](https://www.pentio.com/yubikey/support/fido2/)
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/cbbdd758-b7d7-11ac-0884-c2709d84ed9c.png)

YubiKey 自体は 2022 年末に Cloudflare が実施したキャンペーンで入手したものを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/5a4f65a6-0749-b00f-2acf-6ac5d8793977.png)

- [Cloudflare Zero TrustとYubicoでシームレスなフィッシング対策を実現する（ハードウェア）キー](https://blog.cloudflare.com/ja-jp/making-phishing-defense-seamless-cloudflare-yubico-ja-jp/)
> 今回のキャンペーンは、すべてのCloudflareのお客様がご利用いただけます。Cloudflareをご利用のお客様は、Cloudflareダッシュボードで直接このYubicoセキュリティーキーのキャンペーンを利用することができます。
Yubicoは今回、1個あたり10ドルという「インターネット特別料金」でセキュリティーキーを提供しています。キーはYubicoにより、直接お客様の元に発送されます。
キーの設定とIDプロバイダーおよびCloudflareのZero Trustサービスとの統合に関しては、CloudflareとYubicoの開発者向けドキュメントおよびサポートグループが、ガイドを提供します。

# Azure AD に YubiKey による FIDO 認証を設定する
デフォルトだと `FIDO2 security key` が無効になっているため、以下の手順で有効化します。

- [YubiKey で Azure AD 認証 | naokilog.com](https://www.naokilog.com/2021/08/06/yubikey-%E3%81%A7-azure-ad-%E8%AA%8D%E8%A8%BC/)

最近画面が新しくなった模様。

- [認証方法の管理画面を刷新 | Japan Azure Identity Support Blog](https://jpazureid.github.io/blog/azure-active-directory/modernizing-authentication-management/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/3e125e90-f759-2d2d-1070-3fa884a48a5c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/e692c0d6-ea5f-06dc-3c0d-c31fba8e6a71.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/e614aa82-b0a4-6622-33ce-cb8add962d87.png)

# ユーザーアカウント側でセキュリティキーを登録する
ユーザーアカウントに YubiKey をセキュリティキーとして登録します。

https://myaccount.microsoft.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/556f8768-4986-1727-4a93-48654e1f0be8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/2aca96ca-8708-3bdf-73f5-a47ab168ebfb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/bcff009f-de77-b048-fa65-bfde337c8587.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/9a6ad986-d10a-6779-5923-1a25d54259cd.png)

↑ ここでサインインを求められるので、サインインを行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/cc727130-42b8-c26e-b65c-e85a28e53784.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/85114cff-5e0f-f06e-3375-7ff517e62d06.png)

以下、Chrome ブラウザでかつ YubiKey 5C NFC を USB 接続した状態で進めています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/140e0f86-e860-fa25-21a4-24ecd705b41a.png)

PIN の入力を求められます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/e1bca82a-ae59-cfa2-acbe-4425f3ba2e31.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/8d21243a-8313-ad23-e854-e81f0c1c59cb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/084e54a7-33e0-c3e1-1484-ccb21a2e4be7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/568ff6a3-aff1-edb2-9ac7-0f547ad5d1d1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/db3b3733-6c15-777d-d673-80d49c3d0ac8.png)

以上でユーザーアカウントに YubiKey をセキュリティキーとして登録完了できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/8992d286-e83d-5ec8-0db1-ffcd29909b28.png)

# Cloudflare Access を使って FIDO2 認証を強制する
以下の App Launcher を使います。

`<your-team-name>.cloudflareaccess.com` は App Launcher の Cloudflare Access ポリシーによって保護されていますので、設定します。

- [App Launcher · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/applications/app-launcher/)

Settings > Authentication > App Launcher > Manage > Rules から以下のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/77b218e5-3a3a-1939-df59-e0a7c8798a44.png)

# 確認

`https://<your-team-name>.cloudflareaccess.com` にアクセスし、Azure AD でログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/b98ca935-6a1c-bcee-77bc-a7a3cf398281.png)

ログイン後は、画面右上のユーザ名 > Account から認証情報を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/bf53535b-b2e9-9afa-0fc9-ff4d1973a375.png)

また、以下の URL からも JSON データを確認できます。

`https://<your-team-name>.cloudflareaccess.com/cdn-cgi/access/get-identity`

```json
{
  "id": "xxx",
  "name": "xxx",
  "email": "xxx@example.com",
  "amr": [
    "fido",
    "mfa"
  ],
  "groups": [
    {
      "id": "xxx",
      "name": "Mark 8 Project Team"
    },
    {
      "id": "xxx",
      "name": "Retail"
    },
    {
      "id": "xxx",
      "name": "MSFT"
    },
    {
      "id": "xxx",
      "name": "Sample Team Site"
    },
    {
      "id": "xxx",
      "name": "Global Administrator"
    },
    {
      "id": "xxx",
      "name": "U.S. Sales"
    },
    {
      "id": "xxx",
      "name": "Digital Initiative Public Relations"
    },
    {
      "id": "xxx",
      "name": "Sales and Marketing"
    }
  ],
  "idp": {
    "id": "xxx",
    "type": "azureAD"
  },
  "geo": {
    "country": "JP"
  },
  "user_uuid": "xxx",
  "devicePosture": {
    "xxx": {
      "type": "warp",
      "rule_name": "Warp",
      "success": false
    },
    "xxx": {
      "type": "gateway",
      "rule_name": "Gateway",
      "success": false
    }
  },
  "account_id": "xxx",
  "iat": 1683980281,
  "ip": "xxx",
  "auth_status": "NONE",
  "common_name": "",
  "is_warp": false,
  "is_gateway": false,
  "version": 0,
  "device_sessions": {}
}
```

## パスワードなし + YubiKey を使った場合
ログインが成功し `fido` 属性が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/5b2b5384-6e76-a199-7f10-b719f68e8aa9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/c960b10e-b2da-2244-612c-422220483104.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/5df748dc-a535-f5d2-1faf-7967f418ba1b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/4e3892c9-7c3a-d021-cbd3-1e9062ae3c49.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/1f0a041e-9843-45a4-6cb7-9a040ad1eb7b.png)

## パスワード + YubiKey を使った場合
ログインが成功し `fido` 属性が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/01d962ad-8a76-aa23-29c8-2abde20c1b5f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/2fd1e50d-d70c-217c-90a0-b91f950fa618.png)

## パスワード + TOTP を使った場合
Cloudflare Access ポリシー違反のため、以下のような画面とログが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/7658f937-a52a-bcd7-8523-4683969d6c06.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/7b1c4234-5b28-df9f-85d2-c5c398d7dee4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/84ed7c8a-54ae-40e6-4b26-4425ce179ec2.png)

# その他参考リンク

- [パスワードレス認証を実現するFIDO2認証＜不正ログインの脅威と対策（第4回）＞ | オージス総研](https://www.ogis-ri.co.jp/column/themistruct/c106457.html)