
Go AST와 SSA 코드 표현을 스캔하여 소스 코드의 보안 문제를 검사합니다.
Apache License, Version 2.0("라이선스")에 따라 라이선스가 부여됩니다. 라이선스를 준수하지 않는 한 이 파일을 사용할 수 없습니다. 라이선스 사본은 여기에서 확인할 수 있습니다.
다음과 같이 gosec을 GitHub action으로 실행할 수 있습니다:
최신 안정 릴리스에 고정된 @master와 함께 버전 태그를 사용하세요. 이렇게 하면 안정적인 동작을 제공합니다.
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: ./...
프로젝트에서 비공개 Go 모듈을 임포트하는 경우, gosec이
의존성을 가져올 수 있도록 인증을 구성해야 합니다.
워크플로에서 다음 환경 변수를 설정하세요:
GOPRIVATE: 비공개로 간주해야 하는 모듈 경로 접두사의
쉼표로 구분된 목록
(예: github.com/your-org/*).GITHUB_AUTHENTICATION_TOKEN: 비공개 저장소에 대한 읽기
권한이 있는 GitHub 토큰.name: Run Gosec
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
tests:
runs-on: ubuntu-latest
env:
GO111MODULE: on
GOPRIVATE: github.com/your-org/*
GITHUB_AUTHENTICATION_TOKEN: ${{ secrets.PRIVATE_REPO_TOKEN }}
steps:
- name: Checkout Source
uses: actions/checkout@v3
- name: Run Gosec Security Scanner
uses: securego/gosec@v2
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@v2
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.sarif
goanalysis 패키지는 표준 Go 분석 인터페이스를 지원하는 도구(예: Bazel의 nogo 프레임워크)와의 통합을 위한 golang.org/x/tools/go/analysis.Analyzer를 제공합니다:
nogo(
name = "nogo",
deps = [
"@com_github_securego_gosec_v2//goanalysis",
# add more analyzers as needed
],
visibility = ["//visibility:public"],
)
gosec는 Go 1.25 이상이 필요합니다.
go install github.com/securego/gosec/v2/cmd/gosec@latest
# Scan all packages in current module
gosec ./...
# Write JSON report
gosec -fmt json -out results.json ./...
# Write SARIF report for code scanning
gosec -fmt sarif -out results.sarif ./...
0: 억제되지 않은 발견 사항/오류 없이 스캔 완료1: 억제되지 않은 발견 사항 또는 처리 오류가 하나 이상 존재0을 반환하려면 -no-fail 사용Gosec은 규칙의 일부만 실행하도록 구성하거나, 특정 파일 경로를
제외하거나, 다양한 형식으로 보고서를 생성하도록 구성할 수 있습니다.
기본적으로 모든 규칙은 제공된 입력 파일에 대해 실행됩니다.
현재 디렉터리부터 재귀적으로 스캔하려면 입력 인수로 ./...를
제공하면 됩니다.
gosec은 다음 범주에 걸친 규칙을 포함합니다:
G1xx: 일반적인 보안 코딩 문제 (예: 하드코딩된 자격 증명,
안전하지 않은 사용, HTTP 강화, 쿠키 보안)G2xx: 쿼리/템플릿/명령 구성에서의 인젝션 위험G3xx: 파일 및 경로 처리 위험 (권한, 경로 순회,
임시 파일, 아카이브 추출)G4xx: 암호화 및 TLS 취약점G5xx: 차단 목록에 포함된 임포트G6xx: Go 특유의 정확성/보안 검사 (예: range 별칭 지정 및
슬라이스 경계)G7xx: 오염 분석 규칙 (SQL 인젝션, 명령 인젝션, 경로 순회,
SSRF, XSS, 로그, SMTP 인젝션, SSTI, 안전하지 않은 역직렬화,
오픈 리다이렉트)전체 목록, 규칙 설명 및 규칙별 구성은 RULES.md를 참조하세요.
기본적으로 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(Common Weakness Enumeration)에 매핑됩니다.
정확한 매핑은
여기에서 확인할 수 있습니다.
다음과 같이 구성 파일에서 여러 전역 설정을 제공할 수 있습니다:
{
"global": {
"nosec": "enabled",
"audit": "enabled"
}
}
nosec: 이 설정은 코드베이스 전체에 정의된 모든 #nosec 지시문을 덮어씁니다audit: 일반적인 코드 분석에는 지나치게 간섭적일 수 있는 추가 검사를 활성화하는 감사 모드로 실행합니다# Run with a global configuration file
$ gosec -conf config.json .
여러 구성 요소가 있는 대규모 저장소는 경로마다 다른 보안 규칙이 필요할 수 있습니다. exclude-rules를 사용하여 특정 경로에 대해 특정 규칙을 억제하세요.
구성 파일:
{
"exclude-rules": [
{
"path": "cmd/.*",
"rules": ["G204", "G304"]
},
{
"path": "scripts/.*",
"rules": ["*"]
}
]
}
CLI 플래그:
# Exclude G204 and G304 from cmd/ directory
gosec --exclude-rules="cmd/.*:G204,G304" ./...
# Exclude all rules from scripts/ directory
gosec --exclude-rules="scripts/.*:*" ./...
# Multiple exclusions
gosec --exclude-rules="cmd/.*:G204,G304;test/.*:G101" ./...
| 필드 | 유형 | 설명 |
|---|---|---|
path | string (regex) | 파일 경로와 대조되는 정규식 |
rules | []string | 제외할 규칙 ID. *는 전체를 의미 |