β

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

Harries Blog™ 68 阅读

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

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

获取代码

备注 :源 代码 包含一个不安全的应用程序,您需要将它 安装 在 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 P ip eline Track &
    Plan
    。这些服务都将应用于整个 空间 ,而不是一个特定的应用程序。
  11. 在仪表板中,单击 delivery pipeline 服务并选择该项目: 将 Bluemix AppScan 结果放入 Bluemix Track & Plan 中

    点击查看大图

    将 Bluemix AppScan 结果放入 Bluemix Track & Plan 中
  12. 单击 EDIT CODE ,然后单击 Git 图标( 将 Bluemix AppScan 结果放入 Bluemix Track & Plan 中 )。
  13. 单击 Push > Push All
  14. 键入一条提交消息,选择 Select All ,然后单击 Commit
  15. 单击 B UI LD & 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 中

点击查看大图

关闭 [x]

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

  • 如果还没有命令行 URL 工具 curl ,请安装它。
  • 使用下面这个命令来获取工作项列表。列表应包含一项,也就是您在第 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
  • 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>
  • 在浏览器中打开 x.html
    文件。它显示了一个与以下值类似的值:
    https://hub.jazz.net/ccm08/resource/itemOid/com.ibm.team.workitem.Category/_dLm0sB7LEeWrnMDj3ue0kw
  • 创建一个包含以下内容的文件
    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>"
        }
    }
  • 运行下面这条命令,使用 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"
  • 返回到 Track & Plan 的 Web 界面,单击 ALL WORK 。您会看到您的新工作项,目前它还未分配。 将 Bluemix AppScan 结果放入 Bluemix Track & Plan 中

    点击查看大图

    关闭 [x]

    将 Bluemix AppScan 结果放入 Bluemix Track & 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 & Plan 中

    点击查看大图

    关闭 [x]

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

    结束语

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

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


    相关主题: AppScan Dynamic Analyzer Bluemix CURL

    PS:如果您想和业内技术大牛交流的话,请加qq群(521249302)或者关注微信公众 号(AskHarries),谢谢!

    转载请注明原文出处: Harries Blog™ » 将 Bluemix AppScan 结果放入 Bluemix Track & Plan 中

    作者:Harries Blog™
    追心中的海,逐世界的梦
    原文地址:将 Bluemix AppScan 结果放入 Bluemix Track & Plan 中, 感谢原作者分享。

    发表评论