[アップデート] Amazon ECR の新しいベーシックスキャン「AWS_NATIVE」が GA となったので使ってみた
いわさです。
Amazon ECR にはイメージスキャンの機能があり、無料で利用可能なベーシックスキャンと、有償オプションである拡張スキャンがあります。
このベーシックスキャンはこれまではオープンソースの Clair を使って実現されていました。
先日のアップデートでベーシックスキャンの方式が現在は2種類使えるようになったので紹介します。
AWS 独自のスキャン「AWS_NATIVE」
実は今年の 3 月ごろにベーシックスキャンに AWS 独自のスキャン方法がプレビューで導入されていました。
このベーシックスキャンが今朝 GA になったとアナウンスがありました。
設定方法
ECR プライベートレジストリの設定画面のスキャン設定からベーシックスキャンか拡張スキャンかなど、スキャンに関する設定が行えていたのですが、ここでベーシックスキャンのスキャンバージョンを変更出来るようになっています。
この表示方法だと、いずれは AWS ネイティブなスキャンに統一され Clair は使えなくなりそうですが、次のようにオプトインするような方式でコンソール上は表示されています。
こちらは旧バージョン(Clair)が選択されている従来のアカウントです。
こちらは別の AWS アカウントで既に新しいバージョンが自動で選択されている状態でした。
次のような表示となっていれば新バージョン(AWS ネイティブ)が選択されています。
ちなみに Inspector を使う拡張スキャンの場合はベーシックスキャンのバージョン選択は表示されません。関係ないようです。
スキャン結果を比較してみる
今回は同じリポジトリの同じイメージに対して、旧ベーシックスキャンと新ベーシックスキャンを実施し結果を比較してみました。
本日時点で AWS ネイティブな新ベーシックスキャンについては Common Vulnerability Scoring System (CVSS) を使って重要度が判定される旨がドキュメント上から確認が出来ます。
結果としては旧ベーシックスキャンと新ベーシックスキャンで検出結果が大きく異なっていました。
詳細を比較した見解までは本日用意出来ていないのですが、スキャン結果が異なるという点は認識しておいてください。
旧ベーシックスキャン
適当なイメージなので中身は置いておくとして、旧ベーシックスキャンの結果は次のような形でした。109 件検出されています。
新ベーシックスキャン
一方で新ベーシックスキャンの結果は次のように 42 件でした。
件数を比較してみると次のような形になりました。CRITICAL については対象 CVE 名も挙げています。
- 旧ベーシックスキャン
- 重要:6
- CVE-2019-8457
- CVE-2021-46848
- CVE-2022-1587
- CVE-2022-1586
- CVE-2023-45853
- CVE-2022-37434
- 高:21
- 中:24
- 低:6
- 情報:34
- 重要:6
- 新ベーシックスキャン
- 重要:4
- CVE-2021-46848
- CVE-2022-37434
- CVE-2022-1586
- CVE-2022-1587
- 高:15
- 中:14
- 低:0
- 情報:0
- 重要:4
ここでは、新ベーシックスキャンではCVE-2019-8457
やCVE-2023-45853
が検出されていないことがわかります。(高など他の重要度に分類されているわけでもありませんでした)
本日時点では非推奨とされているが旧ベーシックスキャンに戻すことも出来る
コンソールに表示されているとおり、新ベーシックスキャンと旧ベーシックスキャンの間でモード切り替えが可能です。
「Revert(Not recommended)」ボタンから旧ベーシックスキャンに切り替えることが可能です。
すぐに切り替わりました。なお、この画面で保存操作は不要です。
旧ベーシックスキャンと新ベーシックスキャンでそれぞれのスキャン結果が保持されてるっぽい
少し挙動を観察したのですが、どうやら AWS 内部では旧ベーシックスキャン設定でスキャンした時の結果と新ベーシックスキャン設定でスキャンした時の結果のそれぞれを保持しているようです。
先ほどのリポジトリは旧設定でスキャンを実行し、その後新設定でスキャンを再実行したものとなります。
以下は新ベーシックスキャン実行後の画面です。
ここからレジストリのスキャン設定でまた旧ベーシックスキャンに切り替えたところ、次のように旧ベーシックスキャンのスキャン結果が表示されました。スキャンの終了日時やスキャン結果は確かに旧ベーシックスキャンのものです。
また、ベーシックスキャンは 24 時間に 1 回実行が可能なのですが、新設定と旧設定でそれぞれ 1 回づつ実行が出来ました。どうやらそれぞれの最終実行日時で判断されているようです。
AWS CLI でスキャン結果を取得する場合は注意が必要
公式ドキュメントに次の注意書きがありまして、スキャン結果は DescribeImages と DescribeImageScanFindings で取得が出来るのですが、新スキャン結果については DescribeImages では取得できなくなっています。
The new version of basic scanning does not support imageScanFindingsSummary and imageScanStatus in the DescribeImages API. To view these, use the DescribeImageScanFindings API.
確認してみましょう。
DescribeImages は新スキャン設定時はスキャン結果が取得できない
aws ecr describe-images
の新旧それぞれの実行結果です。
旧スキャン設定時
スキャン設定が旧スキャン設定時は次のようにimageScanStatus
やimageScanFindingsSummary
を確認することが出来ます。
% aws-v1 ecr describe-images --repository-name consoleapp2
{
"imageDetails": [
{
"registryId": "123456789012",
"repositoryName": "consoleapp2",
"imageDigest": "sha256:c9c1e4ee2b05d4ce66d19b1cbcc35d04bce04f0615fb3dd22b87f2ae22fe98e8",
"imageTags": [
"637928536697010435"
],
"imageSizeInBytes": 79933313,
"imagePushedAt": 1657256907.0,
"imageScanStatus": {
"status": "COMPLETE",
"description": "The scan was completed successfully."
},
"imageScanFindingsSummary": {
"imageScanCompletedAt": 1722976323.0,
"vulnerabilitySourceUpdatedAt": 1722939986.0,
"findingSeverityCounts": {
"HIGH": 21,
"MEDIUM": 24,
"INFORMATIONAL": 34,
"LOW": 6,
"CRITICAL": 6,
"UNDEFINED": 18
}
},
"imageManifestMediaType": "application/vnd.docker.distribution.manifest.v2+json",
"artifactMediaType": "application/vnd.docker.container.image.v1+json",
"lastRecordedPullTime": 1657257077.589
}
]
}
新スキャン設定時
一方で、スキャン設定が新スキャン設定になっている場合、AWS CLI の結果からイメージスキャンに関する情報が取得できなくなりました。
% aws-v1 ecr describe-images --repository-name consoleapp2
{
"imageDetails": [
{
"registryId": "123456789012",
"repositoryName": "consoleapp2",
"imageDigest": "sha256:c9c1e4ee2b05d4ce66d19b1cbcc35d04bce04f0615fb3dd22b87f2ae22fe98e8",
"imageTags": [
"637928536697010435"
],
"imageSizeInBytes": 79933313,
"imagePushedAt": 1657256907.0,
"imageManifestMediaType": "application/vnd.docker.distribution.manifest.v2+json",
"artifactMediaType": "application/vnd.docker.container.image.v1+json",
"lastRecordedPullTime": 1657257077.589
}
]
}
DescribeImageScanFindings はスキャン設定に応じた結果が取得される
そして、DescribeImageScanFindings についてですがこちらは新旧どちらでもスキャン結果が取得出来ます。
ただし、先程 AWS 内部でそれぞれの結果を保持していそうだとお伝えしましたが、スキャン設定に応じて新旧どちらの結果が取得されるかが切り替わっているようです。
aws ecr describe-image-scan-findings
を実行してみましょう。
旧スキャン設定時
findingSeverityCounts
を確認してみると先程の旧スキャンと同じ結果が取得されていることがわかります。
% aws-v1 ecr describe-image-scan-findings --repository-name consoleapp2 --image-id imageTag=637928536697010435 --max-items 2
{
"imageScanFindings": {
"findings": [
{
"name": "CVE-2019-8457",
"description": "SQLite3 from 3.6.0 to and including 3.27.2 is vulnerable to heap out-of-bound read in the rtreenode() function when handling invalid rtree tables.",
"uri": "https://security-tracker.debian.org/tracker/CVE-2019-8457",
"severity": "CRITICAL",
"attributes": [
{
"key": "CVSS3_SCORE",
"value": "9.8"
},
{
"key": "package_version",
"value": "5.3.28+dfsg1-0.8"
},
{
"key": "package_name",
"value": "db5.3"
},
{
"key": "CVSS3_VECTOR",
"value": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
},
{
"key": "CVSS2_VECTOR",
"value": "AV:N/AC:L/Au:N/C:P/I:P/A:P"
},
{
"key": "CVSS2_SCORE",
"value": "7.5"
}
]
},
{
"name": "CVE-2021-46848",
"description": "GNU Libtasn1 before 4.19.0 has an ETYPE_OK off-by-one array size check that affects asn1_encode_simple_der.",
"uri": "https://security-tracker.debian.org/tracker/CVE-2021-46848",
"severity": "CRITICAL",
"attributes": [
{
"key": "CVSS3_SCORE",
"value": "9.1"
},
{
"key": "package_version",
"value": "4.16.0-2"
},
{
"key": "package_name",
"value": "libtasn1-6"
},
{
"key": "CVSS3_VECTOR",
"value": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H"
}
]
}
],
"imageScanCompletedAt": 1722976323.0,
"vulnerabilitySourceUpdatedAt": 1722939986.0,
"findingSeverityCounts": {
"HIGH": 21,
"MEDIUM": 24,
"LOW": 6,
"UNDEFINED": 18,
"INFORMATIONAL": 34,
"CRITICAL": 6
}
},
"registryId": "123456789012",
"repositoryName": "consoleapp2",
"imageId": {
"imageDigest": "sha256:c9c1e4ee2b05d4ce66d19b1cbcc35d04bce04f0615fb3dd22b87f2ae22fe98e8",
"imageTag": "637928536697010435"
},
"imageScanStatus": {
"status": "COMPLETE",
"description": "The scan was completed successfully."
},
"NextToken": "eyJuZXh0VG9rZW4iOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAyfQ=="
}
新スキャン設定時
こちらも同様にfindingSeverityCounts
を見てみると新スキャンをコンソールで確認した時の 42 件が取得されています。
% aws-v1 ecr describe-image-scan-findings --repository-name consoleapp2 --image-id imageTag=637928536697010435 --max-items 2
{
"imageScanFindings": {
"findings": [
{
"name": "CVE-2024-0567",
"description": "A vulnerability was found in GnuTLS, where a cockpit (which uses gnuTLS) rejects a certificate chain with distributed trust. This issue occurs when validating a certificate chain with cockpit-certificate-ensure. This flaw allows an unauthenticated, remote client or attacker to initiate a denial of service attack.",
"uri": "https://nvd.nist.gov/vuln/detail/CVE-2024-0567",
"severity": "HIGH",
"attributes": [
{
"key": "CVSS3_SCORE",
"value": "7.5"
},
{
"key": "CVSS3_VECTOR",
"value": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
},
{
"key": "package_version",
"value": "3.7.1-5"
},
{
"key": "package_name",
"value": "gnutls28"
}
]
},
{
"name": "CVE-2023-0361",
"description": "A timing side-channel in the handling of RSA ClientKeyExchange messages was discovered in GnuTLS. This side-channel can be sufficient to recover the key encrypted in the RSA ciphertext across a network in a Bleichenbacher style attack. To achieve a successful decryption the attacker would need to send a large amount of specially crafted messages to the vulnerable server. By recovering the secret from the ClientKeyExchange message, the attacker would be able to decrypt the application data exchanged over that connection.",
"uri": "https://nvd.nist.gov/vuln/detail/CVE-2023-0361",
"severity": "HIGH",
"attributes": [
{
"key": "CVSS3_SCORE",
"value": "7.4"
},
{
"key": "CVSS3_VECTOR",
"value": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N"
},
{
"key": "package_version",
"value": "3.7.1-5"
},
{
"key": "package_name",
"value": "gnutls28"
}
]
}
],
"imageScanCompletedAt": 1722978227.0,
"vulnerabilitySourceUpdatedAt": 1722978227.0,
"findingSeverityCounts": {
"HIGH": 15,
"MEDIUM": 14,
"UNDEFINED": 9,
"CRITICAL": 4
}
},
"registryId": "123456789012",
"repositoryName": "consoleapp2",
"imageId": {
"imageDigest": "sha256:c9c1e4ee2b05d4ce66d19b1cbcc35d04bce04f0615fb3dd22b87f2ae22fe98e8",
"imageTag": "637928536697010435"
},
"imageScanStatus": {
"status": "COMPLETE",
"description": "The scan was completed successfully."
},
"NextToken": "eyJuZXh0VG9rZW4iOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAyfQ=="
}
さいごに
本日は Amazon ECR の新しいベーシックスキャン「AWS_NATIVE」が GA となったので使ってみました。
利用者の多くの方は「スキャン結果変わるようだが、どちらを使えばいいんだ?」となりそうですが、AWS としては今回追加された AWS ネイティブな新スキャンが推奨されています。
旧スキャン廃止の予定は公式ドキュメントやアナウンスを見た限りではまだ無いようなので、スキャン結果の妥当性などの情報を含めて、少し動向に注意しておきたいです。