实战 -- 用freeipa + freeradius + freeotp 实现juniper netscreen FW的VPN通过"密码+OTP"双因素认证方式拨入

要从公司外访问公司内网的资源,需要通过vpn拨入公司内部。为了安全,公司VPN的拨入认证方式使用了双因素认证方式。先前公司用的是RSA SecurID,后来改成了便宜的国产DynamicCode token,现在我们想用手机软件freeOTP来替代这个token,实现免费的双因素认证的VPN拨入。

名词解释

先解解释一下几个常用的名词:

OTP 一次性密码(英语:One Time Password,简称OTP),又称动态密码或单次有效密码。

2FA 双重认证(英语:Two-factor authentication,缩写为2FA),又译为双重验证、双因素认证、二元认证,又称两步骤验证(2-Step Verification,又译两步验证),是一种认证方法,使用两种不同的元素,合并在一起,来确认用户的身份,是多因素验证中的一个特例。

freeotp 可以在智能手机上安装通过OTP的双因素认证APP,用于代替物理token。FreeOPT 支持开放标准协议 TOTPHOTP

freeipa 是一个带web UI的集中管理身份、认证、访问控制等方面的开源免费软件 ,集成了389LDAP,MIT Kerberos等软件

RADIUS 远端用户拨入验证服务(RADIUS, Remote Authentication Dial In User Service)是一个AAA协议,意思就是同时兼顾验证(authentication)、授权(authorization)及计费(accounting)三种服务的一种网络传输协议(protocol),通常用于网络存取、或流动IP服务,适用于局域网及漫游服务。

看看几种token介绍

RSA SecurID长下面这样:

DynamicCode token 长下面这样:

手机上免费的freeOTP:

用户使用freeOTP 进行VPN拨入的过程

一图胜千言,下图是用户使用freeOTP 进行VPN拨入的过程

系统安装

为了安装最新版本的freeIPA(4.7.0版本), 我这边对我的ubuntu16.04_LTS的操作系统进行了升级。因为之前在这个版本上安装的是freeIPA-4.3.1版本,测试下来,无法进行OTP认证。原因一直没有找到,花了整整一天的时间,可能还是因为之前的版本bug太多的原因,我在16.04上进行ipa-server-upgrade操作,也无法把freeIPA升级到最新的4.7版本。实测,在Ubuntu18.04_LTS版本上,可以安装freeIPA4.7.0,如下图:

把操作系统从ubuntu16.04_LTS 升级到 ubuntu18.04_LTS 参考链接

1
2
3
4
5
6
7
8
9
10
11
# 先对当前Ubuntu 16.04 LTS上的软件进行升级
sudo apt update && sudo apt dist-upgrade && sudo apt autoremove

# 安装 Ubuntu Update Manager 并确认lts配置
sudo apt-get install update-manager-core
sudo vi /etc/update-manager/release-upgrades
确认
Prompt=lts

# 执行 Ubuntu 18.04 LTS Upgrade
sudo do-release-upgrade -d

freeIPA 安装配置

在完成Ubuntu18.04_LTS安装后,就可以进行freeIPA的安装了,参考链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# config hostname
hostnamectl set-hostname ipa.xxx.com
echo "172.18.248.82 ipa.xxx.com ipa" >> /etc/hosts

# nstall and configure rng-tools for [achieve high entropy](https://www.howtoing.com/helping-the-random-number-generator-to-gain-enough-entropy-with-rng-tools-debian-lenny)
apt-get install rng-tools
echo "HRNGDEVICE=/dev/urandom" >> /etc/default/rng-tools
systemctl enable rng-tools
systemctl start rng-tools

# install FreeIPA Server Package
apt-get install freeipa-server -y

# configure ipa-server
ipa-server-install
# configration settings:
# Do you want to configure integrated DNS (BIND)? [no]: Enter
# Server host name [ipa.xxx.com]: Enter
# Directory Manager password:<your password>
# IPA admin password: <your password>
# Continue to configure the system with these values? [no]: yes

# ufw(FireWall) setting, enable ports bollow come in
ufw enable
for i in 80 443 389 636 88 464; do ufw allow proto tcp from any to any port $i; done
for i in 88 464 123; do ufw allow proto udp from any to any port $i; done
ufw reload

# Check Kerberos tickets:
kinit admin
klist
# the admin kerberos tickets like bollow
# Ticket cache: KEYRING:persistent:0:0

在完成ipaserver安装后,就可以通过浏览器来访问ipaserver了,请先设置好ipa.xxx.com的DNS指向或在你本机(windows)的hosts文件中添加相应的记录,然后用浏览器访问 https://ipa.xxx.com (请注意,因为浏览器证书是系统自认证的,所以要让你的浏览器信任这个自认证证书) :

使用之前ipa-server-install时设置的admin用户的密码就可以登录前台ipaserver的前台WEB进行用户管理了,如下图:

在FreeIPA 前台WEB上添加用户,并增加OTP认证

1、用admin 帐号登录前台WEB,如上图

2、在身份–用户类别–活跃用户 的右则点击 添加 按钮,添加一个新用户otpuser,并设置密码,如下图:

3、登出admin, 然后用otpuser用户再次登录,第一次登录,要示更改密码,如下图:

4、登录后,在身份–用户类别–活跃用户 点击otpuser用户,在“操作”下拉菜单中,选择“添加OTP令牌”,然后选择默认的TOTP,添加,如下图:

5、在生成 OTP token 的二维码后,在智能手机上,用安装好的FreeOTP 客户端扫描这个 OTP token 二维码。如下图:

6、在智能手机上,FreeOTP在扫描完成二维码后,会生成一个token,点击会显示一个6位数字,这个数字是在用户进行OTP登录时,需要在用户密码后面一起输入的,不然会显示密码错误。如下图:

7、再次用admin 登录,在身份–用户类别–活跃用户 点击otpuser用户,设置这个用户为 密码+OTP认证方式并保存,如下图:

8、登出,再次用otpuser登录,用之前的密码将出错,需要用密码+OTPpasswd才能成功登录。

用 ipa 命令来完成用户管理工作

当然,上面的WEB界面操作有些繁琐,我更喜欢使用 ipa 系列命令来完成相关操作。下面我会以admin身份用 ipa 命令行工具来完成新增用户/设置密码/设置用户OTP认证方式等操作,这个是官网ipaserver+otp配置与测试链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 用kinit admin命令,以admin身份登录:
kinit admin

# 用ipa命令增加一个测试用户otpuser并设置密码
ipa user-add otpuser
ipa passwd otpuser

# 设置otpuser用户认证方式为otp认证(双因素认证)
ipa user-mod otpuser --user-auth-type=otp

# 为otpuser 用户增加一个OTP token二维码
ipa otptoken-add --owner=otpuser
# 这将会显示一个OTP token 的二维码图片,可以用FreeOTP软件在智能手机上扫描获取这个OTP token.
# 用otpuser用户及密码+OTPpasswd在WEB界面登录,看是否可以成功,如果成功,就证明otp认证已经完成。第一次登录可能要更改密码,在更改密码时,也要提供OTPpasswd。

用 ipa otptoken-add 命令生成 OTPtoken

在登录时,要输入passwd+otppasswd(注:+号不要输入哈)

第一次登录可能要更改密码,在更改密码时,也要提供OTPpasswd

安装配置 freeRadius

为什么要使用FreeRadius?

RADIUS 远端用户拨入验证服务,顾名思义,FreeRadius其实就是一个免费的远端用户拨入验证服务。这里FreeRadius的作用就是把Junifer FW 发过来用户远程拨入的AAA验证请求转发给freeIPA的LDAP服务进行认证(密码+OTP认证),并把认证结果返给Junifer FW。如果认证成功,Junifer FW 就会和用户建立VPN 隧道,让用户可以访问公司内网资源。

freeRadius 安装配置相关链接参考

1、 安装freeRadius

1
apt-get install freeradius freeradius-utils freeradius-ldap freeradius-krb5

2、配置 freeRadius

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
### 配置Juniper FW的IP可以访问freeRadius
vi /etc/freeradius/3.0/clients.conf
# 在最后面增加下面的内容,(ipaddr 为juniper的ip地址,secret 为juniper内配置的访问密码):
client juniper {
ipaddr = 172.18.254.0/24
proto = *
secret = juniper_password
limit {
max_connections = 16
lifetime = 0
idle_timeout = 30
}
}

### 在sites-enabled/default 中增加认证ldap支持
vi /etc/freeradius/3.0/sites-enabled/default
# 找到 -ldap 把 -ldap替换为下面的内容:
ldap
if ((ok || updated) && User-Password) {
update {
control:Auth-Type := ldap
}
}
# 把下面三行注释解除
Auth-Type LDAP {
ldap
}

# link ldap mods
ln -s /etc/freeradius/3.0/mods-available/ldap /etc/freeradius/3.0/mods-enabled/ldap

# 编辑ldap,设置 ldap server 和 base_dn
vi /etc/freeradius/3.0/mods-enabled/ldap
# 更改 server 配置为你的ipa server DNS name
server = 'ipa.xxx.com'
# 更改你的 base_dn ,注意,这里要多加两个cn=users,cn=compat, 不然认证不过去
base_dn = 'cn=users,cn=compat,dc=xxx,dc=com'

# 打开ufw 防火墙udp 1812 1813端口
for i in 1812 1813; do ufw allow proto udp from any to any port $i; done
ufw reload

#重启freeradius服务
service freeradius restart

如果你想在切换Junifer FW Radius服务器前先测试一下freeRadius+freeIPA的配置是否已经成功了,可以用radtest进行一下测试,测试方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 配置本机的IP可以访问freeRadius
vi /etc/freeradius/3.0/clients.conf
client ipa {
ipaddr = 172.18.248.82
proto = *
secret = juniper_password
limit {
max_connections = 16
lifetime = 0
idle_timeout = 30
}
}
# 重启freeradius服务
service freeradius restart
# 用radtest命令进行测试
radtest otpuser otpuserpasswd744480 172.18.248.2 1812 juniper_password
# radtest 参数解释
## otpuser 用户名
## otpuserpasswd744480 密码+6位OTP密码
## 172.18.248.2 freeradius服务器ip
## 1812 freeradius服务器端口
## juniper_password 是clients.conf中配置的secret 值

好了,freeRadius to freeIPA ldap 的配置就这样完成了。当用户向Junifer FW提供 (用户名/密码/OTP密码) 请求L2TP/IPSEC VPN 连接时,Junifer FW就会把AAA验证信息(用户名/密码+OTP密码)送达freeRadius,freeRadius就会把认证信息代理到freeIPA的ldap 进行认证,如果认证成功,freeRadius就会把成功返回给Junifer FW, Junifer FW 就会和用户建立VPN连接。

注意事项

最后,说说注意事项:

1、freeipa 服务器的对时,在ubuntu18.04_LTS系统上,默认在安装 freeipa4.7版本是,会使用chronyd服务来对时,而不是之前的ntp服务来对时。chronyd的配置文件为 /etc/chrony/chrony.conf,如果ipaserver没有对外访问tpc/udp 123的权限,那可以使用公司内的对时服务器,比如域控服务器,增加一条 “server your_timeserver_ip iburst” 的配置就可以了。这个服务器一定启着,因为我们用的OTP是TOTP,也就是Time One time password,如果服务器时间不准,TOTP是会出错的。

注意,千万不要再去画蛇添足,用apt安装 ntp服务包,我就是手贱外加无知, apt-get install ntp -y 直接把freeipa给卸载掉了,因为freeipa包依赖chrony,而 chrony和ntp两个包是互斥的,安装ntp就会删除chrony,同时也就把freeipa给删除了。还好,系统在卸载freeipa时,没有把配置及数据删除。重新apt-get install freeipa就恢复了。

坚持原创技术分享,您的支持将鼓励我继续创作!