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 다음과 같이 GITHUB 작업으로 gosec 실행할 수 있습니다.
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 : ./...SARIF 파일로 데이터를 업로드하여 타사 코드 분석 도구를 GitHub 코드 스캔과 통합 할 수 있습니다.
워크 플로는 GITHUB 액션 워크 플로의 단계로 gosec 실행 results.sarif 예를 보여줍니다. 그런 다음 워크 플로는 upload-sarif 파이 액션을 사용하여 results.sarif 파일을 GitHub에 업로드합니다.
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 명령을 사용하여 구문 분석하여 경우에 따라 성능 저하로 이어질 수 있습니다. 이 상황에서 환경 변수 GOSECGOVERSION=go1.21.1 설정하여 GO 모듈 버전을 쉽게 제공 할 수 있습니다.
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 제공 업체의 이름은 현재 gemini 만 지원됩니다.ai-api-key 또는 환경 변수 GOSEC_AI_API_KEY : AI API에 액세스하는 키, gemini의 경우 다음 지침에 따라 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 G201 G202 G203 하려면 #nosec 주석 내에서 억제 할 규칙을 나열 할 수 있습니다 /* #nosec G401 */
주석에 대한 설명이나 정당화 텍스트를 넣을 수 있습니다. 정당화는 규칙 이후 둘 이상의 대시로 억제하고 시작하는 규칙 (예 : //#nosec G101 G102 -- This is a false positive
경우에 따라 #nosec 주석이 사용 된 장소를 다시 방문 할 수도 있습니다. 스캐너를 실행하고 #nosec 주석을 무시하려면 다음을 수행 할 수 있습니다.
gosec -nosec=true ./... 위에서 설명한 바와 같이, GOSEC에서 외부 ( -include / -exclude 사용) 또는 인라인 ( #nosec 주석 사용)을 억제 할 수 있습니다. 이 억제 염증은 감사 목적으로 해당 신호를 생성하는 데 사용될 수 있습니다.
다음과 같이 -track-suppressions 플래그에 의한 억제를 추적 할 수 있습니다.
gosec -track-suppressions -exclude=G101 -fmt=sarif -out=results.sarif ./...kind external 이며 justification 가 "전 세계적으로 억제 된"특정 문장 인 억제 정보를 기록합니다.kind 가 inSource 되고 justification 주석에서 둘 이상의 대시 후 텍스트 인 억제 정보를 기록합니다.참고 : SARIF와 JSON만이 추적 억제를 지원합니다.
GOSEC은 GO 빌드 태그를 분석기로 전달할 수 있습니다. 다음과 같이 쉼표로 분리 된 목록으로 제공 될 수 있습니다.
gosec -tags debug,ignore ./... GOSEC는 현재 text , json , yaml , csv , sonarqube , JUnit XML , html 및 golint 출력 형식을 지원합니다. 기본적으로 결과는 stdout 에보 고되지만 출력 파일에도 기록 할 수도 있습니다. 출력 형식은 -fmt 플래그에 의해 제어되며 출력 파일은 다음과 같이 -out 플래그에 의해 제어됩니다.
# Write output in json format to results.json
$ gosec -fmt=json -out=results.json * .go 결과는 -stdout 플래그에 의해 제공된 출력 파일뿐만 아니라 stdout에도보고됩니다. -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의 일반적인 문제 가져 오기 형식을 생성하고 sonar.externalIssuesReportPaths=path/to/gosec-report.json 사용하여 Sonarqube로 가져와야합니다.
Contributing.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.goMarshalljson/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.0GitHub 릴리스 워크 플로우 트리거는 태그가 상류로 밀린 직후에 트리거됩니다. 이 흐름은 Goreleaser 액션을 사용하여 바이너리를 방출 한 다음 Docker 이미지를 Docker Hub에 구축하고 게시합니다.
출시 된 아티팩트는 COSIGN을 사용하여 서명합니다. CoSign.pub 파일에서 공개 키를 사용하여 Docker 이미지 및 Binaries 파일의 서명을 확인할 수 있습니다.
Docker Image Signature는 다음 명령으로 확인할 수 있습니다.
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 로컬 GO 프로젝트에 대한 컨테이너에서 gosec 도구를 실행할 수 있습니다. 다음과 같이 프로젝트를 볼륨에만 장착하면됩니다.
docker run --rm -it -w / < PROJECT > / -v < YOUR PROJECT PATH > / < PROJECT > :/ < PROJECT > securego/gosec / < PROJECT > /... 참고 : GO 모듈 파일에서 종속성을 성공적으로 해결하려면 현재 작업 디렉토리를 -w 옵션으로 설정해야합니다.
TLS 규칙의 구성은 Mozilla의 TLS 암호 추천에서 생성 될 수 있습니다.
먼저 발전기 도구를 설치해야합니다.
go get github.com/securego/gosec/v2/cmd/tlsconfig/... 이제 프로젝트의 루트에서 go generate 호출 할 수 있습니다.
go generate ./... 이것은 Mozilla의 현재 암호 추천을 포함하는 rules/tls_config.go 파일을 생성합니다.
이것은 GOSEC의 일부 사용자와 함께 목록입니다.
스폰서가 되어이 프로젝트를 지원하십시오. 귀하의 로고는 귀하의 웹 사이트에 대한 링크와 함께 여기에 나타납니다.