RADIUSによる認証ネットワーク環境構築のための7ステップ
最近では当たり前になったwifi環境ですが、wifi環境は盗聴の危険性があり、盗聴によってパスワードが解析されてしまえばどんなユーザでも接続できてしまいます。そのため、ネットワーク環境をセキュアにする目的としてRADIUS (Remote Authentication Dial In User Service) というプロトコルが使われます。そこで実際にRADIUSを利用して、ユーザに対して認証を行う認証ネットワーク環境を構築したのでその7ステップをメモします。
構築した認証ネットワーク環境
RADIUSを使用することで、wifiに接続したPC(スマートフォンなどの携帯端末も含みます)やネットワークスイッチにLANケーブルを通して接続したPCに対して、ユーザ名とパスワードを要求し、認証に成功したPCに対してのみネットワークの接続を許可することができます。これにより、ネットワーク環境、特にwifi環境をよりセキュアにすることができます。
今回は以下の図1のような環境を構築しました。図1中のRADIUS ServerとNetwaork Switch Aが連携することでNetwork Switch Aに接続しようとしたPCに対して認証処理を行い、同様に図中のRADIUS ServerとWireless Access Pointが連携することでWireless Access Pointに接続しようとしたPCに対して認証処理を行います。
RADIUSによる認証手順概要
RADIUSの認証手順を大まかに説明すると、以下のようになります。なお、以下の認証手順はNetwork Switch、Wireless Access Pointどちらへの接続でも同じです。
- ① User PCがNetwork Switch A (もしくはWireless Access Point) に接続を試みる(具体的には、Network Switch AにLANケーブルを接続する、Wireless Access Pointに接続する)
- ② Network Switch A (もしくはWireless Access Point) は、RADIUS Serverに対して、User PCへの認証処理を要求する
-
③ RADIUS ServerはUser PCに対してユーザ名とパスワードを要求し、それらが正しければ認証成功しUser PCはネットワークへ接続可能となる。一方、ユーザ名とパスワードが正しくない場合は認証失敗し、User PCはネットワークへ接続不可となる。
RADIUSによる認証ネットワーク環境構築のための7ステップ
図1の環境を構築するには
- RADIUSサーバの構築
- RADIUSクライアント(図2中のNetwork Switch A、Wireless Access Pointが該当します)の設定
RADIUSサーバの構築
ステップ1:freeRADIUSのインストール
まず始めにRADIUSサーバソフトウェアであるfreeRADIUSをインストールします。freeRADIUSのインストールは、ubuntuのターミナル上で以下のコマンドを実行することで完了します。
$ sudo apt-get install freeradius freeradius-mysql
次にfreeRADIUSの設定ファイルを編集します。
freeRADIUSの設定ファイル編集
freeRADIUSにおいて編集が必要なファイルは下記の4つであり、全て/etc/freeradius配下にあります(ubuntu12.04の場合)
- ・radiusd.conf
- ・clients.conf
- ・users
- ・eap.conf
ステップ2:radiusd.confの編集
最初にradiusd.confを編集します。なお、/etc/freeradiusのファイルを編集するにはroot権限が必要なので、まず以下のコマンドによってrootに移行します。
$ sudo su -
そして以下のcdコマンドによって/etc/freeradiusに移動し、cpコマンドでradiusd.confのオリジナルファイルを保存しておきます。そしてviエディタによってradiusd.confを編集します。(viエディタを普段使わない方はnanoエディタなどでも良いと思います。)
# cd /etc/freeradius/
# cp radiusd.conf radiusd.conf.org
# vi radiusd.conf
radiusd.confの編集箇所は全部で4カ所になります。
#user = freerad (変更前)
#group = freerad (変更前)
user = root (変更後)
group = root(変更後)
# Port on which to listen.
# Allowed values are:
# integer port number (1812)
# 0 means "use /etc/services for the proper port"
#port = 0 (変更前)
port = 1812 (変更後)
# Log authentication requests to the log file.
#
# allowed values: {no, yes}
#
#auth = no (変更前)
auth = yes (変更後)
変更箇所をまとめると、以下の通りです。
・user=root、group=root この2つは、Linuxシステムのアカウントと連携させて認証させたい場合に必要になります。今回はLinuxシステムのアカウントと連携させた認証は行いませんが、今後行う予定であるため記述しておきます。
・port=1812 これはRADIUSで使用するデフォルトのポート番号が1812であるので、この値に変更しておきます。
・auth=yes これはログに認証を要求したユーザ毎の認証失敗、認証成功のログを残すために必要な記述になります。この記述がない場合は、ユーザ毎のログは出力されません。
以上でradiusd.confの編集は完了です。次に、RADIUS Serverに対してUser PCへの認証処理を要求するRADIUSクライアント(図2中のNetwork Switch A、Wireless Access Pointが該当します)に関する設定ファイルであるclients.confの編集を行います。
ステップ3:clients.confの編集
はじめにcpコマンドによってclients.confのオリジナルファイルを保存しておきます。
# cp clients.conf clients.conf.org
そしてviエディタによってclients.confを編集します。編集箇所は1カ所になります。
#
# You can now specify one secret for a network of clients.
# When a client request comes in, the BEST match is chosen.
# i.e. The entry from the smallest possible network.
#
#client 192.168.0.0/24 {
# secret = testing123-1
# shortname = private-network-1
#}
#
#client 192.168.0.0/16 {
# secret = testing123-2
# shortname = private-network-2
#}
#以下を追記
client 192.168.1.0/24 {
secret = testing123
shortname = private-network-1
}
clients.confには、RADIUSクライアント(図2中のNetwork Switch A、Wireless Access Point)のIPアドレスとパスワード(上記のsecretがパスワードです)を設定します。ここに記述されたネットワークアドレスやIPアドレスを持つRADIUSクライアントからの認証要求のみをRADIUSサーバは受付け、それ以外は拒否します。また、ここで設定したsecret、すなわち「testing123」がRADIUSクライアントがRADIUSサーバに対して送るパスワードであり、これが正しくない場合、RADIUSクライアントがRADIUSサーバに対して認証処理を要求してもRADIUSサーバは拒否します。
ステップ4:usersの編集
ここには、図1中のUser PCのアカウントであるユーザ名とパスワードを記述します。ここに記述されたユーザのみがRADIUS認証を通してネットワークへ接続可能となります。
#
# This is an entry for a user with a space in their name.
# Note the double quotes surrounding the name.
#
#"John Doe" Cleartext-Password := "hello";
# Reply-Message = "Hello, %{User-Name}"
test Cleartext-Password := "hello"
Reply-Message = "Hello, %{User-Name}"
上記ではユーザ名が「test」、パスワードが「hello」であるユーザが記述されています。 ここにネットワークへの接続を許可したいユーザ名とそのパスワードを記述することになります。 最後に認証方式の設定ファイルであるeap.confを編集します。
ステップ5:eap.confの編集
eap.confには、認証方式に関する設定が記述されています。認証方式としては、peapを使用しました。そしてpeapを使用する場合のeap.confの設定ファイルは以下のようになります。
# -*- text -*-
##
## eap.conf -- Configuration for EAP types (PEAP, TTLS, etc.)
##
## $Id$
#######################################################################
#
# Whatever you do, do NOT set 'Auth-Type := EAP'. The server
# is smart enough to figure this out on its own. The most
# common side effect of setting 'Auth-Type := EAP' is that the
# users then cannot use ANY other authentication method.
#
# EAP types NOT listed here may be supported via the "eap2" module.
# See experimental.conf for documentation.
#
eap {
default_eap_type =peap
timer_expire = 60
ignore_unknown_eap_types = yes
cisco_accounting_username_bug = no
max_sessions = 4096
tls {
certdir = ${confdir}/certs
cadir = ${confdir}/certs
private_key_password = whatever
private_key_file = ${certdir}/server.key
certificate_file = ${certdir}/server.pem
CA_file = ${cadir}/ca.pem
dh_file = ${certdir}/dh
random_file = /dev/urandom
CA_path = ${cadir}
cipher_list = "DEFAULT"
make_cert_command = "${certdir}/bootstrap"
cache {
enable = no
lifetime = 24 # hours
max_entries = 255
}
verify {
}
}
ttls {
default_eap_type = mschapv2
copy_request_to_tunnel = yes
use_tunneled_reply = yes
}
peap {
default_eap_type = mschapv2
}
mschapv2 {
}
}
mschap {
authtype = MS-CHAP
use_mppe = yes
require_encryption = yes
require_strong = yes
}
正直なところ、eap.confの中身についてはまだまだ勉強不足の点が多く、あまり理解できていません。この中身についてはまた勉強した時に追記したいと思います。とりあえず、peapを使う場合は上記の設定ファイルで動作しています。また、上記の中の「ttls」の部分の記述がないと、iPad、iPod touch、iPhoneなどの端末、すなわちiOSに対しては認証できず接続できないようです。
ステップ6:iptablesの設定
freeRADIUSではUDPのポート番号1812番、1813番を使用するため、以下のiptablesのコマンドによって1812番、1813番宛のトラフィックの受付を許可する必要があります。
iptables -A INPUT -s 192.168.1.0/24 -p udp --dport 1812:1813 -j ACCEPT
上記のコマンドをそのまま実行すると、INPUTチェインの一番下にルールが追加されるので、各自ルールの追加場所は「-I」オプションを使用して指定して下さい。例えば、上記のルールをINPUTチェインの1番目に追加する場合は、以下のコマンドを実行します。
iptables -I INPUT 1 -s 192.168.1.0/24 -p udp --dport 1812:1813 -j ACCEPT
上記の「INPUT」の後に続く数字がルールを挿入する位置になります。上記では「1」が続いているため1番目に挿入されますが、ここで2を記述すれば、2番目にルールが挿入されます。
ステップ7:RADIUSクライアントの設定
RADIUSサーバの構築が完了したら、後はRADISUクライアント(図2中のNetwork Switch A、Wireless Access Pointが該当します)の設定をして完了です。ただし、RADIUSクライアントとして動作するネットワークスイッチやアクセスポイントのRADIUSの設定方法は異なりますので、今回私が使用した機器の場合についてメモします。とはいえ、多くのネットワークスイッチ、アクセスポイントで設定する内容は同じかと思います。ただ、RADIUSに対応していない機器 (IEEE802.1xという規格に対応していない機器)があるので、そこは注意して下さい。
下の画像が私が実際にRADIUSクライアントとして使用したwifiアクセスポイントの設定画面になります。
RAIUSクライアントであるネットワークスイッチやアクセスポイントによって異なると思いますが、どのRADIUSクライアントにおいても、上記の画像と同様に以下の3つの項目を適切に入力すれば動作すると思います。
-
・RADIUSサーバのIPアドレス
上記の画像中では、「Radius Server IP」にRADIUSサーバのIPアドレスである「192.168.1.3」を入力
-
・RADIUSサーバのポート番号
上記の画像中では、「Radius Port」に「radiusd.conf」の「port」で設定した値である「1812」を入力
-
・RADIUSサーバのパスワード
上記の画像中では、「Radius Password」に「clients.conf」で設定したパスワードである「testing123」を入力
RADIUSクライアントとして使用できる機器
RADIUS(IEEE802.1x)に対応している多くの無線アクセスポイントは企業向けであり高額なものが多い(大体2万円〜)ですが、今回RADIUSクライアントとして使用した無線アクセスポイントは以下のTP-LINKという会社の製品であり、10,000円程度とお手頃です。TP-LINK社の製品はあまり日本ではみかけないと思いますが、海外ではよく見かけます。
また、RADIUSクライアントとして動作可能な製品の一つとしては、Apple社のAirMacがあります。
起動と動作確認
以上で必要な設定は完了です。最後に、以下のコマンドでfreeRADIUSを起動し動作確認を行います。
# service freeradius start
freeRADIUSの起動が成功すれば、以下のようなメッセージが表示されます。
* Starting FreeRADIUS daemon freeradius
...done.
もしfreeRADIUSの起動に失敗した場合、以下のようなメッセージが表示されます。
* Starting FreeRADIUS daemon freeradius
...fail.
そしてfreeRADIUSの起動に失敗した場合は、これまでに編集した「radiusd.conf」、「clients.conf」、「users」、「eap.conf」のいずれかに記述ミスが含まれている可能性が高いです。そこで、起動に失敗した場合は、以下のコマンドによってfreeRADIUSをデバッグモードで起動することで、どのファイルのどの部分に記述ミスがあるかを確認できます。よって、起動に失敗した場合はデバッグモードでfreeRADIUSを起動して原因を探ると良いと思います。
# freeradius -X
起動に成功したら次はfreeRADIUSの認証が成功するかを確認します。具体的には、以下の「radtest」コマンドを実行して確認します。
# radtest [ユーザ名] [ユーザパスワード] [RADIUSサーバのIPアドレス] [ポート番号] [secret]
radtestは以上のようにテストしたいユーザ名とパスワード、RADIUSサーバのIPアドレスとポート番号、さらにclient.confに記述したRADIUSクライアントのsecretを入力してテストすることができます。もしRADIUSサーバが正常に動作しており、かつユーザ名とパスワードの組み合わせが正しければ、「Access-Accept」というメッセージが表示されます。ただし、「radtest」はclients.confに記述したIPアドレスまたはIPアドレス範囲を持つパソコンから実行しないとRADIUSサーバからの応答は当然ながらありません。よって、一番簡単なのは、freeRADIUSをインストールしたRADIUSサーバ上でradtestコマンドを実行することです。その場合、radtestコマンドに渡すRADIUSサーバのIPアドレスは「localhost」になります。 具体例を以下に載せます。例えば、これまでに設定した以下の内容でテストします。
- ・ユーザ名 : test (usersに記述した値)
- ・パスワード : hello (usersに記述した値)
- ・RADIUSサーバのIPアドレス: 192.168.1.3
- ・ポート番号 : 1812 (radiusd.confに記述した値)
- ・secret : testing123 (clients.confに記述した値)
# radtest test hello 192.168.1.3 1812 testing123
成功すると、以下のような「Access-Accept」とその他のメッセージが表示されます。
Sending Access-Request of id 236 to 192.168.1.3 port 1812
User-Name = "test"
User-Password = "hello"
NAS-IP-Address = 127.0.1.1
NAS-Port = 1812
rad_recv: Access-Accept packet from host 192.168.1.3 port 1812, id=236, length=35
Reply-Message = "Hello, test"
失敗した場合は、例えば以下のような「Access-Reject」とその他のメッセージが表示されます。
rad_recv: Access-Reject packet from host 192.168.1.10 port 1812, id=79, length=35
失敗した場合はradtestコマンドに渡した値とfreeradiusの設定ファイルに記述した値が正しいかどうかを確認すると良いと思います。
まとめ
RADIUSによってセキュアなネットワーク環境を構築できました。最初はRADIUSによる認証ネットワークの構築は非常に手間がかかると考えていましたが、実際に構築してみると意外に手間は掛からず少ないステップで構築できました。また、簡易ではありますが、そんなにコストを掛けることなく構築できたのが良かったです。
関連記事
- 公開日:2022/09/11 更新日:2022/09/11
Google Compute EngineのインスタンスにSSH接続できなくなった時の対処方法
Google Compute EngineのインスタンスにSSH接続できていたのにSSHの設定ミスや原因不明でSSH接続できなくなった時の対処方法をメモします。自分のPCからだけでなく、Google Cloud Platform上での管理画面からもSSHできない場合にも有効です。
- 公開日:2022/09/08 更新日:2022/09/08
Google Compute EngineのインスタンスにSSH接続する
Google Compute Engineのインスタンスにssh接続するための手順をまとめます。
- 公開日:2018/02/10 更新日:2018/02/10
CentOSでrootのときだけ日本語が文字化けする時の原因と対処方法
さくらVPSでCentOSを使いはじめたところ、一般ユーザで使用している時はvimなどのエディタで編集していても日本語が問題なく表示されていましたが、root権限で同様に編集のためにファイルを開いたら日本語が文字化けしてしまいました。以降ではこの原因と対処方法についてメモします。
- 公開日:2017/12/09 更新日:2017/12/09
サーバ上のディレクトリをローカルにマウントするsshfsの使い方
Linuxでは、サーバ側のディレクトリを自身のローカルPCにマウントして、ローカル上のディレクトリして使用することができるsshfsというコマンドが用意されています。ここではこのsshfsの使い方をメモします。
- 公開日:2017/08/27 更新日:2017/08/27
MacでubuntuのインストールUSBを作成する方法と手順
MacでubuntuのインストールUSBを作成する手順をメモします。ここで載せる手順はターミナルでのコマンドによる方法になります。