OTP 加密工具
自 NetScaler 版本 13.0 Build 41.20 起,OTP 密钥数据以加密格式存储,而非纯文本格式,以增强安全性。以加密格式存储OTP密钥是自动的,不需要手动干预。
以前,NetScaler 设备将 OTP 密钥以纯文本形式存储在活动目录中。以纯文本格式存储 OTP 密钥会构成安全威胁,因为恶意攻击者或管理员可以通过查看其他用户的共享密钥来利用这些数据。
OTP 加密工具具有以下优势:
- 即使您的旧设备使用的是旧格式(纯文本),也不会导致任何数据丢失。
- 对旧 NetScaler Gateway 版本的向后兼容性支持有助于集成和支持现有设备以及新设备。
- OTP 加密工具可帮助管理员同时迁移所有用户的所有 OTP 密钥数据。
注意
OTP 加密工具不会加密或解密 KBA 注册或电子邮件注册数据。
OTP 加密工具的使用
OTP 加密工具可用于执行以下操作:
- 加密。以加密格式存储 OTP 密钥。该工具提取在 NetScaler 注册的设备的 OTP 数据,然后将纯文本格式的 OTP 数据转换为加密格式。
- 解密。将 OTP 密钥恢复为纯文本格式。
- 更新证书。管理员可以随时将证书更新为新证书。管理员可以使用该工具输入新证书并使用新证书数据更新所有条目。证书路径必须是绝对路径或相对路径。
重要提示
- 必须在 NetScaler 设备中启用加密参数才能使用 OTP 加密工具。
- 对于在 Build 41.20 之前向 NetScaler 注册的设备,必须执行以下操作:
- Upgrade the 13.0 NetScaler appliance to 13.0 build 41.20.
- Enable the encryption parameter on the appliance.
- Use the OTP Secret migration tool to migrate OTP secret data from plain text format to encrypted format.
- OTP 加密工具仅支持单值用户属性。它不支持多值用户属性。
纯文本格式的 OTP 密钥数据
示例:
#@devicename=<16 or more bytes>&tag=<64bytes>&,
正如您所看到的,旧格式的起始模式始终是“#@”,结束模式始终是“&”。“devicename=”和结束模式之间的所有数据均构成用户一次性密码数据。
加密格式的 OTP 密钥数据
OTP 数据的新加密格式为以下格式:
示例:
{
"otpdata”: {
“devices”: {
“device1”: “value1”,
“device2”: “value2”, …
}
}
}
<!--NeedCopy-->
其中,value1 是 KID + IV + 密码数据的 base64 编码值
密码数据的结构如下:
{
secret:<16-byte secret>,
tag : <64-byte tag value>
alg: <algorithm used> (not mandatory, default is sha1, specify the algorithm only if it is not default)
}
<!--NeedCopy-->
- 在“devices”中,您有每个名称的值。值是 base64encode (KID) .base64encode (IV) .base64encode(cipherdata)。
- KID 是密钥 ID 值,用于标识用于 OTP 机密数据加密的证书。密钥 ID 特别有用,尤其是在使用多个证书进行 OTP 机密数据加密时。
- 在标准 AES 算法中,IV 始终作为前 16 或 32 字节的密码数据发送。您可以遵循同样的模式。
- 尽管密钥保持不变,但每台设备的 IV 都不同。
注意:
OTP 数据的加密格式存储在用户属性 AD 中。
OTP 加密工具设置
注意
要运行 OTP 加密工具,Citrix 建议您使用带有 Python 环境的替代平台,而不是 NetScaler 设备。
OTP 加密工具位于目录 \var\netscaler\otptool
中。您必须从 NetScaler 源代码下载代码,然后使用所需的 AD 凭据运行该工具。
- 使用 OTP 加密工具的必备条件:
- 在运行此工具的环境中安装 python 3.5 或更高版本。
- 安装 pip3 或更高版本。
- 运行以下命令:
- pip install -r requirements.txt。自动安装要求。
- python main.py。调用 OTP 加密工具。必须根据迁移 OTP 密钥数据的需要提供所需的参数。
- 该工具可以位于 shell 提示符中的
\var\netscaler\otptool
。 - 使用所需的 AD 凭据运行该工具。
OTP 加密工具界面
下图显示了一个示例 OTP 加密工具界面。该接口包含为加密/解密/证书升级必须定义的所有参数。此外,还记录了每个参数的简要描述。
OPERATION 参数
必须定义 OPERATION 参数才能使用 OTP 加密工具进行加密、解密或证书升级。
下表总结了一些可以使用 OTP 加密工具和相应的 OPERATION 参数值的场景。
场景 | OPERATION 参数值和其他参数 |
---|---|
在同一属性中将纯文本 OTP 密钥转换为加密格式 | 将 OPERATION 参数值输入为 0,并为源和目标属性提供相同的值。示例: python3 main.py -Host 192.0.2.1 –Port 636 -username ldapbind_user@aaa.local -search_base cn=users,dc=aaa,dc=local -source_attribute unixhomedirectory -target_attribute unixhomedirectory -operation 0 -cert_path aaatm_wild_all.cert
|
将纯文本 OTP 密钥转换为不同属性中的加密格式 | 将 OPERATION 参数值输入为 0,并为源和目标属性提供相应的值。示例: python3 main.py -Host 192.0.2.1 –Port 636 -username ldapbind_user@aaa.local -search_base cn=users,dc=aaa,dc=local -source_attribute unixhomedirectory -target_attribute userparameters -operation 0 -cert_path aaatm_wild_all.cert
|
将加密的条目转换回纯文本 | 将 OPERATION 参数值输入为 1,并为源和目标属性提供相应的值。示例: python3 main.py -Host 192.0.2.1 –Port 636 -username ldapbind_user@aaa.local -search_base cn=users,dc=aaa,dc=local -source_attribute unixhomedirectory -target_attribute userparameters -operation 1 -cert_path aaatm_wild_all.cert
|
将证书更新为新证书 | 输入 OPERATION 参数值 2,然后在相应的参数中提供所有先前的证书和新证书的详细信息。示例: python3 main.py -Host 192.0.2.1 –Port 636 -username ldapbind_user@aaa.local -search_base cn=users,dc=aaa,dc=local -source_attribute unixhomedirectory -operation 2 -cert_path aaatm_wild_all.cert –new_cert_path aaatm_wild_all_new.cert
|
CERT_PATH 参数
CERT_PATH 参数是一个包含在 NetScaler 中用于加密数据的证书的文件。用户必须为所有三项操作(即 加密、解密 和 更新证书)提供此参数。
CERT_PATH 参数文件必须包含 PEM 或 CERT 格式的证书和关联的私钥(不支持 pfx)。
例如,如果 certicate.cert 和 certificate.key 文件对应于证书文件及其私钥,则在类似 Unix 的系统中,以下命令会创建可用作 cert_path 标志值的 certkey.merged
文件。
$ cat certificate.cert certificate.key > certkey.merged
$
<!--NeedCopy-->
关于证书的注意事项
- 用户必须提供在 NetScaler 设备中全局绑定的相同证书以进行用户数据加密。
- 证书必须在同一文件中包含 Base64 编码的公共证书及其对应的 RSA 私钥。
- 证书的格式必须是 PEM 或 CERT。证书必须遵守 X509 格式。
- 此工具不接受密码保护的证书格式和 .pfx 文件。在向工具提供证书之前,用户必须将 PFX 证书转换为 .cert 。
SEARCH_FILTER 参数
SEARCH_FILTER 参数用于筛选 Active Directory 域或用户。
示例:
-
-search_filter "(sAMAccountName=OTP*)"
:筛选 samAccountName(用户登录名)以“OTP”开头的用户。 -
-search_filter "(objectCategory=person)"
:筛选人物类型的对象类别。 -
-search_file "(objectclass=*)"
:筛选所有对象。
在 NetScaler 设备中启用加密选项
要加密纯文本格式,必须在 NetScaler 设备中启用加密选项。
要使用 CLI 启用 OTP 加密数据,请在命令提示符下键入:
set aaa otpparameter [-encryption ( ON | OFF )]
示例:
set aaa otpparameter -encryption ON
OTP 加密工具用例
OTP 加密工具可用于以下用例。
使用 NetScaler 设备版本 13.0 build 41.20 注册新设备
当您向 NetScaler 设备版本 13.0 build 41.x 注册新设备时,如果启用了加密选项,则 OTP 数据将以加密格式保存。您可以避免手动干预。
如果未启用加密选项,OTP 数据将以纯文本格式存储。
迁移版本 13.0 Build 41.20 之前注册的设备的 OTP 数据
您必须执行以下操作才能加密在 13.0 build 41.20 之前在 NetScaler 设备中注册的设备的 OTP 密钥数据。
- 使用转换工具将 OTP 数据从纯文本格式迁移到加密格式。
- 在 NetScaler 设备上启用“加密”参数。
- 要使用 CLI 启用加密选项,请执行以下操作:
set aaa otpparameter -encryption ON
- 要使用 GUI 启用加密选项,请执行以下操作:
- 导航到 Security(安全)> AAA – Application Traffic(AAA - 应用程序流量),然后单击 Authentication Settings(身份验证设置)部分下的 Change authentication AAA OTP Parameter(更改身份验证 AAA OTP 参数)。
- 在 Configure AAA OTP Parameter(配置 AAA OTP 参数)页面上,选择 OTP Secret encryption(OTP 密钥加密),然后单击 OK(确定)。
- 使用有效的 AD 凭据登录。
- 如果需要,请注册更多设备(可选)。
- 要使用 CLI 启用加密选项,请执行以下操作:
将加密数据从旧证书迁移到新证书
如果管理员想要将证书更新为新证书,该工具将提供用于更新新证书数据条目的选项。
使用 CLI 将证书更新为新证书
在命令提示符下,键入:
示例:
python3 main.py -Host 192.0.2.1 –Port 636 -username ldapbind_user@aaa.local -search_base cn=users,dc=aaa,dc=local -source_attribute unixhomedirectory -target_attribute userparameters -operation 2 -cert_path aaatm_wild_all.cert –new_cert_path aaatm_wild_all_new.cert
注意
- 证书必须同时具有私钥和公钥。
- 目前,该功能仅针对 OTP 提供。
将设备升级到具有加密功能的 13.0 Build 41.20 后注册的设备,重新加密或迁移到新证书
管理员可以在已使用证书加密的设备上使用该工具,并可以使用新证书更新该证书。
将加密数据转换回纯文本格式
管理员可以解密 OTP 密钥并将其恢复为原始纯文本格式。OTP 加密工具会扫描所有用户,查找加密格式的 OTP 密钥,然后将其转换为解密格式。
使用 CLI 将证书更新为新证书
在命令提示符下,键入:
示例:
python3 main.py -Host 192.0.2.1 –Port 636 -username ldapbind_user@aaa.local -search_base cn=users,dc=aaa,dc=local -source_attribute unixhomedirectory -target_attribute userparameters -operation 1
<!--NeedCopy-->
故障排除
该工具将生成以下日志文件。
- app.log. 记录所有主要执行步骤以及有关错误、警告和失败的信息。
- unmodified_users.txt. 包含未从纯文本升级到加密格式的用户 DN 列表。这些日志是因格式错误而生成的,也可能是由于其他原因造成的。