当前位置: 首页 > DevOps > 使用Docker快速部署双因子认证(2FA)平台PrivacyIDEA

使用Docker快速部署双因子认证(2FA)平台PrivacyIDEA

DevOps 0条评论 2023-10-25 1,374 views

20193f6dfd453fefdd0bb368b26ceead.png我是7年前开始使用PrivacyIDEA来实现VMware Horizon平台的双因子认证的,发现其不仅稳定可靠、而且提供易于使用的Web管理页面。由于PrivacyIDEA与Horizon的集成需要FreeRadius组件,在CentOS/Rocky上部署和配置都较为复杂(Ubuntu相对容易一些),所以一直纠结发布哪种方式的部署手册。

本文章通过Docker简化PrivacyIDEA和FreeRadius的部署过程,实现了快速部署和使用。

PrivacyIDEA概述

PrivacyIDEA是一个模块化身份验证系统,使用privacyIDEA,您可以增强现有的应用程序(本地登录、VPN、远程访问、SSH连接等)在身份验证期间使用第二因素验证,提高安全性。最初,其用于OTP身份验证设备,但其他设备也可以使用。

服务器规划

服务器名称IP地址硬件配置用途备注
mgmt-radius192.168.10.102C/4G/80GPrivacyIDEA主服务器

环境及软件版本信息

Docker镜像版本备注
PrivacyIDEAv3.9-patch1最新的生产版本
FreeRadius-pi-modulelatest用于为Horizon提供Radius服务,其会连接privacyidea验证动态口令
postgresql14数据库
Rocky Linux8.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://,输入默认账户:admin/privacyidea登录;

创建一个默认的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的官方文档。


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注