Pure PHP radius class (do not need the radius package !)
We have implemented a pure PHP radius class following the RFC 2865 rules. Using this class, it is also possible to do WWW realm authentication.
Class abstract, full class implementation (LGPL) with helper files and examples can be found at http://developer.sysco.ch/php/
<?php
// (...)
class Radius
{
// (...)
public function Radius($ip_radius_server = '127.0.0.1', $shared_secret = '', $radius_suffix = '', $udp_timeout = 5, $authentication_port = 1812, $accounting_port = 1813)
{
// (...)
}
// (...)
function AccessRequest($username = '', $password = '', $udp_timeout = 0)
{
// (...)
$_socket_to_server = socket_create(AF_INET, SOCK_DGRAM, 17); // UDP packet = 17
if ($_socket_to_server === FALSE)
{
// (...)
}
elseif (FALSE === socket_connect($_socket_to_server, $this->_ip_radius_server, $this->_authentication_port))
{
// (...)
}
elseif (FALSE === socket_write($_socket_to_server, $packet_data, $packet_length))
{
// (...)
}
else
{
// (...)
$read_socket_array = array($_socket_to_server);
$write_socket_array = NULL;
$except_socket_array = NULL;
$received_packet = chr(0);
if (!(FALSE === socket_select($read_socket_array, $write_socket_array, $except_socket_array, $this->_udp_timeout)))
{
if (in_array($_socket_to_server, $read_socket_array))
{
if (FALSE === ($received_packet = @socket_read($_socket_to_server, 1024))) // @ used, than no error is displayed if the connection is closed by the remote host
{
// (...)
}
else
{
socket_close($_socket_to_server);
}
}
}
else
{
socket_close($_socket_to_server);
}
}
// (...)
return (2 == ($this->_radius_packet_received));
}
}
?>
Example
<?php
require_once('radius.class.php');
$radius = new Radius('127.0.0.1', 'secret');
if ($radius->AccessRequest('user', 'pass'))
{
echo "Authentication accepted.";
}
else
{
echo "Authentication rejected.";
}
?>
Radius
導入
このパッケージは、FreeBSD の libradius をもとにしたものです。 この PECL モジュールは、Radius 認証 (» RFC 2865) および Radius 課金 (» RFC 2866) を完全にサポートします。 このパッケージは、Unix (FreeBSD および Linux でテストしました) および Windows で使用可能です。
注意: libradius に関する正確な説明は» ここ にあります。設定ファイルについての詳細な説明は » ここです。
インストール手順
どうやってインストールするの?
- tar パッケージを (通常は php4/ext に) 展開する
- radius-x.x の名前を radius に変更する
- php4 ディレクトリで ./buildconf を実行する
- ./configure --enable-radius を実行する
- make; make install
- tar パッケージを展開する
- radius-x.x ディレクトリで phpize を実行する
- radius-x.x ディレクトリで ./configure を実行する
- make; make install
Windows の場合は、 » http://snaps.php.net/ から php_radius.dll をダウンロードして使用することを推奨します。 バンドルされていない PECL 拡張モジュールは » http://pecl4win.php.net/ からダウンロードできます。
定義済み定数
以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、 実行時に動的にロードされている場合のみ使用可能です。
- RADIUS_ACCESS_REQUEST ()
- 認証のリクエスト
- RADIUS_ACCESS_ACCEPT ()
- アクセスが許可されました
- RADIUS_ACCESS_REJECT ()
- アクセスが拒否されました
- RADIUS_ACCOUNTING_REQUEST ()
- 課金のリクエスト
- RADIUS_ACCOUNTING_RESPONSE ()
- 課金のレスポンス
- RADIUS_ACCESS_CHALLENGE ()
- アクセスチャレンジ
- RADIUS_USER_NAME (string)
- ユーザ名
- RADIUS_USER_PASSWORD (string)
- パスワード
- RADIUS_CHAP_PASSWORD (string)
- Chap パスワード。 chappass = md5(ident + plaintextpass + challenge)
- RADIUS_NAS_IP_ADDRESS (string)
- NAS IP アドレス
- RADIUS_NAS_PORT (int)
- NAS ポート
- RADIUS_SERVICE_TYPE (int)
-
サービスの型、以下のいずれか
- RADIUS_LOGIN
- RADIUS_FRAMED
- RADIUS_CALLBACK_LOGIN
- RADIUS_CALLBACK_FRAMED
- RADIUS_OUTBOUND
- RADIUS_ADMINISTRATIVE
- RADIUS_NAS_PROMPT
- RADIUS_AUTHENTICATE_ONLY
- RADIUS_CALLBACK_NAS_PROMPT
- RADIUS_FRAMED_PROTOCOL (int)
-
フレームのプロトコル、以下のいずれか
- RADIUS_PPP
- RADIUS_SLIP
- RADIUS_ARAP
- RADIUS_GANDALF
- RADIUS_XYLOGICS
- RADIUS_FRAMED_IP_ADDRESS (string)
- IP アドレス
- RADIUS_FRAMED_IP_NETMASK (string)
- ネットマスク
- RADIUS_FRAMED_ROUTING (int)
- ルーティング
- RADIUS_FILTER_ID (string)
- フィルタ ID
- RADIUS_FRAMED_MTU (int)
- MTU
- RADIUS_FRAMED_COMPRESSION (int)
-
圧縮、以下のいずれか
- RADIUS_COMP_NONE
- RADIUS_COMP_VJ
- RADIUS_COMP_IPXHDR
- RADIUS_LOGIN_IP_HOST (string)
- ログイン IP ホスト
- RADIUS_LOGIN_SERVICE (int)
- ログインサービス
- RADIUS_LOGIN_TCP_PORT (int)
- ログイン TCP ポート
- RADIUS_REPLY_MESSAGE (string)
- 応答メッセージ
- RADIUS_CALLBACK_NUMBER (string)
- コールバック番号
- RADIUS_CALLBACK_ID (string)
- コールバック ID
- RADIUS_FRAMED_ROUTE (string)
- フレームのルート
- RADIUS_FRAMED_IPX_NETWORK (string)
- フレームの IPX ネットワーク
- RADIUS_STATE (string)
- 状態
- RADIUS_CLASS (int)
- クラス
- RADIUS_VENDOR_SPECIFIC (int)
- ベンダ固有の属性
- RADIUS_SESSION_TIMEOUT (int)
- セッションタイムアウト
- RADIUS_IDLE_TIMEOUT (int)
- アイドルタイムアウト
- RADIUS_TERMINATION_ACTION (int)
- 停止アクション
- RADIUS_CALLED_STATION_ID (int)
- 呼び出し先ステーション ID
- RADIUS_CALLING_STATION_ID (string)
- 呼び出し元ステーション ID
- RADIUS_NAS_IDENTIFIER (int)
- NAS ID
- RADIUS_PROXY_STATE (int)
- Proxy の状態
- RADIUS_LOGIN_LAT_SERVICE (int)
- ログイン LAT サービス
- RADIUS_LOGIN_LAT_NODE (int)
- ログイン LAT ノード
- RADIUS_LOGIN_LAT_GROUP (int)
- ログイン LAT グループ
- RADIUS_FRAMED_APPLETALK_LINK (int)
- フレームの Appletalk リンク
- RADIUS_FRAMED_APPLETALK_NETWORK (int)
- フレームの Appletalk ネットワーク
- RADIUS_FRAMED_APPLETALK_ZONE (int)
- フレームの Appletalk ゾーン
- RADIUS_CHAP_CHALLENGE (string)
- チャレンジ
- RADIUS_NAS_PORT_TYPE (int)
-
NAS ポート型、以下のいずれか
- RADIUS_ASYNC
- RADIUS_SYNC
- RADIUS_ISDN_SYNC
- RADIUS_ISDN_ASYNC_V120
- RADIUS_ISDN_ASYNC_V110
- RADIUS_VIRTUAL
- RADIUS_PIAFS
- RADIUS_HDLC_CLEAR_CHANNEL
- RADIUS_X_25
- RADIUS_X_75
- RADIUS_G_3_FAX
- RADIUS_SDSL
- RADIUS_ADSL_CAP
- RADIUS_ADSL_DMT
- RADIUS_IDSL
- RADIUS_ETHERNET
- RADIUS_XDSL
- RADIUS_CABLE
- RADIUS_WIRELESS_OTHER
- RADIUS_WIRELESS_IEEE_802_11
- RADIUS_PORT_LIMIT (int)
- ポートの限界
- RADIUS_LOGIN_LAT_PORT (int)
- ログイン LAT ポート
- RADIUS_CONNECT_INFO (string)
- 接続の情報
- RADIUS_ACCT_STATUS_TYPE (int)
-
課金状態の型、以下のいずれか
- RADIUS_START
- RADIUS_STOP
- RADIUS_ACCOUNTING_ON
- RADIUS_ACCOUNTING_OFF
- RADIUS_ACCT_DELAY_TIME (int)
- 課金の遅延時間
- RADIUS_ACCT_INPUT_OCTETS (int)
- 課金の入力バイト数
- RADIUS_ACCT_OUTPUT_OCTETS (int)
- 課金の出力バイト数
- RADIUS_ACCT_SESSION_ID (int)
- 課金のセッション ID
- RADIUS_ACCT_AUTHENTIC (int)
-
課金認証、以下のいずれか
- RADIUS_AUTH_RADIUS
- RADIUS_AUTH_LOCAL
- RADIUS_AUTH_REMOTE
- RADIUS_ACCT_SESSION_TIME (int)
- 課金のセッション時間
- RADIUS_ACCT_INPUT_PACKETS (int)
- 課金の入力パケット
- RADIUS_ACCT_OUTPUT_PACKETS (int)
- 課金の出力パケット
- RADIUS_ACCT_TERMINATE_CAUSE (int)
-
課金終了の原因、以下のいずれか
- RADIUS_TERM_USER_REQUEST
- RADIUS_TERM_LOST_CARRIER
- RADIUS_TERM_LOST_SERVICE
- RADIUS_TERM_IDLE_TIMEOUT
- RADIUS_TERM_SESSION_TIMEOUT
- RADIUS_TERM_ADMIN_RESET
- RADIUS_TERM_ADMIN_REBOOT
- RADIUS_TERM_PORT_ERROR
- RADIUS_TERM_NAS_ERROR
- RADIUS_TERM_NAS_REQUEST
- RADIUS_TERM_NAS_REBOOT
- RADIUS_TERM_PORT_UNNEEDED
- RADIUS_TERM_PORT_PREEMPTED
- RADIUS_TERM_PORT_SUSPENDED
- RADIUS_TERM_SERVICE_UNAVAILABLE
- RADIUS_TERM_CALLBACK
- RADIUS_TERM_USER_ERROR
- RADIUS_TERM_HOST_REQUEST
- RADIUS_ACCT_MULTI_SESSION_ID (string)
- 課金のマルチセッション ID
- RADIUS_ACCT_LINK_COUNT (int)
- 課金のリンク数
- RADIUS_VENDOR_MICROSOFT (int)
-
Microsoft 固有のベンダ属性 (» RFC 2548)、 以下のいずれか
- RADIUS_MICROSOFT_MS_CHAP_RESPONSE
- RADIUS_MICROSOFT_MS_CHAP_ERROR
- RADIUS_MICROSOFT_MS_CHAP_PW_1
- RADIUS_MICROSOFT_MS_CHAP_PW_2
- RADIUS_MICROSOFT_MS_CHAP_LM_ENC_PW
- RADIUS_MICROSOFT_MS_CHAP_NT_ENC_PW
- RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_POLICY
- RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_TYPES
- RADIUS_MICROSOFT_MS_RAS_VENDOR
- RADIUS_MICROSOFT_MS_CHAP_DOMAIN
- RADIUS_MICROSOFT_MS_CHAP_CHALLENGE
- RADIUS_MICROSOFT_MS_CHAP_MPPE_KEYS
- RADIUS_MICROSOFT_MS_BAP_USAGE
- RADIUS_MICROSOFT_MS_LINK_UTILIZATION_THRESHOLD
- RADIUS_MICROSOFT_MS_LINK_DROP_TIME_LIMIT
- RADIUS_MICROSOFT_MS_MPPE_SEND_KEY
- RADIUS_MICROSOFT_MS_MPPE_RECV_KEY
- RADIUS_MICROSOFT_MS_RAS_VERSION
- RADIUS_MICROSOFT_MS_OLD_ARAP_PASSWORD
- RADIUS_MICROSOFT_MS_NEW_ARAP_PASSWORD
- RADIUS_MICROSOFT_MS_ARAP_PASSWORD_CHANGE_REASON
- RADIUS_MICROSOFT_MS_FILTER
- RADIUS_MICROSOFT_MS_ACCT_AUTH_TYPE
- RADIUS_MICROSOFT_MS_ACCT_EAP_TYPE
- RADIUS_MICROSOFT_MS_CHAP2_RESPONSE
- RADIUS_MICROSOFT_MS_CHAP2_SUCCESS
- RADIUS_MICROSOFT_MS_CHAP2_PW
- RADIUS_MICROSOFT_MS_PRIMARY_DNS_SERVER
- RADIUS_MICROSOFT_MS_SECONDARY_DNS_SERVER
- RADIUS_MICROSOFT_MS_PRIMARY_NBNS_SERVER
- RADIUS_MICROSOFT_MS_SECONDARY_NBNS_SERVER
- RADIUS_MICROSOFT_MS_ARAP_CHALLENGE
クイックスタート
どのように使用するの?
- radius リソースを取得する
- ライブラリを設定する
- リクエストを作成する
- 属性を設定する
- リクエストを送信する
- 属性を受け取る
- radius リソースを閉じる (オプション)
このパッケージにはサンプル PHP スクリプトが含まれています。 このスクリプトでは、PAP あるいは CHAP (md5) を使用した radius 認証の 方法を説明しています。Microsoft Radius サーバを使用して認証を行う 場合は、CHAP (md5) を使用することはできません。Microsoft のサーバを 使用する場合は、MS-CHAPv1 あるいは MS-CHAPv2 を使用する必要があります。 しかし、正しいデータを生成するために md4、sha1 および des が必要となる こともあり、これは複雑な手順となります。同梱されている例では すべての認証方式を説明しており、そこには MS-CHAPv1 および MS-CHAPv2 も含まれています。MS-CHAP を動作させるためには、拡張モジュール mcrypt および mhash が必要となります。 バージョン 1.2 以降では、mcrypt 拡張モジュールは必要なくなりました。
連絡先の情報
コメント・バグフィックス・機能拡張・あるいは開発を手伝いたいなどの場合は、 メールを » mbretter@php.net に送ってください。Windows 用のバイナリは » ここから ダウンロードできます。
目次
- radius_acct_open — 課金用の Radius ハンドルを作成する
- radius_add_server — サーバを追加する
- radius_auth_open — 認証用の Radius ハンドルを作成する
- radius_close — すべてのリソースを開放する
- radius_config — 指定した設定ファイルをライブラリに読み込ませる
- radius_create_request — 課金あるいは認証のリクエストを作成する
- radius_cvt_addr — 生データを IP アドレスに変換する
- radius_cvt_int — 生データを整数に変換する
- radius_cvt_string — 生データを文字列に変換する
- radius_demangle_mppe_key — 変形されたデータから mppe キーを得る
- radius_demangle — データを復元する
- radius_get_attr — 属性を取得する
- radius_get_vendor_attr — ベンダ固有の属性を取得する
- radius_put_addr — IP アドレス属性を設定する
- radius_put_attr — バイナリ属性を設定する
- radius_put_int — 整数属性を設定する
- radius_put_string — 文字列属性を設定する
- radius_put_vendor_addr — ベンダ固有の IP アドレス属性を設定する
- radius_put_vendor_attr — ベンダ固有のバイナリ属性を設定する
- radius_put_vendor_int — ベンダ固有の整数属性を設定する
- radius_put_vendor_string — ベンダ固有の文字列属性を設定する
- radius_request_authenticator — リクエスト認証子を返す
- radius_send_request — リクエストを送信し、応答を待つ
- radius_server_secret — 共有秘密鍵を返す
- radius_strerror — エラーメッセージを返す
radius
07-Jan-2008 10:39
08-Jul-2006 12:32
If you are constantly getting the errormessage:
Fatal error: Unknown function: radius_auth_open() in...
And your Server is a Windows-System (for example standard-xampp installation), you propably did not remove the comment symbol ";" in front of "extension=php_radius.dll" in php.ini.
If you did that, but get the error anyway:
Additionally be sure you edited the right php.ini, since xampp installs several php.exe's but only "xampp/apache/bin/php.ini" is the correct one!
It did cost me 2 days to find that out!
28-Apr-2006 12:03
To expand on the simple example by jengo at phpgroupware dot org you can add a NAS IP address to the request by using:
radius_put_addr($radius, RADIUS_NAS_IP_ADDRESS, '127.0.0.1');
and not radius_put_attr or radius_put_string. I also had to use radius_put_string for the user name and password.
14-Jan-2006 03:20
Here's a longer example that DOES do Challenge Response and works with SecurID Authentication Managers.
http://www.webtrotter.com/securid_radius.txt
(script wouldn't let me post it because of the long lines, plus it was too long of an example).
24-Oct-2005 12:26
Here is a simple example on how to auth against radius. Note: This doesn't handle challenge responses.
$radius = radius_auth_open();
if (! radius_add_server($radius,'localhost',0,'radiussecret',5,3))
{
die('Radius Error: ' . radius_strerror($radius));
}
if (! radius_create_request($radius,RADIUS_ACCESS_REQUEST))
{
die('Radius Error: ' . radius_strerror($radius));
}
radius_put_attr($radius,RADIUS_USER_NAME,'username');
radius_put_attr($radius,RADIUS_USER_PASSWORD,'password');
switch (radius_send_request($radius))
{
case RADIUS_ACCESS_ACCEPT:
echo 'GOOD LOGIN';
break;
case RADIUS_ACCESS_REJECT:
echo 'BAD LOGIN';
break;
case RADIUS_ACCESS_CHALLENGE:
echo 'CHALLENGE REQUESTED';
break;
default:
die('Radius Error: ' . radius_strerror($radius));
}