专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » webspheremq:针对 UNIX 和 Windows 的脚本化 WebSphere MQ 密匙文件管理 »正文

webspheremq:针对 UNIX 和 Windows 的脚本化 WebSphere MQ 密匙文件管理

来源: 发布时间:星期一, 2009年9月7日 浏览:0次 评论:0
  脚本化密匙管理个案例研究

  我最近进行个咨询工作包括个任务需要在两个队列管理器的间建立些 SSL 通道这个任务标准操作流程是对几乎所有管理任务使用交互式工具因此我客户认为我们将使用 iKeyman GUI 完成钥匙环创建和所有证书任务当我建议使用脚本替代时他们还有些不愿意

  他们主要反对理由是管理团队(Team)大多都不熟悉脚本工具他们潜在意思是脚本解决方案将会提高管理证书需要最低技术水平相比的下他们认为 GUI 是更容易、更恰当解决方案

  除此的外还有个问题:脚本解决方案能够最有效地利用资源吗?我对我客户说和使用 GUI 完成相同管理任务相比编写脚本将花费同样多(也许更多)时间脚本编写在大型部署中价值是有目共睹但是对于只涉及两个队列管理器任务他们认为进行额外投资简直是在浪费时间

  业务需求是促成这个决策根本原因由于 MD5 散列法已经被破坏客户明智地规定所有密匙必须使用 SHA-1 签名但 GUI 工具不能公开那些支持选择证书签名算法Control控件因此默认支持 MD5 签名修改 GUI 中这个行为需要编辑 iKeyman 和 Java™ 配置文件相比的下包括 –sigalg 选项命令行工具使得选择签名算法变得异常简单

  当我们最终开始工作后事实证明客户担忧根本就是杞人忧天多数脚本都是自我归档(self-documenting)不需要复杂逻辑它们只包含个经过注释命令列表没有任何分支和循环对于管理员来说学习脚本并不比学习 GUI 困难甚至更加容易而且我们需要资源也相当少个任务些脚本正好可以满足我们需求

  不到 3个小时时间内我们就完成了 SSL 配置还包括调整脚本和培训执行密匙管理任务职员个月的后队列管理器迁移到新服务器并进行了重构使用个可重复和准确流程管理员就能够重用这些脚本个小时的内在新队列管理器上独自建立 SSL 通道我们投资在第次重用时就得到了回报

  在任务:消息传递系列这个部分我将和您起完成使用自签名证书配置基本 SSL 通道任务我们将构建两个脚本这样当您需要建立 IBM® WebSphere® MQ SSL 通道时候您也能够在小时的内使您个通道配对并运行

  有关证书类型

  使用 CA 签名证书配置 SSL 和使用自签名证书类似但创建安全策略差别很大

  创建自签名证书时也就创建了个 Deny-All 策略添加到密匙环个证书都是这个策略个例外授权访问需要添加个证书撤销访问需要删除个证书使用自签名证书MQ 管理员必须采取特定动作对个给定证书进行授权访问所有访问控制决策取决于管理员

  使用由 CA 签名证书时个有效策略就是针对每个信任 CA(认证机构)使用 Allow-All 策略换句话说个密匙环添加个 CA 将对那个 CA 已经签名或未来即将签名每个证书建立个信任策略限制信任范围需要使用通道 SSLPEER 属性为这个证书中 Distinguished Name(DN可分辨名称)字段指定可以接受撤销访问需要个 Certicate Revocation List(简称为 CRL)个 CA 撤销个证书时撤销操作被发布给 CRL那个 CA 客户在内部对 CRL 执行镜像队列管理员可以在通道启动时在内部检查这个 CRL如果个通道企图使用个已撤销证书启动对 CRL 本地副本检查将生成这个连接将被拒绝

  使用由 CA 签名证书时MQ 管理员只控制允许连接 Distinguished Names (DN) 串匹配模板CA 发出带有匹配 DN 值任何新证书都能够进行连接阻止这种操作可用Control控件就是 CRL使用由 CA 签名证书时必须维护 CRL它是排除已损坏证书思路方法

  许多有关 SSL 讨论都提到要根据成本或涉及流程来选择证书类型通常这种思路方法将原型化自签名证书(它们可以轻松地免费生成)然后在后续阶段切换为由 CA 签名证书实际上证书类型选择应该基于理想安全策略和企业是否准备好建立和维护个证书撤销列表从安全角度讲最好先使用个 Deny-All 策略然后再授权例外而不是先使用个 Allow-All 策略然后再构建个黑名单基于上述原因我倾向于使用自签名证书这也是本文将讨论证书

  流程概述

  根据本文我将使用两个队列管理器我把它们称为 QMA 和 QMB在较高层次上使用自签名证书构建个新 WebSphere MQ SSL 配置需要以下步骤:

  为 QMA 创建个默认密匙环

  从这个密匙环删除默认 CA 证书

  为 QMA 生成个自签名证书

  提取这个新证书公共密匙

  对 QMB 重复 1-4 步

  将 QMB 公共密匙导入 QMA 密匙环

  发出 QMA 上 REFRESH SECURITY TYPE (SSL)

  对 QMB 重复 6-7 步

  步骤 1-4 是任何新队列管理器必要步骤也是个单脚本自然选择尽管步骤 6-7 可以写入脚本但有时候会出现这种情况 —— 必须将许多公共密匙导入个密匙环但在每个公共密匙的后发送个 REFRESH SECURITY 未必是个好主意因此步骤 6 应该是个单独脚本我们将编写文档介绍说明发送 REFRESH SECURITY 命令条件该命令可以根据您喜好从命令行或您钟爱管理工具运行但这主要是个个人偏好问题因此如果您愿意可以将 REFRESH SECURITY 添加为第 2个脚本最后进入脚本的后还有几个细节问题我将在后面进行介绍

  公共脚本头部

  尽管本文只涉及密匙和证书管理任务中很小块内容但脚本编写是创建可以重用工具因此每个脚本将包括个头部您将在这个头部中设置执行命令所需任何变量

  重用性还会影响到您将要处理密匙环文件位置对于次性使用可以更容易地在个本地临时目录中构建密匙环生成并交换证书然后将完成密匙环文件移动到它们最终目标位置但是您不可能在每次需要添加个证书时候从头开始生成个新密匙环除非您拥有个安全部署服务器和些真正好自动化否则维护个中央密匙环资源库并在执行维护任务的后将这些密匙环推送到您队列管理器是不切实际要使脚本可重复使用脚本需要在密匙环实际使用地方操纵密匙环这需要您将几个文件和路径元素嵌入到您公共脚本头部中下面就让我们来研究下这些内容

  将队列管理器名称包含在证书 Common Name 字段中是个惯例您需要个变量来持有它:

  QMGRNAME=QMA

  要完成证书可分辨名称通常需要个域:

  DOMAIN=us.ibm.com

  您还需要几个组织和地址字段我把这些内容组合到起形成个变量称为 ORG:

  ORG=O=IBM,OU=ISSW,OU=PROD,OU=ADMIN,L=Charlotte,ST=NC,C=US

  证书标签需要队列管理器名称小写版本队列管理器将搜寻这个小写版本以便它能够找到在 SSL 协议期间将显示证书

  FOLDEDNAME=qma

  您还需要知道队列管理器在文件系统中位置WebSphere MQ 将改变某些以便创建平台可移植文件名例如如果个队列管理器名称包含个圆点则该将被转换为个感叹号如果您队列管理器名称包含任何非字母数字您需要检查文件系统以查找被改变名称并在这里设置该值:

  MANGLEDNAME=QMA

  脚本应该可用于非标准安装特别是队列管理器是在个高可用性硬件集群上实现时候PATH2QMGR 变量用于保存这个位置

  PATH2QMGR=/var/mqm/qmgrs

  Windows® 系统上个变量将拥有这个值(假设个默认安装):

  PATH2QMGR=C:\Program Files\IBM\WebSphere MQ

  密匙环密码作为个用户可编辑环境变量存储在脚本中确保不要将存储有密码脚本随意放置保存和运行这个脚本好地方是队列管理器 SSL 目录这个目录必须保护起来以便只有 mqm(或其他平台上等同物)用户 ID 能够读取这些文件由于密匙数据库密码隐藏在这里将脚本存储在这里也不会暴露

  PASSWORD=qK2EkyBmWU

  密码期限只使用但是我喜欢为它创建个变量并将变量和其他用户可编辑字段放置在这向脚本操作员表明个策略决策是在这里捕获这个值以天为单位我为这个举例指定了 10 年期限

  EXPIRY=3650

  我们将在这里使用命令是 GSKit C API 命令而不是 Java 实现这是 C 版本在命令行上显示些选项在 Java 版本中不可用使用 C 版本还有另外个附带好处C 可执行文件执行速度要比 Java 快得多 Java 版本必须为每个命令构建并拆除个 JVM基于 C 语言整个脚本运行时间和在 Java 版本中执行单个命令时间相当要执行文件脚本只需知道 C 2进制文件路径对于 UNIX® 系统默认位置位于 /opt 中:

  PATH=/opt/IBM/gskit/bin:/opt/IBM/gskit/lib:$PATH

  在 Windows 系统上这个默认位置位于 C: 驱动器上:

  PATH=C:\Program Files\IBM\gsk7\bin:C:\Program Files\IBM\gsk7\lib:%PATH%

  这是最后个用户可编辑变量然而在运行任何命令的前您必须告知脚本密匙环文件名称这个名称通过结合使用默认 WebSphere MQ 设置和前面步骤中输入变量构建对于 UNIX 和 Windows这些变量分别是:

  MQSSLDB=$PATH2QMGR/$MANGLEDNAME/ssl/key.kdb

  MQSSLDB=%PATH2QMGR%\%MANGLEDNAME%\ssl\key.kdb

  这些位置是默认应该在队列管理器 SSLKEYR 属性中显示如果选择了另个位置定要相应更新队列管理器

  上面设置可以用于任何证书管理脚本尽管些命令需要区别或其他参数但是实现是相同:将用户可编辑变量全部放置到最前面在那里可以将它们作为个集合来管理

  创建密匙环并删除默认 CA 条目

  下步是生成默认状态密匙环这需要个单 gsk7capicmd 命令:

  gsk7capicmd -keydb -create -db "$MQSSLDB" -pw $PASSWORD -type cms -expire $EXPIRY -stash -fips

  地点:

  第个 gsk7capicmd 参数是需要执行操作类型这里是密匙数据库操作

  第 2个参数始终为要在这个操作类型中执行动作这里我们打算创建个新密匙数据库该数据库通过完全限定 –db 选项指定

  数据库类型指定为 cms队列管理器需要这种类型

  –stash 选项创建个带有密码隐藏文件这是队列管理器在没有人类干预情况下访问密匙数据库方式

  最后指定选项是 –fips该选项不仅生成个和 Federal Information Processing Security (FIPS) 标准兼容密匙数据库它还确保在运行命令时使用库和算法是 FIPS 兼容我不知道指定使用和 FIPS 兼容命令有什么负面影响但是这种命令确有点好处:它们已经各自经过了认证除非可以充分地证明不应在所有情况使用它们否则我策略就是总是指定 FIPS

  密匙环刚刚创建时它将使用几个默认 CA 签名者证书加载目前这些证书包括来自 Entrust、Verisign、Thawte 和 RSA 根证书如前所述这些根证书出现将为 CA 已经发送或将来即将发送每个证书创建个 Allow-All 策略我们现在只使用自签名证书所有这些根证书代表对我们队列管理器不恰当访问授权因此步就是删除所有这些默认 CA 证书

  证书列表随着时间而改变这里使用特定证书来自 V6.0 队列管理器根据您版本和补丁包区别您看到这个列表可能有些区别为了确保所有 CA 证书已被删除您需要将个显示密匙环中所有证书命令添加到脚本末尾

  删除个证书命令如下所示:

  gsk7capicmd -cert -delete -label "Entrust.net Global Secure Server Certication Authority" -db "$MQSSLDB" -pw $PASSWORD -fips

  –label 选项通过个人类可读串识别证书这个标签在个密匙环内必须是惟它在证书创建或导入时设置个证书在区别密匙环中可能有区别标签在这个举例中这个标签识别将要删除特定证书

  我在这里只列举了个举例这个 完整脚本列表 包含 24 个其他命令这些命令删除各种供应商根证书和中间证书

  生成本地队列管理器证书

  下步是为本地队列管理器生成新证书队列管理器根据标签定位它证书标签必须总是由固定串 ibmwebspheremq 加上队列管理器小写名称组成在下面举例中这个标签组成方式为连接标签固定部分和在脚本头部中设置 $FOLDEDNAME 变量:

  gsk7capicmd -cert -create -db "$MQSSLDB" -pw $PASSWORD -label "ibmwebspheremq$FOLDEDNAME" -dn "CN=$QMGRNAME.$DOMAIN,$ORG" -fips

  这个命令引入了另个新选项 —— 证书可分辨名称(Distinguished Name)缩写为 DN这个 DN 是个全局惟名称代表由证书表示实体它包含几个子字段:

  CN=公共名称

  O=组织

  OU=组织单位

  L=位置

  ST=州

  C=国家

  这里应该注意“全局惟” 是针对每个发布者而言两个或多个证书机构使用相同 DN 元素是完全有效对于自签名证书这种情况每个证书都是自己根证书全局惟实施办法就是您围绕用来发布和管理证书人工流程构建Control控件

  队列管理器公共名称通常是队列管理器名称加上其驻留域名例如QMA.us.ibm.com 就是我们 QMA 队列管理器个有效 CN个证书可能包含多个组织单位(Organization UnitOU)条目仔细选择 OU 命名方式有助于创建有意义 SSLPEER 值例如如果个 OU 条目是 PROD 或 DEV那么可以创建个 SSLPEER阻止在生产和开发队列管理器的间进行相互连接(这个通道 SSLPEER 属性和可分辨名称已在月份任务:消息传递 在 WebSphere MQ 网络上进行 SSL 规划 中详细讨论过)

  提取新证书

  为了使新证书在个 SSL 协议中有用远程队列管理器必须访问该证书公共密匙为此需要将这个证书提取到个文件将文件复制到远程节点然后将它导入到驻留在那里密匙环提取证书将是当前脚本最后批任务的然后您将构建第 2个脚本以将证书文件导入到远程密匙环中

  提取证书命令是:

  gsk7capicmd -cert -extract -db "$MQSSLDB" -pw $PASSWORD -label "ibmwebspheremq$FOLDEDNAME" -target $PATH2QMGR/$MANGLEDNAME/ssl/$FOLDEDNAME.crt -format ascii -fips

  这里您对密匙环、证书标签和密码重用了的前–target 选项识别包含提取证书文件名称和位置文件名中 .crt 扩展名匹配 –format ascii 选项并将使您能够稍后导入证书

  整理

  到此脚本工作结束操作员需要验证结果您需要显示密匙环中证书并要求操作员确定没有默认 CA 证书保留下来这个步骤是为了捕获区别 GSKit 发行版的间更改GSKit 将更新默认证书清单

  gsk7capicmd -cert -list -db "$MQSSLDB" -pw $PASSWORD -fips

  第 2个脚本:将证书添加到密匙环

  最后步是在 QMA 和 QMB 的间交换证书您将构建第 2个脚本该脚本将读取先前创建那个 .crt 文件并将它添加到个队列管理器密匙环这个脚本前面部分将重用您的前使用多个变量区别是 $FOLDEDNAME 变量现在引用远程队列管理器而不是本地队列管理器将证书添加到密匙环命令是:

  gsk7capicmd -cert -add -db "$MQSSLDB" -pw $PASSWORD -label "ibmwebspheremq$FOLDEDNAME" -file $FOLDEDNAME.crt -format ascii –fips

  注意这个脚本期望文件名匹配队列管理器小写名称且文件位于当前目录中它还使用相同标准证书标签尽管这不是必须WebSphere MQ 只在需要队列管理器定位自己证书时要求标签使用特定格式我选择使用相同标签表示所有密匙环中特定证书致性有助于管理员更容易地识别和管理证书

  和第个脚本密匙环内容被显示出来以确认操作已经成功完成

  结束语

  本文提供脚本 是连接两个队列管理器所需最少脚本举例设计思想如下:第个脚本可以在任何队列管理器上重用以初次创建密匙环第 2个脚本可以重复用于从任何远程 MQ 节点添加证书这两个脚本中命令足够用于连接个任意大小网络



  当然通过替换脚本中适当命令可以从这些举例轻松构建其他脚本在您尝试创建自己脚本时建议您包含个删除证书脚本个列出密匙环内容独立脚本以及个打印任意证书细节脚本最后您可能需要个脚本来更改密匙数据库密码具体情况取决于您公司密码有效期限所有这些脚本都可以通过对现有某个脚本进行少许修改而创建

  我使用脚本故意保持了简单性只需少许工作脚本中许多字段都可以从队列管理器 ini 文件和 Windows 注册表中获取和解析但作为名顾问我需要能够在尽可能广泛环境中使用工具这些工具不能够进行太多假设如果您拥有个固定职位您可能想花点时间使您脚本更易用、更健壮您可以考虑添加些改进措施比如包含些逻辑以解析文件系统中队列管理器位置等信息或者实现更好处理能力用户输入内容越少导致人工可能性就越低诊断性能越好操作员错过信息并继续使用密匙环机会就越少我将乐于在 t-rob.net 上讨论您遇到任何问题如果您愿意和我分享

  但是无论您使用简单脚本还是增强脚本自动化都将帮助您快速、轻松和致地实现 SSL



  本文举例源代码或素材下载

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: