AWS Lambda 스크립트 구성하기

제공된 예제 코드를 다양한 방법으로 구성하여 Slack에 원하는 정보를 얻을 수 있습니다.

핵심 영역은 페이로드(Slack 메시지가 구성되는 곳) 및 필터링(Snyk 정보가 처리되는 곳)입니다.

이외에도 암호화 및 비밀 검증을 구성할 수 있습니다. 이러한 구성은 이 지침의 범위를 넘어섭니다.

Snyk 페이로드 필터링

다음 코드는 Snyk 페이로드를 필터링합니다.

다음과 같이 코드를 추가하세요:

if(snykbody.indexOf("project") !== -1 && snykbody.indexOf("newIssues") !== -1){
    // 새 문제를 반복함
    var len = event.body['newIssues'].length;
    
    for(let x=0;x<len;x++){    
        // 심각성 얻기
        let severity = JSON.stringify(event.body['newIssues'][x]['issueData']['severity']);
        // 필터링
        if(severity.includes("high") || severity.includes("critical")){
            
            let snykProjectName = JSON.stringify(event.body['project'].name);
            let snykProjectUrl = JSON.stringify(event.body['project'].browseUrl);
            let snykIssueUrl = JSON.stringify(event.body['newIssues'][x]['issueData'].url);
            let snykIssueId = JSON.stringify(event.body['newIssues'][x].id);
            let snykIssuePackage = JSON.stringify(event.body['newIssues'][x].pkgName);
            let snykIssuePriority = JSON.stringify(event.body['newIssues'][x]['priority'].score);
            let message = "New Snyk Vulnerability";
            
            // 결과를 Slack으로 전송
            const result = await messageSlack(
                message,snykProjectUrl,snykProjectName,snykIssuePackage,snykIssueUrl,snykIssueId,severity,snykIssuePriority
            );
        } 
    }

이 코드는 다음을 실행합니다:

  • 유효한 프로젝트 및 문제 확인

  • 문제를 반복하면서 심각성이 높거나 심각한지 확인

  • 지정한 모든 정보를 Slack 메시지로 전달. 원하는 정보를 지정하세요.

필터를 수정하여 예를 들어 특정 CWE만 처리하거나 모든 취약점을 허용하도록 할 수 있습니다.

Slack 메시지 형식

Slack 페이로드는 다음과 같이 messageSlack 함수에서 형식화됩니다.

async function messageSlack(message,snykProjectUrl,snykProjectName,snykIssuePackage,snykIssueUrl,snykIssueId,severity,snykIssuePriority) {
    
    // Axios/Slack 에러를 피하기 위해 문자열 수정
    snykProjectUrl = snykProjectUrl.replace(/['"]+/g, '')
    snykProjectName = snykProjectName.replace(/['"]+/g, '')
    snykIssueUrl = snykIssueUrl.replace(/['"]+/g, '')
    snykIssueId = snykIssueId.replace(/['"]+/g, '')
    snykIssuePackage = snykIssuePackage.replace(/['"]+/g, '')
    severity = severity.replace(/['"]+/g, '')
    
    // 메시지 구성
    let payload = { "text": `${message}`,
                    "blocks": [
		                {
                			"type": "header",
                			"text": {
                				"type": "plain_text",
                				"text": `${message}`,
                			}
                		},{
                			"type": "section",
                			"text": {
                				"type": "mrkdwn",
                				"text": "Snyk has found a new vulnerability in the project:\n*<"+snykProjectUrl+"|"+snykProjectName+">*"
                			}
                		},
                		{
                			"type": "divider"
                		},
                		{
                			"type": "section",
                			"fields": [
                				{
                					"type": "mrkdwn",
                					"text": "*Package name:*\n"+snykIssuePackage
                				},
                				{
                					"type": "mrkdwn",
                					"text": "*Vulnerability:*\n<"+snykIssueUrl+"|"+snykIssueId+">"
                				},
                				{
                					"type": "mrkdwn",
                					"text": "*Severity:*\n"+severity
                				},
                				{
                					"type": "mrkdwn",
                					"text": "*Priority Score:*\n"+snykIssuePriority
                				}
                			]
                		},
                		{
                			"type": "actions",
                			"elements": [
                				{
                					"type": "button",
                					"text": {
                						"type": "plain_text",
                						"text": "View in Snyk"
                					},
                					"style": "primary",
                					"url": snykProjectUrl,
                					"value": "browseUrl"
                				}
                			]
                		}
	               ]};
    
    // 메시지 전송
    const res = await axios.post(slackWebhookUrl, payload);
    const data = res.data;
    console.log(data);
}

Snyk는 Slack의 내장 블록 빌더를 사용하여 페이로드를 원하는 형식으로 디자인했습니다. 블록 빌더를 사용하여 페이로드의 JSON을 구성하여 CWE와 같은 더 많은 정보를 표시하거나 상호작용을 추가하고 Snyk의 ignore API를 사용하여 무시 버튼을 생성할 수 있습니다.

블록 빌더에 대한 자세한 정보는 Slack 웹사이트의 Block Kit에서 찾을 수 있습니다.

Last updated