Periksa kode sumber untuk masalah keamanan dengan memindai representasi kode Go AST dan SSA.
Dilisensikan di bawah lisensi Apache, versi 2.0 ("lisensi"). Anda tidak boleh menggunakan file ini kecuali sesuai dengan lisensi. Anda dapat memperoleh salinan lisensi di sini.
# 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 Anda dapat menjalankan gosec sebagai tindakan github sebagai berikut:
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 : ./...Anda dapat mengintegrasikan alat analisis kode pihak ketiga dengan pemindaian kode github dengan mengunggah data sebagai file sarif.
Alur kerja menunjukkan contoh menjalankan gosec sebagai langkah dalam alur kerja aksi GitHub yang menghasilkan results.sarif . Alur kerja kemudian mengunggah results.sarif 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 dapat dikonfigurasi untuk hanya menjalankan subset aturan, untuk mengecualikan jalur file tertentu, dan menghasilkan laporan dalam format yang berbeda. Secara default semua aturan akan dijalankan terhadap file input yang disediakan. Untuk memindai secara rekursif dari direktori saat ini yang dapat Anda berikan ./... sebagai argumen input.
Secara default, Gosec akan menjalankan semua aturan terhadap jalur file yang disediakan. Namun dimungkinkan untuk memilih subset aturan untuk dijalankan melalui -include= flag, atau untuk menentukan seperangkat aturan untuk secara eksplisit mengecualikan menggunakan -exclude= flag.
# Run a specific set of rules
$ gosec -include=G101,G203,G401 ./...
# Run everything except for rule G303
$ gosec -exclude=G303 ./... Setiap masalah yang terdeteksi oleh gosec dipetakan ke CWE (Pencacahan Kelemahan Umum) yang menggambarkan secara lebih umum kerentanan. Pemetaan yang tepat dapat ditemukan di sini.
Sejumlah pengaturan global dapat disediakan dalam file konfigurasi sebagai berikut:
{
"global" : {
"nosec" : " enabled " ,
"audit" : " enabled "
}
}nosec : Pengaturan ini akan menimpa semua arahan #nosec yang ditentukan di seluruh basis kodeaudit : berjalan dalam mode audit yang memungkinkan pemeriksaan tambahan bahwa untuk analisis kode normal mungkin terlalu usil # Run with a global configuration file
$ gosec -conf config.json . Beberapa aturan juga menerima bendera konfigurasi; Bendera ini didokumentasikan dalam aturan.md.
Beberapa aturan memerlukan versi GO spesifik yang diambil dari file modul GO yang ada dalam proyek. Jika versi ini tidak dapat ditemukan, itu akan mundur untuk menjadi versi runtime.
Versi modul GO diuraikan menggunakan perintah go list yang dalam beberapa kasus dapat menyebabkan degradasi kinerja. Dalam situasi ini, versi Modul GO dapat dengan mudah disediakan dengan mengatur variabel lingkungan GOSECGOVERSION=go1.21.1 .
Gosec akan mengambil secara otomatis dependensi kode yang sedang dianalisis ketika modul GO dihidupkan (misalnya GO111MODULE=on ). Jika ini bukan masalahnya, dependensi perlu diunduh secara eksplisit dengan menjalankan perintah go get -d sebelum pemindaian.
Gosec akan mengabaikan file uji di semua paket dan ketergantungan apa pun di direktori vendor Anda.
Pemindaian file uji dapat diaktifkan dengan bendera berikut:
gosec -tests ./...Folder tambahan juga dapat dikecualikan sebagai berikut:
gosec -exclude-dir=rules -exclude-dir=cmd ./...Gosec dapat mengabaikan file GO yang dihasilkan dengan komentar kode yang dihasilkan default.
// Code generated by some generator DO NOT EDIT.
gosec -exclude-generated ./...Gosec dapat menyarankan perbaikan berdasarkan rekomendasi AI. Ini akan menghubungi AI API untuk menerima saran untuk temuan keamanan.
Anda dapat mengaktifkan fitur ini dengan memberikan argumen baris perintah berikut:
ai-api-provider : Nama penyedia API AI, saat ini hanya gemini yang didukung.ai-api-key atau mengatur variabel lingkungan GOSEC_AI_API_KEY : Kunci untuk mengakses AI API, untuk Gemini, Anda dapat membuat kunci API mengikuti instruksi ini.ai-endpoint : titik akhir dari penyedia AI, ini adalah argumen opsional. gosec -ai-api-provider= " gemini " -ai-api-key= " your_key " ./... Seperti halnya semua alat deteksi otomatis, akan ada kasus positif palsu. Dalam kasus di mana GOSEC melaporkan kegagalan yang telah diverifikasi secara manual sebagai aman, dimungkinkan untuk membubarkan kode dengan komentar yang dimulai dengan #nosec .
Komentar #nosec harus memiliki format #nosec [RuleList] [-- Justification] .
Komentar #nosec perlu ditempatkan di telepon di mana peringatan dilaporkan.
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 )
}
} Ketika positif palsu spesifik telah diidentifikasi dan diverifikasi sebagai aman, Anda mungkin ingin hanya menekan aturan tunggal itu (atau seperangkat aturan tertentu) dalam bagian kode, sambil terus memindai masalah lain. Untuk melakukan ini, Anda dapat mencantumkan aturan yang akan ditekan dalam anotasi #nosec , misalnya: /* #nosec G401 */ atau //#nosec G201 G202 G203
Anda dapat menempatkan deskripsi atau teks justifikasi untuk anotasi. Pembenaran harus setelah aturan untuk menekan dan memulai dengan dua atau lebih tanda hubung, misalnya: //#nosec G101 G102 -- This is a false positive
Dalam beberapa kasus, Anda mungkin juga ingin mengunjungi kembali tempat -tempat di mana anotasi #nosec telah digunakan. Untuk menjalankan pemindai dan mengabaikan anotasi #nosec apa pun, Anda dapat melakukan hal berikut:
gosec -nosec=true ./... Seperti dijelaskan di atas, kami dapat menekan pelanggaran secara eksternal (menggunakan -include / -exclude ) atau inline (menggunakan anotasi #nosec ) di GOSEC. Peradangan penindasan ini dapat digunakan untuk menghasilkan sinyal yang sesuai untuk tujuan audit.
Kami dapat melacak penekan dengan bendera -track-suppressions sebagai berikut:
gosec -track-suppressions -exclude=G101 -fmt=sarif -out=results.sarif ./...kind external dan justification adalah kalimat tertentu "ditekan secara global".kind adalah inSource dan justification adalah teks setelah dua atau lebih tanda hubung dalam komentar.Catatan: Hanya Sarif dan JSON format yang mendukung penekan pelacakan.
Gosec dapat meneruskan tag go build Anda ke penganalisa. Mereka dapat disediakan sebagai daftar yang terpisah koma sebagai berikut:
gosec -tags debug,ignore ./... Gosec saat ini mendukung text , json , yaml , csv , sonarqube , JUnit XML , html dan format output golint . Secara default hasil akan dilaporkan ke stdout, tetapi juga dapat ditulis ke file output. Format output dikendalikan oleh flag -fmt , dan file output dikendalikan oleh bendera -out sebagai berikut:
# Write output in json format to results.json
$ gosec -fmt=json -out=results.json * .go Hasil akan dilaporkan ke stdout serta ke file output yang disediakan oleh -stdout flag. Bendera -verbose mengesampingkan format output saat stdout hasilnya saat menyimpannya di file output
# 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 Catatan: Gosec menghasilkan format impor masalah generik untuk Sonarqube, dan sebuah laporan harus diimpor ke Sonarqube menggunakan sonar.externalIssuesReportPaths=path/to/gosec-report.json .
Kontribusi.MD berisi informasi terperinci tentang penambahan aturan baru ke Gosec.
Anda dapat membangun biner dengan:
makeInstal alat dengan:
go get -u github.com/a-h/generate/cmd/schema-generateKemudian hasilkan tipe dengan:
schema-generate -i sarif-schema-2.1.0.json -o mypath/types.goSebagian besar Marshalljson/Unmarshaljson dihapus kecuali yang untuk PropertyBag yang berguna untuk menyambungkan properti tambahan. Sisanya bisa dihapus. URI, ID, UUID, GUID diganti namanya sehingga sesuai dengan konvensi GO yang ditentukan di sini
Anda dapat menjalankan semua tes unit menggunakan:
make testAnda dapat membuat rilis dengan menandai versi sebagai berikut:
git tag v1.0.0 -m " Release version v1.0.0 "
git push origin v1.0.0Alur kerja rilis GitHub memicu segera setelah tag didorong ke hulu. Aliran ini akan melepaskan binari menggunakan aksi Goreleaser dan kemudian akan membangun dan menerbitkan gambar Docker ke Hub Docker.
Artefak yang dirilis ditandatangani menggunakan COSIGN. Anda dapat menggunakan kunci publik dari file cosign.pub untuk memverifikasi tanda tangan gambar Docker dan file binari.
Tanda tangan gambar Docker dapat diverifikasi dengan perintah berikut:
cosign verify --key cosign.pub securego/gosec:<TAG>
Tanda tangan file biner dapat diverifikasi dengan perintah berikut:
cosign verify-blob --key cosign.pub --signature gosec_<VERSION>_darwin_amd64.tar.gz.sig gosec_<VERSION>_darwin_amd64.tar.gz
Anda juga dapat membangun secara lokal gambar Docker dengan menggunakan perintah:
make image Anda dapat menjalankan alat gosec dalam wadah melawan proyek GO lokal Anda. Anda hanya perlu memasang proyek menjadi volume sebagai berikut:
docker run --rm -it -w / < PROJECT > / -v < YOUR PROJECT PATH > / < PROJECT > :/ < PROJECT > securego/gosec / < PROJECT > /... CATATAN: Direktori kerja saat ini perlu ditetapkan dengan -w opsi untuk berhasil menyelesaikan dependensi dari file modul go
Konfigurasi aturan TLS dapat dihasilkan dari rekomendasi Cipher TLS Mozilla.
Pertama, Anda perlu menginstal alat generator:
go get github.com/securego/gosec/v2/cmd/tlsconfig/... Anda dapat memohon sekarang go generate di akar proyek:
go generate ./... Ini akan menghasilkan file rules/tls_config.go yang akan berisi rekomendasi ciphers saat ini dari mozilla.
Ini adalah daftar dengan beberapa pengguna Gosec.
Dukung proyek ini dengan menjadi sponsor. Logo Anda akan muncul di sini dengan tautan ke situs web Anda