Осмотрите исходный код на наличие задач безопасности, сканируя представление кода 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 . Рабочий процесс затем загружает файл 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= или указать набор правил, чтобы явно исключить с помощью -exclude= .
# 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 . Некоторые правила также принимают флаги конфигурации; Эти флаги задокументированы в правилах.md.
Некоторые правила требуют конкретной версии 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 может предложить исправления на основе рекомендации искусственного интеллекта. Он позвонит AIPI AI, чтобы получить предложение для поиска безопасности.
Вы можете включить эту функцию, предоставив следующие аргументы командной строки:
ai-api-provider : название поставщика AI API AI, в настоящее время поддерживается только gemini .ai-api-key или установите переменную среды GOSEC_AI_API_KEY : ключ для доступа к API AI, для Gemini вы можете создать ключ API, следующие по этим инструкциям.ai-endpoint : конечная точка поставщика ИИ, это необязательный аргумент. 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 ) или Inline (с использованием аннотаций #nosec ) в 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 Output. Результаты по умолчанию будут сообщены в STDOUT, но также могут быть записаны в выходной файл. Формат вывода управляется флагом -fmt , а выходной файл управляется флагом -out следующим образом:
# Write output in json format to results.json
$ gosec -fmt=json -out=results.json * .go Результаты будут сообщены STDOUT, а также в предоставленный выходной файл от флага -stdout . Флаг -verbose переопределяет выходной формат при просьбе результатов при сохранении их в выходном файле
# 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 .
Ancoming.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 сразу же после того, как тег выдвигается вверх по течению. Этот поток выпустит двоичные файлы, используя действие GoreAser, а затем он построит и опубликует изображение Docker в Docker Hub.
Выпущенные артефакты подписаны с использованием CoSign. Вы можете использовать открытый ключ из файла cosign.pub, чтобы проверить подпись изображения Docker и двоичных файлов.
Подпись изображения Docker может быть проверена с помощью следующей команды:
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
Вы также можете создать изображение Docker, используя команду:
make image Вы можете запустить инструмент gosec в контейнере против вашего локального проекта GO. Вам нужно только установить проект в томе следующим образом:
docker run --rm -it -w / < PROJECT > / -v < YOUR PROJECT PATH > / < PROJECT > :/ < PROJECT > securego/gosec / < PROJECT > /... ПРИМЕЧАНИЕ. Текущий рабочий каталог должен быть установлен с помощью опции -w , чтобы успешно разрешить зависимости от файла модуля GO
Конфигурация правила TLS может быть получена из рекомендации Mozilla's TLS Ciphers.
Сначала вам нужно установить инструмент генератора:
go get github.com/securego/gosec/v2/cmd/tlsconfig/... Теперь вы можете вызвать go generate в корне проекта:
go generate ./... Это будет генерировать файл rules/tls_config.go , который будет содержать текущую рекомендацию Ciphers от Mozilla.
Это список с некоторыми пользователями Gosec.
Поддержите этот проект, став спонсором. Ваш логотип отобразится здесь со ссылкой на ваш сайт