Клер, выпущенный Coreos в ноябре 16, является очень эффективным инструментом для статического анализа изображений Docker, чтобы определить, какие известные уязвимости существуют на изображениях. Интеграция CLAIR в трубопровод CI/CD:
Этот репо был создан для решения вышеуказанных проблем.
Корни этого репо -центра вокруг следующих убеждений:
clair_cicd , чтобы повлиять на решения о оценке риска изображения Docker Чтобы начать использовать clair-cicd , сервисный инженер вставляет одну строку кода в трубопровод CI службы. Единственная строка кода запускает Shell Script Assage-Image-Risk.sh. Часть ответственности трубопровода CI состоит в том, чтобы построить изображение Docker, а затем выдвинуть это изображение Docker в реестр Docker. Единственная линия кода clair-cicd должна появляться после того, как изображение Docker будет построено и протестировано, но до того, как изображение Docker будет выдвинуто в реестр Docker.
В этом простом случае Assess-Image-Risk.SH возвращает статус выхода с нулевым выходом, если изображение Docker не содержит известных уязвимостей выше тяжести средней тяжести. Если изображение Docker содержит какие-либо известные уязвимости с серьезностью, превышающей среду, Assage-Image-Risk.sh возвращает ненулевой выход, а сборка не удается, т. Е. Сборка должна потерпеть неудачу до того, как изображение Docker будет выдвинуто в реестр Docker.
Пример иллюстрирует, о чем описано для альпийского изображения: 3.4 Docker Image.
~ > curl -s -L
https://raw.githubusercontent.com/simonsdave/clair-cicd/master/bin/assess-image-risk.sh |
bash -s -- alpine:3.4
~ > echo $?
0
~ > Чтобы понять, как assess-image-risk.sh принимает решение о оценке риска, попробуйте использовать флаг -v .
~ > curl -s -L
https://raw.githubusercontent.com/simonsdave/clair-cicd/master/bin/assess-image-risk.sh |
bash -s -- -v alpine:3.4
2020-01-12 16:43:35 pulling clair database image ' simonsdave/clair-cicd-database:latest '
2020-01-12 16:44:17 successfully pulled clair database image
2020-01-12 16:44:17 starting clair database container ' clair-db-c1dbb5f93ae98755 '
2020-01-12 16:44:23 waiting for database server in container ' clair-db-c1dbb5f93ae98755 ' to start ...........................
2020-01-12 16:44:54 successfully started clair database container
2020-01-12 16:44:54 clair configuration in ' /var/folders/7x/rr443kj575s8zz54jrbrp4jc0000gn/T/tmp.ElAlhGNl '
2020-01-12 16:44:59 pulling clair image ' simonsdave/clair-cicd-clair:latest '
2020-01-12 16:45:13 successfully pulled clair image ' simonsdave/clair-cicd-clair:latest '
2020-01-12 16:45:13 starting clair container ' clair-e9573ae537134fa0 '
2020-01-12 16:45:15 successfully started clair container ' clair-e9573ae537134fa0 '
2020-01-12 16:45:15 saving docker image ' alpine:3.4 ' to ' /tmp/tmp.IaNHCH '
2020-01-12 16:45:16 successfully saved docker image ' alpine:3.4 '
2020-01-12 16:45:16 starting to create clair layers
2020-01-12 16:45:16 creating clair layer ' 378cb6b4a17e08c366cebd813d218f60889848387fa61a56ac054ca027a4890d '
2020-01-12 16:45:16 successfully created clair layer ' 378cb6b4a17e08c366cebd813d218f60889848387fa61a56ac054ca027a4890d '
2020-01-12 16:45:16 done creating clair layers
2020-01-12 16:45:16 starting to get vulnerabilities for clair layers
2020-01-12 16:45:16 saving vulnerabilities to directory ' /tmp/tmp.MDncHN '
2020-01-12 16:45:16 getting vulnerabilities for layer ' 378cb6b4a17e08c366cebd813d218f60889848387fa61a56ac054ca027a4890d '
2020-01-12 16:45:16 successfully got vulnerabilities for layer ' 378cb6b4a17e08c366cebd813d218f60889848387fa61a56ac054ca027a4890d '
2020-01-12 16:45:16 done getting vulnerabilities for clair layers
2020-01-12 21:45:17 INFO io:89 Looking for vulnerabilities in directory ' /tmp/tmp.MDncHN '
2020-01-12 21:45:17 INFO io:95 Found 1 files with vulnerabilities in directory ' /tmp/tmp.MDncHN '
2020-01-12 21:45:17 INFO io:104 Looking for vulnerabilities in ' /tmp/tmp.MDncHN/378cb6b4a17e08c366cebd813d218f60889848387fa61a56ac054ca027a4890d.json '
2020-01-12 21:45:17 INFO io:122 Found 0 vulnerabilities in ' /tmp/tmp.MDncHN/378cb6b4a17e08c366cebd813d218f60889848387fa61a56ac054ca027a4890d.json '
2020-01-12 21:45:17 INFO io:133 Found 0 vulnerabilities in 1 files in directory ' /tmp/tmp.MDncHN '
2020-01-12 21:45:17 INFO assessor:19 Assessment starts
2020-01-12 21:45:17 INFO assessor:26 Assessment ends - pass
~ > echo $?
0
~ > В приведенных выше примерах использовался белый список уязвимости по уязвимости. Когда это указано в качестве документа JSON, этот белый список будет:
{
"ignoreSevertiesAtOrBelow" : " medium "
}По умолчанию Assess-Image-Risk.SH возвращает ненулевой статус выхода, если на изображении выявлены какие-либо уязвимости с серьезностью, превышающей среду. Среда получена из белого списка уязвимости по умолчанию.
Приведенный ниже пример иллюстрирует, как указать белый список уязвимости и с тяжестью, отличной от среды. Обратите внимание на использование префикса json:// чтобы указать, что это встроенный белый список.
~ > curl -s -L
https://raw.githubusercontent.com/simonsdave/clair-cicd/master/bin/assess-image-risk.sh |
bash -s -- -v --whitelist ' json://{"ignoreSevertiesAtOrBelow": "negligible"} ' ubuntu:18.04
2020-01-12 16:46:56 pulling clair database image ' simonsdave/clair-cicd-database:latest '
2020-01-12 16:46:58 successfully pulled clair database image
2020-01-12 16:46:58 starting clair database container ' clair-db-3b0811925f7e8bc2 '
2020-01-12 16:46:59 waiting for database server in container ' clair-db-3b0811925f7e8bc2 ' to start .............................
2020-01-12 16:47:32 successfully started clair database container
2020-01-12 16:47:32 clair configuration in ' /var/folders/7x/rr443kj575s8zz54jrbrp4jc0000gn/T/tmp.BXCs3Giy '
2020-01-12 16:47:34 pulling clair image ' simonsdave/clair-cicd-clair:latest '
2020-01-12 16:47:36 successfully pulled clair image ' simonsdave/clair-cicd-clair:latest '
2020-01-12 16:47:36 starting clair container ' clair-fc579c71e7daba57 '
2020-01-12 16:47:38 successfully started clair container ' clair-fc579c71e7daba57 '
2020-01-12 16:47:38 saving docker image ' ubuntu:18.04 ' to ' /tmp/tmp.lPDhNd '
2020-01-12 16:47:43 successfully saved docker image ' ubuntu:18.04 '
2020-01-12 16:47:43 starting to create clair layers
2020-01-12 16:47:43 creating clair layer ' cc59b0ca1cf21d77c81a98138703008daa167b1ab1a115849d498dba64e738dd '
2020-01-12 16:47:43 successfully created clair layer ' cc59b0ca1cf21d77c81a98138703008daa167b1ab1a115849d498dba64e738dd '
2020-01-12 16:47:43 creating clair layer ' 27a911bb510bf1e9458437f0f44216fd38fd08c462ed7aa026d91aab8c054e54 '
2020-01-12 16:47:44 successfully created clair layer ' 27a911bb510bf1e9458437f0f44216fd38fd08c462ed7aa026d91aab8c054e54 '
2020-01-12 16:47:44 creating clair layer ' d80735acaa72040a0a98ca3ae6891f9abb4e2f5d627b4099c4fefdc3ce1e696e '
2020-01-12 16:47:44 successfully created clair layer ' d80735acaa72040a0a98ca3ae6891f9abb4e2f5d627b4099c4fefdc3ce1e696e '
2020-01-12 16:47:44 creating clair layer ' 1ee34a985f7aef86436a5519f5ad83f866a74c7d9a0c22e47c4213ee9cb64e6d '
2020-01-12 16:47:44 successfully created clair layer ' 1ee34a985f7aef86436a5519f5ad83f866a74c7d9a0c22e47c4213ee9cb64e6d '
2020-01-12 16:47:44 done creating clair layers
2020-01-12 16:47:44 starting to get vulnerabilities for clair layers
2020-01-12 16:47:44 saving vulnerabilities to directory ' /tmp/tmp.dkfgmI '
2020-01-12 16:47:44 getting vulnerabilities for layer ' cc59b0ca1cf21d77c81a98138703008daa167b1ab1a115849d498dba64e738dd '
2020-01-12 16:47:44 successfully got vulnerabilities for layer ' cc59b0ca1cf21d77c81a98138703008daa167b1ab1a115849d498dba64e738dd '
2020-01-12 16:47:44 getting vulnerabilities for layer ' 27a911bb510bf1e9458437f0f44216fd38fd08c462ed7aa026d91aab8c054e54 '
2020-01-12 16:47:44 successfully got vulnerabilities for layer ' 27a911bb510bf1e9458437f0f44216fd38fd08c462ed7aa026d91aab8c054e54 '
2020-01-12 16:47:44 getting vulnerabilities for layer ' d80735acaa72040a0a98ca3ae6891f9abb4e2f5d627b4099c4fefdc3ce1e696e '
2020-01-12 16:47:44 successfully got vulnerabilities for layer ' d80735acaa72040a0a98ca3ae6891f9abb4e2f5d627b4099c4fefdc3ce1e696e '
2020-01-12 16:47:44 getting vulnerabilities for layer ' 1ee34a985f7aef86436a5519f5ad83f866a74c7d9a0c22e47c4213ee9cb64e6d '
2020-01-12 16:47:44 successfully got vulnerabilities for layer ' 1ee34a985f7aef86436a5519f5ad83f866a74c7d9a0c22e47c4213ee9cb64e6d '
2020-01-12 16:47:44 done getting vulnerabilities for clair layers
2020-01-12 21:47:45 INFO io:89 Looking for vulnerabilities in directory ' /tmp/tmp.dkfgmI '
2020-01-12 21:47:45 INFO io:95 Found 4 files with vulnerabilities in directory ' /tmp/tmp.dkfgmI '
2020-01-12 21:47:45 INFO io:104 Looking for vulnerabilities in ' /tmp/tmp.dkfgmI/27a911bb510bf1e9458437f0f44216fd38fd08c462ed7aa026d91aab8c054e54.json '
2020-01-12 21:47:45 INFO io:122 Found 33 vulnerabilities in ' /tmp/tmp.dkfgmI/27a911bb510bf1e9458437f0f44216fd38fd08c462ed7aa026d91aab8c054e54.json '
2020-01-12 21:47:45 INFO io:104 Looking for vulnerabilities in ' /tmp/tmp.dkfgmI/cc59b0ca1cf21d77c81a98138703008daa167b1ab1a115849d498dba64e738dd.json '
2020-01-12 21:47:45 INFO io:122 Found 33 vulnerabilities in ' /tmp/tmp.dkfgmI/cc59b0ca1cf21d77c81a98138703008daa167b1ab1a115849d498dba64e738dd.json '
2020-01-12 21:47:45 INFO io:104 Looking for vulnerabilities in ' /tmp/tmp.dkfgmI/1ee34a985f7aef86436a5519f5ad83f866a74c7d9a0c22e47c4213ee9cb64e6d.json '
2020-01-12 21:47:45 INFO io:122 Found 33 vulnerabilities in ' /tmp/tmp.dkfgmI/1ee34a985f7aef86436a5519f5ad83f866a74c7d9a0c22e47c4213ee9cb64e6d.json '
2020-01-12 21:47:45 INFO io:104 Looking for vulnerabilities in ' /tmp/tmp.dkfgmI/d80735acaa72040a0a98ca3ae6891f9abb4e2f5d627b4099c4fefdc3ce1e696e.json '
2020-01-12 21:47:45 INFO io:122 Found 33 vulnerabilities in ' /tmp/tmp.dkfgmI/d80735acaa72040a0a98ca3ae6891f9abb4e2f5d627b4099c4fefdc3ce1e696e.json '
2020-01-12 21:47:45 INFO io:133 Found 33 vulnerabilities in 4 files in directory ' /tmp/tmp.dkfgmI '
2020-01-12 21:47:45 INFO assessor:19 Assessment starts
2020-01-12 21:47:45 INFO assessor:34 Assessing vulnerability CVE-2018-11236 - start
2020-01-12 21:47:45 INFO assessor:52 Vulnerability CVE-2018-11236 @ severity medium greater than whitelist severity @ negligible - fail
2020-01-12 21:47:45 INFO assessor:36 Assessing vulnerability CVE-2018-11236 - finish
2020-01-12 21:47:45 INFO assessor:23 Assessment ends - fail
~ > echo $?
1
~ > Выше приведено примером встроенного белого списка. Также возможно указать белый список в файле. Пример ниже иллюстрирует использование. Примечание Использование file:// prefix, чтобы указать, что белый список содержится в файле.
~ > cat whitelist.json
{
" ignoreSevertiesAtOrBelow " : " medium "
}
~ > curl -s -L
https://raw.githubusercontent.com/simonsdave/clair-cicd/master/bin/assess-image-risk.sh |
bash -s -- -v --whitelist file://whitelist.json alpine:3.4
2020-01-12 16:48:41 pulling clair database image ' simonsdave/clair-cicd-database:latest '
2020-01-12 16:48:42 successfully pulled clair database image
2020-01-12 16:48:42 starting clair database container ' clair-db-191152e37b864e4b '
2020-01-12 16:48:43 waiting for database server in container ' clair-db-191152e37b864e4b ' to start .............................
2020-01-12 16:49:16 successfully started clair database container
2020-01-12 16:49:16 clair configuration in ' /var/folders/7x/rr443kj575s8zz54jrbrp4jc0000gn/T/tmp.GdlBNmiG '
2020-01-12 16:49:19 pulling clair image ' simonsdave/clair-cicd-clair:latest '
2020-01-12 16:49:20 successfully pulled clair image ' simonsdave/clair-cicd-clair:latest '
2020-01-12 16:49:20 starting clair container ' clair-747d1c50606fba7e '
2020-01-12 16:49:21 successfully started clair container ' clair-747d1c50606fba7e '
2020-01-12 16:49:22 saving docker image ' alpine:3.4 ' to ' /tmp/tmp.Eldkbe '
2020-01-12 16:49:23 successfully saved docker image ' alpine:3.4 '
2020-01-12 16:49:23 starting to create clair layers
2020-01-12 16:49:23 creating clair layer ' 378cb6b4a17e08c366cebd813d218f60889848387fa61a56ac054ca027a4890d '
2020-01-12 16:49:23 successfully created clair layer ' 378cb6b4a17e08c366cebd813d218f60889848387fa61a56ac054ca027a4890d '
2020-01-12 16:49:23 done creating clair layers
2020-01-12 16:49:23 starting to get vulnerabilities for clair layers
2020-01-12 16:49:23 saving vulnerabilities to directory ' /tmp/tmp.pCOhlL '
2020-01-12 16:49:23 getting vulnerabilities for layer ' 378cb6b4a17e08c366cebd813d218f60889848387fa61a56ac054ca027a4890d '
2020-01-12 16:49:23 successfully got vulnerabilities for layer ' 378cb6b4a17e08c366cebd813d218f60889848387fa61a56ac054ca027a4890d '
2020-01-12 16:49:23 done getting vulnerabilities for clair layers
2020-01-12 21:49:23 INFO io:89 Looking for vulnerabilities in directory ' /tmp/tmp.pCOhlL '
2020-01-12 21:49:23 INFO io:95 Found 1 files with vulnerabilities in directory ' /tmp/tmp.pCOhlL '
2020-01-12 21:49:23 INFO io:104 Looking for vulnerabilities in ' /tmp/tmp.pCOhlL/378cb6b4a17e08c366cebd813d218f60889848387fa61a56ac054ca027a4890d.json '
2020-01-12 21:49:23 INFO io:122 Found 0 vulnerabilities in ' /tmp/tmp.pCOhlL/378cb6b4a17e08c366cebd813d218f60889848387fa61a56ac054ca027a4890d.json '
2020-01-12 21:49:23 INFO io:133 Found 0 vulnerabilities in 1 files in directory ' /tmp/tmp.pCOhlL '
2020-01-12 21:49:23 INFO assessor:19 Assessment starts
2020-01-12 21:49:23 INFO assessor:26 Assessment ends - pass
~ > echo $?
0
~ > Конкретные уязвимости также могут быть белые. Пример ниже иллюстрирует эту возможность. Если вы добавите флаг -v (словес) в assess-image-risk.sh Vulnerability CVE-2019-13627 in whitelist - pass
~ > curl -s -L
https://raw.githubusercontent.com/simonsdave/clair-cicd/master/bin/assess-image-risk.sh |
bash -s -- --whitelist ' json://{"ignoreSevertiesAtOrBelow":"low"} ' ubuntu:18.04
~ > echo $?
1
~ > cat whitelist.json
{
" ignoreSevertiesAtOrBelow " : " low " ,
" vulnerabilities " : [
{ " cveId " : " CVE-2018-20839 " , " rationale " : " reason #1 " },
{ " cveId " : " CVE-2019-5188 " , " rationale " : " reason #2 " },
{ " cveId " : " CVE-2018-11236 " , " rationale " : " reason #3 " },
{ " cveId " : " CVE-2019-13627 " , " rationale " : " reason #4 " },
{ " cveId " : " CVE-2019-13050 " , " rationale " : " reason #5 " },
{ " cveId " : " CVE-2018-11237 " , " rationale " : " reason #6 " },
{ " cveId " : " CVE-2018-19591 " , " rationale " : " reason #7 " }
]
}
~ > curl -s -L
https://raw.githubusercontent.com/simonsdave/clair-cicd/master/bin/assess-image-risk.sh |
bash -s -- --whitelist ' file://whitelist.json ' ubuntu:18.04
~ > echo $?
0
~ >Ito WhiteLists Стоит увидеть проблему № 7, в которой говорится:
При указании белого списка для
assess-image-risk.shс аргументом командной строки--whitelistдолжен поддерживать схемуhttps://в дополнение к существующим схемамjson://,file://. Почему это важно? В идеале белые списки должны поддерживаться аналитиком безопасности, а не инженером по обслуживанию. Это означает, что белые списки должны поддерживаться в другом репо с соответствующим процессом управления изменениями. Схемыjson://иfile://подходят для поддержания белых списков в одном и том же репо -коде. Тем не менее, было бы лучше поддерживать белые списки в репо, которая читается для инженеров -сервисных инженеров и редактируется только аналитиками безопасности, которые могут применять соответствующие процессы управления изменениями, используются для внесения изменений (обзоры кода, филиалы функций и т. Д.).
Есть 3 движущихся частях:
Из образцов в начале этого DOC вы увидите подход скручивания последнего выпуска оценки-риска. Assess-Image-Risk.SH затем раскручивает контейнер, используя Simonsdave/Clair-Database. Затем используется другой контейнер с использованием Simonsdave/Clair-CICD-Clair с контейнером SimonsDave/Clair-CICD-CLAIR, который может разговаривать с контейнером-датабазой SimonsDave/Clair. После того, как контейнер Simonsdave/Clair-CICD-Clair будет запущен, Assess-Image-Risk.sh Docker Exec's This Bash Script, который проводит фактическую оценку риска.
Вооружившись пониманием того, как работает clair-cicd вы оцените, что способность выполнять оценку-риск .sh-это то, что определяет требования к среде выполнения. Assess-Image Risk.sh-это сценарий, используемый для запуска процесса оценки риска, и поэтому этот сценарий определяет основную часть предположений/требований для clair-cicd -в скрипте используется Docker, SED и OpenSSL, поэтому clair-cicd