RADIUSによる認証ネットワーク環境構築のための7ステップ

公開日:2013/09/19 更新日:2013/09/19
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_network_configure.png図1 RADIUSによって構築する認証ネットワーク環境図

RADIUSによる認証手順概要

RADIUSの認証手順を大まかに説明すると、以下のようになります。なお、以下の認証手順はNetwork Switch、Wireless Access Pointどちらへの接続でも同じです。

radius_process.png図2 RADIUSによる認証手順概要図

      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ステップを載せます。

RADIUSによる認証ネットワーク環境構築のための7ステップ

図1の環境を構築するには

  • RADIUSサーバの構築
  • RADIUSクライアント(図2中のNetwork Switch A、Wireless Access Pointが該当します)の設定
が必要になります。そしてこれは7ステップで完了します。 まずは、RADIUSサーバを構築します。具体的には、ubuntu12.04上にRADIUSサーバソフトウェアであるfreeRADIUSをインストールし、さらに4つの設定ファイルを編集することで構築します。

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アクセスポイントの設定画面になります。

radius_client.png 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による認証ネットワークの構築は非常に手間がかかると考えていましたが、実際に構築してみると意外に手間は掛からず少ないステップで構築できました。また、簡易ではありますが、そんなにコストを掛けることなく構築できたのが良かったです。

関連記事

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。