【AWS】ECR 最新イメージの脆弱性スキャン結果を CSV ライクに出力する【Bash】

こんにちは。お久しぶりでございます。
昨年の秋に受験した 情報処理安全確保支援士試験 に合格してたようで大変浮足立っております。
ただ、支援士資格に関してはコストが高額なのもあり、未登録のままにしておこうかと考えている今日この頃でございます。

さて、話は変わりますが Inspector V2 で ECR のイメージを継続的にスキャンしている環境がございまして。
複数の ECR リポジトリに存在する最新イメージにて検知された脆弱性スキャン結果のみを抽出する必要がございまして。
ちょっとしたスクリプトを組む必要が出てきまして。
わりかし今後も似たようなスクリプトを組む気がしているので、自分用のイディオムとして残しておきます。

スクリプト

ロギング ( log.sh ) / credentials ( env.sh ) の処理は別ファイルから読み込む前提とします。
また、対象とする ECR リポジトリに関しても、リスト ( list.sh ) を作成し、外部ファイルから読み込む形とします。
※ list.sh については、引数を渡して ECR リポジトリを出力する処理である前提です。

#!/usr/bin/bash

PWD=`dirname ${0}`

source ${PWD}/../etc/env.sh
. ${PWD}/../lib/log.sh

if [ $# != 1 ]; then
    echo "Error: invalid argument."
    emitLog "Error: invalid argument."
    exit 1
fi

if !(type "aws" > /dev/null 2>&1); then
    echo "Error: aws command is not found."
    emitLog "Error: aws command is not found."
    exit 1
fi

## GET LATEST IMAGE TAG

container_array=($(/bin/bash ${PWD}/../etc/list.sh ${1}))

container_index=0
for i in ${container_array[@]}
do
     tag_array[${container_index}]=`aws ecr describe-images \
          --region ap-northeast-1 \
          --repository-name ${i} \
          --query 'sort_by(imageDetails,& imagePushedAt)[-1]' --output json \
          | jq -r '.imageTags[0]'`

     let container_index++
done

## SHOW SCAN FINDING

tag_index=0
for i in ${tag_array[@]}
do
     echo "/=================================================/"
     aws ecr describe-image-scan-findings \
          --region ap-northeast-1 \
          --repository-name ${container_array[$tag_index]} \
          --image-id imageTag=${i} \
          | jq ".repositoryName, .imageId.imageTag"

     element_num=`aws ecr describe-image-scan-findings \
          --region ap-northeast-1 \
          --repository-name ${container_array[$tag_index]} \
          --image-id imageTag=${i} \
          | jq '.imageScanFindings.enhancedFindings | length'`
     
     element_num=$(($element_num - 1))
     for j in `seq 0 ${element_num}`
     do
          echo "-------------------------------------------------"
          aws ecr describe-image-scan-findings \
               --region ap-northeast-1 \
               --repository-name ${container_array[$tag_index]} \
               --image-id imageTag=${i} \
               | jq -r "[.imageScanFindings.enhancedFindings[$j].packageVulnerabilityDetails.vulnerablePackages[0].name, .imageScanFindings.enhancedFindings[$j].packageVulnerabilityDetails.vulnerabilityId, .imageScanFindings.enhancedFindings[$j].severity, .imageScanFindings.enhancedFindings[$j].score] | @csv"
     done

     let tag_index++     
done

ネストしまくりで可読性がアレですね。
もっと上手な書き方あれば教えてください。

投稿者: snk

保有資格 ・TOEIC 835 ・LPIC 304 ・AWS SAA/SAP ・GCP PCA ・IPA SC

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です