English / Japanese
EOS は 802.1X 認証機能に対応していません。 そこで我々は EOS に 802.1X 認証機能を追加するソフトウェアを開発し、これをスイッチエンジニアが簡単にインストールし、利用できる Extension パッケージとしてまとめました。
この文書では我々が作成した 802.1X suite for EOS のインストールとセットアップについて説明します。
注意: 2011年3月現在、このソフトウェアはベータ版です。 動作上の不具合に起因する問題について制作者は一切の責任を負わないものとします。
Kenta Mukai, Yutaka Yasuda
Arista Square
10/Dec/2012 : 5. ソースからの再ビルド を追加。あなた自身の EOS バージョンに合わせてリビルドできます。
30/Mar/2011 : 最初のβリリース。EOS 4.5.1 に対応。
1. 概要
1.1 構成・動作環境
1.2 機能
1.3 ソフトウェア構成
1.4 パッケージ内容
2. インストール
2.1 パッケージのインストール
3. 運用
3.1 設定
3.2 起動
3.3 終了
3.4 ログ管理
3.5 トラブルシューティング
4. アンインストール
5. ソースからの再ビルド
802.1X 認証は図1に示すように Authenticator, Authentication Server, Supplicants の三つの要素から構成される。
典型的な認証処理は以下のようなステップで行われる。
通信の許可・遮断はスイッチが行うのが合理的であるため、Authenticator の機能は普通スイッチに実装される。つまり初期的にはスイッチは Supplicant が接続されているポートは他のポートとの通信ができない孤立した状態に設定され、認証が成功すれば他のポートとの通信を開けるように振る舞う。
ところで 802.1X はポートベースのアクセス管理を行うために規定されているが、利用者の環境によっては 802.1X 対応のスイッチのポート一つを、必ずしも一台のマシンで占有するとは限らない。 そこで複数の利用者がポートを共有している(port sharing と呼ばれる)状況でも 802.1X プロトコルによる認証の恩恵を受けるために、市場には 802.1X 規格を拡張して、ポートベースではなく MAC アドレスベースでのアクセス制御を行う製品が存在する。
802.1X は EAP と呼ばれるプロトコルを利用するが、これを有線 LAN(Ethernet)環境で利用するために EAPOL (EAP over LAN) プロトコルが規定されている。 EAPOL では宛先 MAC アドレスに特殊な値 01:80:C2:00:00:03 を設定する。 これは IEEE 802.1D で定められたブリッジ制御用のアドレスの一部であり、Spanning Tree などもこの領域を使って機能している。 しかし逆にこのアドレスはスイッチ(ブリッジ)制御用と見なされるため、802.1X 非対応のスイッチではスイッチ内で破棄してしまう。
これでは Supplicant が出した認証リクエストは上流にある802.1X 対応スイッチに届かないため、市場では 802.1X のポートシェアリングを実現するため、EAPOL パケットを上流(あるいは他ポート)にフォワードする事が可能なスイッチが存在する。 この機能は「802.1X パススルー」などと呼ばれており、ポートシェアリングを行う際にはAuthenticator と Supplicant 間を接続するスイッチにこの機能がある事を確認する必要がある。
我々の提供する 802.1X suite for EOS は図2. に示すような環境を実現する。
つまりこれは Arista のソフトウェア実行能力を最大限に活かした one box solution である。 具体的には Authenticator 以外に Authentication server および DHCP server も Arista の中で実行する。 このように必要なサービスを one box で処理することの効果として、次節に示す統合ログの提供などが可能になった。 もちろん不要であれば DHCP あるいは Radius サーバについてそれぞれ外部のものを利用するようにできるが、その場合は幾らか設定変更などの調整が必要となる点に注意されたい。
802.1X suite for EOS が提供する機能について簡単に列挙しておく。
802.1X suite for EOS が含んでいるソフトウェアの構成を図3.に示す。 次節に述べるパッケージのインストールによってこれらのソフトウェア群がインストールされると考えれば良い。
具体的なソフトウェアのバージョン、オリジナルソースの情報などについては次節で示すこととし、ここでは各コンポーネントの役割などについて説明する。 それぞれ図の右側から順に以下に示す。
インストールを容易にするために、802.1X suite for EOS は SWIX および RPM フォーマットのパッケージ形式で提供されている。 以下に必要となる 4 つのパッケージの内容を簡単に示す。 ソフトウェア群の構成については前節を参照のこと。
上記の RPM ファイルは EOS 4.5.1 のために作られた。 もしより新しい EOS にインストールしたい場合は、5. ソースからの再ビルド を参照されたい。
下記のパッケージをダウンロードして、USB メモリドライブに入れる。 ファイル名は変更しても構わないが、拡張子はそのままにすること。
上記の RPM ファイルは EOS 4.5.1 のために作られた。 もしより新しい EOS にインストールしたい場合は、5. ソースからの再ビルド を参照されたい。
Extension パッケージの登録として CLI の copy コマンドを使った例を示す。 USB メモリドライブを Arista の USB ポートに接続した状態で、下記のように copy コマンドを実行して Extension として登録する。 以下に操作例を示すが、前節でダウンロードしたパッケージはいずれも USB メモリのトップディレクトリにあるものとする。
localhost#copy usb1:hostapd-0.7.3-EOS451.i686.rpm extension: localhost#
同じ方法で全ての Extension を登録する。
登録状態を show extensions コマンドによって確認できる。
Status が A, NI であることをチェック。
localhost#show extensions Name Version/Release Status RPMs ------------------------------------------ ------------------------- ------ ---- dhcp-4.1.1-18.P1.EOS451.i686.rpm 4.1.1/18.P1.EOS451 A, NI 1 freeradius.EOS451.swix 2.1.9/EOS451 A, NI 2 hostapd-0.7.3-EOS451.i686.rpm 0.7.3/EOS451 A, NI 1 perl.EOS451.swix 5.10.0/82.fc12 A, NI 6 A: available | NA: not available | I: installed | NI: not installed | F: forced localhost#
これによって次回起動時には自動的に Extension が読み込まれる。 詳細な Extension の操作については Arista Square のドキュメント「Extensions」 を参照。
CLI の extension コマンドを使ってインストールを行う。 依存性があるため、インストール順に注意。
localhost#extension hostapd-0.7.3-EOS451.i686.rpm localhost#extension perl.EOS451.swix localhost#extension freeradius.EOS451.swix localhost#extension dhcp-4.1.1-18.P1.EOS451.i686.rpm localhost#
登録状態を show extensions コマンドによって確認できる。 Status が A, I になったことをチェック。
localhost#show extensions Name Version/Release Status RPMs ------------------------------------------ ------------------------- ------ ---- dhcp-4.1.1-18.P1.EOS451.i686.rpm 4.1.1/18.P1.EOS451 A, I 1 freeradius.EOS451.swix 2.1.9/EOS451 A, I 2 hostapd-0.7.3-EOS451.i686.rpm 0.7.3/EOS451 A, I 1 perl.EOS451.swix 5.10.0/82.fc12 A, I 6 A: available | NA: not available | I: installed | NI: not installed | F: forced localhost#
FreeRADIUS, dhcpd の設定項目などについては省略する。
元となったソフトウェアの資料を参照されたい。
ただし設定ファイルの位置が以下のパスに変えられている点に注意。
dhcpd: /persist/local/dhcp/
FreeRADIUS:/persist/local/raddb/
設定ファイルは /persist/local/etc/hostapd/settings.txt である。 まず典型的なファイルの内容を示し、主要な項目についてそれぞれ説明する。
bash-4.0# pwd /persist/local/etc/hostapd bash-4.0# cat settings.txt interfaces=et19 logger_syslog=2 logger_syslog_level=2 eap_reauth_period=3600 own_ip_addr=127.0.0.1 auth_server_addr=127.0.0.1 auth_server_port=1812 auth_server_shared_secret=xxxxxxx acct_server_addr=127.0.0.1 acct_server_port=1813 acct_server_shared_secret=xxxxxxx bash-4.0#
この設定ファイルは次節に説明する hostapd の起動時に /persist/local/etc/hostapd/conf ディレクトリ以下に展開され、それらを用いて hostapd が起動する。 逆に conf ディレクトリ以下のファイルは直接修正すべきでない。
FreeRADIUS, dhcpd を起動する。 現時点ではこれらは自動起動になっておらず、また起動するための CLI コマンドを用意していないため、EOS の bash から init スクリプトを用いて起動する。 次回システム再起動時にも同じ操作が必要である。 (近日中に対応予定。ベータテスター募集中。)
bash- 4.0# /etc/init.d/dhcpd start Starting dhcpd: bash- 4.0# bash- 4.0# /etc/init.d/radiusd start Starting RADIUS server: bash- 4.0#
hostapd を起動し、802.1X サービスを有効化する。 この操作には管理用の CLI コマンドが用意されているので、まず CLI のコンフィグレーションモードに移行し、続けて dot1x system-auth-control コマンドを実行する。 次回システム再起動時にも同じ操作が必要である。 (近日中に対応予定。ベータテスター募集中。)
localhost#configure localhost(config)# localhost(config)#dot1x system-auth-control Applying Mac Access-List: [ OK ] Starting hostapd_acl_worker Starting hostapd: [ OK ] localhost(config)#
FreeRADIUS, dhcpd については終了操作は特に用意していない。 停止させたければ起動時と同様に EOS の bash から init スクリプトを用いて行えばよい。
hostapd を終了し、802.1X サービスを無効化する。 起動時と同様に、まず CLI のコンフィグレーションモードに移行し、続けて no dot1x system-auth-control コマンドを実行する。
localhost(config)#no dot1x system-auth-control Stopping hostapd: [ OK ] Removing Mac Access-List: [ OK ] localhost(config)#
これによって対象となっていたポートの MAC ACL が全て破棄され、どのポートに対しても認証無しにアクセスできるようになる点に注意。
統合ログ表示スクリプトは hostapd と dhcpd のログを解析し、ユーザ名、MAC アドレス、IP アドレス、認証情報を紐付けた情報を出力する。 スクリプトは /persist/local/etc/hostapd/show_integrated_log.py にある。 Python で書かれており、引数なしで実行することによって下記のような出力を表示する。
bash-4.0# cd /persist/local/etc/hostapd bash-4.0# python show_integrated_log.py : dot1x: Mar 31 03:42:24 et18 john 00:09:6b:3f:ce:fe authenticated dot1x: Mar 31 03:42:54 et18 john 00:09:6b:3f:ce:fe 192.168.12.178 dot1x: Mar 31 03:44:44 et17 foo 00:1f:d0:ad:c7:e7 authenticated dot1x: Mar 31 03:45:04 et17 foo 00:1f:d0:ad:c7:e7 192.168.12.162 dot1x: Mar 31 03:47:49 et17 foo 00:1f:d0:ad:c7:e7 unauthenticated dot1x: Mar 31 03:48:26 et18 john 00:09:6b:3f:ce:fe unauthenticated bash-4.0#
各行はそれぞれイベントがある度に出力される。 以下にイベントの種類と出力フォーマットを示す。
なおオリジナルの hostapd では認証時のログには MAC アドレスと認証の成否しか出力されない。 このために認証時に ユーザ名とインタフェース名を付加したログを出力するよう変更を加えている。
既に判っている典型的な問題についてまとめておく。
仮想化システムのゲストOSに Supplicant の役割をさせた場合、Supplicant ソフトウェアが正しく動作しない場合が確認された。 原因は仮想化システムに利用される Virtual Switch が図4.に示すように EAPOL のスイッチ制御パケットを全ポートにフォワーディングしてしまうことにある。
wpa_supplicant を含めて、ある種の Supplicant ソフトウェアは他ホストからの、あるいは他のホスト向けの EAPOL パケットを受け取ると動作がおかしくなる場合がある。 対策としては、仮想スイッチに対して ebtables などを用いたフィルタリングを設定し、EAPOL パケットは特定のポート、つまり上流スイッチに接続されたポート以外にはフォワードしないように設定すれば良い。
以下に ebtables による設定例を示す。0x888E は EAPOL のプロトコルタイプ、eth1 はホストサーバの NIC に対応する。
$ ebtables -A FORWARD -p 0x888E -i eth1 -j ACCEPT $ ebtables -A FORWARD -p 0x888E -o eth1 -j ACCEPT $ ebtables -A FORWARD -p 0x888E -j DROP
なお従来 Linux のブリッジにおいては EAPOL を含めたスイッチ制御パケットは一切フォワードしない仕様だった。(つまり802.1X 認証はゲストOSからは一切出来なかった)
しかし KVM のゲストOSから 802.1X 認証を利用したい、というリクエストを聞いて、David Miller が2010年10月21日にカーネルに対して全てのスイッチコントロールパケットを転送するように修正を加えた。
このため現在の最新カーネルはこの問題の対策が必要と思われる。
技術的な問い合わせは yasuda [ at ] ylb.jp まで。
CLI の no extension コマンドを使ってアンインストールする。 依存性があるため、アンインストール順に注意。
localhost#no extension dhcp-4.1.1-18.P1.EOS451.i686.rpm localhost#no extension hostapd-0.7.3-EOS451.i686.rpm localhost#no extension freeradius.EOS451.swix localhost#
perl は依存関係のために正常にアンインストールできない。
localhost#no extension perl.EOS451.swix % Error uninstalling extension: RPM uninstall error: Transaction check failed: perl(Data::Dumper) is needed by (installed) net-snmp-utils-1:5.5-7.99.Ar.i686 perl(Fcntl) is needed by (installed) i2c-tools-3.0.2-4.fc12.i686 perl(File::Copy) is needed by (installed) net-snmp-utils-1:5.5-7.99.Ar.i686 perl(Getopt::Std) is needed by (installed) net-snmp-utils-1:5.5-7.99.Ar.i686 perl(IO::File) is needed by (installed) net-snmp-utils-1:5.5-7.99.Ar.i686 perl(POSIX) is needed by (installed) i2c-tools-3.0.2-4.fc12.i686 perl(POSIX) is needed by (installed) i2c-tools-3.0.2-4.fc12.i686 perl(Term::ReadLine) is needed by (installed) net-snmp-utils-1:5.5-7.99.Ar.i686 perl(constant) is needed by (installed) i2c-tools-3.0.2-4.fc12.i686 perl(strict) is needed by (installed) i2c-tools-3.0.2-4.fc12.i686 perl(vars) is needed by (installed) i2c-tools-3.0.2-4.fc12.i686 perl >= 0:5.004 is needed by (installed) i2c-tools-3.0.2-4.fc12.i686 /usr/bin/perl is needed by (installed) i2c-tools-3.0.2-4.fc12.i686 /usr/bin/perl is needed by (installed) net-snmp-utils-1:5.5-7.99.Ar.i686 localhost#
登録状態を show extensions コマンドによって確認できる。 Status が A, NI になっておれば良い。 (perl については I のまま)
localhost#show extensions Name Version/Release Status RPMs ------------------------------------------ ------------------------- ------ ---- dhcp-4.1.1-18.P1.EOS451.i686.rpm 4.1.1/18.P1.EOS451 A, NI 1 freeradius.EOS451.swix 2.1.9/EOS451 A, NI 2 hostapd-0.7.3-EOS451.i686.rpm 0.7.3/EOS451 A, NI 1 perl.EOS451.swix 5.10.0/82.fc12 A, I 6 A: available | NA: not available | I: installed | NI: not installed | F: forced localhost#
Extension パッケージの削除は CLI の delete コマンドによって行う。
localhost#delete extension:hostapd-0.7.3-EOS451.i686.rpm localhost#
同じ方法で全ての Extension を削除する。
show extensions で状態を確認すると以下のようになっているだろう。
localhost#show extensions No extensions are available localhost#
これで次回起動時に自動的に Extension が読み込まれる事はない。 詳細な Extension の操作については Arista Square のドキュメント「Extensions」 を参照。
上に記した RPM ファイルはすべて EOS 4.5.1 のために作られたものである。 より新しい EOS にインストールしたい場合は、以下の記述に従ってパッケージ群を再構成すれば良い。 我々は EOS 4.5.1 のベースバージョンであった Fedora 12 環境を PC 上に構築し、そこでビルドした。
必要なソースは SRPM 形式で以下に置かれている。
Perl については EOS 向けの加工は何も無いので、一般的な perl パッケージをそのままインストールすれば良い。
SRPM ファイルを展開する。これらの作業は PC 上で行っている。(Arista の上で行ったのではない)
$ rpm -ivh dhcp-4.1.1-18.P1.EOS451.src.rpm 1:dhcp ########################################### [100%] $ rpm -ivh freeradius-2.1.9-EOS451.src.rpm 1:freeradius ########################################### [100%] $ rpm -ivh hostapd-0.7.3-EOS451.src.rpm 1:hostapd ########################################### [100%] $
すると、ソースコードとパッチファイルがrpm/SOURCES/に、スペックファイルがrpm/SPECS/に展開される。
$ ls rpm/ SOURCES SPECS $
rpmbuildコマンドを使って再ビルドを行う。
$ rpmbuild -bb rpm/SPECS/dhcp.spec : 書き込み完了: /home/kenta/rpm/RPMS/i686/dhcp-4.1.1-18.P1.EOS451.i686.rpm : $ $ rpmbuild -bb rpm/SPECS/freeradius.spec : 書き込み完了: /home/kenta/rpm/RPMS/i686/freeradius-2.1.9-EOS451.i686.rpm : $ $ rpmbuild -bb rpm/SPECS/hostapd-0.7.3.spec : 書き込み完了: /home/kenta/rpm/RPMS/i686/hostapd-0.7.3-EOS451.i686.rpm : $
rpm/RPMS/i686/ 以下に作成された rpm ファイルが確認できるだろう。
$ ls rpm/RPMS/i686/ dhclient-4.1.1-18.P1.EOS451.i686.rpm freeradius-mysql-2.1.9-EOS451.i686.rpm dhcp-4.1.1-18.P1.EOS451.i686.rpm freeradius-perl-2.1.9-EOS451.i686.rpm dhcp-debuginfo-4.1.1-18.P1.EOS451.i686.rpm freeradius-postgresql-2.1.9-EOS451.i686.rpm dhcp-devel-4.1.1-18.P1.EOS451.i686.rpm freeradius-python-2.1.9-EOS451.i686.rpm freeradius-2.1.9-EOS451.i686.rpm freeradius-unixODBC-2.1.9-EOS451.i686.rpm freeradius-debuginfo-2.1.9-EOS451.i686.rpm freeradius-utils-2.1.9-EOS451.i686.rpm freeradius-krb5-2.1.9-EOS451.i686.rpm hostapd-0.7.3-EOS451.i686.rpm freeradius-ldap-2.1.9-EOS451.i686.rpm hostapd-debuginfo-0.7.3-EOS451.i686.rpm $
FreeRADIUS は perl と libtool-ltdl-2.2.6-15.fc12.i686.rpm に依存している。 Arista の Extension としてインストールするために、これらを含めて EOS の SWIX フォーマットにアーカイブする。 また、perl についても(インストール操作を簡単にするために)必要なモジュールをひとつの SWIX ファイルにアーカイブする。 なお、以下の作業は Arista / EOS で行う。
locahost#swix create freeradius.eos4.5.1.swix \ > freeradius-2.1.9-EOS451.i686.rpm \ > libtool-ltdl-2.2.6-15.fc12.i686.rpm adding: manifest.txt (stored 0%) adding: freeradius-2.1.9-EOS451.i686.rpm (stored 0%) adding: libtool-ltdl-2.2.6-15.fc12.i686.rpm (stored 0%) locahost# locahost#swix create perl.eos4.5.1.swix \ > perl-5.10.0-82.fc12.i686.rpm \ > perl-Module-Pluggable-3.90-82.fc12.i686.rpm \ > perl-Pod-Escapes-1.04-82.fc12.i686.rpm \ > perl-Pod-Simple-3.07-82.fc12.i686.rpm \ > perl-libs-5.10.0-82.fc12.i686.rpm \ > perl-version-0.82-1.fc12.i686.rpm adding: manifest.txt (stored 0%) adding: perl-5.10.0-82.fc12.i686.rpm (stored 0%) adding: perl-Module-Pluggable-3.90-82.fc12.i686.rpm (stored 0%) adding: perl-Pod-Escapes-1.04-82.fc12.i686.rpm (stored 0%) adding: perl-Pod-Simple-3.07-82.fc12.i686.rpm (stored 0%) adding: perl-libs-5.10.0-82.fc12.i686.rpm (stored 0%) adding: perl-version-0.82-1.fc12.i686.rpm (stored 0%) locahost#
これで、2.1 パッケージのインストール に示した手順でインストール可能な RPM および SWIX パッケージが用意できた。