発端

知人よりFreeRADIUSの建て方を聞かれた。文書化が面倒なのでブログに記載することにする。前提条件はこんなところだろうか。

  • サーバーに使用しているディストリビューションはRHL9とかそのあたり
  • NetScreenの認証ができるようになればよい(具体的になにをどう認証するかの指定はなし)
  • 実装はFreeRADIUSを指定

とりあえず、RHL9なんていう古いディトリビューションにはとんとお目にかかっていないので、RHELクローンのCentOSで代用することにする。

NetScreenの認証についてだが、何をどう認証するのかの指定がないため、運用やセキュリティは考えないことにして一番単純な構成で構築しようと思う。

具体的にはこうだ。

  • NetScreenのAdmin認証にRADIUSを使用
  • 認証にはLinuxのユーザーを利用

今回の構成はとりあえずFreeRADIUSでユーザー認証ができることのみを目的とするため、実運用には耐えられないものであることを付け加えておく。

さて、インストールにかかろう。

インストール

CentOSなので、yumの使用を前提に進める。

個人的にLinuxDebianGentooを愛用しているため、RedHat系のディストリビューションに触るのは久しぶりである。

RHL9では基本的にyumはインストールされていないかもしれないが、細かい検証が必要ないただの試験環境であれば、rpmでいちいちダウンロードと依存性の解決をするのは時間の無駄なので、まずyumを入れることをおすすめしたい。

RedHat Linux 9の開発は終了しているが、Fedora Legacy Projectでメンテナンスがされている。

詳細は以下を参照。

@IT:サポートが終了したRed Hat Linuxをアップデートするには(yum編)

yumをインストールしたら、アップデートやリポジトリの設定変更などをしたいところだが、今回の目的はFreeRADIUSの構築であるため割愛する。

さて、まずはfreeradiusがyumによって提供可能かどうかとそのバージョンを確認しよう。当然ながら、全ての作業はroot権限で実行する必要がある。

# yum list freeradius
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * updates: rsync.atworks.co.jp
 * addons: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
Available Packages
freeradius.i386                        1.1.3-1.4.el5                        base

コマンド実行の結果、freeradiusのパッケージ情報(赤文字部分)が表示されれば問題なくインストール可能だ。

それが確認できたら続いてインストールを実行する。

# yum install freeradius
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * updates: rsync.atworks.co.jp
 * addons: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
    • > Running transaction check
      • > Package freeradius.i386 0:1.1.3-1.4.el5 set to be updated
    • > Processing Dependency: net-snmp-utils for package: freeradius
    • > Processing Dependency: net-snmp for package: freeradius
    • > Processing Dependency: perl(DBI) for package: freeradius
    • > Running transaction check
      • > Package perl-DBI.i386 0:1.52-2.el5 set to be updated
      • > Package net-snmp-utils.i386 1:5.3.2.2-5.el5 set to be updated
      • > Package net-snmp.i386 1:5.3.2.2-5.el5 set to be updated
    • > Processing Dependency: libsensors.so.3 for package: net-snmp
    • > Running transaction check
      • > Package lm_sensors.i386 0:2.10.7-4.el5 set to be updated
    • > Finished Dependency Resolution
Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: freeradius i386 1.1.3-1.4.el5 base 1.1 M Installing for dependencies: lm_sensors i386 2.10.7-4.el5 base 513 k net-snmp i386 1:5.3.2.2-5.el5 base 711 k net-snmp-utils i386 1:5.3.2.2-5.el5 base 185 k perl-DBI i386 1.52-2.el5 base 600 k Transaction Summary ================================================================================ Install 5 Package(s) Update 0 Package(s) Remove 0 Package(s) Total download size: 3.1 M Is this ok [y/N]:

リポジトリへの問い合わせと依存関係の確認が行われ、必要なすべてのパッケージの一覧が表示される。
確認をし、問題がなければプロンプトにyと答えればダウンロードとインストールが始まる。
インストールの最中にいくつかの警告や質問が表示されることがあるので、都度確認し答える。それが面倒ならばyumのオプションに-yを与えることで、全ての質問に対して同意(y)したものと見なされる。

# yum install freeradius -y

問題なくインストールが実行されればComple!という表示とともにyumの処理が完了する。

Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : perl-DBI                                          [1/5] 
  Installing     : lm_sensors                                        [2/5] 
  Installing     : net-snmp                                          [3/5] 
  Installing     : net-snmp-utils                                    [4/5] 
  Installing     : freeradius                                        [5/5] 

Installed: freeradius.i386 0:1.1.3-1.4.el5
Dependency Installed: lm_sensors.i386 0:2.10.7-4.el5 net-snmp.i386 1:5.3.2.2-5.el5 net-snmp-utils.i386 1:5.3.2.2-5.el5 perl-DBI.i386 0:1.52-2.el5
Complete!

インストールが完了したら念のため以下のコマンドなどで確認をする。

# yum list freeradius
freeradius.i386                     1.1.3-1.4.el5                      installed

# rpm -q freeradius
freeradius-1.1.3-1.4.el5

# command -v radiusd
/usr/sbin/radiusd

無事インストールされたことが確認できたら、いよいよ設定に移る。

FreeRADIUSの設定

まずはFreeRADIUSの設定を行う。yumでインストールした場合、おそらく/etc/raddbに設定ファイルが一式インストールされているはずだ。

参考までに検証環境でのls出力を記載する。

# ls /etc/raddb/
acct_users    dictionary  ldap.attrmap      preproxy_users  sqlippool.conf
attrs         eap.conf    naslist           proxy.conf      users
certs         example.pl  naspasswd         radiusd.conf
clients       hints       otp.conf          realms
clients.conf  huntgroups  otppasswd.sample  snmp.conf

この中で、ごく初歩的な認証のみを実施する場合、編集するファイルは以下の2つである。

  • radiusd.conf
  • clients.conf

順に見ていこう。



radius.conf

RADIUSサーバーに関する設定を記載するためのファイル。
今回の目的において、デフォルトの状態で確認が必要なのは以下の2点である。

port = 0
  • /etc/servicesからポート番号を取得するため(Port 1812)
  • おそらくデフォルトが0であるため変更の必要はない
user = root 
  • /etc/shadowをradiusdが読めるようにするため
  • 通常はradiusdとなっている

認証はmoduleディレクティブに定義されている方式分(preprocess, CHAP, MS-CHAP, EAP等)実行される。

clients.conf

認証を実施するクライアントに関する設定を記載するためファイル。
認証を実施するクライアントをここに登録する。このファイルの末尾に以下のような記述を追加すればよい。

client [認証を行うクライアントのIP Address/Domain Name] {
        secret = [クライアントとなるためのパスワード]
        shortname = [任意の名前]
}

実際に例を挙げる。

client 192.168.1.254 {
        secret = juniper
        shortname = ns5gt
}

起動/確認

これでとりあえずはLinuxユーザーを利用したRADIUS認証の準備が整った。早速起動して確認するとしよう。

# /etc/init.d/radiusd start

もし、認証プロセスを検証する必要がある場合はデバッグモードで立ち上げることもできる。

# radiusd -X -A

radiusdが無事に起動したら、テストコマンドを使用してRADIUS認証が行えることを確認する。

# radtest [User] [Pass] localhost [NAS Port] [secret]

これはあくまでlocalhostに対してRADIUS認証が可能かどうかのテストであるため、先ほど設定した値ではないことに注意。

# radtest hoge hogehoge localhost 1 testing123
Sending Access-Request of id 146 to 127.0.0.1 port 1812
        User-Name = "hoge"
        User-Password = "hogehoge"
        NAS-IP-Address = 255.255.255.255
        NAS-Port = 1
rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=146, length=20

hogeは自分のサーバーのユーザー名、hogehogeはそのパスワードを入力して欲しい。localhostのsecretはデフォルトでtesting123になっている。実行した結果、Access-Acceptと帰ってくればFreeRADIUSは正常に動作していることになる。

NetScreenの設定

サーバーの準備が整ったらNetScreen側の設定を行う。
NetScreenに管理者権限でログインしていることを前提とする。

メニューバーより、Configuration>Auth>Auth Serverへと移動する。

左上のNewボタンをクリックし、認証サーバーの設定画面に入る。

ここで以下のような設定を行う。

Name: RADIUS [任意の名前] 
IP/Domain Name: 192.168.1.254 [RADIUSサーバーのIPアドレスもしくはドメインネーム]
Account Type: Adminのみチェック [何の認証に使用するか]

RADIUS, Secure ID, LDAPのなかからRADIUSを選択肢、以下の設定を行う。

RADIUS Port: 1812 [ラディウスサーバーの使用する認証ポート]
Shared Secret: juniper [セッションに使用する共有シークレット]

Shared SecretはFreeRADIUSのclients.confに設定したsecretを入力する。

ここまで入力をしたら、OKボタンを押し設定を反映する。これでRADIUSサーバーの登録は完了だ。続いて、Admin認証にこのサーバーを使用するように設定をしよう。

メニューバーより、Configuration > Admin > Administratorsへと移動する。

Admin Privileges: External admin has read-write privilegeを選択 [設定変更可能な管理ユーザーを作るため、RWを選択]
Admin Auth Server: Local/RADIUSを選択

現状ではRADIUSでPrivilegeパラメータを提供していないため、NetScreen上でRW, ROを選択する必要がある。今回はRWを指定したが、ROにすることもできる。

ここまで設定したらApplyボタンを押し設定を反映する。

これで管理ユーザーの認証にRADIUSサーバーを使用し、Linuxユーザーを使用したログインが可能になったはずだ。

一度ログアウトをし、任意のLinuxユーザーでNetScreenにログインを試みてもらいたい。

追記

ただユーザー認証のみを行っているだけでは少し寂しいので、FreeRADIUSからPrivilegeを渡す設定を追加してみる。

確認、設定が必要なファイルは以下の2つ。

  • /etc/raddb/users
  • /usr/share/freeradius/dictionary.netscreen

dictionary.netscreen

各ベンダーごとのパラメータが記載されたファイル。今回はNetScreenのためdictionary.netscreenだが、Cisco機器の場合はdictionary.ciscoとなる。

参考までにdictionary.netscreenの全文を記載する。

# -*- text -*-
#
#       From:
#       http://www.netscreen.com/support/downloads/4.0_configuring_screenOS_for_
NTdomain_v11.pdf
#

VENDOR          Netscreen                       3224

BEGIN-VENDOR    Netscreen

ATTRIBUTE       NS-Admin-Privilege                      1       integer
ATTRIBUTE       NS-VSYS-Name                            2       string
ATTRIBUTE       NS-User-Group                           3       string
ATTRIBUTE       NS-Primary-DNS                          4       ipaddr
ATTRIBUTE       NS-Secondary-DNS                        5       ipaddr
ATTRIBUTE       NS-Primary-WINS                         6       ipaddr
ATTRIBUTE       NS-Secondary-WINS                       7       ipaddr

#
#  Values VSYS-Admin and Read-Only-VSYS-Admin require a NS-VSYS-Name
#  attribute in the response packet.
#
VALUE   NS-Admin-Privilege              Root-Admin              1
VALUE   NS-Admin-Privilege              All-VSYS-Root-Admin     2
VALUE   NS-Admin-Privilege              VSYS-Admin              3
VALUE   NS-Admin-Privilege              Read-Only-Admin         4
VALUE   NS-Admin-Privilege              Read-Only-VSYS-Admin    5

END-VENDOR      Netscreen

これを見ると、NS-Admin-Privilegeという属性に1〜5の整数値を付与することでPrivilegeをRADIUSから渡すことができそうだ。

属性と値を確認したら、usersファイルを編集する。

users

viで普通に開き、ファイルの任意の位置に以下のような文を追加する。

hoge[Privilegeを付与したい任意のユーザー名]
                NS-Admin-Privilege = 1

また、以下のように書くことでLinuxユーザーではなく、このファイルで定義したユーザー名とパスワードを使用した認証も可能である。

hoge  Auth-Type := Local, User-Password == "hogehoge"
         NS-Admin-Privilege = 1

ここまで設定を完了したら以下のコマンドを実行し、NetScreenの設定変更を行う。

# /etc/init.d/radiusd restart

NetScreenの設定

ネットスクリーンでの変更点は、メニューバーより、Configuration > Admin > Administratorsへと移動し、先ほど External admin has read-write privilegeに設定した箇所をGet privilege from RADIUS serverに変更すればよい。

最後に

FreeRADIUSそんなに詳しくないにも関わらず、思いつくまま勢いで書いたため、かなり適当である。そのうちきちんとまとめよう。