JFrog x射线:创建Jira问题使用webhooks在微风

JFrog x射线:创建Jira问题使用webhooks在微风

JFrog Xray提供端到端的安全扫描解决方案涵盖工件的完整开发生命周期。这包括脆弱性分析、安全性和许可遵从性、工件流控制、分布等等。当x射线发现安全或许可证问题时,它将触发对它的违规。开发周期中最常见的用例之一就是能够使用Jira等常用工具跟踪这些问题,而Xray Webhooks允许您这样做。

首先,什么是webhook?

一个Webhook是一个API概念,用来改变web请求行为与自定义回调,由第三方用户使用,开发人员或程序不是必须与原始网站或应用程序相关联。这也可以被称为“反向API”。

假设我们有一个由x射线触发的违规,我们有一个带有手表的x射线策略,该策略被配置为将Webhook发送到特定的第三方应用程序。为了使. json第三方应用程序自动创建可读和可用的文件,我们可以使用一个简单的脚本来解析数据,并将其显示在Jira票据甚至Slack消息中。

JFrog x光违章

5个简单的步骤来实现与Jira一起工作的x射线网络钩子

以下是我们需要做的:

  1. 创建一个“轻”服务器,它将知道如何侦听远程请求。
  2. 配置一个x射线网络链接,与政策这会触发它。
  3. 理解结构一个x光网络钩子. json文件,以便正确地解析信息。(见感染文件结构下面部分中的片段)
  4. 一旦我们能够解析信息,我们需要定义想要发送到JIRA服务器的内容以及问题将包含哪些信息。(见从x射线处理程序创建Jira下面部分中的片段)
  5. 实现与此信息的Jira服务器交互。

为什么Go是最好的选择?

Go是一种超级简单的语言使用!只需几行代码,我们就可以轻松地创建一个服务器,它可以在短时间内启动并运行,并且知道如何侦听HTTP请求。根据我的经验,与其他语言相比,使用Go编程语言要容易得多。

此外,为了帮助我们创建Jira客户端对象并使用它打开一个问题,我们可以使用go-jira,一个非常好的开源库GoCenter上也有这里有一个很好的例子

剩下要做的就是在Jira服务器上创建一个用户,并为其提供访问权限来创建问题。

去的例子

让我们来看看它的实际应用吧!下面是你可以使用的Go结构和处理程序片段:

1.违反结构

这个结构定义了我们要为之创建Jira罚单的x射线违规。x射线创建一个违例,它被webhook以JSON格式捕获。

类型违例结构{创建的字符串' json:" Created " ' TopSeverity string ' json:"top_severity" ' WatchName string ' json:"watch_name" ' PolicyName string ' json:"policy_name" ' Issues Issues ' json:" Issues " '}

2.问题的结构

部分违规是许可证或安全问题。

type问题结构{严重性字符串' json:" Severity " '类型字符串' json:"type" ' //问题类型license/security摘要字符串' json:" Summary " '描述字符串' json:" Description " ' ImpactedArtifacts ImpactedArtifacts ' json:"impacted_artifacts" '} type问题[]问题

3.受影响工件结构

每个问题都包含Artifactory中许多受违规影响的工件。

type ImpactedArtifact struct{名称字符串' json:" Name " ' //工件名称DisplayName字符串' json:"display_name" '路径字符串' json:" Path " ' // Artifactory中的工件路径PackageType字符串' json:"pkg_type" ' SHA256字符串' json:" SHA256 " ' //工件SHA256校验和SHA1字符串' json:" SHA1 " ' Depth int ' json:" Depth " ' //工件层次结构中的工件深度ParentSHA字符串' json:"parent_sha" ' InfectedFiles InfectedFiles ' json:"infected_files" '} type ImpactedArtifacts []ImpactedArtifact

4.感染文件结构

每个工件可以包含许多受感染的文件,这些是受感染的组件。

type受感染文件struct{名称字符串' json:" Name " '路径字符串' json:" Path " ' // Artifactory中的工件路径SHA256字符串' json:" SHA256 " ' // artifact SHA256校验和深度int ' json:" Depth " ' //其层次结构中的工件深度ParentSHA字符串' json:"parent_sha" ' //父工件SHA1 DisplayName字符串' json:"display_name" PackageType字符串' json:"pkg_type" '} type受感染文件[]受感染文件

从x射线处理程序示例创建Jira

下面是使用上述结构的完整示例。

CreateJira(w http.)ResponseWriter, r *http.Request) {var violation var jiraAccountConfiguration JiraAccountConf var jiraIssueConfiguration JiraIssueConf jiraAccountConfiguration = readjiraconfigationfile ("config/jira-account.json") jiraIssueConfiguration = ReadJiraIssueFile ("config/jira-create-issue.json") body, err:= ioutil.ReadAll(io.LimitReader(r。Body, 5048576))如果err != nil{panic(err)}如果err:= json。Unmarshal(身体,违反);err != nil {w.c arhead()。集(“内容类型”、“application / json;charset=UTF-8") w. writeheader (200) if err:= json. newencode (w).Encode(err);fmt. = nil {panic(Err)}}。Println("打开jira帐户配置文件")tp:= jira。BasicAuthTransport{用户名:strings.TrimSpace(jiraAccountConfiguration.UserName),密码:strings.TrimSpace(jiraAccountConfiguration.Password),}客户端,err:= jiraa . newclient (tp.Client(), strings.TrimSpace(jiraAccountConfiguration.ConnectionString))如果err != nil {fmt. trimspace。Printf("\nerror: %v\n", err) return} i:= jira。问题{字段:&jira。IssueFields{受让人:&jira。用户{名称:jiraIssueConfiguration。受让人,},记者:吉拉。User{ Name: jiraIssueConfiguration.Reporter, }, Description: "The watch " + violation.WatchName + " with policy " + violation.PolicyName + " created a violation with " + getIssuesCount(violation) + " number of issues", Type: jira.IssueType{ Name: jiraIssueConfiguration.IssueType, // BUG/IMPROVEMENT/TASK ETC }, Project: jira.Project{ Key: jiraIssueConfiguration.Project, // PROJECT_NAME on Jira Server }, Summary: "Violation was found with " + violation.TopSeverity + " severity", }, } issue, _, err := client.Issue.Create(&i) if err != nil { panic(err) } fmt.Println("%s: %+v\n", issue.Key) }

自己试试吧!