级别: 初级 陈 大金, Rational 高级技术顾问, IBM
2009 年 3 月 09 日 本文将介绍 Rational AppScan Enterprise(ASE)强大灵活的集成功能,包括如何配置和定制 ASE 与 Rational 其他产品的集成,以及通过集成如何实现 Web 应用安全生命周期管理的整体解决方案。
前言
IBM Rational AppScan Enterprise Edition(以下简称 ASE)的 Web 应用安全解决方案,能提供扫描、报告和修复建议,适合于各种用户各种类型的安全测试,包括应用程序开发人员、QA 团队、入侵测试人员、安全审核人员和高级管理员。企业通过 ASE 以及与 Rational 其他相关产品的集成,能够实现将 Web 应用安全的全生命周期的整体解决方案。
ASE 提供了强大的集成能力,能够与 Rational 产品进行无缝集成,实现了 Web 应用安全和软件开发生命周期的集成,如下图所示。
图 1. ASE 集成关系图
本文将着重介绍 ASE 与 AppScan Standard、AppScan Developer 以及 Rational ClearQuest 集成的实现方式,以及给 Web 应用安全管理带来的价值。
ASE 与 AppScan Standard Edition 的集成
IBM Rational AppScan Standard Edition (以下简称 AppScan SE)是一种自动化 Web 应用程序安全性测试引擎,能够连续、自动地审查 Web 应用程序、测试安全性问题,并生成包含修订建议的行动报告,简化补救过程。
ASE 与 AppScan SE 的集成主要体现在以下几个方面:
-
扫描规则的导入集成
-
扫描结果的导入集成
-
扫描对象控制的集成
以下将分别详细介绍如下,
与 AppScan SE 扫描规则的导入集成,实现 ASE 扫描规则的精细化管理
AppScan SE 提供了强大的扫描规则的自定制和管理能力,提供了对扫描规则的精细化的管理和定制,甚至能够包括对单个 test variant 的 disable/enable 等,以便在扫描中使用特定、不同的规则扫描不同的应用,以提高扫描的效率以及准确性。AppScan SE 中规则导出,如下图所示。
图 2. AppScan SE 规则管理
将 AppScan SE 定制好的扫描规则导出后,再导入 ASE 中,供 ASE 扫描时配置使用。在 ASE 中的导入配置,如下图所示。
图 3. ASE 中规则导入
借助 ASE 的规则导入集成能力,能够实现了以下应用场景:
-
能够将扫描规则按照攻击的方式进行分类,并制定专人负责扫描、研究和修复,以提供工作效率。如可以根据 WASC 的分类标准,将规则分为 Authentication, Authorization, Client-side Attacks, Command Execution 不同的大类;而可以具体到一些特别的漏洞技术,如 XSS、Injection 等。如下图,将扫描规则分为 XSS 和 Injection 两类,
图 4. ASE 规则定制和管理 -1
-
将扫描规则按照工具的方式进行划分,以便于应用在不同的环境下,使用不同的规则库。如将扫描规则按照 invasive 和 non-invasive 划分,从而可以避免在生产环境下使用 invasive 的规则,导致对生产系统产生影响,如下图所示,
图 5. ASE 规则定制和管理 -2
-
通过 ASE 提供的强大的权限控制能力,可以将扫描规则、被扫描对象以及用户三者之间进行权限设置,使得指定的用户只能使用指定的扫描规则扫描指定的对象(应用、服务器或 IP 地址段),从而确保了 ASE 系统的高度安全控制。如下图,通过定制 server group 实现被扫描对象的定义和管理,
图 6. ASE 的 Server Group 功能
通过组合 server group 以及扫描规则,即可限定指定用户使用指定的扫描规则扫描指定的对象,如下图所示,
图 7. ASE 的 Server Group 和扫描规则管理功能
AppScan SE 扫描结果导入到 ASE 中进行集中管理
AppScan SE 的扫描结果,可以方便地导入到 ASE 中,进行统一的结果分析、展现和报告。如下图所示,在 ASE 中,将 AppScan SE 的扫描结果导入,
图 8. AppScan SE 扫描结果导入功能
此外,ASE 的导入功能还提供指定路径下文件的导入、定时导入等功能,从而实现了结果导入的自动化。借助自动化的结果导入,可以将 AppScan 集成到软件开发生命周期中,并融合到企业持续集成的解决方案中,如下图,
图 9. AppScan 与 Rational 其他产品进行持续集成
当使用 Rational BuildForge 将 AppScan SE 集成到持续集成流程中后,可以自动对已部署的 Web 应用进行漏洞扫描,并生成扫描结果和报告,同时将结果数据导入 ASE 中进行统一、集中的管理和报告。
AppScan SE 与 ASE 的控制集成,实现扫描对象的精确控制
通过 AppScan SE 与 ASE 的集成后,可以设定 AppScan SE 的用户能够扫描的对象,如应用、服务器以及 IP 地址段,从而确保 AppScan SE 的用户按照安全规定和规范使用 AppScan SE 开展工作。其配置过程,如下步骤所述,
首先,在 ASE 中设置每个用户可以扫描的服务器,
图 10. ASE 中设置用户可扫描的服务器和规则
当该用户使用 AppScan SE 的时候,按照以下步骤将 AppScan SE 和 ASE 集成;输入相应的用户名、密码以及 ASE 的 URL 地址,如下图所示。
图 11. AppScan SE 连接 ASE 的配置
当不同的用户使用自己的帐号信息设置好与 ASE 的集成后,即可看到可以扫描的对象的不同,如下,当用户 administrator 和 ken 通过 AppScan SE 连接 ASE 后,看到各自不同的扫描对象。
用户 administrator 的扫描对象,如下图所示。
图 12. 用户 administrator 的扫描对象
用户 ken 的扫描对象,如下图所示。
图 13. 用户 ken 的扫描对象
ASE 与 AppScan Developer Edition 的集成
IBM Rational AppScan Developer Edition (以下简称 AppScan DE)是一款针对开发人员的,结合了动态分析,静态分析,运行时分析,以及字符串分析等多种安全性分技术的 Web 应用安全漏洞检测工具,使得企业能够在开发早期即可开始安全漏洞测试工作,提供了更准确、更全面的结果,并降低了修复成本、提升了工作效率。
AppScan DE 通过与 ASE 的集成,实现通过 Web 应用漏洞扫描结果的统一管理和报告。通过如下图配置,以便与 ASE 实现连接,
图 14. AppScan DE 中配置连接 ASE 的信息
配置完成后,即可从 AppScan DE 中将动态分析 (Dynamic analysis) 的结果上传到 ASE 中,进行集中的管理和分析,如下图所示。
当在 AppScan DE 中扫描完后,即可点击“Upload Report”,如下图所示。
图 15. AppScan DE 无缝地与 ASE 的集成
ASE 通过一个 import 任务,将 AppScan DE 的结果上传到 ASE 中。因此,需要定义 import 类型任务的名称,如下图所示。
图 16. 在 AppScan DE 中向 ASE 提交扫描结果
ASE 会将从 AppScan DE 的扫描结果,作为 import 任务保存在用户在 ASE 中对应的用户自有目录下面,并自动创建一个对应 report pack,如下图所示。
图 17. AppScan DE 结果导入后的效果图
此外,通过集成后,可以在 AppScan DE 的 Eclipse 界面中直接打开 ASE 界面,进行结果查看等管理工作,如下图所示。
图 18. 从 AppScan DE 中直接打开 ASE 界面
ASE 与 Rational ClearQuest 的集成
ASE 能够与 ClearQuest 集成,将 Web 应用漏洞作为开发过程产生的缺陷在 ClearQuest 中进行管理,并在 ASE 中提供管理信息,便于访问。
在 ASE 中将扫描的漏洞提交到 ClearQuest 中,如下图,
图 19. 在 ASE 中向 ClearQuest 提交缺陷
提交后, ClearQuest 的 ID 信息将保存在 ASE 中,便于与 ClearQuest 进行同步跟踪查询和管理,如下图所示。
图 20. ASE 和 ClearQuest 集成后的效果图
借助上述集成能力,可以将 Web 应用漏洞的管理与开发过程无缝的融合在一起,从而实现漏洞“扫描 -> 修复 -> 跟踪 -> 验证”的全生命周期的管理。为完成 ASE 与 ClearQuest 的集成,需要对 ASE 进行一定的定制工作,该定制工作需要借助 Rational 专业服务团队帮助客户实现。
以下简单描述定制原理和过程,如下:
-
在 ASE 中安装 ClearQuest 的客户端工具,并配置 ClearQuest 连接到 ClearQuest 服务器;
-
在 ASE 安装目录下的增加对应 web service 配置文件(文件名自行定义),如,在 C:\Program Files\IBM\Rational ASE\WebApp\WebServices\SubmitIssues.asmx, 其文件内容如下,
代码清单 1. ASE web service 配置代码
<%@ WebService Language="C#" CodeBehind="~/App_Code/WebServices/SubmitIssues.cs"
Class="SubmitIssues" %>
|
-
在 C:\Program Files\IBM\Rational ASE\WebApp\App_Code\ WebServices/ 下增加提交缺陷的 web service 对应的实现文件 SubmitIssues.cs,其代码片段请参考“代码示例”部分的“代码清单 2. ASE web service 实现代码”;
-
在 C:\Program Files\IBM\Rational ASE\WebApp\App_Code\ Extensions 下,增加提交缺陷功能的具体实现,其代码片段请参考“代码示例”部分的“代码清单 3. ASE extension 的实现代码”
通过以上主要步骤,即可完成 ASE 与 ClearQuest 的集成定制工作。同时,对于 ASE 与其他工具的定制工作原理,大致相同。由于该定制需要了解 ASE 的 API 和部分内部结构,建议在 Rational AppScan 专业服务团队的指导下进行。
总结
通过上述介绍,我们可以看出 Rational AppScan Enterprise 提供了良好的集成性和扩展性,对 Rational AppScan 及 Rational 其他产品提供了很好集成控制能力,从而实现了 Web 应用安全漏洞全生命周期的管理,并将其与软件开发生命周期的管理实现了无缝的集成,从而为企业提供了一个强大、灵活的 Web 漏洞管理平台。
代码示例
代码清单 2. ASE web service 实现代码
[WebMethod]
public void Submit(ref Issue[] issues)
{
if (_session == null)
{
_session = new WFSessionClass();
string webXMInstance = base.Context.Request.ApplicationPath.Replace("/", "");
_session.LogonInstance(webXMInstance, true);
}
foreach (Issue issue in issues)
{
try
{
// Get the issue based on watchfire issue id
IWFIssue existingIssue = null;
Try
{
existingIssue = _session.GlobalAdmin.GetIssue(issue.ID);
}
Catch
{
issue.SubmitStatus = SubmitStatus.IssueDoesNotExist;
continue;
}
// ensure the External ID's match
if (existingIssue.ExternalID != issue.ExternalID)
{
issue.SubmitStatus = SubmitStatus.ExternalIDDoesNotMatch;
continue;
}
// set the properties if they exist
// Status must be sent!
existingIssue.Status = (int)issue.Status;
if (issue.Note != null) existingIssue.Note = issue.Note;
if (issue.Int1 != null) existingIssue.Int1 = issue.Int1.Value;
if (issue.Int2 != null) existingIssue.Int2 = issue.Int2.Value;
if (issue.Int3 != null) existingIssue.Int3 = issue.Int3.Value;
if (issue.Int4 != null) existingIssue.Int4 = issue.Int4.Value;
if (issue.Int5 != null) existingIssue.Int5 = issue.Int5.Value;
if (issue.String1 != null) existingIssue.String1 = issue.String1;
if (issue.String2 != null) existingIssue.String2 = issue.String2;
if (issue.String3 != null) existingIssue.String3 = issue.String3;
if (issue.String4 != null) existingIssue.String4 = issue.String4;
if (issue.String5 != null) existingIssue.String5 = issue.String5;
// Update the issue
existingIssue.Update();
issue.SubmitStatus = SubmitStatus.Success;
}
Catch
{
// ignore and continue
issue.SubmitStatus = SubmitStatus.UnknownFailure;
}
}
}
|
代码清单 3. ASE extention 的实现代码
// 向 ClearQuest 中提交漏洞信息
public string WriteCQDefect(ClearQuestOleServer.SessionClass cqSession,
string headline, string description, string severity, string priority,
string keywords, string symptoms, string owner, string extIssueId,
string extProduct, DataTable variants)
{
IOAdEntity cqdefect = (IOAdEntity)cqSession.BuildEntity("Defect");
cqdefect.SetFieldValue("Headline", headline);
cqdefect.SetFieldValue("Description", description);
cqdefect.SetFieldValue("Severity", severity);
cqdefect.SetFieldValue("Priority", priority);
cqdefect.SetFieldValue("Keywords", keywords);
cqdefect.SetFieldValue("Symptoms", symptoms);
cqdefect.SetFieldValue("Owner", owner);
cqdefect.SetFieldValue("ExtIssueId", extIssueId);
cqdefect.SetFieldValue("ExtProduct", extProduct);
if (variants != null)
{
// Add the attachments
IOAdAttachmentFields attachFields =
(IOAdAttachmentFields)cqdefect.AttachmentFields;
object attachFieldName = "Attachments";
IOAdAttachmentField attachField =
(IOAdAttachmentField)attachFields.item(ref attachFieldName);
IOAdAttachments attachments = (IOAdAttachments)attachField.Attachments;
// make a folder for the files created
string variantTempDir = null;
DirectoryInfo variantTempDirInfo;
Try
{
variantTempDir = Path.GetTempPath() + Path.DirectorySeparatorChar
+ Path.GetRandomFileName() + Path.DirectorySeparatorChar;
variantTempDirInfo = Directory.CreateDirectory(variantTempDir);
}
catch (Exception ex)
{
WEOManager.LogError(ex.Message, "CQSubmitDefectAction");
}
int variantIndex = 1;
foreach (DataRow row in variants.Rows)
{
string origFileName = variantTempDir + "Variant"
+variantIndex.ToString() + "-Orig.txt";
File.WriteAllText(origFileName, row[3].ToString());
attachments.Add(origFileName, "Variant " + variantIndex.ToString()
+ "Original Request");
string testFileName = variantTempDir + "Variant"
+ variantIndex.ToString() + "-Test.txt";
File.WriteAllText(testFileName, row[4].ToString());
attachments.Add(testFileName, "Variant " + variantIndex.ToString()
+ "Test Request");
variantIndex++;
}
}
cqdefect.Validate();
cqdefect.Commit();
return ((OAdFieldInfo)cqdefect.GetFieldValue("id")).GetValue();
}
|
参考资料 学习
获得产品和技术
讨论
关于作者  | |  | 陈大金,现任 IBM 中国有限公司软件部 Rational 高级技术顾问。主要从事含质量管理、配置管理、IT 过程改进等在内的软件全生命周期管理的解决方案等方面的研究和咨询工作。参与过 ICBC、中国移动、Accenture 等大型软件工程咨询、实施的项目。 |
对本文的评价
|