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.";
}
?>
CXXIX. Radius
導入
このパッケージは、FreeBSD の libradius をもとにしたものです。 この PECL モジュールは、Radius 認証 (RFC 2865) および Radius 課金 (RFC 2866) を完全にサポートします。 このパッケージは、Unix (FreeBSD および Linux でテストしました) および Windows で使用可能です。
インストール手順
どうやってインストールするの?
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 スナップショットのページ(使用する PHP のバージョンに応じて以下の適切なレポジトリを 選択してください)からこのバンドルされていない PECL エクステンションを入手することができます。 : PECL for PHP 4.3.x, PECL for PHP 5.0.x または PECL Unstable。
定義済み定数
以下の定数が定義されています。 この関数の拡張モジュールが 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 -- エラーメッセージを返す
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!
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.
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).
Here is a simple example on how to auth against radius. Note: This doesn't handle challenge responses.
<?php
$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));
}
?>
