FreeRADIUSとOpenSSLで構築する802.1X認証サーバ

以下のテキストは、執筆時当時の情報を元に書いたものであり、 現在の情勢にそぐわないことを含む場合があるので注意されたい。 また、テキストは最終提出原稿で校正を経る前のものなので、実際にUNIXUSER 本誌に記載されたものとは異なる。誤字脱字等そのままである。

致命的な誤り以外は加筆修正等は行なわないので情報の鮮度に気をつけつつ 利用して欲しい。

目次


======================================================================
■■■ Part 3  FreeRADIUSとOpenSSLで構築する802.1X認証サーバ
======================================================================

■
■ SSIDやMACアドレスによるアクセス制限の問題点
■

総務省による「国民のための情報セキュリティサイト」
http://www.soumu.go.jp/joho_tsusin/security/index.htm
をご存じだろうか。政府がインターネット利用に関する注意情報を広報している
のは時代の移り変わりを感ずる。さてこの中で、

	「情報管理担当者のための情報セキュリティ対策」
		↓
	「無線LANの危険性」

というリンクを辿ると無線LAN運用時の注意が書いてある。おそらくここに書い
てあるものが2004年現在の無線LANに関するセキュリティ意識の一般的な水準を
示しているのではないだろうか。

SSIDを推測されにくいものにし、接続可能な無線LANアダプタのMACアドレスを制
限することはもはや最低限の防御設定であるのはいうまでもない。しかし、それ
で十分ではない。

SSIDはそもそも通信相手を識別するためのものであって、それ自身秘密として扱
われるものではない。たとえば、一般ユーザの利用しているWindows端末のネッ
トワークプロパティを見れば、誰でも容易にSSIDを確認できる。また、アクセス
ポイント側にSSIDの隠蔽機能がない(もしくは有効化していない)場合は、無線
LANカードの持つスキャン機能により利用可能なSSID一覧が得られる。

また、MACアドレスによるフィルタリングでは、確かにアクセスポイントとの
「双方向通信」は拒否できるものの「傍受」は防止できない。もし、同一のSSID
が設定された無線LANカードからならパケットダンプを行なうことにより、アク
セス権を持つ無線LANカードとアクセスポイントのMACアドレスが簡単に分かって
しまう【図 を】。

---[図 を]------------------------------------------------------------
 image: ethereal.png
 Ethernet Frame には双方のMACアドレスが記録される。
----------------------------------------------------------------------

MACアドレスを手動で更新できる方法も存在するため、悪意ある者であればしば
らくパケットを傍受して、通信許可の与えられているMACアドレスと同一のもの
を付与してLANに接続することも技術的には可能である。

では、WEPはどうだろう。残念ながら、WEPによる暗号化通信は十分に短い時間の
パケット観察により鍵を捜し当てられてしまうことが知られている。

■
■ 802.1Xとは
■

802.1Xは、接続ポートベースで通信の可否をコントロールするプロトコルである
【図 を】。


---[図 を]------------------------------------------------------------
(http://www.open1x.org/ と同様の図)


  +--- Authentication --+
  |         Server      |  EAP(Extensible Authentication Protocol)
  |			|-------+
  +---------------------+       |
			     +--+-------------------+
			     |    Authenticator     |
			     |       (AP)	    |
			     |			    |
			     +-----||---------------+
				○ / ×
	+-------------+		  /
	| Supplicant  +----------/
	|	      |
	| 	      |
        +-------------+
	  PAE(Port Access Entity)
----------------------------------------------------------------------

802.1Xによる認証では、3つの基本個体が構成要件となる。

  - Authentication Server
	認証そのものを行なうサーバ。RADIUSが利用されることが多い。

  - Authenticator
	クライアント(Supplicant)からの認証手続を Authentication Server
	に問い合わせ、その結果に従いクライアントの接続されているポートを
	解放するかどうかを決定する。

  - Supplicant
	接続クライアントのネットワークインタフェースを通じて
	Authenticatorに認証依頼をする個体。


802.1Xの特徴としては、実際に接続を受ける機器が直接認証を受け持つのではな
く、外部の Authentication Server に委託することが挙げられる。これにより、
認証機構を置き換えることが容易になるほか、認証ポートを持つ機器をシンプル
にできる。コンシューマむけ無線LANのアクセスポイント(AP)のように安価な機
器にも実装しやすいのがメリットといえよう。

802.1X認証を有効化しているAPでは、クライアントからの接続を
"Uncontrolled Port" で受ける。Uncontrolled Port はEAPの通信のみが許可さ
れたもので、Authentication Server による認証を受けるまではこのポートでの
やりとりがなされる。認証完了後は "Controlled Port" での接続に移行し、全
ての通信が許可される。

■
■ さまざまな認証プロトコル
■

Authentication Server との認証プロトコルは EAP(Extensible Authentication
Protocol) といい、実際の認証方式をあとから拡張できるように設計されたもの
である。これにどのような認証方式を採用するかによっていくつかの組み合わせ
が考えられる。代表的なものとしては以下のものが挙げられる。

    EAP-MD5

	MD5を利用した Challenge-Response 方式の「ユーザ/パスワード」対の
	認証方式。パスワードの暗号化しか行なえない。つまりWEPキーの安全
	な自動配布などができない)ため認証後の通信内容の漏洩に関しては特
	別な効力を持たない。

    EAP-TLS

	TLS(Transport Layer Security)をサーバとクライアント相互の認証に
	使う(本稿ではこれを利用する)。

    EAP-PEAP
    EAP-TTLS

	サーバ認証にTLSを利用する。TLSで作成したトンネルを用いて認証を行
	なうのがPEAPとTTLS。PEAPはトンネル内でさらにEAPを利用する。TTLS 
	はトンネル化された経路でPAPやCHAPをも利用することができる。クラ
	イアント側の証明書を要しない点でEAP-TLSよりも管理コストが軽減さ
	れる。

相互に電子証明書による認証を必要とするEAP-TLSがセキュリティ的に最も強固
なので、これを利用するのが一番望ましいといえよう。しかし、これらの間には

	管理コストが低い         ←→	管理コストが高い
	セキュリティ強度が低い		セキュリティ強度が高い

というトレードオフがあるので、どの環境でどれがよいとは一概に言い切れない。
実際には802.1X認証のサーバ/クライアントとして利用するソフトウェアが共に
対応しているプロトコルを選ぶことになるだろう。そして今回は、PC-Unix上で
フリーソフトウェアを利用して構築することを目指しているので、認証サーバと
して利用する FreeRADIUS、Supplicantとして利用する XSupplicant ともに対応
しているEAP-TLSを利用する。


■
■ FreeRADIUS+XSupplicantによる802.1X認証環境
■

802.1Xの特徴のひとつである「認証サーバは独立した存在」という性質のおかげ
で、フリーソフトウェアによる認証サーバの構築が可能となっている。今回は
EAP-TLSに対応している FreeRADIUS を利用して、802.1Xの認証サーバを設置し
てみよう。

構成するネットワーク構成の概略は以下の図のようになる。


	〜〜上位ネットワーク〜〜
		|
		|
	+-------+---------------+
	| 無線LAN-AP		|
	| (Authenticator)	|
	|			|
	+-------+---------------+
		|192.168.11.1
		|                      LAN(192.168.11.0/24)
  ----+---------+---------------+-------------------------------------
      |				|
      |				|192.168.11.50
      |			 +------+-----------------+
      |			 | 認証サーバ(FreeRADIUS) |
      |			 | (Authentication Server)|
      |			 |			  |
      |192.168.11.22	 +------------------------+
   +------------------+
   | クライアント     |
   | 無線LAN          |
   | 接続端末	      |
   | (Supplicant)     |
   +------------------+



念のため筆者が検証に用いた環境の組み合わせを示しておく。

	【認証サーバ】
		OS:		NetBSD 2.0E
		RADIUS:		FreeRADIUS-0.9.3 + OpenSSL-0.9.7d
	【無線LAN-AP】
		ハードウェア:	WBR-G54
		ファームウェア:	Ver. 2.06
	【クライアント】
		OS:		Vine Linux 2.6r4 (Kernel 2.4.22-0v12.10)
		無線LANカード:	NEC WL54AG (Atherosチップ)
		Supplicant:	XSupplicant 0.8b




■
■ FreeRADIUS+OpenSSLの導入
■

まず認証サーバ側の設定を済ませておこう。FreeRADIUS の EAP-TLS モジュール
は OpenSSL を必要とするのでこれも同時に導入する必要がある。ここで注意が
必要なのだが、ほとんどのPC-UnixシステムではOSのデフォルト配布セットの中
にOpenSSL が含まれるようになっている。しかし、FreeRADIUSで利用する
OpenSSL ライブラリは0.9.7以上のものを要求する点、OpenSSLにたびたび不具合
が発見される点などを考慮すると、FreeRADIUSとセットでソースからインストー
ルするほうが管理上好都合であると考え、ここでは執筆時点の最新版である、

	* openssl-0.9.7d.tar.gz
	* freeradius-0.9.3.tar.gz

を同一のディレクトリ配下(/usr/local/1x)にインストールする例を示そう。も
し、作業に当たるときに、より新しいものが出ていたらそちらを利用するのが良
い。

●OpenSSL 0.9.7d の導入

  適当な作業ディレクトリに移動し http://www.openssl.org/source/ より最新
  リリース版の openssl のソースを取得する。

	ファイル名	openssl-0.9.7d.tar.gz
	ファイルサイズ	2798433バイト
	MD5値		1b49e90fc8a75c3a507c0a624529aca5

  prefixを /usr/local/1x に定めてインストールする手順は以下のようになる。

  % su
  # exec sh			(以下の作業例では全てshを想定)
  # tar zxpf openssl-0.9.7d.tar.gz
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # cd openssl-0.9.7d
    ~~~~~~~~~~~~~~~~~
  # less INSTALL
    ~~~~~~~~~~~~
  INSTALLファイルに config スクリプトに渡すオプションの意味が書かれてい
  るので、サイトの都合に合わせて必要なものを選択する。以下の例では共有ラ
    イブラリの作成と、prefix指定を行なっている。

  # ./config shared --prefix=/usr/local/1x

  実行時の共有ライブラリのパスが埋め込まれるよう、LD_RUN_PATH変数を定義
  してmakeする。

  # LD_RUN_PATH=/usr/local/1x/lib make all test install


●FreeRADIUS 0.9.3 の導入

  http://www.freeradius.org/ よりソースを入手する。

	ファイル名	freeradius-0.9.3.tar.gz
	ファイルサイズ	1819922バイト
	MD5値		36f33d9dd305a2c9f1089c30a9fff0b8

  prefixを /usr/local/1x に定めてインストールする手順は以下のようになる。

  # tar zxpf freeradius-0.9.3.tar.gz
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # cd freeradius-0.9.3
    ~~~~~~~~~~~~~~~~~~~

  先ほどインストールした OpenSSL 0.9.7d のヘッダファイル、ライブラリを優
  先的に参照するように、CFLAGS変数、LDFLAGS変数を定義して configure ス
  クリプトを起動する。これを忘れると、システムにインストールされている
  SSLライブラリを参照して、バージョン不整合によるコンパイルエラーが起き
  ることがある。

  # CFLAGS=-I/usr/local/1x \
    LDFLAGS='-L/usr/local/1x/lib -R/usr/local/1x/lib' \
    ./configure --prefix=/usr/local/1x

  # make all install

●証明書(certificate)の作成

  FreeRADIUSが利用する証明書を作成する。この作業に関しては
  http://www.freeradius.org/doc/EAPTLS.pdf
  http://www.impossiblereflex.com/8021x/eap-tls-HOWTO.htm 
  も参考にすると良いだろう。後に説明する実行例では後者のWebページにある
  証明書生成スクリプトを今回のインストールディレクトリに沿うように変更し
  たものを利用した。リスト【ろ、は、に】にこれらのスクリプトを示す。各ス
  クリプト中、初期パスワードとして "unixuser" を与えている部分があるが、
  これは適宜変更して欲しい。

--[コラム]---------------------------------------------------------------
公開鍵基盤を利用した認証の仕組みを全て理解するのは難しいが、証明書管理
をする上で混乱しないよう、最低限以下の点だけは把握しておこう。

1. 暗号化通信(あるいは認証)を行なう個体は公開鍵と秘密鍵の両方を持つ
2. 公開鍵の値は相手に知らせ、秘密鍵は誰にも知られないようにする
3. 公開鍵を用いて暗号化したものは秘密鍵を用いないと復号できない
4. 秘密鍵を用いて暗号化したものは公開鍵を用いないと復号できない
5. 3の性質を利用すると相手以外に知られたくない暗号文を送ることができる
6. 4の性質を利用すると記述した者が本人であることの証明が行なえる(電子署名)
7. 6のためには「鍵」が本当に信頼できるものであるとの保証を「認証局」にし
   てもらわなければならない

電子商取引などを目的としたSSL(TLS)通信に利用する鍵は、世界的に認知された
認証局で認証してもらわなければ信頼されず実用にならない。今回のようなロー
カルエリアで適用する証明書の場合は、管理者みずからが認証局(となる証明書)
を設置し各クライアントコンピュータにそれを「ルート証明書」としてインストー
ルすれば良い。
-------------------------------------------------------------------------
---[リスト ろ]--------------------------------------------------------
[[ CA.root ]]

#!/bin/sh
SSL=/usr/local/1x
export PATH=${SSL}/bin/:${SSL}/ssl/misc:${PATH}
export LD_LIBRARY_PATH=${SSL}/lib
# needed if you need to start from scratch otherwise the CA.pl -newca command doesn't copy the new
# private key into the CA directories
rm -rf demoCA
echo "*****************************************************************************"
echo "Creating self-signed private key and certificate"
echo "When prompted override the default value for the Common Name field"
echo "*****************************************************************************"
echo
# Generate a new self-signed certificate.
# After invocation, newreq.pem will contain a private key and certificate
# newreq.pem will be used in the next step
openssl req -new -x509 -keyout newreq.pem -out newreq.pem -passin pass:unixuser -passout pass:unixuser
echo "*****************************************************************************"
echo "Creating a new CA hierarchy (used later by the "ca" command) with the certificate"
echo "and private key created in the last step"
echo "*****************************************************************************"
echo
echo "newreq.pem" | CA.pl -newca >/dev/null
echo "*****************************************************************************"
echo "Creating ROOT CA"
echo "*****************************************************************************"
echo
# Create a PKCS#12 file, using the previously created CA certificate/key
# The certificate in demoCA/cacert.pem is the same as in newreq.pem. Instead of
# using "-in demoCA/cacert.pem" we could have used "-in newreq.pem" and then omitted
# the "-inkey newreq.pem" because newreq.pem contains both the private key and certificate
openssl pkcs12 -export -in demoCA/cacert.pem -inkey newreq.pem -out root.p12 -cacerts -passin pass:unixuser -passout pass:unixuser
# parse the PKCS#12 file just created and produce a PEM format certificate and key in root.pem
openssl pkcs12 -in root.p12 -out root.pem -passin pass:unixuser -passout pass:unixuser
# Convert root certificate from PEM format to DER format
openssl x509 -inform PEM -outform DER -in root.pem -out root.der
#Clean Up
rm -rf newreq.pem
----------------------------------------------------------------------

---[リスト は]--------------------------------------------------------
[[ CA.svr ]]

#!/bin/sh
SSL=/usr/local/1x
export PATH=${SSL}/bin/:${SSL}/ssl/misc:${PATH}
export LD_LIBRARY_PATH=${SSL}/lib
echo "*****************************************************************************"
echo "Creating server private key and certificate"
echo "When prompted enter the server name in the Common Name field."
echo "*****************************************************************************"
echo
# Request a new PKCS#10 certificate.
# First, newreq.pem will be overwritten with the new certificate request
openssl req -new -keyout newreq.pem -out newreq.pem -passin pass:unixuser -passout pass:unixuser
# Sign the certificate request. The policy is defined in the openssl.cnf file.
# The request generated in the previous step is specified with the -infiles option and
# the output is in newcert.pem
# The -extensions option is necessary to add the OID for the extended key for server authentication
openssl ca -policy policy_anything -out newcert.pem -passin pass:unixuser -key unixuser -extensions xpserver_ext -extfile xpextensions -infiles newreq.pem
# Create a PKCS#12 file from the new certificate and its private key found in newreq.pem
# and place in file specified on the command line
openssl pkcs12 -export -in newcert.pem -inkey newreq.pem -out $1.p12 -clcerts -passin pass:unixuser -passout pass:unixuser
# parse the PKCS#12 file just created and produce a PEM format certificate and key in certsrv.pem
openssl pkcs12 -in $1.p12 -out $1.pem -passin pass:unixuser -passout pass:unixuser
# Convert certificate from PEM format to DER format
openssl x509 -inform PEM -outform DER -in $1.pem -out $1.der
# Clean Up
rm -rf newert.pem newreq.pem
----------------------------------------------------------------------

---[リスト に]--------------------------------------------------------
[[ CA.clt ]]

#!/bin/sh
SSL=/usr/local/1x
export PATH=${SSL}/bin/:${SSL}/ssl/misc:${PATH}
export LD_LIBRARY_PATH=${SSL}/lib
echo "*****************************************************************************"
echo "Creating client private key and certificate"
echo "When prompted enter the client name in the Common Name field. This is the same"
echo " used as the Username in FreeRADIUS"
echo "*****************************************************************************"
echo
# Request a new PKCS#10 certificate.
# First, newreq.pem will be overwritten with the new certificate request
openssl req -new -keyout newreq.pem -out newreq.pem -passin pass:unixuser -passout pass:unixuser
# Sign the certificate request. The policy is defined in the openssl.cnf file.
# The request generated in the previous step is specified with the -infiles option and
# the output is in newcert.pem
# The -extensions option is necessary to add the OID for the extended key for client authentication
openssl ca -policy policy_anything -out newcert.pem -passin pass:unixuser -key unixuser -extensions xpclient_ext -extfile xpextensions -infiles newreq.pem
# Create a PKCS#12 file from the new certificate and its private key found in newreq.pem
# and place in file specified on the command line
openssl pkcs12 -export -in newcert.pem -inkey newreq.pem -out $1.p12 -clcerts -passin pass:unixuser -passout pass:unixuser
# parse the PKCS#12 file just created and produce a PEM format certificate and key in certclt.pem
openssl pkcs12 -in $1.p12 -out $1.pem -passin pass:unixuser -passout pass:unixuser
# Convert certificate from PEM format to DER format
openssl x509 -inform PEM -outform DER -in $1.pem -out $1.der
# clean up
rm -rf newcert newreq.pem
----------------------------------------------------------------------

  作成すべき証明書には以下の3つがある。

  1. ルート認証局の証明書(2,3の正当性を示すために必要)
  2. サーバホストの証明書
  3. 接続クライアントの証明書

  当然だが(1)を最初に作成し、(2)と(3)は新規に作成するだけでなく(1)による
  署名を行なう必要がある。ここでは、それぞれの個体名(Common Name)を

  1 = "UNIXUSER Authority"
  2 = "Server"
  3 = "Client"

  とし、それぞれの個体に応じた証明書を作成する手順を示す。

  (0) デフォルト項目の修正
  ------------------------
  これから3つの証明書を作るにあたり、新規証明書に埋め込む情報を繰り返し
  記入することになる。同様のものをその都度タイプするより、デフォルト項目
  をサイトに合ったものにしておく方がはるかに効率が良い。
  /usr/local/1x/ssl/openssl.cnf をリスト【い】を参考に修正しておくと以下
  の(1)〜(3)の作業がはかどるだろう。

---[リスト い]--------------------------------------------------------
【openssl.cnf の修正箇所の差分(unified diff)】

--- /usr/local/1x/ssl/openssl.cnf.dist	2004-04-29 18:01:04.000000000 +0900
+++ /usr/local/1x/ssl/openssl.cnf	2004-05-06 00:08:09.000000000 +0900
@@ -122,17 +122,18 @@
 
 [ req_distinguished_name ]
 countryName			= Country Name (2 letter code)
-countryName_default		= AU
+countryName_default		= JP
 countryName_min			= 2
 countryName_max			= 2
 
 stateOrProvinceName		= State or Province Name (full name)
-stateOrProvinceName_default	= Some-State
+stateOrProvinceName_default	= Yamagata
 
 localityName			= Locality Name (eg, city)
+localityName_default		= Sakata
 
 0.organizationName		= Organization Name (eg, company)
-0.organizationName_default	= Internet Widgits Pty Ltd
+0.organizationName_default	= UNIXUSER Readers
 
 # we can do this but it is not needed normally :-)
 #1.organizationName		= Second Organization Name (eg, company)
@@ -146,6 +147,7 @@
 
 emailAddress			= Email Address
 emailAddress_max		= 64
+emailAddress_default		= <管理者のメイルアドレス>
 
 # SET-ex3			= SET extension number 3
 
@@ -153,6 +155,7 @@
 challengePassword		= A challenge password
 challengePassword_min		= 4
 challengePassword_max		= 20
+challengePassword_default	= unixuser
 
 unstructuredName		= An optional company name
----------------------------------------------------------------------

  (1) ルート認証局の証明書の作成
  ------------------------------

  証明書を置くディレクトリを作成しそこに移動する。今回の場合は
  /usr/local/1x/etc/certs に置くことにしよう。証明書作成作業はこのディレ
  クトリで行なうものとする。

  # mkdir /usr/local/1x/etc/certs
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  リスト【い、ろ、は】の証明書作成用スクリプトもコピーしておく

  # cp CA.root CA.svr CA.clt /usr/local/1x/etc/certs
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # cd /usr/local/1x/etc/certs
    ~~~~~~~~~~~~~~~~~~~~~~~~~~

  リスト【ろ】に示したシェルスクリプトを起動し、ルート証明書を作成する。
  openssl.conf のデフォルト値を変えてあれば、ほとんどがそのままリターン
  キーを押せば良い。ただし、Common Name に自サイトに応じた適切な名前(今
  回の例では "UNIXUSER Authority")を入れることに注意。実行例【ほ】。

---[実行例 ほ]----------------------------------------------------------------
# ./CA.root
  ~~~~~~~~~
*****************************************************************************
Creating self-signed private key and certificate
When prompted override the default value for the Common Name field
*****************************************************************************

Generating a 1024 bit RSA private key
................++++++
.......++++++
writing new private key to 'newreq.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:
State or Province Name (full name) [Yamagata]:
Locality Name (eg, city) [Sakata]:
Organization Name (eg, company) [UNIXUSER Readers]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:UNIXUSER Authority
                               ~~~~~~~~~~~~~~~~~~
Email Address [<管理者のメイルアドレス>]:
*****************************************************************************
Creating a new CA hierarchy (used later by the ca command) with the certificate
and private key created in the last step
*****************************************************************************

*****************************************************************************
Creating ROOT CA
*****************************************************************************

MAC verified OK
------------------------------------------------------------------------------



  (2) サーバホスト証明書の作成
  ----------------------------

  リスト【と】の内容で xpextensions というファイルを作業ディレクトリに用
  意する。
---[リスト と]--------------------------------------------------------
[ xpclient_ext ]
extendedKeyUsage = 1.3.6.1.5.5.7.3.2

[ xpserver_ext ]
extendedKeyUsage = 1.3.6.1.5.5.7.3.1
----------------------------------------------------------------------

  CA.svr スクリプトを利用して作成する。スクリプトの引数に保存ファイルの
  ベース名を指定する(この例では srvcert)。途中で質問される Common Name 
  にはサーバ名(この例では "Server")を指定する。実行例【へ】参照。

---[実行例 へ]----------------------------------------------------------------
# ./CA.svr srvcert
 ~~~~~~~~~~~~~~~~~
*****************************************************************************
Creating server private key and certificate
When prompted enter the server name in the Common Name field.
*****************************************************************************

Generating a 1024 bit RSA private key
....++++++
.................++++++
writing new private key to 'newreq.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:
State or Province Name (full name) [Yamagata]:
Locality Name (eg, city) [Sakata]:
Organization Name (eg, company) [UNIXUSER Readers]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:Server
                               ~~~~~~
Email Address [<管理者のメイルアドレス>]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password [unixuser]:
An optional company name []:
Using configuration from /usr/local/1x/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity  
            Not Before: May  6 12:29:13 2004 GMT
            Not After : May  6 12:29:13 2005 GMT
        Subject:  
            countryName               = JP
            stateOrProvinceName       = Yamagata
            localityName              = Sakata
            organizationName          = UNIXUSER Readers
            commonName                = Server
            emailAddress              = <管理者のメイルアドレス>
        X509v3 extensions:
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
Certificate is to be certified until May  6 12:29:13 2005 GMT (365 days)
Sign the certificate? [y/n]:y
                            ~

1 out of 1 certificate requests certified, commit? [y/n]y
                                                        ~
Write out database with 1 new entries
Data Base Updated 
MAC verified OK
------------------------------------------------------------------------------


  (3) 接続クライアント証明書の作成
  ---------------------------------

  CA.clt スクリプトを利用して作成する。スクリプトの引数に保存ファイルの
  ベース名を指定する(この例では clicert)。途中で質問される Common Name 
  にはクライアント名(この例では "Client")を指定する。実行例【ち】参照。


---[実行例 ち]----------------------------------------------------------------
# ./CA.clt clicert
  ~~~~~~~~~~~~~~~~
*****************************************************************************
Creating client private key and certificate
When prompted enter the client name in the Common Name field. This is the same
 used as the Username in FreeRADIUS
*****************************************************************************

Generating a 1024 bit RSA private key
...++++++
.....++++++
writing new private key to 'newreq.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:
State or Province Name (full name) [Yamagata]:
Locality Name (eg, city) [Sakata]:
Organization Name (eg, company) [UNIXUSER Readers]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:Client
                               ~~~~~~
Email Address [<管理者のメイルアドレス>]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password [unixuser]:
An optional company name []:
Using configuration from /usr/local/1x/ssl/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity  
            Not Before: May  6 13:55:14 2004 GMT
            Not After : May  6 13:55:14 2005 GMT
        Subject:  
            countryName               = JP
            stateOrProvinceName       = Yamagata
            localityName              = Sakata
            organizationName          = UNIXUSER Readers
            commonName                = Client
            emailAddress              = <管理者のメイルアドレス>
        X509v3 extensions:
            X509v3 Extended Key Usage:
                TLS Web Client Authentication
Certificate is to be certified until May  6 13:55:14 2005 GMT (365 days)
Sign the certificate? [y/n]:y
                            ~

1 out of 1 certificate requests certified, commit? [y/n]y
                                                        ~
Write out database with 1 new entries
Data Base Updated 
MAC verified OK
------------------------------------------------------------------------------

●FreeRADIUSの動作設定

  FreeRADIUSの設定ファイルは、今回の導入作業例では
  /usr/local/1x/etc/raddb/ にインストールされる。EAP-TLS を利用するため
  に radiusd.conf, clients.conf, users ファイルを修正する。

  (1)radiusd.conf の修正
  ----------------------
  600行目付近、デフォルトのEAPタイプをTLSにする。
------------------------------------------------------------------------------
@@ -606,7 +606,7 @@
                #
                #  For now, only one default EAP type may be used at a time.
                #
-               default_eap_type = md5
+               default_eap_type = tls
 
                #  Default expiry time to clean the EAP list, It is
                #  maintained to correlate the EAP-Response for each
------------------------------------------------------------------------------

  640行目付近より始まる tls {……} の設定がデフォルトでは全てコメントア
  ウトされている。これをリスト【り】のように書き換えて有効化する。修正部
  分には秘密鍵を取り出すためのパスワードと、証明書ファイルのパス名等が含
  まれるので、これは適宜書き換える。

---[リスト り]----------------------------------------------------------------
                ## EAP-TLS is highly experimental EAP-Type at the moment.
                #       Please give feedback on the mailing list.
                tls {   
                        private_key_password = unixuser
                        private_key_file = /usr/local/1x/etc/certs/server.pem

                        #  If Private key & Certificate are located in
                        #  the same file, then private_key_file &
                        #  certificate_file must contain the same file
                        #  name.
                        certificate_file = /usr/local/1x/etc/certs/server.pem

                        #  Trusted Root CA list
                        CA_file = /usr/local/1x/etc/certs/root.pem

                        dh_file = /usr/local/1x/etc/DH
                        random_file = /usr/local/1x/etc/random

                        #
                        #  This can never exceed the size of a RADIUS
                        #  packet (4096 bytes), and is preferably half
                        #  that, to accomodate other attributes in
                        #  RADIUS packet.  On most APs the MAX packet
                        #  length is configured between 1500 - 1600
                        #  In these cases, fragment size should be
                        #  1024 or less.
                        #
                                fragment_size = 1024

                                #  include_length is a flag which is
                                #  by default set to yes If set to
                                #  yes, Total Length of the message is
                                #  included in EVERY packet we send.
                                #  If set to no, Total Length of the
                                #  message is included ONLY in the
                                #  First packet of a fragment series.
                                #
                                include_length = yes
                }
------------------------------------------------------------------------------

  また、定義中乱数用ファイルのパス名があるが、これらは任意の内容のものを
  作ればよいようである。たとえば、以下のようにして作成すればよいだろう。

  # md5 /var/log/messages > /usr/local/1x/etc/DH
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # md5 /var/log/maillog > /usr/local/1x/etc/random
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  (2)clients.conf の修正
  ----------------------
  802.1Xの問合せを行なうアクセスポイントのIPアドレスを登録しておく。もし、
  アクセスポイントのLANないIPアドレスが192.168.11.1であれば、リスト【ぬ】
  のような記述を追加するとよい。
---[リスト ぬ]----------------------------------------------------------------
client 192.168.11.1 {
        secret          = henohenomoheji
        shortname       = AP1
}
------------------------------------------------------------------------------

  「secret」項目には、アクセスポイントとFreeRADIUS間で使われる共有鍵の文
  字列を指定する。この鍵は、無線LAN-APの802.1Xの設定で用いるので覚えてお
  こう。

●FreeRADIUSの起動

  以下、FreeRADIUSを /usr/local/1x/ 以下にインストールしたものとして説明
  する。

  まず、radiusdの利用するポート番号が /etc/services に登録されているか確
  認する。なければ、

	radius          1812/tcp
	radius          1812/udp
	radius-acct     1813/tcp                radacct
	radius-acct     1813/udp                radacct

  を /etc/services に追加しておこう。


  /usr/local/1x/sbin/rc.radiusd に起動・停止制御用のスクリプトがあるので、
  これを利用すると良いだろう。

  【起動】		/usr/local/1x/sbin/rc.radiusd start
  【設定読み直し】	/usr/local/1x/sbin/rc.radiusd reload
  【再起動】		/usr/local/1x/sbin/rc.radiusd restart
  【停止】		/usr/local/1x/sbin/rc.radiusd start

  いずれかによって制御する。なお、rc.radiusd スクリプトの中に

	#
	#  See 'man radiusd' for details on command-line options.
	#
	ARGS=""

  という行がある。ARGS変数には、radiusd を起動する時のコマンドライン引数
  を記述できる。例えば、ここに

	ARGS='-A -X'

  と書いておくと、デバッグメッセージが端末に出力されるようになる。思軒段
  階では -A -X オプションを付与するように記述しておいた方が便利だろう。
  その他 radiusd の理解できるオプションとその意味については

  % MANPATH=/usr/local/1x/man man 8 radiusd

  なととしてオンラインマニュアル radiusd(8) を参照して欲しい。

■
■ クライアント(XSupplicant)の導入
■

802.1Xの認証クライアント(Supplicant)のひとつであり、Linuxに対応している
XSupplicant を導入してみよう。

http://open1x.sourceforge.net/

に、安定版の最終リリースへのリンクがあるのでこれを辿り ソースを入手する。
本稿執筆時の安定版は 0.8b であるので以下の手順説明は0.8bに基づいて進める
ものとする(註: 開発版は1.0pre2が出ているが設定ファイルの文法等かなり異なっ
ている。時間不足もあって筆者の環境では認証確立に至らなかったので今回は
0.8b を利用した。)。

xsupplicant-0.8b のインストールには

	autoconf 2.54 以上
	libpcap
	libdnet

が必要なので、これらを導入後に xsupplicant-0.8b のビルドに進む。

●autoconf-2.54の導入

  まず、システムに既に導入されている autoconf のバージョンを調べよう。
  
  % autoconf --version
    ~~~~~~~~~~~~~~~~~~
  Autoconf version 2.13

  既に2.54以上がインストールされていればこの節の作業は必要ない。古いもの
  がインストールされている場合、既存環境との不整合問題を防ぐために、
  FreeRADIUS と同様  /usr/local/1x/ ディレクトリ以下にインストールしたほ
  うが後々のトラブルが少ないだろう。ring.gr.jp:/pub/GNU/autoconf/ などか
  ら autoconf-2.59 を入手する。

	ファイル名	autoconf-2.59.tar.gz
	ファイルサイズ	1236359バイト
	MD5値		d4d45eaa1769d45e59dcb131a4af17a0

  # tar zxpf autoconf-2.59.tar.gz
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # cd autoconf-2.59
    ~~~~~~~~~~~~~~~~
  # ./configure --prefix=/usr/local/1x && make all install
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  以下の作業で新しい autoconf を優先的に起動するようコマンド検索パスの先
  頭に /usr/local/1x/bin を追加しておく。

  # PATH=/usr/local/1x/bin:"$PATH"
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

●libpcap-0.8.3の導入

  http://www.tcpdump.org/ などから、libpcap 0.8.3 のソースアーカイブを入
  手する。

	ファイル名	libpcap-0.8.3.tar.gz
	ファイルサイズ	302551バイト
	MD5値		56a9d4615d8354fcfe8cff8c8443c77b

  # tar zxpf libpcap-0.8.3.tar.gz
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # cd libpcap-0.8.3
    ~~~~~~~~~~~~~~~~
  # ./configure --prefix=/usr/local/1x && make all install
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

●libdnet-1.7の導入

  http://libdnet.sourceforge.net/ などから libdnet 1.7 のソースアーカイ
  ブを入手する。

	ファイル名	libdnet-1.7.tar.gz
	ファイルサイズ	160062バイト
	MD5値		e0680e7375dd733f50466fcd4ac5e203

  # tar zxpf libdnet-1.7.tar.gz
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # cd libdnet-1.7
    ~~~~~~~~~~~~~~
  # ./configure --prefix=/usr/local/1x && make all install
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

●xsupplicant-0.8bの導入

  http://prdownloads.sourceforge.net/open1x/xsupplicant-0.8b.tar.gz?download
  より、xsupplicant-0.8b のソースを入手する。

	ファイル名	xsupplicant-0.8b.tar.gz
	ファイルサイズ	345492バイト
	MD5値		ac40850192071017d2f04e7f7c180c1d

  ソースを展開し、先にインストールしたライブラリのパス名を指定して
  configureする。

  # tar zxpf xsupplicant-0.8b.tar.gz
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # cd xsupplicant
    ~~~~~~~~~~~~~~
  # ./configure --prefix=/usr/local/1x \
		--with-pcap-root=/usr/local/1x \
		--with-dnet-root=/usr/local/1x \
		--with-ossl-root=/usr/local/1x

  エラーが出なければコンパイル&インストールする。
  radiusdの時と同様実行時のライブラリ検索パスが埋め込まれるように
  LD_RUN_PATH 変数を設定してmakeする。

  # LD_RUN_PATH=/usr/local/1x/lib make all install
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


●xsupplicant の設定

  (1)証明書ファイルのコピー

  FreeRADIUSの導入時に作成した証明書ファイルのうち、ルートCAのものとクラ
  イアントのものを xsupplicant を起動するホストにコピーする。ここでは、
  root.pem と clicert.pem をコピーする。コピーするディレクトリは任意でよ
  いが、(2)で初期化ファイルを置く /etc/1x/ ディレクトリにまとめておくこ
  とにする。

  # ls -l /etc/1x
    ~~~~~~~~~~~~~
  -rw-------    1 root    root        2353 May  6 22:55 clicert.pem
  -rw-------    1 root    root        2669 May  6 22:35 root.pem


  (2)初期化ファイルの設定
  xsupplicant-0.8bの初期化ファイルは /etc/1x/1x.conf となっている。ソー
  スディレクトリの ./etc/ ディレクトリに初期化ファイルのサンプルがあるの
  でまずはこれをコピーするとよいだろう。xsupplicant-0.8b のソースのある
  ディレクトリで以下のように実行する。

  # mkdir /etc/1x
    ~~~~~~~~~~~~~
  # cp etc/1x.conf /etc/1x
    ~~~~~~~~~~~~~~~~~~~~~~

  EAP-TLSを優先し、証明書ファイルを認識するよう /etc/1x/1x.conf ファイル
  にリスト【る】の項目を記述する。

---[リスト る]------------------------------------------------------------
default : type = wireless 
default : pref = tls
default : id = Client
default : key = /etc/1x/clicert.pem
default : root = /etc/1x/root.pem
default : auth = EAP 
default : type = wireless 
--------------------------------------------------------------------------

■
■ 無線LAN-APの設定
■

今回は BUFFALO WBR-G54(Ver2.06)を用いた802.1Xの設定例を示す。
802.1X(EAP-TLS)に対応しているアクセスポイントであれば同様の設定が可能だ
ろう。

WBR-G54では、以下の手順で802.1X認証の設定を行なった。

  1. WebブラウザでAPの管理Webを開き、「アドバンスト」メニューに進む
  2. 「LAN設定」→「無線LANセキュリティ」の管理画面で以下のように設定す
     る(→ 脚註【か】)
	データの暗号化  (*) WEP   WEP暗号化キー [ xxxxx ]
						[       ]
						[       ]
						[       ]
        IEEE802.1x/   認証サーバ	[ 192.168.11.50 ]
	EAP認証(WPA)  認証ポート	[ 1812 ]
		      Shared Secret	[ henohenomoheji ]

      → 図【わ】参照。
---[図: わ]-----------------------------------------------------------
 image: wbr.png
----------------------------------------------------------------------      


---[註: か]-----------------------------------------------------------
WBR-G54, XSupplicant, NEC-WL54AG の組み合わせでは、最初にWEPの利用を
ONにしてなんらかのキーを利用する設定にしておかないと、802.1X認証確立後の
暗号化キー自動交換後の通信ができないという問題が起きるので、WEPも設定し
ておいた。
----------------------------------------------------------------------

■
■ xsupplicant の起動
■

radiusdの起動と無線LAN-APの802.1X設定が完了したらクライアントホストで
xsupplicant を起動する。以下の例は、Linux マシンで、無線LANカードが ath0 
デバイスにアタッチされる場合のコマンドライン例である。

  # iwconfig ath0 essid <ネットワークのSSID>
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # iwconfig key s:xxxxx			(無線LAN-APで設定したもの)
    ~~~~~~~~~~~~~~~~~~~~
  # ifconfig ath0 192.168.11.22 netmask 255.255.255.0 up
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # /usr/loca/1x/bin/radiusd -i ath0
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Calling do_eapol, with device ath0
  Setup on device ath0 complete
  Done with init.
  Sending EAPOL-Start #1
  Connection Established, authenticating...
  Please Enter Your Password : unixuser
			       ~~~~~~~~ (パスフレーズを入力)

  自動的なWEPキー交換が行なわれた場合、

EAPOL Key processed: broadcast [1] (13 bytes) 
Successfully set WEP key  [1]
EAPOL Key processed: unicast [4] (13 bytes) 
Successfully set WEP key  [4]
Successfully set the WEP transmit key  [4]

  のようなメッセージが出力される。成功したら、無線LANセグメントの任意の
  ホストに対して ping を打つなどして開通を確認しよう。


■
■ Windows XP supplicant からの接続
■

Windows XP では、802.1X supplicant のサービスが標準で装備されている。こ
こでは、Windows XP Home Edition(Service Pack 1) に装備されている 
Wireless zero Configuration サービスを例として、設定方法を示そう。なお、
無線LANカード等のドライバの導入方法などについては割愛する。

xsupplicant の場合と同様導入の手順は、証明書のインストールのあと
Supplicant の設定をすることになる。

●証明書のインストール

  ルート証明書とクライアント証明書をXPマシンにコピーする。Windowsで解釈
  可能なDERフォーマットのものが、証明書を作成したホストの
  /usr/local/1x/etc/certs/ ディレクトリにできているはずである。このうち
  ルート証明書とクライアント証明書となる root.der と clicert.der を安全
  な手段でWindows XPマシンにコピーする。コピーしたフォルダをExplorer で
  開いておく。

  ・ルート証明書のインストール
  ============================

  (1)root.der ファイルのアイコンを右クリックし、
     「証明書のインストール(I)」を選択
  (2)「証明書のインポートウィザード」が起動するので先に進む
  (3)「証明書ストア」の選択では「証明書をすべて次のストアに配置する(P)」
     を選択
     --------------------------
     図: image 04-iw-store.png
     --------------------------
  (4)「信頼されたルート証明機関」を選択
     --------------------------
     図: image 05-iw-store2.png
     --------------------------

  ・クライアント(ユーザ)証明書のインストール
  ===========================================
  (1)clicert.der ファイルのアイコンを右クリックし、
     「証明書のインストール(I)」を選択
  (2)「証明書のインポートウィザード」が起動するので先に進む
  (3)「証明書ストア」の選択では
     「証明書の種類に基づいて、自動的に証明書ストアを選択する(U)」
     を選択
     -----------------------------
     図: image 11-iw-autostore.png
     -----------------------------

●Wireless Zero Configuration サービスの開始

  (1)「コントロールパネル」→「管理ツール」→「サービス」
  (2)サービス一覧より
     「Wireless Zero Configuration(802.11アダプタの自動構成)」を
     選択する。
  (3)既に起動していなければ、手動で起動する
     ------------------------------------
     図: image xp-wlan-zeroconf.png
     ------------------------------------

●802.1X 認証接続の確立

  Wireless Zero Configuration サービスが起動していれば、無線LANインタフェー
  スの802.1X認証設定のためのメニューが、ネットワークインタフェースのプロ
  パティーに現れる。

  (1)「コントロールパネル」→「ネットワーク接続」
      のネットワーク接続一覧に無線LANアダプタの接続アイコンが
      あることを確認
  (2)無線LANアダプタのアイコンで右クリックし「プロパティ(R)」を
     選択すると「ワイヤレスネットワーク」のタブがあるはずなので、
     これを選択。
     ------------------------------------
     図: image xp-wlan-prop.png
     ------------------------------------
  (3)「優先するネットワーク」の一覧に802.1Xを設定したい無線LAN-APのSSID
      が出ていればそれを選択し「プロパティ(P)」をクリック、
      なければ、「追加(A)」をクリック
  (4)「アソシエーション」タブで、
	正しい「ネットワーク名(SSID)」を入力し、
     ワイヤレスネットワークキーで、

	ネットワーク認証(A)	[ オープンシステム ]
	データの暗号化		[ WEP ]
	[レ] キーは自動的に提供される(H)

     を設定
     ------------------------------------
     図: image xp-wlan-prop-assoc.png
     ------------------------------------

  (5)「認証」タブで、
     [ レ ] このネットワークでIEEE 802.1X を有効にする(E)
     をチェックし、EAPの種類には
     「スマートカードまたはその他の証明書」を選択
     ------------------------------------
     図: image xp-wlan-prop-auth.png
     ------------------------------------

  (6)「EAPの種類」の「プロパティ(R)」で、

	[レ] このコンピュータの証明書を使う(S)
	   [レ] 単純な証明書の選択を行なう(推奨)(M)

	[レ]サーバの証明書を有効化する(V)

     をチェックし、信頼されたルート証明書に先ほどインストールした
     root.derのCA(今回の例では UNIXUSER Authority)を選択する。
     ------------------------------------
     図: image xp-wlan-prop-key.png
     ------------------------------------


  以上の設定が完了したら[OK]をクリックしていくと認証依頼が始まる。


■
■ まとめ
■

以上駆け足で802.1X認証環境の設定について説明した。今回利用したEAP-TLSで
は取り扱う証明書が複数あるため、各ソフトウェアの設定ファイルの証明書の登
録がすこし繁雑かもしれない。ただ、一度設定してしまえばあとは自動化もでき
るほど認証接続自体は簡単なので、通常運用時の負担は増えないだろう。


■
■ 参考文献
■

802.1Xと、FreeRADIUS, XSupplicant について知るために有用な
文献を以下に示しておこう。

RFC 2284 PPP Extensible Authentication Protocol (EAP)
RFC 2865 Remote Authentication Dial In User Service (RADIUS)
RFC 2869 RADIUS Extensions

「SSL Certificates HOWTO」
http://www.linux.or.jp/JF/JFdocs/SSL-Certificates-HOWTO/index.html

HOWTO on EAP/TLS authentication between FreeRADIUS and XSupplicant
http://www.missl.cs.umd.edu/wireless/eaptls/

White Paper 802.1X
http://www.foundrynet.com/solutions/appNotes/PDFs/802.1xWhite_Paper.pdf

802.1x
http://wireless.utk.edu/documentation/papers/802.1x-chris.pdf

〜 安心して無線LANを使用するために 〜
http://www.soumu.go.jp/s-news/2004/pdf/040426_3_03.pdf


yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]