开源组件
Tacacs_plus + FreeRadius + FreeIPA
应用场景
中大型网络运维场景中网络设备的 AAA 认证,供内部网络工程师运维使用。
为什么选用这套组合 ?
综上所述
tacacs+ 更适合网络设备管理,但是在适配性上不一定能满足所有厂商的设备统一管理的需求,radius 更大众化,兼容性更好,但是在权限管理功能上稍弱、稍繁琐。这两者均在组织架构管理功能上不如 LDAP,如果我们需要 OTP 功能,tacacs+ 与 radius 还需额外的配置对接一些支持动态口令的系统,如 privacyIDEA,但是这样后端还需要部署 LDAP,那样的话会导致我们的 AAA 系统繁琐。
FreeIPA 是红帽开源的一个解决方案,,它本身不提供具体功能,而是整合了 389-ds、bind、kerberos 等核心软件包,形成一个以 389-ds(ldap)为数据存储后端,kerberos 为验证前端,bind 为主机识别,apache + tomcat 提供的一个web管理界面,统一的命令行管理界面的身份识别系统。
FreeIPA 安装简单方便,webUI 易于操作,申请 OTP、修改密码策略,修改用户分组等操作均可通过 Web 或者命令行完成,方便手工维护。搭建高可用集群也是非常简单的,文档也非常丰富。因此我们选用 FreeIPA 作为后端实现 LDAP 的功能。
最终思路
tacacs+ 作为主要网络设备通过 AAA 对接的协议,radius 作为备份渠道,兼容性更好,后端采用 FreeIPA 管理人员、分配 OTP,所有节点部署的时候均考虑高可用性,确保任何一台宕机不影响 AAA 使用。
架构设计
网络设备使用协议二选一:tacacs+ 或者 radius,无论是 tacacs+ 服务还是 freeradius 服务均通过 ldap 读取账号、密码。AAA 日志主要为 Authentication、Accounting,FreeIPA 日志主要为 LDAP 查询日志,均存放在本地,通过 filebeat 读取展示在 ELK 上。
AAA 账号体系规划
我们把需求分为几类:
本地账号,此类账号需要在 AAA 失效时确保拥有管理员权限可以远程登录,console 登录。
网络管理员账号:拥有较高的权限
系统运维账号:可以查看一些基础信息,做一些开关端口的简单操作
IT:视需求而定
脚本批量执行时的账号(无 OTP)
设备配置自动备份的账号(无 OTP)
预期效果
支持 AAA(验证、授权、审计) 认证
一套账户同时支持 tacac+ 协议、 radius 协议
账户支持绑定 OTP(动态口令认证)
支持分组,不同组别支持不同 authorization 权限,用户分组可以在 FreeIPA Web 界面完成。
高可用,FreeIPA 挂了一台或者 AAA 挂了一台均不受影响。
Prerequisites
OS:centos7
FreeIPA 安装需要 root 用户,其余不用。
规划
域名 test.net 四台机器:
域名 | 服务 | 作用 | IP |
ipa.test.net | FreeIPA | 用户管理、OTP 管理 | 192.168.0.10 |
ipa-bak.test.net | FreeIPA | 用户管理、OTP 管理 | 192.168.0.11 |
aaa1.test.net | Tacacs_plus + FreeRadius | 网络设备认证接入 | 192.168.0.20 |
aaa2.test.net | Tacacs_plus + FreeRadius | 网络设备认证接入 | 192.168.0.21 |
认证流程
用户通过 SSH 登陆网络设备
FreeIPA 高可用部署
安装 epel 源
yum install epel-release -y
安装一个软件增强随机数产生的工具 haveged,并开启,加快随机数生成。
yum install haveged
systemctl enable haveged
systemctl restart haveged
关闭 Firewalld,生产环境可以不用关,写策略只允许两台 aaa 服务器访问 FreeIPA。
systemctl stop firewalld
systemctl disable firewalld
编辑 /etc/hosts
192.168.0.10 ipa.test.net ipa.test.net
192.168.0.11 ipa-bak.test.net ipa-bak.test.net
安装 FreeIPA
yum install ipa-server ipa-server-dns
在 ipa 上执行 ipa-server-install安装 FreeIPA
注意:ipa-bak 不需要执行ipa-server-install命令
Server host name [idc01-prod-freeipahost-213794]: ipa.test.net
Warning: hostname ipa.test.net does not match system hostname idc01-prod-freeipahost-213794.
System hostname will be updated during the installation process
to prevent service failures.
The domain name has been determined based on the host name.
Please confirm the domain name [test.net]:
The kerberos protocol requires a Realm name to be defined.
This is typically the domain name converted to uppercase.
Please provide a realm name [test.NET]:
Certain directory server operations require an administrative user.
This user is referred to as the Directory Manager and has full access
to the Directory for system management tasks and will be added to the
instance of directory server created for IPA.
The password must be at least 8 characters long.
Directory Manager password:
Password (confirm):
The IPA server requires an administrative user, named 'admin'.
This user is a regular system account used for IPA server administration.
IPA admin password:
Password (confirm):
The IPA Master Server will be configured with:
Hostname: ipa.test.net
IP address(es): 192.168.0.10
Domain name: test.net
Realm name: test.NET
初始化 admin 用户密码
kinit admin
之后可以通过 https://ipa.test.net 访问了
在 ipa 上执行以下命令,创建 ipa 备份节点 gpg 文件,并将此文件传到 ipa-bak 上
kinit admin
ipa-replica-prepare ipa-bak.test.net
scp /var/lib/ipa/replica-info-ipa-bak.test.net.gpg root@ipa-bak.test.net:/var/lib/ipa/
在 ipa-bak 上执行以下命令
ipa-replica-install /var/lib/ipa/replica-info-ipa-bak.test.net.gpg
之后可以通过 https://ipa-bak.test.net 访问了
查看 ipa 集群,ipa-replica-manage list,显示如下表示两台都是 master,两边都可以编辑并同步。
ipa.test.net: master
ipa-bak.test.net: master
Web 操作
创建用户
创建用户组
这里要注意组名一定要配合后续的 tacacs 配置,需要增加 tacacs 前缀
将用户关联到用户组
申请 Token
扫描二维码,可以用 FreeOTP 或者 Google Authenticator
将用户验证方式改为密码 + OTP 的方式
以上操作完成后,应该能在另外一台 FreeIPA 上查看到。
手机查看动态口令
一些常用命令
默认密码策略有失败锁定时间 600 秒,密码多次失败后可用以下恢复。
kinit admin
ipa user-unlock liuqi
Tacacs_plus server 配置
安装编译环境
yum install gcc perl-LDAP wget
最新的 tacacs plus 源码包,此版本支持 LDAP。
http://www.pro-bono-publico.de/projects/src/DEVEL.201706241310.tar.bz2
安装
wget http://www.pro-bono-publico.de/projects/src/DEVEL.201706241310.tar.bz2
tar xvfj DEVEL.201706241310.tar.bz2
cd /PROJECTS
./configure
make && make install
创建日志文件夹
mkdir /var/log/tac_plus
mkdir /var/log/tac_plus/access
mkdir /var/log/tac_plus/acct
chmod 760 -R /var/log/tac_plus/
配置开机服务
cp ~/PROJECTS/tac_plus/extra/tac_plus.service /etc/systemd/system/
systemctl daemon-reload
配置文件模板
cp ~/PROJECTS/tac_plus/extra/tac_plus.cfg-ads /usr/local/etc/tac_plus.cfg
chmod 660 /usr/local/etc/tac_plus.cfg
修改配置文件
ldap 读取脚本具体可以查看 /usr/local/lib/mavis/mavis_tacplus_ldap.pl,可以用来修改读取的 ldap 的 attribute
注意:setenv LDAP_HOSTS这里 aaa1 指向 ipa.test.net,aaa2 指向 ipa-bak.test.net
配置文件思路:
通过mavis_tacplus_ldap.pl将 tacacs 后端验证指向 ldap 服务即 FreeIPA,形成分组映射,映射规则默认为前缀 + 组名,前缀默认为 tacacs,通过分组 admin、helpdesk 去设置不同的组别 permit 的命令不同,来形成权限的分配。
具体 cmd 权限分配参考文档:
http://www.pro-bono-publico.de/projects/tac_plus.html#AEN1427
#!/usr/local/sbin/tac_plus
id = spawnd {
listen = { port = 49 }
spawn = {
instances min = 1
instances max = 10
}
background = yes
}
id = tac_plus {
access log = /var/log/tac_plus/access/%Y%m%d.log
accounting log = /var/log/tac_plus/acct/%Y%m%d.log
mavis module = external {
setenv LDAP_SERVER_TYPE = "microsoft"
setenv LDAP_HOSTS = "ldap://ipa.test.net:389"
setenv LDAP_SCOPE = "sub"
setenv LDAP_BASE = "cn=users,cn=accounts,dc=test,dc=NET"
setenv LDAP_FILTER= "(uid=%s)"
#setenv UNLIMIT_AD_GROUP_MEMBERSHIP = "1"
setenv REQUIRE_TACACS_GROUP_PREFIX = 1
#上面意思要求 LDAP memberOF 组名里包括 tacacs 前缀,也就是组名需要为"tacacsadmin"、"tacacshelpdesk"
setenv FLAG_USE_MEMBEROF = 1
#setenv AD_GROUP_PREFIX = ""
#以上可以修改 tacacs 前缀,默认为"tacacs"
exec = /usr/local/lib/mavis/mavis_tacplus_ldap.pl
}
login backend = mavis
user backend = mavis
pap backend = mavis
skip missing groups = yes
cache timeout = 3600
#默认两分钟超时,需要重新登录才可以授权,这里改成 1 个小时。
host = world {
address = ::/0
prompt = "Welcome C=%%C Time=%c\n"
#Crypt password generate by "openssl passwd-1 clear_text_password"
enable 15 = crypt $1$/ZBGKGvh$ngiTDivqGYxuOGqKREuCj0
key = "weidian"
}
group = admin {
message = "[Admin privileges]"
default service = permit
service = shell {
default command = permit
default attribute = permit
set priv-lvl = 15
}
}
group = helpdesk {
message = "[Helpdesk privileges]"
default service = permit
enable = deny
service = shell {
default command = permit
default attribute = permit
set priv-lvl = 1
}
}
}
密码生成
用于 crypt 后续字段,例如设置 enable 密码为 test
openssl passwd -1 test
$1$/ZBGKGvh$ngiTDivqGYxuOGqKREuCj0
开启服务
systemctl enable tac_plus
systemctl restart tac_plus
测试 tacacs 用户
/usr/local/bin/mavistest /usr/local/etc/tac_plus.cfg tac_plus TACPLUS username password
成功的话输出如下
Input attribute-value-pairs:
TYPE TACPLUS
TIMESTAMP mavistest-7570-1499682756-0
USER liuqi01
PASSWORD XXXX
TACTYPE AUTH
Output attribute-value-pairs:
TYPE TACPLUS
TIMESTAMP mavistest-7570-1499682756-0
USER liuqi01
RESULT ACK
PASSWORD XXXX
SERIAL GyTr+2rGUnctmKhJLvKVsw=
DBPASSWORD XXXX
TACMEMBER "admin"
TACTYPE AUTH
FreeRadius 安装
yum install freeradius freeradius-utils freeradius-ldap freeradius-krb5
设置客户端设备,允许所有 IP 网络设备进行验证,密码 weidian
client localnet {
ipaddr = 0.0.0.0/0 #FreeIPA severs network
proto = *
secret = weidian
nas_type = other # localhost isn't usually a NAS...
limit {
max_connections = 16
lifetime = 0
idle_timeout = 30
}
}
打开验证 LDAP 功能
vim /etc/raddb/sites-enabled/default
# The ldap module reads passwords from the LDAP database.
# -ldap
ldap
if ((ok || updated) && User-Password) {
update {
control:Auth-Type := ldap
}
}
# We do NOT recommend using this. LDAP servers are databases.
# They are NOT authentication servers. FreeRADIUS is an
# authentication server, and knows what to do with authentication.
# LDAP servers do not.
#
Auth-Type LDAP {
ldap
}
打开隧道 LDAP 功能,radius 通过 tunnel 后端访问 FreeIPA
vim /etc/raddb/sites-enabled/inner-tunnel
#-ldap
ldap
if ((ok || updated) && User-Password) {
update {
control:Auth-Type := ldap
}
}
# We do NOT recommend using this. LDAP servers are databases.
# They are NOT authentication servers. FreeRADIUS is an
# authentication server, and knows what to do with authentication.
# LDAP servers do not.
#
Auth-Type LDAP {
ldap
}
开启 ldap 验证 mod
ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/
修改 /etc/raddb/mods-enabled/ldap 指向 FreeIPA
注意:aaa1 指向 ipa.test.net,aaa2 指向 ipa-bak.test.net
server = "ipa.test.net"
base_dn = "dc=test,dc=NET"
开启 radius 服务,或者用 radiusd -X 测试
systemctl enable radiusd
systemctl restart radiusd
测试,userpassowrd 用密码 + otp 验证。
radtest <user> <userpassword> <freeradius server> <port> <radius secret>
如果测试成功会出现
Received Access-Accept Id 239 from 127.0.0.1:1812 to 127.0.0.1:13395 length 20
网络设备配置
这块各个厂商手册里均有详细介绍,举一个例子,不过多描述。
以下配置配置两台 tacacs+ server,可以冗余切换
Cisco nexus
aaa authentication login default group tacacs-server local
aaa authentication login console local
aaa authorization config-commands default group tacacs-server local
aaa authorization commands default group tacacs-server local
aaa accounting default group tacacs-server local
tacacs-server host 192.168.0.20 key 7 "fewhg"
aaa group server tacacs+ tacacs-server
server 192.168.0.20
server 192.168.0.21
source-interface Vlan102
radius-server host 192.168.0.20 key 7 "fewhg" authentication accounting
radius-server host 192.168.0.21 key 7 "fewhg" authentication accounting
aaa group server radius radius-server
server 192.168.0.20
server 192.168.0.21
source-interface Vlan102
TrobleShooting
调试 debug 信息,需要先关闭 tac_plus 和 freeradius 服务
Tacacs_plus
/usr/local/sbin/tac_plus -d 4088 -fp /var/run/tac_plus.pid /usr/local/etc/tac_plus.cfg -d 15
Freeradius
radiusd -X
FreeIPA
tail -f /var/log/dirsrv/slapd-test-NET/access
tail -f /var/log/dirsrv/slapd-test-NET/errors
一些常见的坑
tacacs+ 有 cache 时间,过了时间后授权会失败,默认两分钟,上文中已提到修改
freeIPA 配置高可用的时候,第二台不需要预先执行 server-install
遇到问题的时候,先理清楚认证流程,锁定出问题的环节,再排查具体配置。整套认证流程很清晰,一般认证出错会有以下情况:
tacacs、radius 未收到请求,检查网络、防火墙、服务是否正常运行
收到请求但是拒绝了,去检查白名单、AAA 对接密码
收到请求向后端 LDAP 查询出错,例如没有找到 memberOf 属性,去 freeipa 上看日志,看一下前端查询的是什么命令,base DN 等信息有没有错,还有个简单的方法,直接修改调用的 perl 脚本,把查询的 attribute 修改为一些系统默认的属性,确认。还有一些 ldapsearch 等 openldap 常见命令可以配合排查。
密码不正确,确认你的用户分组信息正确,确认 OTP 已绑定,确认不是失败多次锁定的情况,通过上文提到的用户测试工具排查
/usr/local/bin/mavistest /usr/local/etc/tac_plus.cfg tac_plus TACPLUS username password
冗余测试
服务器关闭,登陆无影响,授权由于用户信息有缓存,需要重新登录。
FreeIPA 服务器关闭,无影响,开启后会自动重新同步。
其他
日志搜集
审计功能需要在 tacacs 日志目录已经 freeradius 目录下找到,建议通过 filebeat 等工具打到 elk 上展示。
例如:/var/log/tac_plus/acct/20170711.log
2017-07-11 15:59:57 +0800 10.2.2.88 liuqi 0 10.2.130.89 stop task_id=10.2.130.89@pts/0 start_time=1499759997 timezone=GMT cmd=show running-config ntp (SUCCESS) service=none
2017-07-11 16:14:58 +0800 10.2.2.88 liuqi 0 10.2.130.89 stop task_id=10.2.130.89@pts/0 start_time=1499760898 timezone=GMT stop_time=1499760898 service=none
2017-07-11 16:21:38 +0800 10.2.2.88 liuqi 0 10.2.130.89 start task_id=10.2.130.89@pts/0 start_time=1499761298 timezone=GMT service=none
总结
经上述配置,我们可以搭建一套供网络运维用的 AAA 认证体系,一般公司网络工程师数量较少,对 AAA 服务访问量较小,所以此套环境足够承载上百台网络设备的认证授权。
希望对大家的工作有帮助和启发。