こんにちは。お久しぶりでございます。
昨年の秋に受験した 情報処理安全確保支援士試験 に合格してたようで大変浮足立っております。
ただ、支援士資格に関してはコストが高額なのもあり、未登録のままにしておこうかと考えている今日この頃でございます。
さて、話は変わりますが 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
ネストしまくりで可読性がアレですね。
もっと上手な書き方あれば教えてください。