Clair ซึ่งเปิดตัวโดย CoreOS ในเดือนพฤศจิกายน '16 เป็นเครื่องมือที่มีประสิทธิภาพมากสำหรับการวิเคราะห์ภาพ Docker แบบคงที่เพื่อกำหนดช่องโหว่ที่รู้จักกันในภาพ การบูรณาการ Clair เข้ากับไปป์ไลน์ CI/CD:
repo นี้ถูกสร้างขึ้นเพื่อจัดการกับความท้าทายข้างต้น
รากของศูนย์ repo นี้รอบ ๆ ความเชื่อดังต่อไปนี้:
clair_cicd เพื่อมีอิทธิพลต่อการตัดสินใจประเมินความเสี่ยงของภาพนักเทียบท่า ในการเริ่มต้นใช้ clair-cicd วิศวกรบริการจะแทรกรหัสบรรทัดเดียวลงในท่อ CI ของบริการ รหัสบรรทัดเดียวเรียกใช้เชลล์สคริปต์ประเมินภาพ-ความเสี่ยง ส่วนหนึ่งของความรับผิดชอบของ CI Pipeline คือการสร้างภาพนักเทียบท่าแล้วผลักภาพนักเทียบท่านั้นไปยังรีจิสทรีนักเทียบท่า บรรทัดเดียวของรหัส clair-cicd ควรปรากฏขึ้นหลังจากที่อิมเมจนักเทียบท่าถูกสร้างและทดสอบ แต่ก่อนที่ภาพนักเทียบท่าจะถูกส่งไปยังรีจิสทรีนักเทียบท่า
ในกรณีง่ายๆนี้การประเมินภาพ-ความเสี่ยง. sh จะส่งคืนสถานะการออกเป็นศูนย์หากภาพนักเทียบท่าไม่มีช่องโหว่ที่รู้จักเหนือความรุนแรงปานกลาง หากอิมเมจนักเทียบท่ามีช่องโหว่ที่รู้จักใด ๆ ที่มีความรุนแรงสูงกว่าปานกลาง, การประเมิน-ภาพ-ความเสี่ยง. บิลด์ควรล้มเหลวก่อนที่ภาพนักเทียบท่าจะถูกส่งไปยังรีจิสทรี Docker
ตัวอย่างแสดงสิ่งที่อธิบายเกี่ยวกับอัลไพน์: 3.4 ภาพนักเทียบท่า
~ > 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
~ > ในตัวอย่างข้างต้นมีการใช้ whitist ที่มีช่องโหว่เริ่มต้น เมื่อระบุว่าเป็นเอกสาร JSON ผู้อนุญาตให้ใช้งานนี้จะเป็น:
{
"ignoreSevertiesAtOrBelow" : " medium "
}โดยค่าเริ่มต้นการประเมินภาพ-ความเสี่ยง.shจะส่งคืนสถานะการออกที่ไม่เป็นศูนย์หากมีการระบุช่องโหว่ใด ๆ ในภาพที่มีความรุนแรงสูงกว่าสื่อ สื่อมาจากการอนุญาตที่มีช่องโหว่เริ่มต้น
ตัวอย่างด้านล่างแสดงให้เห็นถึงวิธีการระบุ whitist ที่มีช่องโหว่และมีความรุนแรงอื่นนอกเหนือจากสื่อ หมายเหตุการใช้คำนำหน้า json:// เพื่อระบุว่านี่เป็น whitelist แบบอินไลน์
~ > 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
~ > ข้างต้นเป็นตัวอย่างของการอนุญาตแบบอินไลน์ นอกจากนี้ยังเป็นไปได้ที่จะระบุ whitelist ในไฟล์ ตัวอย่างด้านล่างแสดงให้เห็นถึงการใช้งาน หมายเหตุการใช้ file:// คำนำหน้าเพื่อระบุว่า whitelist มีอยู่ในไฟล์
~ > 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 (verbose) เพื่อ 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 ซึ่งบอกว่า:
เมื่อระบุ whitelist สำหรับ
assess-image-risk.shด้วยอาร์กิวเมนต์บรรทัดคำสั่ง--whitelistควรรองรับhttps://scheme นอกเหนือจากjson://,file://Schemes ทำไมสิ่งนี้จึงสำคัญ? นักวิเคราะห์ความปลอดภัยควรได้รับการดูแลโดยนักวิเคราะห์ความปลอดภัยไม่ใช่วิศวกรบริการ ซึ่งหมายความว่าควรรักษาผู้ขายขาวไว้ใน repo อื่นด้วยกระบวนการจัดการการเปลี่ยนแปลงที่เหมาะสมjson://และfile://Schemes ใช้ได้ดีสำหรับการบำรุงรักษา Whitelists ใน repo เดียวกันคือรหัสบริการ อย่างไรก็ตามมันจะเป็นการดีกว่าที่จะรักษาผู้ขายขาวใน repo ที่อ่านได้อย่างง่ายดายสำหรับวิศวกรบริการและแก้ไขได้โดยนักวิเคราะห์ความปลอดภัยที่สามารถใช้กระบวนการจัดการการเปลี่ยนแปลงที่เหมาะสมจะใช้เพื่อทำการเปลี่ยนแปลง (บทวิจารณ์รหัสสาขาคุณสมบัติ ฯลฯ )
มี 3 ชิ้นที่เคลื่อนไหว:
จากตัวอย่างในช่วงเริ่มต้นของเอกสารนี้คุณจะเห็นแนวทางของการดัดแปลงการประเมินล่าสุดของการประเมิน-ภาพความเสี่ยง. Assess-image- ความเสี่ยงจากนั้นหมุนคอนเทนเนอร์โดยใช้ Simonsdave/Clair-Database คอนเทนเนอร์อื่นจะถูกเรียกใช้โดยใช้ Simonsdave/Clair-Cicd-Clair กับภาชนะบรรจุ Simonsdave/Clair-Cicd-Clair ที่สามารถพูดคุยกับคอนเทนเนอร์ Simonsdave/Clair-Database เมื่อคอนเทนเนอร์ Simonsdave/Clair-Cicd-Clair กำลังทำงานอยู่แล้วให้ประเมินความเสี่ยงต่อการประเมินความเสี่ยงต่อการใช้งานของนักเทียบท่านี้ซึ่งทำการประเมินความเสี่ยงที่แท้จริง
ด้วยความเข้าใจในความเข้าใจว่าการทำงานของ clair-cicd คุณจะชื่นชมว่าความสามารถในการดำเนินการประเมินความเสี่ยงต่อการประเมินภาพเป็นสิ่งที่กำหนดข้อกำหนดสำหรับสภาพแวดล้อมการดำเนินการ Assess-image-wisk.sh เป็นสคริปต์ทุบตีที่ใช้ในการเปิดกระบวนการประเมินความเสี่ยงและเป็นสคริปต์นี้ซึ่งกำหนดจำนวนของสมมติฐาน/ข้อกำหนดสำหรับ clair-cicd สคริปต์ใช้ Docker, SED และ OpenSSL ดังนั้นสิ่งเหล่านี้จะ clair-cicd มีอยู่ในสภาพแวดล้อม