ตรวจสอบซอร์สโค้ดสำหรับปัญหาความปลอดภัยโดยการสแกนการแสดงรหัส GO AST และ SSA
ได้รับใบอนุญาตภายใต้ใบอนุญาต Apache เวอร์ชัน 2.0 ("ใบอนุญาต") คุณไม่สามารถใช้ไฟล์นี้ยกเว้นตามใบอนุญาต คุณอาจได้รับสำเนาใบอนุญาตที่นี่
# binary will be $(go env GOPATH)/bin/gosec
curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s -- -b $( go env GOPATH ) /bin vX.Y.Z
# or install it into ./bin/
curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s vX.Y.Z
# In alpine linux (as it does not come with curl by default)
wget -O - -q https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s vX.Y.Z
# If you want to use the checksums provided on the "Releases" page
# then you will have to download a tar.gz file for your operating system instead of a binary file
wget https://github.com/securego/gosec/releases/download/vX.Y.Z/gosec_vX.Y.Z_OS.tar.gz
# The file will be in the current folder where you run the command
# and you can check the checksum like this
echo " <check sum from the check sum file> gosec_vX.Y.Z_OS.tar.gz " | sha256sum -c -
gosec --help คุณสามารถเรียกใช้ gosec เป็นแอ็คชั่น GitHub ดังนี้:
name : Run Gosec
on :
push :
branches :
- master
pull_request :
branches :
- master
jobs :
tests :
runs-on : ubuntu-latest
env :
GO111MODULE : on
steps :
- name : Checkout Source
uses : actions/checkout@v3
- name : Run Gosec Security Scanner
uses : securego/gosec@master
with :
args : ./...คุณสามารถรวมเครื่องมือวิเคราะห์รหัสบุคคลที่สามเข้ากับการสแกนรหัส GitHub โดยการอัปโหลดข้อมูลเป็นไฟล์ SARIF
เวิร์กโฟลว์แสดงตัวอย่างของการรัน gosec เป็นขั้นตอนในเวิร์กโฟลว์การกระทำของ GitHub ซึ่งส่งออกไฟล์ results.sarif Sarif เวิร์กโฟลว์จากนั้นอัปโหลดไฟล์ results.sarif ไปยัง GitHub โดยใช้การดำเนินการ upload-sarif
name : " Security Scan "
# Run workflow each time code is pushed to your repository and on a schedule.
# The scheduled workflow runs every at 00:00 on Sunday UTC time.
on :
push :
schedule :
- cron : ' 0 0 * * 0 '
jobs :
tests :
runs-on : ubuntu-latest
env :
GO111MODULE : on
steps :
- name : Checkout Source
uses : actions/checkout@v3
- name : Run Gosec Security Scanner
uses : securego/gosec@master
with :
# we let the report trigger content trigger a failure using the GitHub Security features.
args : ' -no-fail -fmt sarif -out results.sarif ./... '
- name : Upload SARIF file
uses : github/codeql-action/upload-sarif@v2
with :
# Path to SARIF file relative to the root of the repository
sarif_file : results.sarifgo install github.com/securego/gosec/v2/cmd/gosec@latest GOSEC สามารถกำหนดค่าให้เรียกใช้เฉพาะชุดย่อยของกฎเพื่อแยกเส้นทางไฟล์บางอย่างและสร้างรายงานในรูปแบบที่แตกต่างกัน โดยค่าเริ่มต้นกฎทั้งหมดจะถูกเรียกใช้กับไฟล์อินพุตที่ให้มา ในการสแกนซ้ำจากไดเรกทอรีปัจจุบันคุณสามารถจัดหา ./... เป็นอาร์กิวเมนต์อินพุต
โดยค่าเริ่มต้น GOSEC จะเรียกใช้กฎทั้งหมดกับเส้นทางไฟล์ที่ให้มา อย่างไรก็ตามมีความเป็นไปได้ที่จะเลือกชุดย่อยของกฎที่จะทำงานผ่าน -include= Flag หรือเพื่อระบุชุดของกฎเพื่อแยกออกอย่างชัดเจนโดยใช้ -exclude= Flag
# Run a specific set of rules
$ gosec -include=G101,G203,G401 ./...
# Run everything except for rule G303
$ gosec -exclude=G303 ./... ทุกประเด็นที่ตรวจพบโดย gosec จะถูกแมปกับ CWE (การแจกแจงความอ่อนแอทั่วไป) ซึ่งอธิบายในแง่ทั่วไปมากขึ้นเกี่ยวกับช่องโหว่ การทำแผนที่ที่แน่นอนสามารถพบได้ที่นี่
สามารถให้การตั้งค่าส่วนกลางจำนวนมากในไฟล์กำหนดค่าดังต่อไปนี้:
{
"global" : {
"nosec" : " enabled " ,
"audit" : " enabled "
}
}nosec : การตั้งค่านี้จะเขียนทับคำสั่ง #nosec ทั้งหมดที่กำหนดไว้ตลอดฐานรหัสaudit : รันในโหมดการตรวจสอบซึ่งช่วยให้สามารถตรวจสอบเพิ่มเติมได้ว่าสำหรับการวิเคราะห์รหัสปกติอาจมีความอ่อนไหวเกินไป # Run with a global configuration file
$ gosec -conf config.json . กฎบางอย่างยอมรับธงการกำหนดค่าเช่นกัน ธงเหล่านี้มีการบันทึกไว้ในกฎ
กฎบางอย่างต้องใช้เวอร์ชัน GO เฉพาะซึ่งถูกดึงมาจากไฟล์โมดูล GO ที่มีอยู่ในโครงการ หากไม่พบเวอร์ชันนี้มันจะกลับไปที่เวอร์ชันรันไทม์
รุ่นโมดูล Go ถูกแยกวิเคราะห์โดยใช้คำสั่ง go list ซึ่งในบางกรณีอาจนำไปสู่การลดลงของประสิทธิภาพ ในสถานการณ์นี้รุ่นโมดูล Go สามารถให้ได้ง่ายโดยการตั้งค่าตัวแปรสภาพแวดล้อม GOSECGOVERSION=go1.21.1
GOSEC จะดึงข้อมูลการพึ่งพาของรหัสที่ถูกวิเคราะห์โดยอัตโนมัติเมื่อเปิดโมดูล GO (เช่น GO111MODULE=on ) หากไม่เป็นเช่นนั้นการพึ่งพาจะต้องดาวน์โหลดอย่างชัดเจนโดยเรียกใช้คำสั่ง go get -d ก่อนการสแกน
GOSEC จะเพิกเฉยต่อไฟล์ทดสอบในทุกแพ็คเกจและการอ้างอิงใด ๆ ในไดเรกทอรีผู้ขายของคุณ
การสแกนไฟล์ทดสอบสามารถเปิดใช้งานได้ด้วยการตั้งค่าสถานะต่อไปนี้:
gosec -tests ./...สามารถยกเว้นโฟลเดอร์เพิ่มเติมได้ดังนี้:
gosec -exclude-dir=rules -exclude-dir=cmd ./...GOSEC สามารถเพิกเฉยต่อไฟล์ GO ที่สร้างขึ้นด้วยความคิดเห็นรหัสเริ่มต้นที่สร้างขึ้น
// Code generated by some generator DO NOT EDIT.
gosec -exclude-generated ./...GOSEC สามารถแนะนำการแก้ไขตามคำแนะนำ AI มันจะเรียก AI API เพื่อรับข้อเสนอแนะสำหรับการค้นหาความปลอดภัย
คุณสามารถเปิดใช้งานคุณสมบัตินี้ได้โดยให้อาร์กิวเมนต์บรรทัดคำสั่งต่อไปนี้:
ai-api-provider : ชื่อของผู้ให้บริการ AI API ซึ่งปัจจุบันได้รับการสนับสนุนเฉพาะ geminiai-api-key หรือตั้งค่าตัวแปรสภาพแวดล้อม GOSEC_AI_API_KEY : กุญแจสำคัญในการเข้าถึง AI API สำหรับราศีเมถุนคุณสามารถสร้างคีย์ API ตามคำแนะนำเหล่านี้ai-endpoint : จุดสิ้นสุดของผู้ให้บริการ AI นี่เป็นอาร์กิวเมนต์เสริม gosec -ai-api-provider= " gemini " -ai-api-key= " your_key " ./... เช่นเดียวกับเครื่องมือตรวจจับอัตโนมัติทั้งหมดจะมีกรณีของผลบวกที่ผิดพลาด ในกรณีที่ GOSEC รายงานความล้มเหลวที่ได้รับการยืนยันด้วยตนเองว่าปลอดภัยเป็นไปได้ที่จะใส่คำอธิบายประกอบรหัสด้วยความคิดเห็นที่เริ่มต้นด้วย #nosec
ความคิดเห็น #nosec ควรมีรูปแบบ #nosec [RuleList] [-- Justification]
ความคิดเห็น #nosec จะต้องวางไว้บนบรรทัดที่มีการรายงานคำเตือน
func main () {
tr := & http. Transport {
TLSClientConfig : & tls. Config {
InsecureSkipVerify : true , // #nosec G402
},
}
client := & http. Client { Transport : tr }
_ , err := client . Get ( "https://go.dev/" )
if err != nil {
fmt . Println ( err )
}
} เมื่อมีการระบุและตรวจสอบว่าเป็นบวกเท็จโดยเฉพาะคุณอาจต้องการระงับเฉพาะกฎเดียว (หรือชุดของกฎเฉพาะ) ภายในส่วนของรหัสในขณะที่ยังคงสแกนปัญหาอื่น ๆ ต่อไป ในการทำเช่นนี้คุณสามารถแสดงรายการกฎที่จะถูกระงับภายในคำอธิบายประกอบ #nosec เช่น: /* #nosec G401 */ หรือ //#nosec G201 G202 G203
คุณสามารถใส่คำอธิบายหรือข้อความเหตุผลสำหรับคำอธิบายประกอบ การให้เหตุผลควรเป็นหลังจากกฎเพื่อระงับและเริ่มต้นด้วยสองขีดกลางขึ้นไปเช่น: //#nosec G101 G102 -- This is a false positive
ในบางกรณีคุณอาจต้องการทบทวนสถานที่ที่มีการใช้คำอธิบายประกอบ #nosec ในการเรียกใช้เครื่องสแกนและเพิกเฉยต่อคำอธิบายประกอบ #nosec ใด ๆ ที่คุณสามารถทำได้ดังต่อไปนี้:
gosec -nosec=true ./... ตามที่อธิบายไว้ข้างต้นเราสามารถระงับการละเมิดภายนอก (โดยใช้ -include / -exclude ) หรือแบบอินไลน์ (โดยใช้ #nosec Annotations) ใน GOSEC การปราบปรามการอักเสบนี้สามารถใช้เพื่อสร้างสัญญาณที่สอดคล้องกันเพื่อวัตถุประสงค์ในการตรวจสอบ
เราสามารถติดตามการปราบปรามโดยธง -track-suppressions ดังนี้:
gosec -track-suppressions -exclude=G101 -fmt=sarif -out=results.sarif ./...kind เป็น external และ justification เป็นประโยคหนึ่ง "ระงับทั่วโลก"kind เป็น inSource และ justification เป็นข้อความหลังจากสองขีดกลางขึ้นไปในความคิดเห็นหมายเหตุ: เฉพาะรูปแบบ Sarif และ JSON เท่านั้นที่รองรับการยับยั้งการติดตาม
Gosec สามารถส่งแท็ก GO Build ของคุณไปยังเครื่องวิเคราะห์ได้ พวกเขาสามารถจัดทำเป็นรายการคั่นด้วยเครื่องหมายจุลภาคดังนี้:
gosec -tags debug,ignore ./... ปัจจุบัน GOSEC รองรับ text , json , yaml , csv , sonarqube , JUnit XML , html และ golint โดยผลลัพธ์เริ่มต้นจะถูกรายงานไปยัง stdout แต่ยังสามารถเขียนไปยังไฟล์เอาต์พุต รูปแบบเอาต์พุตถูกควบคุมโดย -fmt Flag และไฟล์เอาต์พุตถูกควบคุมโดยค่าสถานะ -out ดังต่อไปนี้:
# Write output in json format to results.json
$ gosec -fmt=json -out=results.json * .go ผลลัพธ์จะถูกรายงานไปยัง stdout รวมถึงไฟล์เอาต์พุตที่ให้ไว้โดย -stdout Flag ธง -verbose จะแทนที่รูปแบบเอาต์พุตเมื่อ stdout ผลลัพธ์ในขณะที่บันทึกไว้ในไฟล์เอาต์พุต
# Write output in json format to results.json as well as stdout
$ gosec -fmt=json -out=results.json -stdout * .go
# Overrides the output format to 'text' when stdout the results, while writing it to results.json
$ gosec -fmt=json -out=results.json -stdout -verbose=text * .go หมายเหตุ: GOSEC สร้างรูปแบบการนำเข้าปัญหาทั่วไปสำหรับ SonarQube และรายงานจะต้องนำเข้าสู่ Sonarqube โดยใช้ sonar.externalIssuesReportPaths=path/to/gosec-report.json
Inturning.md มีข้อมูลโดยละเอียดเกี่ยวกับการเพิ่มกฎใหม่ให้กับ Gosec
คุณสามารถสร้างไบนารีด้วย:
makeติดตั้งเครื่องมือด้วย:
go get -u github.com/a-h/generate/cmd/schema-generateจากนั้นสร้างประเภทด้วย:
schema-generate -i sarif-schema-2.1.0.json -o mypath/types.goส่วนใหญ่ของ Marshalljson/unmarshaljson จะถูกลบออกยกเว้นหนึ่งสำหรับ PropertyBag ซึ่งมีประโยชน์ในการอินไลน์คุณสมบัติเพิ่มเติม ส่วนที่เหลือสามารถลบออกได้ URI, ID, UUID, GUID ถูกเปลี่ยนชื่อดังนั้นมันจึงเหมาะกับการประชุม GO ที่กำหนดไว้ที่นี่
คุณสามารถเรียกใช้การทดสอบหน่วยทั้งหมดโดยใช้:
make testคุณสามารถสร้างรีลีสโดยแท็กเวอร์ชันดังนี้:
git tag v1.0.0 -m " Release version v1.0.0 "
git push origin v1.0.0เวิร์กโฟลว์การเปิดตัว GitHub ทริกเกอร์ทันทีหลังจากที่แท็กถูกผลักอัปสตรีม โฟลว์นี้จะปล่อยไบนารีโดยใช้การกระทำของ Goreleaser จากนั้นจะสร้างและเผยแพร่ภาพนักเทียบท่าลงใน Docker Hub
สิ่งประดิษฐ์ที่ปล่อยออกมาได้รับการลงนามโดยใช้ COSIGN คุณสามารถใช้คีย์สาธารณะจากไฟล์ cosign.pub เพื่อตรวจสอบลายเซ็นของไฟล์อิมเมจและไบนารี
ลายเซ็นภาพนักเทียบท่าสามารถตรวจสอบได้ด้วยคำสั่งต่อไปนี้:
cosign verify --key cosign.pub securego/gosec:<TAG>
ลายเซ็นไฟล์ไบนารีสามารถตรวจสอบได้ด้วยคำสั่งต่อไปนี้:
cosign verify-blob --key cosign.pub --signature gosec_<VERSION>_darwin_amd64.tar.gz.sig gosec_<VERSION>_darwin_amd64.tar.gz
นอกจากนี้คุณยังสามารถสร้างอิมเมจนักเทียบท่าได้โดยใช้คำสั่ง:
make image คุณสามารถเรียกใช้เครื่องมือ gosec ในคอนเทนเนอร์กับโครงการ GO ในพื้นที่ของคุณ คุณต้องติดตั้งโครงการลงในระดับเสียงดังนี้:
docker run --rm -it -w / < PROJECT > / -v < YOUR PROJECT PATH > / < PROJECT > :/ < PROJECT > securego/gosec / < PROJECT > /... หมายเหตุ: ไดเรกทอรีการทำงานปัจจุบันต้องตั้งค่าด้วยตัวเลือก -w เพื่อให้ได้รับการแก้ไขการอ้างอิงจากไฟล์โมดูล GO สำเร็จ
การกำหนดค่าของกฎ TLS สามารถสร้างได้จากคำแนะนำ TLS Ciphers ของ Mozilla
ก่อนอื่นคุณต้องติดตั้งเครื่องมือเครื่องกำเนิดไฟฟ้า:
go get github.com/securego/gosec/v2/cmd/tlsconfig/... คุณสามารถเรียกใช้ตอนนี้ go generate ในรากของโครงการ:
go generate ./... สิ่งนี้จะสร้างไฟล์ rules/tls_config.go ซึ่งจะมีคำแนะนำ Ciphers ปัจจุบันจาก Mozilla
นี่คือรายการที่มีผู้ใช้ Gosec บางคน
สนับสนุนโครงการนี้โดยการเป็นสปอนเซอร์ โลโก้ของคุณจะปรากฏที่นี่พร้อมลิงค์ไปยังเว็บไซต์ของคุณ