ランダム化されたMACアドレスはネットワーク認証においてどう扱えるのか。[Cisco ISEの利用例]

## ランダム MAC アドレス
iOS 14  や Android 端末で MAC アドレスのランダム化する機能が出てきました。自宅のルータなんかで MAC アドレスによるアクセス制限をされている方たちの「なぜかつながらなくなった！」「原因がわかるまで大変だった」「ランダム化は切ったわ」というような声がちらほらとネットでも見受けられました。

Use private Wi-Fi addresses in iOS 14, iPadOS 14, and watchOS 7
https://support.apple.com/en-us/HT211227
Android Open Source Project > Develop > Connectivity > Privacy: MAC Randomization
https://source.android.com/devices/tech/connect/wifi-mac-randomization

家庭や公衆 Wi-Fi 等ではプライバシーに配慮した機能として需要がある機能だとは思うのですが、MAC アドレスは端末の識別子として広く使われています。ですので、ご自宅のネットワーク環境だけでなく職場でも同様の苦労をされている方がいらっしゃるんではないかと、ちょっと注目しておりました。MAC アドレスでデバイスやユーザを識別する方法というのは一般的なものなので、この機能が端末側で有効になると管理者さん的にはきついじゃないかなあと。

機種ごとに MAC アドレスのランダム化の実装はバリエーションがあるものの、このランダム化されたMACアドレスはフォーマットが IEEE で定められています。よって、それがランダム化された MAC アドレスなのかどうか、は少なくともシステマチックに判断できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/f2fa1bb3-d418-7a87-9c3d-080aa51da7fe.png)
この図に描いたように MAC アドレスの先頭3オクテットが OUI で、その8ビットのうちの下2桁のところで判断できます。具体的にはこの b1 が1でかつ b0 が0のアドレスがランダム化されたものとなります。ということは最初の1オクテットが2,6,A,Eのどれかで終わるものがそれです。

## ランダム MAC の無効化はエンドユーザにオフロードしたいです…。
こうした MAC アドレスを持ったデバイスを使っているそのエンドユーザは正当なユーザであって、登録したデバイスを利用しているのだとしたら、これを識別して、ネットワークに接続させる際の判断基準に採用できるようになるといいかなと思います。そして組織のネットワークに接続させるときにランダム化されたMACアドレスを持ったものを禁止するとか、制限付きのネットワークに入れるとかいうことも考えられますし、正規の端末を使っているのであればランダム化を切って接続しなおすようにガイドを出すというのが一番な気がしています。
とはいえその作業について管理者がいちいち面倒を見ていては業務が崩壊します。Windows端末にしてもスマホにしても、エンドユーザ側で設定変更ができるのでそうしてもらえるように一度準備しておくのが現実的かつ理想的だと思います。
例えば Windows 10 だと Wi-Fi 設定で一つクリックするだけです。
_Windows 10 でのランダム MAC アドレスの設定_
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/0040cc68-0aa1-33cd-3340-b9d705b443c8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/8c371d7c-07d4-d219-77a4-8bb3119940c5.png)

## Cisco Identity Services Engine で ランダム MAC アドレスに対応する
Cisco Identity Services Engine(ISE) という高機能な認証サーバがあるのですが、それを使って認証フローを作るとしたら以下の様なやり方があります。
参考までにこの記事で載せているISEのバージョンは3.0です。
1. 業務用の SSID にランダム MAC を利用した端末で接続してくるとインストラクションにリダイレクト
2. そうでないものは通常の Dot1x 認証へ渡す

まずはランダム MAC を使った端末が仮でストアされる内部 DB グループを作成します。 __Administration > Identity Management > Groups__
  に進み Endpoint Identity Group に新しく入れ物を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/bdf765c8-a88f-d151-bc10-f41f32e9d0e6.png)
次に __Work Centers__ で__Guest Portals__ を選び __Create__ を選択し新たなポータルを作成します。これがユーザに「ランダム MAC やめなさい」的なインストラクションを見せるポータルになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/ef37d60e-e359-bdab-8cab-933bc09c5035.png)
選ぶのは Hotspot Guest Portal です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/e4de4d93-bde8-c107-d1e2-e4339cb35ad2.png)
ポータルの名前を適当に決めてて、そのままスクロールダウンしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/5915fc84-a896-055f-0949-89da5c750160.png)
Endpoint Identity Groupで先ほど作った Random_MAC_Endpoints を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/f7fa9e6f-7a5a-7dbd-34d2-de9d7f6c039f.png)
そうしたらまた上の方にスクロールアップして戻ります。一旦ここで __Save__ します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/78e76dce-f6b2-2833-7c16-8b7243afaa66.png)
__Portal Page Cusomization__ というタブを選び、せっかくなので日本語のポータルを編集していく例にしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/f0415987-415a-947a-727a-2a1b9010d434.png)

__Global Page Customizations__ の __Text Elements__ で適当な文章にバナーを変えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/f86ffe18-4c86-d0b7-f370-b05eef6fc37f.png)

スクロールダウンし__Acceptable Use Policy__ を選択し、ブラウザページタイトルや __Content Title__ を適宜埋めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/e5b732f8-c048-4e7c-d1e2-8ab7cfe0b9a1.png)


__Instructional Text__ で Toggle HTML Source を押してから以下のスクリプトを記述し、それができたらまた Toggle HTML Source ボタンを押し戻します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/330b2188-18ea-df63-80c3-1608e2942d80.png)
そうするとボタンが消えます。

\<script>
    (function(){
       jQuery('.cisco-ise-aup-text').hide();
       jQuery('.cisco-ise-aup-controls').hide();
       setTimeout(function(){ jQuery('#portal-session-timeout-popup-screen, #portal-session-timeout-popup-popup, #portal-session-timeout-popup').remove(); }, 100);
      })();
\</script>

同じテキストボックスの中にランダムMACアドレスを無効化する方法を記述してユーザに案内することも併せて行うとよいと思います。
スクロールアップして Save します。

ランダム MAC アドレスで接続してきたデバイスに対して与える認可プロファイルを設定します。
認可プロファイルは単純にポートの開放にあたるような Permit Access であったり、VLAN であったり ACL, そのほか先ほど設定したようなポータルへのリダイレクト等様々なものを与えることができるものです。
ということで、ここで先ほどの Random MAC Detected と名前を付けたポータルへのリダイレクトを選択します。
__Policy > Policy Elements > Result > Authorizatioin > Authorization Profiles__ に進み、__+ Add__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/0f17ffd7-967d-9757-e8e7-ceab9a7e735d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/7f0ac5ba-29f9-7006-d63c-fde7d2fce46a.png)
__Common Tasks__ の中でスクロールダウンしていくと Web Redirection というものが選べますので、先ほど作ったポータルを選ぶように選択します。ここで Web Redirection を選択して、次のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/35095577-313b-427e-6f72-8e74a8376f2a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/30f4cf36-7578-e5db-b89a-2d4f13d84ad1.png)スクロールダウンして Save をお忘れなく。Save ボタンとか Commit ってたまに忘れてアレってなりますよね。

ちなみにこれは無線LANコントローラ Catalyst 9800-CL 側の Redirect ACL です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/e10c441a-6b42-5082-fc60-d09e0c64061e.png)

そして最後に 認証認可のポリシーを作成します。

冒頭で記述したように、ランダム MAC アドレスのフォーマットを持った端末をひっかける正規表現を使った MAB の特殊ルールを作り、先ほどのポータルに誘い込めるようにします。Policy > Policy Sets に進み、Authorization Policy に新しくルール作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/67ed7e3f-0c79-10fe-f21d-1f94489661b3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/913530/e0d7f21d-c255-d386-61ae-ea5ce66c887b.png)

## まとめ
これで、Random MAC を無効にする変更をしないと今作ったこっちのルールに引っ掛かってDot1x等の別のルールに進めないようにすることができるでしょう。
ISEの認証・認可で細かなルールを作ってひっかけると結構こまごまといろいろなことができて、例えば認証する SSID 名だったり、ネットワークデバイスのロケーションだったりを条件として認可が変わる、みたいな使い方はよくお話しとしてあるのですが、今回の件で端末側のMACアドレスで正規表現を組み合わせるというあまり普段考えない方法を試すことができました。
この正規表現での認可ルールの表現というのは、新しい ISE3.0 独自の内容ということはないので、皆さんお手持ちのISEでお試しください。