Mac OS X Server をRADIUSサーバとしてAirMacでWPA/WPA2エンタープライズネットワークを構築する


# 無線ネットワークのセキュリティ上の問題点
個人宅などはもちろんのこと、スモールオフィスでもWiFiを使っている方は多いと思います。ですが、WiFiの電波はオフィス外にも届いてしまうことが多く、セキュリティ的な心配があります。

- SSIDを見えなくする
- MACアドレス登録制にする

などの対策をしている方もいるかもしれませんが、実はこれらの対策はほとんど効果がありません。

SSIDがブロードキャストされないようにしても、ちょっとしたツールを使えば簡単に見つけられてしまいます。また、WiFiを暗号化してもMACアドレスは暗号化されていないので、空を飛んでる電波をキャッチすれば、どんなMACアドレスで通信しているかはすぐにわかってしまいます。ツールを使えばPCのMACアドレスを偽装することは容易なので、MACアドレスによるフィルタリングは簡単に突破されてしまいます。

となると、根本的にはWiFi接続パスワードに長く無意味な文字列を設定するなどして、他人に盗まれないように厳重に管理するしかありません。ところが、人員の出入りが多い環境だと、アクセス権を与えたくないひとがあらわれるたびにパスワードを変える必要があり、その都度何十台もの端末のWiFi設定をやりなおす必要が出てきてしまいます。

本記事では、WiFiへの接続をユーザごとに個別に管理する方法をご紹介します。

# WPAパーソナルと WPAエンタープライズ
WiFiのセキュリティ方式には WEP や WPA といったものがあります。WEPはかなり古い規格で、セキュリティ的にも危ないという認知はだいぶ広がってきているので、多くの方はWPAを使っていると思います。

ところで、このWPAには「WPAパーソナル」と「WPAエンタープライズ」というのがあるのですが、多くの方はよくわからないままWPAパーソナルを選んでいるのではと思います。

WPAパーソナルというのは皆さんが普段使っている接続方式で、SSIDに対して共通のパスワードを設定して接続する方式のことを指します(普通の接続方式ですね)。ほとんどの人はこれで用が足りるので、家庭用のWiFiルータなどの中には WPAパーソナルしかサポートしていないものも多いとおもいます。

一方、ある程の人数が増えてくると冒頭に書いたようなセキュリティ上の懸念が強くなり、共通パスワードでWiFiに接続する方式は限界を迎えます。そこで登場するのが「WPAエンタープライズ」です。

## WPAエンタープライズとは
WPAエンタープライズは、共通のパスワードではなく、証明書や、利用者ごとのIDとパスワードを使ってWiFi接続を認証する方式です。

ネットワーク利用者の認証はIEEE 802.1X(あいとりぷるいー はちまるに てん いちえっくす。以下802.1X)を使って行われます。実は、ネットワーク接続のセキュリティの問題というのは、WiFiだけでなく有線接続でもおこります。たとえば、オフィスの床に配線されているEthernetケーブルにこっそりPCを接続されてしまうと、簡単に社内ネットワークに侵入できてしまいます。このような問題に対処するためにネットワークに接続されたユーザを認識するための仕組みとして考えられた規格が 802.1Xです。

WPAエンタープライズは、この802.1Xによる認証を WiFi接続認証に取り入れたもの、といえます。

なお、802.1Xの詳細は[こちらのブログ](http://y2web.net/blog/computer/sysadmin/iee8021x-276/)などの解説が詳しいのでそちらをご覧ください。

# AirMacを使った WPAエンタープライズネットワークの概要

細かいことを言うと様々な構築方法があるのですが、今回は、

- クライアント
	- iPhone, Android, Mac, Windows(7以降)
- 無線LANブリッジ
	- AirMac Extreme
	- インターネット接続自体は別のルーターで行っていて、単なる無線LANブリッジとして使用
- 認証サーバ
	- OS X Server (Yosemite, El Capitan)
		- オープンディレクトリサーバとして稼働中
- 認証方式
	- EAP-PEAP
		- クライアント側でユーザIDとパスワードを入力させる方法

という構成で説明します。なお、私の環境では OS X Serverはオープンディレクトリサーバとして構築していますが、そうでなくても大丈夫なはずです。

以下にこの構成でWPAエンタープライズネットワークを構築する方法を解説します。

# Step1. OS X Serverを RADIUSサーバとして設定する

WiFiネットワークを構築するのはAirMacなのですが、AirMac自体がユーザ認証を行うわけではなく、OS X Serverにその検証を委譲します。このとき、AirMacとOS X Serverの間はRADIUSプロトコルというプロトコルで認証情報がやりとりされます。そのため、まずは、OS X ServerをRADIUSサーバとしてセットアップし、AirMacからの認証要求に応えられるようにする必要があります。

[Appleの公式サポート](https://support.apple.com/ja-jp/HT202552)によると、OS X Serverには最初からRADIUSサーバ機能が組み込まれていますが、単独のサービスとしては存在せず、AirMacとの接続に特化した形で提供されるとあります。

このサポート情報によると、LAN内にAirMacがあれば自動的に検出されて、Server.appのサイドバーにAirMacの設定メニューが現れるとあります。ところが、僕の環境では一度もその項目を見たことがありません。

![スクリーンショット 2015-03-11 9.02.50.png](https://qiita-image-store.s3.amazonaws.com/0/41616/d37ed5d3-15be-2a34-1d19-cb809e7de115.png "スクリーンショット 2015-03-11 9.02.50.png")

まだ原因が掴めていないのですが、もしかすると AirMacをインターネットルーターとしてセットアップしている場合にしか出てこないのかもしれません。このような場合は、コマンドラインから手動でRADIUSサーバを有効にする必要があります。

以下の手順ではコマンドラインを使ってRADIUSサーバを設定します。

## 証明書のインストール

RADIUSサーバには証明書が必要となりますので、まずそれをインストールします。証明書がどうつかわれるかについては[こちらのブログ](http://y2web.net/blog/computer/sysadmin/iee8021x-2-278/)を参照してください。

RADIUSサーバ専用の証明書を発行してもいいですが、OS X Serverがデフォルトで持っている証明書を使ってしまうこともできます。これは Server.appの左のサイドパネルの「証明書」というところを開くと確認できます。この証明書の実体は、```/etc/certificates/```の下にあります。

lsコマンド等で見てみると、以下のようなファイルが見つかると思います。

```
/etc/certificates/server.example.com.D4B81DCA0B58E9E949842A2214242E5BB8B163F9.key.pem
/etc/certificates/server.example.com.D4B81DCA0B58E9E949842A2214242E5BB8B163F9.cert.pem
/etc/certificates/server.example.com.D4B81DCA0B58E9E949842A2214242E5BB8B163F9.chain.pem
```

これを radiusconfigコマンドでインストールします。(ファイル名は環境ごとに違うので、みなさんの証明書の名前におきかえてください)

```
> sudo radiusconfig -installcerts /etc/certificates/server.example.com.D4B81DCA0B58E9E949842A2214242E5BB8B163F9.key.pem /etc/certificates/server.example.com.D4B81DCA0B58E9E949842A2214242E5BB8B163F9.cert.pem /etc/certificates/server.example.com.D4B81DCA0B58E9E949842A2214242E5BB8B163F9.chain.pem
```
※ 長いですが1行のコマンドです
※ 各ファイルは絶対パスで与える必要があります

## 証明書のパスワードを設定

```radiusconfig -setcertpassword```を使って、この証明書を使うためのパスワードをRADIUSサーバに教える必要があります。

```
> sudo radiusconfig -setcertpassword
Enter Certificate Passphrase:
```

プロンプトが表示されたら、```Apple:UseCertAdmin``` と入力します。これがパスワード(パスフレーズ)になっているようです(詳細不明。[参考サイト](https://discussionsjapan.apple.com/thread/10119913?tstart=0))。

## RADIUSサーバの起動
```
> sudo radiusconfig -start                                                                                                                                                           
```
でRADIUSサーバが起動します。psコマンドで、radiusdがいることを確認しましょう。

```
> ps auxww | grep radius
root            10149   0.0  0.0  2510320   6256   ??  Us    9:57AM   0:00.23 /Applications/Server.app/Contents/ServerRoot/usr/sbin/radiusd -sf
```

## AirMacをRADIUSクライアントとして登録
このRADIUSサーバをAirMacから使えるようにするためには、AirMacをクライアントとして登録する必要があります。そのためには AirMacのIPアドレスを固定する必要があるのでご注意ください。AirMac自体のIPアドレスをDHCPで設定している場合は、あらかじめ固定IPに変更しておいてください。

以下、AirMacのIPアドレスが192.168.0.2の場合の例です。

```
> sudo radiusconfig -addclient 192.168.0.2 my_airmac other
Enter shared secret:<共有シークレットを考えて入力>
192.168.0.2 added to the nas list
```

コマンドを入力すると、共有シークレット(パスワード)を入力するように促されますので、ランダムなパスワードを生成して入力して下さい。この共有シークレットはあとでAirMacの設定をするときに必要になります。なお、このパスワードを簡単なものにしてしまうとセキュリティ上のリスクが上がるので、設定には十分ご注意ください。

うまく登録できているかどうかは ```radiusconfig -naslist``` で確認できます。

```
> sudo radiusconfig -naslist
client 192.168.0.2 {
        secret = 12345678  (※実環境ではもっと難しいものにしてください)
        shortname = my_airmac
        type = other
};
```

## RADIUSサーバの再起動

radiusconfigの -startと-stopでRADIUSサーバを再起動することができます。念のため一度再起動させておきましょう。

```
> sudo radiusconfig -stop
> sudo radiusconfig -start
```

## デバッグログ出力を強化する
RADIUSサーバの動作状況を細かくデバッグしたい場合は、以下のコマンドを実行すると、ログに細かな内容が出力されるようになります。

```
> sudo radiusconfig -setconfig auth yes
> sudo radiusconfig -setconfig auth_badpass yes
> sudo radiusconfig -setconfig auth_goodpass yes
```

設定を変えたら一度RADIUSサーバを再起動したほうが良いかもしれません。

動作ログは、```/var/log/radius/radius.log``` に出力されます。

# Step2. アクセス制御
## com.apple.radius_accessグループの作成
RADIUS認証でWiFiネットワークに接続できるユーザを限定するためには、OS X Server側に com.apple.access_radius というシステムグループを作る必要があります。Server.appでは作れないので、OS X Server上でディレクトリユーティリティを使います。

このアプリを起動して以下のように表示を「Groups」としてグループ一覧を表示します。なお、OS X Serverをオープンディレクトリサーバとして設定している場合、「ノード」には「/Local/Defaults」と「/LDAPv3/127.0.0.1」が選べるのでLDAPの方を選びます。

左下の+ボタンを押し、右下のフィールドに ```com.apple.access_radius``` と入力して保存すればグループを作成できます。
![スクリーンショット 2015-03-10 16.21.00.png](https://qiita-image-store.s3.amazonaws.com/0/41616/92f26224-8c14-48ac-db2b-83c2cbd78034.png "スクリーンショット 2015-03-10 16.21.00.png")

グループをディレクトリサーバ上(LDAP上)に作っておけば、オープンディレクトリのスレーブノードをRADIUSのセカンダリサーバーとして設定するときに、グループも共有できて便利です。OS X Serverを冗長化していない場合はローカルに作成しても大丈夫です。

## 接続可能なユーザを限定する
グループを作成したら、Server.appに戻ります。「グループ」を表示すると「com.apple.access_ldap」が増えているはずなのでそれを開きます。見えない場合は Server.appの「表示」メニューからシステムアカウントを表示するようにしてみてください。

com.apple.access_ldapが開けたら、接続許可を与えたいユーザやグループを追加します。なお、保存時にグループの「フルネーム」を設定する必要があるので、認識しやすい名前を設定してください(ex. "RADIUS Access Users"など)。

以上でOS X Server側の設定は完了です。

# Step3. AirMacの設定を変更し、WPAエンタープライズネットワークを構築する
ここからはAirMac側の設定になります。

## ワイヤレスセキュリティをWPAエンタープライズに変更する
AirMacの設定はAirMacユーティリティーを使用します。以下のように、「ワイヤレスセキュリティ」をWPAパーソナルから「WPA/WPA2エンタープライズ」に変更します。WPA2しか使わない場合は「WPA2エンタープライズ」でも構いません。
![スクリーンショット 2015-03-10 16.07.07.png](https://qiita-image-store.s3.amazonaws.com/0/41616/0a7b1de3-d265-2dc0-1cbc-6c335f487ac0.png "スクリーンショット 2015-03-10 16.07.07.png")

つぎに、「RADIUSを構成...」ボタンを押し、RADIUSサーバの情報を入力します。このキャプチャは RADIUSサーバとして設定した OS X Serverが 192.168.0.10である場合の設定例です。

![スクリーンショット 2015-03-10 16.07.40.png](https://qiita-image-store.s3.amazonaws.com/0/41616/43f78daf-39e5-ba73-9034-18f716d57183.png "スクリーンショット 2015-03-10 16.07.40.png")

これで保存し、「アップデート」を実行すると AirMacが再起動して、WPAエンタープライズネットワークが構築されます。

なお、OS X Serverを冗長化している場合は、スレーブサーバにもRADIUSサーバをセットアップし、この画面でセカンダリのRADIUSサーバとして指定することもできます。

# Step4. 端末をWPAエンタープライズネットワークに接続する
## iPhone, Macの接続

作成された無線ネットワークに接続しようとすると、共通パスワードではなく、ユーザIDとパスワードを入力するように求められます。

![スクリーンショット 2015-03-10 16.13.51.png](https://qiita-image-store.s3.amazonaws.com/0/41616/ca5dbf92-3e03-4909-4681-7b728a154beb.png "スクリーンショット 2015-03-10 16.13.51.png")

アクセス許可を与えたユーザのIDとパスワードを入力して、WiFiに接続できることを確認してください。

## Androidの接続
手元にあった Xperia Z2(SOL-25、Android 4.4.2)で接続してみましたが、問題なく接続できました。他の機種や、Androidの古いバージョンで接続できるかどうかはわかりません。

## Windows 7、8の接続
Windowsでこのワイヤレスネットワークに接続しようとすると、ユーザIDとパスワードを入れた後にエラーになってしまいます。原因は、最初に設定した OS X サーバの証明書が自己署名証明書なので、Windows側がサーバを正しく信頼できないためです。

そこで、以下のようにしてサーバ証明書の検証をスキップさせます。

- コントロールパネルの「ネットワークと共有センター」から「ワイヤレスネットワークの管理」を選びます
	- Windows8には「ワイヤレスネットワークの管理」がないので、「新しい接続またはネットワークのセットアップ」をクリックして「新しいワイヤレスネットワークへの接続」を選んでください

![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/41616/18593346-0a8c-765f-5eb4-b2cdd6ce27ad.png "無題3.png")

- 「追加」ボタンを押します

![無題4.png](https://qiita-image-store.s3.amazonaws.com/0/41616/20afde83-6304-ca97-5a73-7e72bef329fc.png "無題4.png")

- 「ネットワークプロファイルを手動で作成します」を選びます

![無題5.png](https://qiita-image-store.s3.amazonaws.com/0/41616/7023ff03-eea3-cfa3-8637-cec110b275b9.png "無題5.png")

- SSIDを手動で入力し、「WPA2エンタープライズ」を選択します
	- 暗号化の種類は「AES」でOKです

![無題6.png](https://qiita-image-store.s3.amazonaws.com/0/41616/ce017987-33b8-f385-dd8f-9f79a76578e8.png "無題6.png")

- 「次へ」を押し、さらにプロパティを開いて詳細設定を行います
- 以下の画面で「設定」を押します

![無題8.png](https://qiita-image-store.s3.amazonaws.com/0/41616/d14bb3eb-4bfb-bbff-a196-5f0018376bca.png "無題8.png")

- 「サーバの証明書を検証する」のチェックを外します

![無題9.png](https://qiita-image-store.s3.amazonaws.com/0/41616/65f20751-4f97-1061-99e0-a08d0ecf51c4.png "無題9.png")

- さらに「構成...」ボタンを押し、MSCHAPv2のプロパティ画面のチェックを外し、Windowsのログオン名とパスワードを使わないようにします

![無題10.png](https://qiita-image-store.s3.amazonaws.com/0/41616/afe94c65-3a7b-f0c1-32a1-eac5d2d1061c.png "無題10.png")

- OKを２回押して前の画面に戻り、今度は「詳細設定」を選びます
	- 802.1Xの設定で「認証モードを指定する」にチェックを入れ、「ユーザー認証」を選びます

![無題11.png](https://qiita-image-store.s3.amazonaws.com/0/41616/408ae419-89ff-222c-c623-0b1fb7596c65.png "無題11.png")

以上で完了です。設定を保存した後、このWiFiに接続しようとすると、以下のようにユーザーIDとパスワードの入力を求められるので、入力すれば接続できるはずです。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/41616/59bc3bd3-236e-dcb5-1faa-319c82e48406.png "無題.png")

最近はSSL証明書なども安く手に入るので、公的な機関で署名された証明書を用意しても構いません。Windowsユーザーが多い環境の場合はそのほうがスムーズかもしれません。ただし、僕の方ではそこまで試していませんので詳細は不明です。

## Windows XPの接続
Windows XPを接続する場合はさらに別の罠があるようです。僕は試していませんが、詳しくは[こちらのサイト](http://y2web.net/blog/computer/sysadmin/winxp-std-supplicant-324/)などを参考にしてください。

# 最後に
この手順で WPAエンタープライズネットワークの構築ができますが、個人のパスワード管理がずさんだとセキュリティリスクはかえって高まってしまいます。OS X Serverのパスワードポリシーを強化して、パスワードには必ず英数字記号が含まれるようにするといった検討もしたほうが良いでしょう。

一方、WPAエンタープライズにすると、RADIUSの認証ログを残すことでいつだれのIDでWiFiに接続されたのかを監視することができるようになります。何らかの不正アクセスがあった場合の手がかりとしても有用ですし、ログを取得していることを利用者に知らせることで安易に端末を接続させないための心理的なプレッシャーを与えることもできます。

また、今回は使っていませんが WPAエンタープライズには EAP-PEAP ではなく EAP-TLSという認証方法もあります。こちらを使うと、事前にクライアント証明書をインストールしてある端末しか接続できなくすることができます。セキュリティ的には非常に強固ですが、証明書を管理する手間がかかるので、運用は面倒になります。社員の端末を一元管理する仕組みの導入とセットで行うのが現実的かもしれません。