FreeRADIUS3 - エラー: exec からの出力の解析に失敗しました。演算子が必要です。

FreeRADIUS3 - エラー: exec からの出力の解析に失敗しました。演算子が必要です。

OTP 認証用の FreeRADIUS 3 では、認証は成功しますが、FreeRADIUS は応答を解析できません。

テスト コマンドを送信し、デバッグ出力 ( radiusd -X) を監視すると、外部プログラムからの応答が適切であるように見えても出力が解析されないという、次に示すようなエラーが発生します。

# below, totp.py generates a TOTP for johnboy, to aid testing
# using pyotp package to make testing easier...

radtest -t mschap johnboy $(./totp.py) localhost 0 testing123
.
.
.
(4) eap: No EAP-Message, not doing EAP
(4)     [eap] = noop
(4)     [expiration] = noop
(4)     [logintime] = noop
(4) multiotp: Executing: /usr/local/bin/multiotp.php '%{User-Name}' '%{User-Password}' -request-nt-key -src=%{Packet-Src-IP-Address} -chap-challenge=%{CHAP-Challenge} -chap-password=%{CHAP-Password} -ms-chap-challenge=%{MS-CHAP-Challenge} -ms-chap-response=%{MS-CHAP-Response} -ms-chap2-response=%{MS-CHAP2-Response}:
(4) multiotp: EXPAND %{User-Name}
(4) multiotp:    --> johnboy
(4) multiotp: EXPAND %{User-Password}
(4) multiotp:    --> 
(4) multiotp: EXPAND -src=%{Packet-Src-IP-Address}
(4) multiotp:    --> -src=127.0.0.1
(4) multiotp: EXPAND -chap-challenge=%{CHAP-Challenge}
(4) multiotp:    --> -chap-challenge=
(4) multiotp: EXPAND -chap-password=%{CHAP-Password}
(4) multiotp:    --> -chap-password=
(4) multiotp: EXPAND -ms-chap-challenge=%{MS-CHAP-Challenge}
(4) multiotp:    --> -ms-chap-challenge=0xf54c102e95a800d8
(4) multiotp: EXPAND -ms-chap-response=%{MS-CHAP-Response}
(4) multiotp:    --> -ms-chap-response=0x0001000000000000000000000000000000000000000000000000e3004419ce4b084c0b073836fd40f3828fcc7c4223b0dcc5
(4) multiotp: EXPAND -ms-chap2-response=%{MS-CHAP2-Response}
(4) multiotp:    --> -ms-chap2-response=
(4) multiotp: ERROR: Failed parsing output from: /usr/local/bin/multiotp.php '%{User-Name}' '%{User-Password}' -request-nt-key -src=%{Packet-Src-IP-Address} -chap-challenge=%{CHAP-Challenge} -chap-password=%{CHAP-Password} -ms-chap-challenge=%{MS-CHAP-Challenge} -ms-chap-response=%{MS-CHAP-Response} -ms-chap2-response=%{MS-CHAP2-Response}: Expecting opera
tor
(4) multiotp: ERROR: Program returned code (0) and output 'Filter-Id += "<user_group>",NT_KEY: A7C014D1209A4078F1003810BDB08BE6  '
(4)     [multiotp] = fail
(4)   } # authorize = fail
(4) Using Post-Auth-Type Reject
(4) # Executing group from file /etc/raddb/sites-enabled/default
(4)   Post-Auth-Type REJECT {
.
.
.

答え1

からFreeRADIUS メーリングリストMultiOTP からの応答は'Filter-Id += "<user_group>",NT_KEY: A7C014D1209A4078F1003810BDB08BE6 'FreeRADIUS 3 では有効ではありませんが、FreeRADIUS 2 では機能する可能性があります。

私はラッパースクリプトを使用して[MultiOTP[(からの出力を解析することでこの問題を回避しました。https://github.com/multiOTP/multiotp)、FreeRADIUS 認証プロセス内の 'authenticate' セクションの 'exec' ステップでは 'Filter-Id += "Erica-Users' の部分のみを返し、'authorize' ステップの 'mschap' ステップでは 'NT_KEY: A7C014D1209A4078F1003810BDB08BE6' の部分のみを返します。

FreeRADIUS 3とMultiOTPのドキュメントは注目に値する。マルチOTP README.md、そして繰り返しFreeRADIUS ウィキは、執筆時点ではそうではなく、FreeRADIUS 3 で実際に使用されるファイル名は示されません。

MultiOTP 自体の設定手順は正確です。

フリーRADIUS3優れたオンラインドキュメントがあるここ、そして丁寧で親切なメーリングリスト

同じ問題に取り組んでいる方のために、FreeRADIUS 3 構成のコード スニペットをいくつか示します。仮想サーバー構成ファイルは、特定の環境に固有のものである可能性があるため、ここでは示していません。

/usr/local/bin/multiotp_wrapper_mschap.sh:

#!/bin/bash

# Extract Filter-Id

user_name=$1
user_password=$2
packet_src_ip_address=$3
ms_chap_challange=$4
ms_chap_response=$5

/usr/local/bin/multiotp.php ${user_name} ${user_password} -request-nt-key -src=${packet_src_ip_address} -ms-chap-challenge=${ms_chap_challange} -ms-chap-response=${ms_chap_response} | sed -e 's/.*,//'

/usr/local/bin/multiotp_wrapper_exec.sh

#!/bin/bash

# Extract NT_KEY

user_name=$1
user_password=$2
packet_src_ip_address=$3
ms_chap_challange=$4
ms_chap_response=$5

/usr/local/bin/multiotp.php ${user_name} ${user_password} -request-nt-key -src=${packet_src_ip_address} -ms-chap-challenge=${ms_chap_challange} -ms-chap-response=${ms_chap_response} | sed -e 's/,NT_KEY.*$//'

/etc/raddb/mods-enabled/multiotp:

exec multiotp {  
  wait = yes
  input_pairs = request
  output_pairs = reply
  program = "/usr/local/bin/multiotp_wrapper_exec.sh '%{User-Name}' '%{User-Password}' %{Packet-Src-IP-Address} %{MS-CHAP-Challenge} %{MS-CHAP-Response}"
  shell_escape = yes
}

/etc/raddb/mods-enabled/multiotpmschap:

mschap multiotpmschap {
  # ntlm_auth = "/usr/local/bin/multiotp.php '%{User-Name}' '%{User-Password}' -request-nt-key -src=%{Packet-Src-IP-Address} -chap-challenge=%{CHAP-Challenge} -chap-password=%{CHAP-Password} -ms-chap-challenge=%{MS-CHAP-Challenge} -ms-chap-response=%{MS-CHAP-Response} -ms-chap2-response=%{MS-CHAP2-Response}"
  ntlm_auth = "/usr/local/bin/multiotp_wrapper_mschap.sh '%{User-Name}' '%{User-Password}' %{Packet-Src-IP-Address} %{MS-CHAP-Challenge} %{MS-CHAP-Response}"
  pool {
    start = ${thread[pool].start_servers}
    min = ${thread[pool].min_spare_servers}
    max = ${thread[pool].max_servers}
    spare = ${thread[pool].max_spare_servers}
    uses = 0
    retry_delay = 30
    lifetime = 86400
    cleanup_interval = 300
    idle_timeout = 600
  }
}

答え2

他の人が「エラー: 出力の解析に失敗しました」というメッセージを受け取る場合に備えて、multiotp.ini の「ログの表示」オプションを確認してください。このオプションが有効になっていると、問題が発生する可能性もあります。

参照する: 参考:

関連情報