Clair, veröffentlicht von CoreOS im November 16, ist ein sehr effektives Instrument zur statischen Analyse von Docker -Bildern, um festzustellen, welche bekannten Schwachstellen in den Bildern vorhanden sind. Integration von Clair in eine CI/CD -Pipeline:
Dieses Repo wurde erstellt, um die oben genannten Herausforderungen zu bewältigen.
Die Wurzeln dieses Repo drehen sich um die folgenden Überzeugungen:
clair_cicd konsumiert werden, um die Entscheidungen zur Bewertung von Docker Image Risikobewertung zu beeinflussen Um die Verwendung von clair-cicd zu verwenden, fügt ein Serviceingenieur eine einzige Codezeile in die CI-Pipeline eines Dienstes ein. In der einzelnen Code-Zeile wird das Shell-Skript bewertet-Image-risk.sh ausgeführt. Ein Teil der Verantwortung der CI -Pipeline besteht darin, das Docker -Bild zu erstellen und dann dieses Docker -Image in eine Docker -Registrierung zu bringen. Die einzelne Zeile des clair-cicd -Code sollte nach dem Erstellen und Test des Docker-Bildes erscheinen, bevor das Docker-Bild in eine Docker-Registrierung gedrückt wird.
In diesem einfachen Fall gibt das Risk der Assess-Image einen Null-Exit-Status zurück, wenn das Docker-Bild keine bekannten Schwachstellen über einer mittleren Schwere enthält. Wenn das Docker-Bild bekannte Schwachstellen mit einem Schweregrad höher als mittelgroß ist, gibt es einen Ausgangsstatus ungleich Null zurück, und der Build schlägt dh dh. Der Build sollte scheitern, bevor das Docker -Bild in eine Docker -Registrierung gedrückt wird.
Das Beispiel zeigt, was für das Alpine beschrieben wird: 3.4 Docker -Bild.
~ > curl -s -L
https://raw.githubusercontent.com/simonsdave/clair-cicd/master/bin/assess-image-risk.sh |
bash -s -- alpine:3.4
~ > echo $?
0
~ > Um zu verstehen, wie assess-image-risk.sh seine Risikobewertung entscheidet, verwenden Sie das Flag -v Flag.
~ > 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
~ > In den obigen Beispielen wurde eine Standard -Schwachstellen -Whitelist verwendet. Wenn dieser Whitelist als JSON -Dokument angegeben ist, wäre er:
{
"ignoreSevertiesAtOrBelow" : " medium "
}Standardmäßig wird ein Risk der Bewertung im Bild eingereicht. Das Medium leitet sich von der standardmäßigen Verletzlichkeit Whitelist ab.
Das folgende Beispiel zeigt, wie eine Schwachstellen -Whitelist und eine andere Schwere als Medium angeben. Beachten Sie die Verwendung von json:// Präfix, um anzuzeigen, dass dies ein Inline -Whitelist ist.
~ > 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
~ > Das obige ist ein Beispiel für eine Inline -Whitelist. Es ist auch möglich, einen Whitelist in einer Datei anzugeben. Das folgende Beispiel zeigt die Verwendung. Beachten Sie die Verwendung der file:// Präfix, um anzuzeigen, dass der Whitelist in einer Datei enthalten ist.
~ > 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
~ > Spezifische Schwachstellen können auch weißeListetiert werden. Das folgende Beispiel zeigt diese Fähigkeit. Wenn Sie das Flag -v (ausführliche) FLAG hinzufügen, um das Image- assess-image-risk.sh Sie sehen genau, wie sich die Schwachstellen auf die Risikobewertung mit Aussagen wie Vulnerability CVE-2019-13627 in whitelist - pass auswirken.
~ > 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 Es ist es wert, Ausgabe Nr. 7 zu sehen, in der steht:
Wenn Sie den Whitelist für
assess-image-risk.shmit dem Argument--whitelistCommand Line" angeben, sollten Sie zusätzlich zu den vorhandenenjson://-file://Schematahttps://-Schema unterstützen. Warum ist das wichtig? Idealerweise sollten Whitelists von einem Sicherheitsanalysten und nicht von einem Serviceingenieur gepflegt werden. Dies bedeutet, dass Whitelisten in einem anderen Repo mit einem angemessenen Veränderungsmanagementprozess aufrechterhalten werden sollten. Diejson://undfile://Schemata sind in Ordnung, um Whitelisten im selben Repo zu pflegen. Es wäre jedoch besser, Whitelisten in einem Repo zu pflegen, das für Serviceingenieure readonly und nur von Sicherheitsanalysten bearbeitet werden kann, die geeignete Änderungsmanagementprozesse anwenden könnten, um Änderungen vorzunehmen (Code -Überprüfungen, Feature -Zweige usw.).
Es gibt 3 bewegliche Teile:
Aus den Proben zu Beginn dieses Dokuments sehen Sie den Ansatz, die neueste Veröffentlichung von Assess-Image Risk.sh in eine Local Run Bash-Shell zu locken. Assess-Image-Risiko. Ein weiterer Container wird dann mit Simonsdave/Clair-Cicd-Clair ausgeführt, wobei der Container von Simonsdave/Clair-Cicd-Clair mit dem Container Simonsdave/Clair-Database-Container sprechen kann. Sobald der SimonsDave/Clair-Cicd-Clair-Container ausgeführt wird, beurteilen Sie das Image-Risiko.
Mit dem Verständnis, wie clair-cicd funktioniert, werden Sie es zu schätzen wissen, dass die Fähigkeit, Bewertungs-Image-Risiko auszuführen. Assess-Image-Risiko.sh ist ein Bash-Skript, das zum Starten des clair-cicd verwendet wird. Daher ist es dieses Skript, das den clair-cicd