我是7年前开始使用PrivacyIDEA来实现VMware Horizon平台的双因子认证的,发现其不仅稳定可靠、而且提供易于使用的Web管理页面。由于PrivacyIDEA与Horizon的集成需要FreeRadius组件,在CentOS/Rocky上部署和配置都较为复杂(Ubuntu相对容易一些),所以一直纠结发布哪种方式的部署手册。
本文章通过Docker简化PrivacyIDEA和FreeRadius的部署过程,实现了快速部署和使用。
PrivacyIDEA概述
PrivacyIDEA是一个模块化身份验证系统,使用privacyIDEA,您可以增强现有的应用程序(本地登录、VPN、远程访问、SSH连接等)在身份验证期间使用第二因素验证,提高安全性。最初,其用于OTP身份验证设备,但其他设备也可以使用。
服务器规划
服务器名称 | IP地址 | 硬件配置 | 用途 | 备注 |
---|---|---|---|---|
mgmt-radius | 192.168.10.10 | 2C/4G/80G | PrivacyIDEA | 主服务器 |
环境及软件版本信息
Docker镜像 | 版本 | 备注 |
---|---|---|
PrivacyIDEA | v3.9-patch1 | 最新的生产版本 |
FreeRadius-pi-module | latest | 用于为Horizon提供Radius服务,其会连接privacyidea验证动态口令 |
postgresql | 14 | 数据库 |
Rocky Linux | 8.8 | 操作系统环境 |
安装基础环境
为安装docker compose环境,需要先删除podman和runc两个包。
sudo dnf remove -y podman runc
添加Docker-ce的repo。
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装并启动docker-ce和docker-compose。
sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl --now enable docker
如果以非root用户运行,需要添加用户到docker组,以实现非用户用户下直接运行“docker”命令(Without sudo)。
注意:这里的“ops”是非用户的用户。
sudo usermod -aG docker ops
构建新的FreeRadius-pi-module镜像
由于默认的freeradius-pi-module镜像连接的privacyidea地址是localhost,无法在docker compose中使用,所以,我们重新重新构建一个镜像。
创建一个文件夹,名为freeradius-pi-module
mkdir ~/freeradius-pi-module
cd freeradius-pi-module
新建一个Dockerfile
cat > ~/freeradius-pi-module/Dockerfile << EOF
FROM khalibre/freeradius-pi-module:latest
RUN sed -i -e 's@URL = https://localhost/validate/check@URL = http://privacyidea/validate/check@' /etc/freeradius/rlm_perl.ini
EOF
构建新的freeradius-pi-module镜像
sudo docker build . -t freeradius-pi-module:v1.0
创建PrivacyIDEA的本地运行目录
在/usr/local下创建privacyidea目录,并创建日志目录和radius的自定义配置文件目录,data/raddb目录下的文件会更新/etc/freeradius目录下的文件,轻根据实际需要使用。
sudo mkdir -p /usr/local/privacyidea/log
sudo mkdir -p /usr/local/privacyidea/data/raddb
sudo chown -R ops /usr/local/privacyidea
创建Radius的客户端连接配置文件
为了使Horizon的UAG(或其他需要连接Radius的设备)可以连接Radius服务器,需要在Clients.conf中添加一个Client连接信息,包含允许的IP地址、密钥等信息。
注意:请根据实际需要修改。
此文件会在freeradius-pi-module启动时替换掉/etc/freeradius/目录下的clients.conf配置文件。
cat > /usr/local/privacyidea/data/raddb/clients.conf << EOF
client localhost {
ipaddr = 127.0.0.1
proto = *
secret = testing123
require_message_authenticator = no
limit {
max_connections = 16
lifetime = 0
idle_timeout = 30
}
}
client localhost_ipv6 {
ipv6addr = ::1
secret = testing123
}
client hz-uag.corp.local {
ipaddr = 192.168.10.0/24
secret = vmware
shortname = hz-uag
}
EOF
使用docker compose运行phpIPAM
完成Docker环境准备后,下面准备PrivacyIDEA的Docker-Compose配置文件,您可根据需要调整配置,例如:初始化密码等。
注意1:一定要修改数据库的密码(POSTGRESQL_PASSWORD、DB_PASSWORD)等关键信息。 注意2:也可以修改配置,使用外部的数据库,即数据库采用虚拟机部署。
例如:我们在/usr/local/privacyidea文件夹下创建"docker-compose.yml"文件,内容如下:
cat > /usr/local/privacyidea/docker-compose.yml << EOF
version: '2.1'
services:
postgresql:
image: 'docker.io/bitnami/postgresql:14'
ports:
- '5432:5432'
environment:
- POSTGRESQL_DATABASE=privacyidea
- POSTGRESQL_USERNAME=privacyidea
- POSTGRESQL_PASSWORD=privacyidea
volumes:
- privacyidea-db:/var/lib/postgresql/data
privacyidea:
image: 'docker.io/khalibre/privacyidea:v3.9-patch1'
ports:
- '80:80'
environment:
- DB_VENDOR=postgresql
- DB_NAME=privacyidea
- DB_HOST=postgresql
- DB_USER=privacyidea
- DB_PASSWORD=privacyidea
- SECRET_KEY=suppersecretkey
- PI_PEPPER=secretworduseforadminencrypt
- PI_PAGE_TITLE=pivacyIDEA
depends_on:
- postgresql
freeradius:
image: 'freeradius-pi-module:v1.0'
ports:
- "1812-1813:1812-1813/udp"
volumes:
- './log:/var/log/freeradius:rw'
- './data/raddb:/data/raddb:rw'
volumes:
privacyidea-db:
EOF
使用“docker-compose”命令启用PrivacyIDEA。
cd /usr/local/privacyidea
sudo docker compose up -d
sudo docker ps
最后,再添加防火墙的80/443端口,允许外部访问。
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=1812/udp
sudo firewall-cmd --permanent --add-port=1813/udp
sudo firewall-cmd --reload
使用Web访问PrivacyIDEA系统,进行初始化配置
浏览器访问http://
创建一个默认的Realm,也可以不创建,因为我们会集成LDAP认证;
进入到“Config”->"Users"->"New ldapresolver",创建LDAP连接;
填写LDAP连接信息;
点击“Test LDAP Resolver”,连接成功后,点击“Save resolver”;
进入"Config"->"Realms",创建一个基于LDAP认证的Realm,点击“Create realm”完成创建;
将新创建的Realm设置成默认。
为LDAP用户创建Token
进入到"Users"页面,点击要创建Token的用户;
点击“Enroll New Token”;
选择token类型,默认是一次性token,点击“Enroll Token”;
创建完成后,会提供一个二维码,用于手机APP添加Token;
注意:此二维码是一次性的,关闭页面后,无法再查看此二维码;但,可以使用API可以重新生成二维码。
最后,在手机上安装“Google Authenticator”或“PrivacyIDEA Authenticator”软件,并扫描图中二维码,即可获得动态口令。
为Horizon UAG配置Radius认证
进入Horizon UAG的“身份验证设置”,点击“编辑”按钮; 共享密码为Client.conf中的“secret”配置,端口为“1812”; 完成以上配置后,再通过Horizon Client/Web登录,提示先输入动态口令,认证通过后,再输入用户密码完成认证。
PrivacyIDEA优化配置
每次登录PrivacyIDEA都会有一个欢迎向导,通过下图所示的Policy,关闭欢迎向导。
默认情况下,APP扫描完成二维码,只显示Token ID,如果有多个Token时,不容易被识别,通过下图所示的Policy,为Token在App端增加组织信息和用户名信息。
完成
至此,我们完成了基于Docker的PrivacyIDEA+FreeRadius环境搭建,其不仅可以用户Horizon桌面的二次认证,也可以用于其他场景,详细可以参考PrivacyIDEA的官方文档。