ããã¯ããªã«ãããããŠæžãããã®ïŒ
以åããã¡ãã£ãšæ°ã«ãªã£ãŠãããTrivyãšããã³ã³ããã€ã¡ãŒãžã®è匱æ§ã¹ãã£ã³ããŒã«ã詊ããŠã¿ãããšæããŸãã
以åãClairã詊ããããšãããã®ã§ãããããããã£ãã倧å€ã ã£ãã®ã§ããã¡ãã£ãšç°¡åãªãã®ã¯ãªãããªãïŒãšæã£ãŠããã®ã§ã
Clairで、Dockerイメージの脆弱性スキャンを試す - CLOVER🍀
䜿ãããããšè©å€ã ã£ãããšããã£ãŠãèªåã§ãåãããŠã¿ãããšæããŸãã
Trivy
Trivyã¯ãOSSã®ã³ã³ããã€ã¡ãŒãžã®è匱æ§ã¹ãã£ã³ããŒã«ã§ãã
ã³ã³ããã€ã¡ãŒãžã®OSãããã±ãŒãžçã«å«ãŸããè匱æ§ãã¹ãã£ã³ããŠãããŸããåºæ¬çãªäœ¿ãæ¹ã¯CLIã§ãã³ã³ããã€ã¡ãŒãžåãæå®ããŠ
å®è¡ãããšããã·ã³ãã«ãªãã®ã§ãããŸããé«éãªããšã売ãã«ããŠããŸãã
ã€ã³ã¹ããŒã«ãOSããã±ãŒãžã䜿ãããšã§ç°¡åã«ã§ããããCIãžã®çµã¿èŸŒã¿æ¹ã玹ä»ããããããŠããŸãã
OSããã±ãŒãžã®èåŒ±æ§æ€ç¥ã®ã¿ã§ãªããã¢ããªã±ãŒã·ã§ã³ã®äŸåé¢ä¿ããã®èåŒ±æ§æ€ç¥ãå¯èœã§ãã
ããã°ã©ãã³ã°èšèªãšããŠã¯ãRubyãPythonãPHPãNode.jsãRustãã€ãç¹å®ã®èšå®ãã¡ã€ã«ã«å¯Ÿå¿ããŠããŸãã
ä»ã®ã³ã³ããã€ã¡ãŒãžè匱æ§ã¹ãã£ã³ããŒã«ïŒClairãAnchore EngineãQuayãDocker HubãGCRïŒãšã®æ¯èŒã
Comparison with other scanners
Trivyã®éçºè ã¯æ¥æ¬ã®æ¹ã§ãTrivyã¯ä»ã¯Aquaã®ã©ã€ã³ãããã«å ãã£ãŠããããã§ãïŒTrivyã¯èªäœã¯OSSã®ãŸãŸïŒã
Trivy Vulnerability Scanner Joins the Aqua Family
ã§ã¯ã説æã¯ãããããã«ããŠäœ¿ã£ãŠãã£ãŠã¿ãŸãããã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ããUbuntu Linux 18.04 LTSã§ãã
$ uname -srvmpio Linux 4.15.0-96-generic #97-Ubuntu SMP Wed Apr 1 03:25:46 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.4 LTS Release: 18.04 Codename: bionic $ docker -v Docker version 19.03.8, build afacb8b7f0
Trivyãã€ã³ã¹ããŒã«ãã
ãŸãã¯ãTrivyãã€ã³ã¹ããŒã«ããŸãã
Ubuntu Linuxã®å Žåã¯ãaptã§ã®ã€ã³ã¹ããŒã«ãå¯èœã§ãã
$ sudo apt install wget apt-transport-https gnupg lsb-release $ wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add - $ echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list $ sudo apt update $ sudo apt install trivy
ä»åã€ã³ã¹ããŒã«ããããTrivyã®ããŒãžã§ã³ã§ãã
$ trivy -v Version: 0.5.4
詊ããŠã¿ã
ã§ã¯ã䜿ã£ãŠã¿ãŸããä»åã¯ãOSããã³ããã±ãŒãžã察象ã«ããŸãããïŒã¢ããªã±ãŒã·ã§ã³ã®ã¹ãã£ã³ã¯ãããŸããïŒã
ãé¡ã¯ãClairã®æãšåããå°ãããŒãžã§ã³ãå€ãApacheã䜿ããŸãã
Clairで、Dockerイメージの脆弱性スキャンを試す - CLOVER🍀
Dockerã€ã¡ãŒãžãpullã
$ docker image pull httpd:2.4.37
Quick Startã«ãããã£ãŠãã¹ãã£ã³ãè¡ããŸãã
äœ¿ãæ¹ã¯ç°¡åã§ãã³ã³ããã€ã¡ãŒãžåãæå®ããŠtrivyã³ãã³ããå®è¡ããã ãã§ãã
$ trivy httpd:2.4.37
ååã¯ãè匱æ§ããŒã¿ããŒã¹ãããŠã³ããŒãããŠããŸãã
2020-04-14T12:51:05.627Z INFO Need to update DB 2020-04-14T12:51:05.627Z INFO Downloading DB... 15.54 MiB / 15.54 MiB [-----------------------------------------------------------------------------------------------------------------------------------] 100.00% 2.37 MiB p/s 7s 2020-04-14T12:51:13.721Z INFO Reopening DB... 2020-04-14T12:51:19.721Z INFO Detecting Debian vulnerabilities...
çµæã¯ããããªæãã«ãªããŸãã
httpd:2.4.37 (debian 9.6) ========================= Total: 628 (UNKNOWN: 3, LOW: 129, MEDIUM: 317, HIGH: 155, CRITICAL: 24) +---------------------+---------------------+----------+----------------------------+-----------------------------------+------------------------------------------------------------------+ | LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE | +---------------------+---------------------+----------+----------------------------+-----------------------------------+------------------------------------------------------------------+ | apt | CVE-2019-3462 | CRITICAL | 1.4.8 | 1.4.9 | Incorrect sanitation of the | | | | | | | 302 redirect field in HTTP | | | | | | | transport method of... | + +---------------------+----------+ +-----------------------------------+------------------------------------------------------------------+ | | CVE-2011-3374 | MEDIUM | | | It was found that apt-key | | | | | | | in apt, all versions, do not | | | | | | | correctly... | +---------------------+---------------------+----------+----------------------------+-----------------------------------+------------------------------------------------------------------+ ãçç¥ã + +---------------------+----------+ +-----------------------------------+------------------------------------------------------------------+ | | CVE-2018-20482 | LOW | | | tar: Infinite read loop in | | | | | | | sparse_dump_region function in | | | | | | | sparse.c | + +---------------------+ + +-----------------------------------+------------------------------------------------------------------+ | | TEMP-0290435-0B57B5 | | | | | +---------------------+---------------------+----------+----------------------------+-----------------------------------+------------------------------------------------------------------+ | util-linux | CVE-2016-2779 | HIGH | 2.29.2-1+deb9u1 | | util-linux: runuser tty hijack | | | | | | | via TIOCSTI ioctl | +---------------------+ + + +-----------------------------------+ + | uuid-dev | | | | | | | | | | | | | +---------------------+---------------------+----------+----------------------------+-----------------------------------+------------------------------------------------------------------+
ããŠã³ããŒããããããŒã¿ããŒã¹ãããã£ãã·ã¥ãªã©ã¯ä»¥äžã«ä¿åãããããã§ãã
$ find ~/.cache/trivy -type f $HOME/.cache/trivy/db/trivy.db $HOME/.cache/trivy/fanal/fanal.db
ããŒã¿ããŒã¹ã¯ãæŽæ°ãäžèŠãªå Žåã¯2åç®ä»¥éã¯ããŠã³ããŒãããªããããªã®ã§ïŒå¿
èŠãªå Žåã¯æ¬¡åã®å®è¡æã«ã¢ããããŒããè¡ãããŸãïŒã
1床ããŒã¿ããŒã¹ããã³ãã£ãã·ã¥ãã¯ãªã¢ããŠéåºŠãæž¬ã£ãŠã¿ãŸãããã
$ trivy --reset
ååå®è¡ã®é床ã
$ time trivy httpd:2.4.37 2020-04-14T13:01:30.043Z INFO Need to update DB 2020-04-14T13:01:30.043Z INFO Downloading DB... 15.54 MiB / 15.54 MiB [-----------------------------------------------------------------------------------------------------------------------------------] 100.00% 1.73 MiB p/s 9s 2020-04-14T13:01:40.671Z INFO Reopening DB... 2020-04-14T13:01:46.839Z INFO Detecting Debian vulnerabilities... httpd:2.4.37 (debian 9.6) ========================= Total: 628 (UNKNOWN: 3, LOW: 129, MEDIUM: 317, HIGH: 155, CRITICAL: 24) ãçç¥ã real 0m17.188s user 0m1.982s sys 0m0.720s
20ç§ã«æºããªãçšåºŠã§ããã
2åç®ã
$ time trivy httpd:2.4.37 2020-04-14T13:02:23.738Z INFO Detecting Debian vulnerabilities... httpd:2.4.37 (debian 9.6) ========================= Total: 628 (UNKNOWN: 3, LOW: 129, MEDIUM: 317, HIGH: 155, CRITICAL: 24) ãçç¥ã real 0m3.930s user 0m0.199s sys 0m0.257s
4ç§åŒ±ãéãã§ãïŒããã¯ç¢ºãã«è¯ãã§ãããClairã®ã€ã³ã¹ããŒã«ã®å€§å€ãããè匱æ§ããŒã¿ããŒã¹ã®æŽæ°ã«æéãããã£ãŠããã®ã
åã®ããâŠã
ã³ãã³ãã®ãã«ãã
$ trivy -h NAME: trivy - A simple and comprehensive vulnerability scanner for containers USAGE: trivy [options] image_name VERSION: 0.5.4 OPTIONS: --template value, -t value output template [$TRIVY_TEMPLATE] --format value, -f value format (table, json, template) (default: "table") [$TRIVY_FORMAT] --input value, -i value input file path instead of image name [$TRIVY_INPUT] --severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY] --output value, -o value output file name [$TRIVY_OUTPUT] --exit-code value Exit code when vulnerabilities were found (default: 0) [$TRIVY_EXIT_CODE] --skip-update skip db update [$TRIVY_SKIP_UPDATE] --download-db-only download/update vulnerability database but don't run a scan [$TRIVY_DOWNLOAD_DB_ONLY] --reset remove all caches and database [$TRIVY_RESET] --clear-cache, -c clear image caches without scanning [$TRIVY_CLEAR_CACHE] --quiet, -q suppress progress bar and log output [$TRIVY_QUIET] --no-progress suppress progress bar [$TRIVY_NO_PROGRESS] --ignore-unfixed display only fixed vulnerabilities [$TRIVY_IGNORE_UNFIXED] --debug, -d debug mode [$TRIVY_DEBUG] --removed-pkgs detect vulnerabilities of removed packages (only for Alpine) [$TRIVY_REMOVED_PKGS] --vuln-type value comma-separated list of vulnerability types (os,library) (default: "os,library") [$TRIVY_VULN_TYPE] --cache-dir value cache directory (default: "/home/vagrant/.cache/trivy") [$TRIVY_CACHE_DIR] --ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE] --timeout value docker timeout (default: 2m0s) [$TRIVY_TIMEOUT] --light light mode: it's faster, but vulnerability descriptions and references are not displayed [$TRIVY_LIGHT] --only-update value deprecated [$TRIVY_ONLY_UPDATE] --refresh deprecated [$TRIVY_REFRESH] --auto-refresh deprecated [$TRIVY_AUTO_REFRESH] --help, -h show help --version, -v print the version
åºæ¬çãªäœ¿ãæ¹ã¯ããã£ãã®ã§ãããå°ããããããã£ãŠã¿ãŸãããã
çµæãJSONã§åºåãã
èåŒ±æ§æ€åºçµæã®ããã©ã«ãã®åºåãã©ãŒãããã¯table圢åŒãªã®ã§ãããJSONã«å€æŽããããšãå¯èœã§ãïŒããšãGoã®ãã³ãã¬ãŒãã
䜿ãããšãå¯èœïŒã
ã-fãã§æå®ããŸãããŸããã-oããªãã·ã§ã³ã䜿ãããšã§ãçµæããã¡ã€ã«ã«ä¿åããããšãã§ããŸãã
$ trivy -f json -o results.json httpd:2.4.37 2020-04-14T12:55:15.481Z INFO Detecting Debian vulnerabilities...
çµæã®äžéšã
$ head -n 30 results.json [ { "Target": "httpd:2.4.37 (debian 9.6)", "Vulnerabilities": [ { "VulnerabilityID": "CVE-2019-3462", "PkgName": "apt", "InstalledVersion": "1.4.8", "FixedVersion": "1.4.9", "LayerID": "sha256:7b4e562e58dcb7fbe1e27bb274f0ff8bfeb2fd965203380436e159df9f218900", "Description": "Incorrect sanitation of the 302 redirect field in HTTP transport method of apt versions 1.4.8 and earlier can lead to content injection by a MITM attacker, potentially leading to remote code execution on the target machine.", "Severity": "CRITICAL", "References": [ "http://www.securityfocus.com/bid/106690", "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-3462", "https://lists.apache.org/thread.html/8338a0f605bdbb3a6098bb76f666a95fc2b2f53f37fa1ecc89f1146f@%3Cdevnull.infra.apache.org%3E", "https://lists.debian.org/debian-lts-announce/2019/01/msg00013.html", "https://lists.debian.org/debian-lts-announce/2019/01/msg00014.html", "https://security.netapp.com/advisory/ntap-20190125-0002/", "https://usn.ubuntu.com/3863-1/", "https://usn.ubuntu.com/3863-2/", "https://www.debian.org/security/2019/dsa-4371" ] }, { "VulnerabilityID": "CVE-2011-3374", "PkgName": "apt", "InstalledVersion": "1.4.8", "LayerID": "sha256:7b4e562e58dcb7fbe1e27bb274f0ff8bfeb2fd965203380436e159df9f218900", "Description": "It was found that apt-key in apt, all versions, do not correctly validate gpg keys with the master keyring, leading to a potential man-in-the-middle attack.",
CIã«çµã¿èŸŒãéãªã©ã«ãå¿ èŠã«å¿ããŠã
æ€åºããè匱æ§ã®éèŠåºŠãæå®ãã
ã--severityããªãã·ã§ã³ã䜿ãããšã§ãæ€åºããè匱æ§ã®éèŠåºŠããã£ã«ã¿ãªã³ã°ããããšãã§ããŸãã
$ trivy --severity HIGH,CRITICAL httpd:2.4.37 2020-04-14T13:04:28.016Z INFO Detecting Debian vulnerabilities... httpd:2.4.37 (debian 9.6) ========================= Total: 179 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 155, CRITICAL: 24)
ããã©ã«ãã¯ããã¡ãïŒå šçš®é¡ïŒã§ãã
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY]
è匱æ§ããŒã¿ããŒã¹ã¯ïŒ
è匱æ§ã¹ãã£ã³ãè¡ããšããããšã¯ãæ€åºå¯Ÿè±¡ãšãªãè匱æ§ãéããããããŒã¿ããŒã¹ããããŸããããããååã«ããŠã³ããŒããããŠãã
ãã®ã§ããã
ã©ãããããŠã³ããŒãããŠããã®ããªïŒãšæã£ãŠèª¿ã¹ãã®ã§ããããã¡ãã®ããã§ãã
https://github.com/aquasecurity/trivy/blob/v0.5.4/pkg/db/db.go#L20-L23
å¥ãªããžããªã§ããã
GitHub - aquasecurity/trivy-db
ã©ããªå 容ãå«ãŸããŠãããã¯ããã¡ããèŠããšããã§ãããã
https://github.com/aquasecurity/trivy-db/tree/v1-2020041412/pkg/vulnsrc
è匱æ§ããŒã¿ããŒã¹ã¯ãtrivyã³ãã³ãã®å®è¡æã«å¿
èŠã§ããã°æŽæ°ãããããæ¬¡ã«èšèŒããã¯ã©ã€ã¢ã³ãïŒãµãŒããŒã¢ãŒãã®æã¯
ãµãŒããŒåŽã宿çã«æŽæ°ããŸãã
ãªããè匱æ§ããŒã¿ããŒã¹ã®æŽæ°ãã¹ãããããããšãå¯èœã§ãããè匱æ§ããŒã¿ããŒã¹ã®ããŠã³ããŒãã®ã¿ãè¡ãããšãã§ããŸãã
ã¯ã©ã€ã¢ã³ãïŒãµãŒããŒã¢ãŒãã§åãããŠã¿ã
æåŸã¯ãã¯ã©ã€ã¢ã³ãïŒãµãŒããŒã¢ãŒãã§åãããŠã¿ãŸãã
ã¯ã©ã€ã¢ã³ãïŒãµãŒããŒã¢ãŒãã«ãããšãè匱æ§ããŒã¿ããŒã¹ã¯ãµãŒããŒåŽã§ç®¡çããããšãã§ããã¯ã©ã€ã¢ã³ãåŽã«ã¯ããŒã¿ããŒã¹ã¯
å¿
èŠãªããªããŸããè€æ°ã®å Žæã§Trivyãå®è¡ããããã®ã®ãè匱æ§ããŒã¿ããŒã¹ãæ¯åããŠã³ããŒãããã®ã¯é¿ãããããšãã
å Žåã«äœ¿çšããããã§ãã
ãªãããµãŒããŒåŽãä¿æããŠããè匱æ§ããŒã¿ããŒã¹ã¯ããã¯ã°ã©ãŠã³ãã§æŽæ°ãããŸãã
ä»åãã¯ã©ã€ã¢ã³ãã192.168.33.10ããµãŒããŒã192.168.33.11ã§åäœãããã®ãšããŠã詊ããŠã¿ãŸããTrivyã¯ããããã«ã€ã³ã¹ããŒã«æžã¿ãš
ããŸãã
ãŸããµãŒããŒåŽãserverãµãã³ãã³ãã®ãã«ããèŠãŠã¿ãŸãããã
$ trivy server -h NAME: trivy server - server mode USAGE: trivy server [command options] [arguments...] OPTIONS: --skip-update skip db update [$TRIVY_SKIP_UPDATE] --download-db-only download/update vulnerability database but don't run a scan [$TRIVY_DOWNLOAD_DB_ONLY] --reset remove all caches and database [$TRIVY_RESET] --quiet, -q suppress progress bar and log output [$TRIVY_QUIET] --debug, -d debug mode [$TRIVY_DEBUG] --cache-dir value cache directory (default: "/home/vagrant/.cache/trivy") [$TRIVY_CACHE_DIR] --token value for authentication [$TRIVY_TOKEN] --token-header value specify a header name for token (default: "Trivy-Token") [$TRIVY_TOKEN_HEADER] --listen value listen address (default: "localhost:4954") [$TRIVY_LISTEN]
èµ·åã¯ãtrivy serverãã§ããã€ã³ãããã¢ãã¬ã¹ãããŒãã¯ãå€éšããæ¥ç¶ããã®ã§ã--listenããªãã·ã§ã³ãä»ããŠã0.0.0.0ãã«
ãã€ã³ãããŸããã
$ trivy server --listen 0.0.0.0:4954 2020-04-14T13:33:40.977Z INFO Need to update DB 2020-04-14T13:33:40.977Z INFO Downloading DB... 2020-04-14T13:33:52.093Z INFO Reopening DB... 2020-04-14T13:33:52.094Z INFO Listening 0.0.0.0:4954...
ç¶ããŠãã¯ã©ã€ã¢ã³ãåŽã®ãã«ããèŠãŠã¿ãŸãã
$ trivy client -h NAME: trivy client - client mode USAGE: trivy client [command options] [arguments...] OPTIONS: --template value, -t value output template [$TRIVY_TEMPLATE] --format value, -f value format (table, json, template) (default: "table") [$TRIVY_FORMAT] --input value, -i value input file path instead of image name [$TRIVY_INPUT] --severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY] --output value, -o value output file name [$TRIVY_OUTPUT] --exit-code value Exit code when vulnerabilities were found (default: 0) [$TRIVY_EXIT_CODE] --clear-cache, -c clear image caches without scanning [$TRIVY_CLEAR_CACHE] --quiet, -q suppress progress bar and log output [$TRIVY_QUIET] --ignore-unfixed display only fixed vulnerabilities [$TRIVY_IGNORE_UNFIXED] --debug, -d debug mode [$TRIVY_DEBUG] --removed-pkgs detect vulnerabilities of removed packages (only for Alpine) [$TRIVY_REMOVED_PKGS] --vuln-type value comma-separated list of vulnerability types (os,library) (default: "os,library") [$TRIVY_VULN_TYPE] --ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE] --cache-dir value cache directory (default: "/home/vagrant/.cache/trivy") [$TRIVY_CACHE_DIR] --timeout value docker timeout (default: 2m0s) [$TRIVY_TIMEOUT] --token value for authentication [$TRIVY_TOKEN] --token-header value specify a header name for token (default: "Trivy-Token") [$TRIVY_TOKEN_HEADER] --remote value server address (default: "http://localhost:4954") [$TRIVY_REMOTE] --custom-headers value custom headers [$TRIVY_CUSTOM_HEADERS]
ãtrivy clientãã³ãã³ãã§ãæ¥ç¶å ã®ãµãŒããŒãã--remoteãã§æå®ãã€ã€ãã¹ãã£ã³ã
$ trivy client --remote http://192.168.33.11:4954 httpd:2.4.37
ãšãŠãç°¡åã«å®è¡ã§ããŸãã
ãšããã§ãããã¯ã°ã©ãŠã³ãã§åããŠããè匱æ§ããŒã¿ããŒã¹ã®æŽæ°ã«ã€ããŠã§ããã1æéã«1åã¢ããããŒãã®ç¢ºèªãããŠããããã§ãã
https://github.com/aquasecurity/trivy/blob/v0.5.4/pkg/rpc/server/listen.go#L53-L58
æŠããäœ¿ãæ¹ã¯ããã£ãã®ã§ã¯ãªãã§ããããã
䟿å©ãããªã®ã§ãã³ã³ããã€ã¡ãŒãžãæ±ãæã®èæ ®ã«å ¥ããŠãããŸãããã