转载

将 Bluemix AppScan 结果放入 Bluemix Track & Plan 中

 

IBM Security AppScan Dynamic Analyzer 通过检测如今的许多最常见的安全漏洞,帮助保护部署在 IBM Bluemix 上的 Web 应用程序。在本教程中,我将介绍如何使用 AppScan Analyzer 扫描您的 Bluemix 应用程序,然后将结果发送给 Bluemix DevOps Services Track & Plan 缺陷跟踪服务。

构建您的应用程序需要做的准备工作

 
  • 一个免费的 Bluemix 帐户
  • 一个免费的 DevOps 帐户
  • 对 Python 有基本的理解

获取代码

备注:源代码包含一个不安全的应用程序,您需要将它安装在 Bluemix 上并执行扫描。参见第 1 步。

在本教程中,您将学习如何使用 AppScan Dynamic Analyzer 扫描您 Bluemix 应用程序,然后将扫描结果发送给 Track & Plan 缺陷跟踪服务。

第 1 步. 创建一个应用程序并为它启用 DevOps

 
  1. 登录到 Bluemix。打开您的 Web 应用程序或创建一个新应用程序。您可以使用本教程的代码项目的 server_side 文件夹中的应用程序,作为要在这些操作说明中使用的示例应用程序。该应用程序特意包含了一个安全缺陷,在后面的操作说明中会使用 AppScan 检测出来。
  2. 打开该应用程序并单击左侧的 Overview
  3. 单击右上角的 ADD GIT
  4. 单击 CONTINUE
  5. 创建存储库后,单击顶部的 TRACK & PLAN
  6. 单击 Project Settings
  7. 选择 Enable Track & Plan 并单击 SAVE
  8. 单击顶部的 EDIT CODE 并创建应用程序(使用 Git 或直接在浏览器中)。
  9. 在 Bluemix 仪表板中,创建并绑定应用程序所需的服务。
  10. 从 DevOps 添加两个服务:Delivery Pipeline Track & Plan。这些服务都将应用于整个空间,而不是一个特定的应用程序。
  11. 在仪表板中,单击 delivery pipeline 服务并选择该项目: 将 Bluemix AppScan 结果放入 Bluemix Track & Plan 中

    点击查看大图

  12. 单击 EDIT CODE,然后单击 Git 图标(将 Bluemix AppScan 结果放入 Bluemix Track & Plan 中)。
  13. 单击 Push > Push All
  14. 键入一条提交消息,选择 Select All,然后单击 Commit
  15. 单击 BUILD & DEPLOY
  16. 单击构建阶段上的 go 图标(将 Bluemix AppScan 结果放入 Bluemix Track & Plan 中),除非构建和部署流程已在运行。
  17. 连接到应用程序并确认它是初始应用程序。
  18. 使用 Web 编辑器或 Git 创建您的应用程序。完成上述操作后,重复子步骤 13–17 来验证应用程序的功能。
  19. 单击 TRACK & PLAN 并为一个缺陷创建一个工作项(您稍后将使用该缺陷获取配置细节)。

第 2 步. 使用 Track & Plan REST 接口

 

现在您已能从用户界面使用 Track & Plan,是时候通过 REST 接口从程序使用它了。

  1. 查看 Track & Plan 的 URL,看看为您分配了哪个 服务器和您的项目 ID 是什么。可以看到,我的值是 ccm08_cqZlJx7LEeWrnMDj3ue0kw将 Bluemix AppScan 结果放入 Bluemix Track & Plan 中

    点击查看大图

  2. 如果还没有命令行 URL 工具 curl,请安装它。
  3. 使用下面这个命令来获取工作项列表。列表应包含一项,也就是您在第 1 步的第 19 小步中创建的缺陷。请注意该命令只有一行。
    curl -k https://[uid:password]@hub.jazz.net/[server ID]/
             oslc/contexts/[project ID]/workitems -H "Content-Type: application/
                 x-oslc-cm-change-request+json" -H "Accept: text/json" > x.html
  4. x.html 文件中的结果是一个 JSON 结构。大部分字段都不需要,但需要将工作项存档到类别。要获取它,可以编辑 x.html 文件并将该对象包装在 HTML 代码中:
    <HTML>
    <BODY>
    <SCRIPT>
    var obj = JSON.parse('<curl result goes here>');
    // Double quotes are used in the result, so we need to use the single quotes.
    
    document.write(obj["oslc_cm:results"][0]["rtc_cm:filedAgainst"]["rdf:resource"]);
    </SCRIPT>
    </BODY>
    </HTML>
  5. 在浏览器中打开 x.html 文件。它显示了一个与以下值类似的值:
  6. 创建一个包含以下内容的文件 workitem.json:
    {
        "dc:title":"Test work item",
        "dc:description":"Description goes here",
        "dc:type": "defect",
        "rtc_cm:filedAgainst": {
          "rdf:resource": "<result of substep 5 goes here>"
        }
    }
  7. 运行下面这条命令,使用 REST 接口创建一个工作项(在本例中为一个缺陷)。它应该完全在一行上。
     curl -k https://[uid:password]@hub.jazz.net/[server ID]/oslc/contexts/
            [project ID]/workitems -v -X POST -d @workitem.json -H "Content-Type:
                application/x-oslc-cm-change-request+json" -H "Accept: text/json"
  8. 返回到 Track & Plan 的 Web 界面,单击 ALL WORK。您会看到您的新工作项,目前它还未分配。 将 Bluemix AppScan 结果放入 Bluemix Track &amp; Plan 中

    点击查看大图


    如果想向工作项添加其他任何字段来获得扫描结果,可以按照子步骤 4-7 中的相同过程将它们添加到您的模板 (workitem.json)。您需要查看 x.html 文件中的 JSON 结构来确定字段名称。

第 3 步. 扫描您的应用程序

 
  1. 返回到 Bluemix 仪表板。
  2. 创建一个新服务(选择 Security > AppScan Dynamic Analyzer),将它绑定到您的应用程序。
  3. 在系统要求时重新加载应用程序。
  4. 单击新服务,确保启动 URL 是正确的,如有必要,请添加登录信息。
  5. 单击 SCAN
  6. 下载扫描 PDF 并阅读它来查看您的安全问题。本教程的剩余部分假设您已找到了一些需要复制到 Track & Plan 的问题。

第 4 步. 解析扫描报告并将扫描结果发送到 Track & Plan API

 

Bluemix AppScan 服务提供的扫描报告是 PDF 格式的。该格式非常便于阅读并与人们分享,但不太适合计算机处理。要将报告转换为更容易使用的格式,可以使用 Adobe Acrobat Reader 11(或更高版本)打开它,选择 File > Save As Other > Text

查看该文本文件,可以注意到所有问题在第 2 行都拥有 “Severity:<high、medium 或 low>”。在问题末尾,有一行以 TOC 结尾,随后是一个空格。这应该足以拆分这些问题并创建工作项。

您可以将这些结果与 第 2 步 相结合来实际发送结果。这无法从浏览器完成,因为在浏览器中运行的 JavaScript 仅能够连接在相同域上运行的 REST API,或者宣称可从其他来源使用代码调用自己的 API。Track & Plan API 不属于二者。

我提供了一个 Python 程序来完成此任务。您需要使用您自己的配置来修改前几行,请参见 第 2 步 中的解释。备注:您可以从 IBM DevOps Services 中本教程的代码项目的 client_side 文件夹下载 Python 脚本。

#! /usr/bin/python

# Send the results of an IBM Bluemix AppScan Dynamic Analyzer scan,
# saved as text by Acrobat Reader, to IBM Bluemix Devops Track & Plan

import re
import urllib.request
import base64
import json

# Configuration ####################################

# Your devops credentials
uid = "oripomerantz";
passwd = "Nice-try";

# Get these values from Step 2.1.
serverID = "ccm08";
projectID = "_cqZlJx7LEeWrnMDj3ue0kw";

# Get this value from Steps 2.3-5
filedAgainst = "https://hub.jazz.net/ccm08/resource/"
filedAgainst += "itemOid/com.ibm.team.workitem.Category/_dLm0sB7LEeWrnMDj3ue0kw";

# The report file
reportFile = "report.txt"


# Read and parse the report ############################

# Read the report into a list of lines.
report = open(reportFile).read().split("/n")

# This array will include all the issues.
issues = []
inIssue = False
startOfIssue = re.compile("Severity:") # Actually, line #2 of it
endOfIssue = re.compile("TOC$")

# This is the syntax for a for loop in Python
for i in range(len(report)):
    # If we're not in an issue and we find Severity: in this
    # line, start the issue with the previous line.
    if not inIssue and startOfIssue.search(report[i]):
         issue = report[i-1] + "/n"
         inIssue = True

    # If we are in an issue and we see TOC at the end of
    #
    if inIssue and endOfIssue.search(report[i]):
        inIssue = False
        issues.append(issue)
        issue = ""
    if inIssue: # Use //n to convert to /n which will be converted
                   # to a newline by Track & Plan
        issue += report[i] + "//n";

# The HTTP configuration #################################################

# Basic authentication to get access to the API. Python can do HTTP
# basic authentication for us, but this is much simpler.
auth = base64.b64encode(bytes(uid + ":" + passwd, 'utf-8')).decode("utf-8")

# The URL to access the API
url = "https://hub.jazz.net/" + serverID
url += "/oslc/contexts/" + projectID + "/workitems"

# Header fields
headers = { 'Content-Type': 'application/x-oslc-cm-change-request+json',
                  'Accept': 'text/json',
                  'Authorization': 'Basic ' + str(auth) + '=='
             }


# Send the issues as work items ########################################
for issue in issues:
     # /n is the delimiter between the heading and the content
     (heading, content) = issue.split("/n")

     # The heading has some spaces before it. Remove them.
     heading = heading.lstrip()

     # Create the JSON request to send
     request = '{/n/t"dc:title": "' + heading + '",/n'

     # Escape any apostrophes in the work item content. Double escaping is
     # needed because it becomes single escaping in the JSON and then
     # gets interpreted correctly by the server.
     request += "/t'dc:description': '" + content.replace("'", "//'") + "',/n"

     request += '/t"dc:type": "defect",/n'

     # The filed against value. To figure this value you need to run some
     # curl, as explained in step 2 in the tutorial
     request += '/t"rtc_cm:filedAgainst": {/n'
     request += '/t/t"rdf:resource": "' + filedAgainst + '"/n'
     request += '/t}/n'
     request += '}/n'

     # Send the request
     req = urllib.request.Request(url, bytes(request, 'utf-8'), headers)
     response = urllib.request.urlopen(req)
     resp = json.loads(response.read().decode("utf-8"))

     # The response includes many fields. One of them is the
     # work item number. You can print it out to see the others if you
     # need them.
     print ("Created work item #" + str(resp["dc:identifier"]) + " for " + heading)

运行此程序,您会看到为您创建了相关的工作项:

将 Bluemix AppScan 结果放入 Bluemix Track &amp; Plan 中

点击查看大图

结束语

 

本教程中讨论的程序非常简单。更复杂的程序可从描述中读取更多字段,比如严重级别,并将它们放在工作项中的相关字段中。这样的程序可能还拥有针对不同 URL 的不同类别,将工作项标记为自动扫描所检测到的漏洞。要创建包含这些功能的程序,让解析更加复杂,可以将 issue 从一个字符串更改为一种结构,并在 JSON request 中设置更多字段。您可以查看您从 Track & Plan 收到的 resp 变量来查看有哪些可用字段。

Track & Plan 服务:链接计划和代码,以便计划与开发团队的进度保持同步。


相关主题:AppScan Dynamic AnalyzerBluemixCURL


    
正文到此结束
Loading...