2026年5月23日 星期六

PrivacyIDEA RADIUS plugin Part 3

再延續PrivacyIDEA  Radius 外掛這個主題

前導如下:

https://xrcd2.blogspot.com/2026/05/privacyidea-radius-plugin-part-2.html



privacyIDEA 帳號的取得方式,常見的有 

(1) Create a new Passwd Resolver (/etc/passwd)

(2) Create a new LDAP Resolver (如 Windows AD(Active Directory) )

(3) Create a new SQL Resolver


先建立 Resolvers 解析器 ,再建 Realm 領域 與其建立連結.


如要建立(或取得)一個 privacyIDEA 的使用者,它可以來自(1) privacyIDEA Linux 本機上的使用者.

可自行參考 https://xrcd2.blogspot.com/2025/04/privacyidea.html

或 (2) LDAP 上的帳號 可自行參考  https://xrcd2.blogspot.com/2025/04/privacyidea-2fardp-test.html 


如(1)透過本機的/etc/passwd的作法,密碼只能透過設定 PIN 碼取代之,因為 privacyIDEA 無權去讀解寫/etc/shadow


[root@2FA src]# ls -la /etc/shadow

---------- 1 root root 1327 May 23 19:45 /etc/shadow

[root@2FA src]# ls -la /etc/passwd

-rw-r--r-- 1 root root 2955 May 23 19:45 /etc/passwd

[root@2FA src]# 


(2) LDAP Resolver 對 privacyIDEA 而言它,簡單的說他只負責驗證,使用者跟Token/OTP的配對關連及登入驗證部份.


如上所述,如需更簡單的管理 privacyIDEA 上的使用者,透過 MySQL 是一個不錯的選擇.


使用情境假設. privacyIDEA 用於 VPN 及 Windows RDP 登入控管.那使用者在[遠端連回公司辦公]的安控,就是有二段完全獨立的雙因子驗證 (2FA) ,如第一階段 VPN 的部份可以用 privacyIDEA SQL 身份及OTP,第二階段 RDP 的部份,可以用 privacyIDE Windows AD 身份及OTP.這樣應該更安全了吧.


以下筆記為建立  privacyIDEA SQL 使用者帳戶的小筆記


[root@2FA src]# mysql

Welcome to the MariaDB monitor.  Commands end with ; or \g.

Your MariaDB connection id is 184

Server version: 10.11.15-MariaDB MariaDB Server


Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


MariaDB [(none)]> CREATE DATABASE vpn_users;

Query OK, 1 row affected (0.005 sec)


MariaDB [(none)]> CREATE USER 'pi_resolver'@'localhost' IDENTIFIED BY 'Passw0rd';

Query OK, 0 rows affected (0.003 sec)


MariaDB [(none)]> GRANT ALL PRIVILEGES ON vpn_users.* TO 'pi_resolver'@'localhost';

Query OK, 0 rows affected (0.001 sec)


MariaDB [(none)]> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.001 sec)


MariaDB [(none)]> use vpn_users;

Database changed

MariaDB [vpn_users]> CREATE TABLE pi_users (

    ->     id INT AUTO_INCREMENT PRIMARY KEY,

    ->     username VARCHAR(64) NOT NULL UNIQUE,

    ->     password_hash VARCHAR(255),

    ->     email VARCHAR(100),

    ->     mobile VARCHAR(20),

    ->     description VARCHAR(255)

    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Query OK, 0 rows affected (0.005 sec)


MariaDB [vpn_users]> INSERT INTO pi_users (username, email, mobile) VALUES ('testuser', 'testuser@vlab.tw', '0912345678');

Query OK, 1 row affected (0.001 sec)



MariaDB [vpn_users]>  SELECT * FROM pi_users\G;

*************************** 1. row ***************************

           id: 1

     username: testuser

password_hash: NULL

        email: testuser@vlab.tw

       mobile: 0912345678

  description: NULL

1 row in set (0.000 sec)


ERROR: No query specified


MariaDB [vpn_users]> UPDATE pi_users SET description = 'TEST User' WHERE id = 1;

Query OK, 1 row affected (0.001 sec)

Rows matched: 1  Changed: 1  Warnings: 0


MariaDB [vpn_users]>  SELECT * FROM pi_users\G;

*************************** 1. row ***************************

           id: 1

     username: testuser

password_hash: NULL

        email: testuser@vlab.tw

       mobile: 0912345678

  description: TEST User

1 row in set (0.000 sec)


ERROR: No query specified


MariaDB [vpn_users]> 



=======================


==>

 {"userid":"id","username":"username","password":"password_hash","email":"email","mobile":"mobile","description":"description"}


======================


CREATE TABLE pi_users (

    id INT AUTO_INCREMENT PRIMARY KEY,

    username VARCHAR(64) NOT NULL UNIQUE,

    password_hash VARCHAR(255),

    email VARCHAR(100),

    mobile VARCHAR(20),

    description VARCHAR(255)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;



==========================


[root@2FA ~]# vi   /etc/privacyidea/rlm_perl.ini

[Default]

URL = https://localhost/validate/check


#REALM = defrealm

#RESCONF = deflocal


REALM = mysql 

RESCONF = SQL


===================================


MariaDB [(none)]> use vpn_users;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A


Database changed

MariaDB [vpn_users]>  SELECT * FROM pi_users\G;

*************************** 1. row ***************************

           id: 1

     username: testuser

password_hash: NULL

        email: testuser@vlab.tw

       mobile: 0912345678

  description: TEST User

*************************** 2. row ***************************

           id: 2

     username: vpn.sqluser

password_hash: {SSHA256}p5yVX9/7OX0TrPdHlQhrm4rPZyi5F/8KbnPPPP/qFqsTAuA8

        email: vpn.sqluser@vlab.tw

       mobile: 0939000000

  description: VPN User in SQL

2 rows in set (0.000 sec)


ERROR: No query specified


MariaDB [vpn_users]> 


======================================

 


























PrivacyIDEA RADIUS plugin Part 2

 再延續PrivacyIDEA  Radius 外掛這個主題

前導如下:

https://xrcd2.blogspot.com/2025/09/privacyidea-radius-plugin-installation.html


整合 FreeRADIUS 與 FortiGate 進行 OTP 登入,主要有兩種常見的實作方式。

一種是將 OTP 與密碼(PIN碼)組合在同一個欄位輸入(Password/PIN+OTP),

另一種是透過挑戰-回應(Challenge-Response)機制分成兩個步驟輸入。


驗證模式選擇,根據不同的後端整合,可以選擇以下方式:


(1)組合輸入模式 (Password/PIN+OTP):

   使用者在 FortiClient 或登入介面的「密碼」欄位直接輸入 密碼(PIN碼) + 6位OTP(例如 MyPassword123456)(PIN 9999123456)。

    FreeRADIUS 接收到請求後,會自動拆分並分別驗證密碼((PIN碼) 與 OTP 碼。

    優點:設定簡單,無需處理複雜的 RADIUS 挑戰屬性。

(2)挑戰-回應模式 (Challenge-Response):

    使用者先輸入帳號密碼,FortiGate 發送第一個 RADIUS 請求。

    FreeRADIUS 回傳 Access-Challenge,FortiGate 隨即彈出第二個視窗要求輸入驗證碼。

    優點:使用者體驗較直覺,但需確保 FreeRADIUS 與 FortiGate 之間的通訊協定(如 PAP 或 MS-CHAPv2)支援此流程。


(1) 組合輸入模式    測試 


 (1)  Audit  


(2)挑戰-回應模式規則建立




(2)挑戰-回應模式 測試


(2) Audit 



Demo