
Go 보안 검사기
Go AST 및 SSA 코드 표현을 스캔하여 소스 코드의 보안 문제를 검사합니다.
Apache 라이선스 2.0 버전(이하 "라이선스")에 따라 라이선스가 부여됩니다. 라이선스를 준수하지 않는 한 이 파일을 사용할 수 없습니다. 라이선스 사본은 여기에서 얻을 수 있습니다.
gosec을 GitHub 액션으로 다음과 같이 실행할 수 있습니다:
최신 안정 릴리스에 고정된 @master와 함께 버전 태그를 사용하세요. 이는 안정적인 동작을 제공합니다.```yaml
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 토큰.```yaml
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 Actions 워크플로의 한 단계로 gosec를 실행하여
results.sarif 파일을 출력하는 예를 보여줍니다.
그런 다음 워크플로는 upload-sarif 액션을 사용하여
results.sarif 파일을 GitHub에 업로드합니다.```yaml
name: "Security Scan"
on: push: schedule:
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
### Go 분석
`goanalysis` 패키지는
[`golang.org/x/tools/go/analysis.Analyzer`](https://pkg.go.dev/golang.org/x/tools/go/analysis)
를 제공하며, 표준 Go 분석 인터페이스를 지원하는 도구(예: Bazel의
[nogo](https://github.com/bazelbuild/rules_go/blob/master/go/nogo.rst)
프레임워크)
와의 통합을 위한 것입니다:```starlark
nogo(
name = "nogo",
deps = [
"@com_github_securego_gosec_v2//goanalysis",
# add more analyzers as needed
],
visibility = ["//visibility:public"],
)
gosec는 Go 1.25 이상이 필요합니다.```bash go install github.com/securego/gosec/v2/cmd/gosec@latest
## 빠른 시작```bash
# 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 특화 정확성/보안 검사 (예: 범위 별칭 및 슬라이스 경계)G7xx: 오염 분석 규칙 (SQL 인젝션, 명령 인젝션, 경로 트래버설, SSRF, XSS, 로그, SMTP 인젝션, SSTI, 안전하지 않은 역직렬화, 오픈 리다이렉트)전체 목록, 규칙 설명 및 규칙별 구성에 대해서는 RULES.md를 참조하세요.
기본적으로 gosec는 제공된 파일 경로에 대해 모든 규칙을 실행합니다. 그러나 -include= 플래그를 사용하여 실행할 규칙의 하위 집합을 선택하거나, -exclude= 플래그를 사용하여 명시적으로 제외할 규칙 집합을 지정할 수 있습니다.```bash
$ gosec -include=G101,G203,G401 ./...
$ gosec -exclude=G303 ./...
### CWE 매핑
`gosec`에 의해 발견된 모든 문제는 취약점을 보다 일반적인 용어로 설명하는
[CWE (Common Weakness Enumeration)](http://cwe.mitre.org/data/index.html)에
매핑됩니다. 정확한 매핑은
[여기](https://github.com/securego/gosec/blob/master/issue/issue.go#L50)에서
확인할 수 있습니다.
### 구성
구성 파일에서 다음과 같이 여러 전역 설정을 제공할 수 있습니다:```JSON
{
"global": {
"nosec": "enabled",
"audit": "enabled"
}
}
nosec: 이 설정은 코드 베이스 전체에 정의된 모든 #nosec 지시자를 덮어씁니다.audit: 감사 모드로 실행되며, 일반적인 코드 분석에서는 너무 지나칠 수 있는 추가 검사를 활성화합니다.```bash$ gosec -conf config.json .
### 경로 기반 규칙 제외
여러 구성 요소를 가진 대규모 저장소는 경로에 따라 다른 보안 규칙이 필요할 수 있습니다. `exclude-rules`를 사용하여 특정 경로에 대해 특정 규칙을 억제하세요.
**설정 파일:**```json
{
"exclude-rules": [
{
"path": "cmd/.*",
"rules": ["G204", "G304"]
},
{
"path": "scripts/.*",
"rules": ["*"]
}
]
}
CLI 플래그:```bash
gosec --exclude-rules="cmd/.*:G204,G304" ./...
gosec --exclude-rules="scripts/.:" ./...
gosec --exclude-rules="cmd/.:G204,G304;test/.:G101" ./...
| 필드 | 유형 | 설명 |
|-------|------|-------------|
| `path` | string (regex) | 파일 경로와 매칭되는 정규식 |
| `rules` | []string | 제외할 규칙 ID. `*`는 모두 |
#### 규칙 구성
일부 규칙은 구성 플래그도 허용합니다; 이러한 플래그는
[RULES.md](https://github.com/securego/gosec/blob/master/RULES.md)에 문서화되어 있습니다.
#### Go 버전
일부 규칙은 프로젝트에 있는 Go 모듈 파일에서 검색된 특정 Go 버전이 필요합니다. 이 버전을 찾을 수 없는 경우 Go 런타임 버전으로 대체됩니다.
Go 모듈 버전은 `go list` 명령을 사용하여 구문 분석되며, 경우에 따라 성능 저하가 발생할 수 있습니다. 이 상황에서는 환경 변수
`GOSECGOVERSION=go1.21.1`을 설정하여 Go 모듈 버전을 쉽게 제공할 수 있습니다.
### 종속성
gosec는 Go 모듈을 사용하여 패키지를 로드합니다. 대부분의 프로젝트에서 종속성은 스캔 중에 자동으로 해결됩니다.
종속성이 없는 경우, 실행하십시오:```bash
go mod tidy
go mod download
gosec는 모든 패키지의 테스트 파일과 vendor 디렉터리의 모든 종속성을 무시합니다.
테스트 파일 스캔은 다음 플래그를 사용하여 활성화할 수 있습니다. 플래그:```bash gosec -tests ./...
또한 다음과 같이 추가 폴더를 제외할 수 있습니다:```bash
gosec -exclude-dir=rules -exclude-dir=cmd ./...
gosec는 기본 생성 코드 주석이 있는 생성된 go 파일을 무시할 수 있습니다.``` // Code generated by some generator DO NOT EDIT.
Please provide the Markdown content to translate.```bash
gosec -exclude-generated ./...
gosec는 AI 추천 기반으로 수정 사항을 제안할 수 있습니다. 보안 찾기에 대한 제안을 받기 위해 AI API를 호출합니다.
다음 명령줄 인수를 제공하여 이 기능을 활성화할 수 있습니다:
ai-api-provider: AI API 제공자의 이름입니다. 지원되는 제공자:
atlas (기본 모델 deepseek-ai/deepseek-v4-flash), atlas-deepseek-v4-flash, atlas-qwen3-coder-next, atlas-kimi-k2.6, 또는 Atlas Cloud가 호스팅하는 모든 채팅 모델의 경우 atlas:<model-id>. Atlas Cloud는 atlascloud.ai에서 제공되는 OpenAI 호환 제공자입니다.gemini-3-pro-preview (기본값), gemini-2.5-pro, gemini-2.5-flash, gemini-2.5-flash-liteclaude-sonnet-4-6 (기본값), , , , , 🎁 Atlas Cloud 는 개발자에게 비디오 생성, 이미지 생성 및 LLM API에 대한 단일 AI API를 제공하는 전체 모달 AI 추론 플랫폼입니다. 여러 공급업체 통합을 관리하는 대신 한 번 연결하여 300개 이상의 큐레이션 모델에 대한 통합 액세스를 얻을 수 있습니다.
Atlas Cloud의 새로운 코딩 플랜 프로모션을 확인하여 더 예산 친화적인 API 액세스를 이용하세요: https://www.atlascloud.ai/console/coding-plan
예제:```bash
export GOSEC_AI_API_KEY="your_key" export GOSEC_AI_PROVIDER="atlas" gosec ./...
GOSEC_AI_API_KEY="your_key"
gosec -ai-api-provider="atlas:qwen/qwen3-coder-next" ./...
gosec -ai-api-provider="gemini-3-pro-preview"
-ai-api-key="your_key" ./...
gosec -ai-api-provider="claude-sonnet-4-6"
-ai-api-key="your_key" ./...
gosec -ai-api-provider="gpt-5.4"
-ai-api-key="your_key" ./...
gosec -ai-api-provider="gpt-5.4"
-ai-api-key="your_azure_key"
-ai-base-url="https://your-resource.openai.azure.com/openai/deployments/your-deployment"
./...
gosec -ai-api-provider="llama3.2"
-ai-base-url="http://localhost:11434/v1"
./...
gosec -ai-api-provider="custom-model"
-ai-api-key="your_key"
-ai-base-url="https://internal-api.company.com/v1"
-ai-skip-ssl
./...
### 코드 주석 처리
모든 자동화된 탐지 도구와 마찬가지로, 거짓 양성(false positive) 사례가 발생할 수 있습니다.
gosec가 수동으로 안전하다고 확인된 오류를 보고하는 경우, `#nosec`로 시작하는 주석을 코드에 추가할 수 있습니다.
`#nosec` 주석은 `#nosec [RuleList] [-- Justification]` 형식을 따라야 합니다.
`#nosec` 주석은 경고가 보고된 줄에 배치되어야 합니다.```go
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)
}
}
특정 오탐(false positive)이 식별되고 안전하다고 확인되었을 때,
해당 코드 섹션 내에서 단일 규칙(또는 특정 규칙 세트)만을 억제하고,
다른 문제에 대한 검색은 계속 진행하고 싶을 수 있습니다. 이를 위해
#nosec 주석 내에 억제할 규칙을 나열할 수 있습니다.
예: /* #nosec G401 */ 또는 //#nosec G201 G202 G203
주석에 설명 또는 정당화 텍스트를 넣을 수도 있습니다.
정당화 텍스트는 억제할 규칙 뒤에 위치해야 하며,
두 개 이상의 대시로 시작해야 합니다.
예: //#nosec G101 G102 -- This is a false positive
또는 gosec는 //gosec:disable 지시어도 지원하며,
이는 #nosec와 유사하게 작동합니다:```go
//gosec:disable G101 -- This is a false positive
In some cases you may also want to revisit places where
`#nosec` or `//gosec:disable` annotations have been used. To
run the scanner and ignore any `#nosec` annotations you can do
the following:```bash
gosec -nosec=true ./...
주석이 관련 없는 규칙을 실수로 억제하거나 설명 없이 추가되는 것을 방지하기 위해, gosec는 두 개의 선택적 플래그를 제공합니다. 두 플래그 모두 기본값이 false이므로 기존 코드베이스는 변경 없이 그대로 작동합니다.
-nosec-require-rules는 규칙 ID를 나열하지 않은 #nosec / //gosec:disable 지시어를 거부합니다.-nosec-require-justification는 규칙 목록 뒤에 -- justification이 없는 지시어를 거부합니다.활성화되면, 검사를 통과하지 못한 지시어는 더 이상 어떤 발견도 억제하지 않으며, 해당 라인의 기본 문제와 함께 출력에서 오류로 보고됩니다.```bash gosec -nosec-require-rules -nosec-require-justification ./...
동일한 옵션들은 글로벌 구성 블록을 통해 설정할 수 있습니다:```json
{
"global": {
"nosec-require-rules": "enabled",
"nosec-require-justification": "enabled"
}
}
위에서 설명한 대로, 위반 사항을 외부적으로(-include/-exclude 사용) 또는 인라인(#nosec 주석 사용)으로 억제할 수 있습니다. 감사를 위해 억제 메타데이터를 내보낼 수 있습니다.
-track-suppressions를 사용하여 억제 추적을 활성화합니다:```bash
gosec -track-suppressions -exclude=G101
-fmt=sarif -out=results.sarif ./...
- 외부 억제의 경우, gosec는 억제 정보를 기록합니다
여기서 `kind`는 `external`이고 `justification`은 `Globally suppressed.`입니다.
- 인라인 억제의 경우, gosec는 억제 정보를 기록합니다
여기서 `kind`는 `inSource`이고 `justification`은 주석에서 두 개 이상의 대시 뒤에 오는 텍스트입니다.
**참고:** SARIF 및 JSON 형식만 억제 추적을 지원합니다.
### 빌드 태그
gosec는 귀하의 [Go 빌드 태그](https://pkg.go.dev/go/build/)를 분석기에 전달할 수 있습니다.
다음과 같이 쉼표로 구분된 목록으로 제공할 수 있습니다:```bash
gosec -tags debug,ignore ./...
gosec는 text, json, yaml, csv, junit-xml,
html, sonarqube, golint, sarif 형식을 지원합니다. 기본적으로
결과는 표준 출력(stdout)으로 보고되지만, 출력 파일에 기록할 수도
있습니다. 출력 형식은 -fmt 플래그로 제어되며, 출력 파일은 -out 플래그로
다음과 같이 제어됩니다:```bash
$ gosec -fmt=json -out=results.json *.go
`-stdout`을 사용하여 결과를 출력하면서 동시에 `-out`을 작성합니다.
`-verbose`를 사용하여 표준 출력 형식을 재정의하면서 파일 형식을 유지합니다.```bash
# 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는
generic issue import format
를 SonarQube용으로 생성하며, 보고서는 SonarQube로 가져와야 합니다
사용하여
sonar.externalIssuesReportPaths=path/to/gosec-report.json.
gosec -severity medium ./...
gosec -confidence medium ./...
gosec --exclude-rules="cmd/.:G204,G304;scripts/.:*" ./...
gosec -exclude-generated ./...
gosec -tests ./...
## 개발
개발 문서가 다음으로 이동되었습니다.
[DEVELOPMENT.md](https://github.com/securego/gosec/blob/HEAD/DEVELOPMENT.md).
## gosec을 사용하는 곳은?
다음은 gosec 사용자 중 일부가 포함된 [목록](https://github.com/securego/gosec/blob/HEAD/USERS.md)입니다.
## 후원자
후원자가 되어 이 프로젝트를 지원해 주세요. 귀하의 로고가 여기에 표시되며 웹사이트 링크가 연결됩니다.
<a href="https://github.com/mercedes-benz" target="_blank"><img src="https://assets.kitploit.com/production/public/readmes/2947/08b6f9da5faff0e986172b0c77fed0865a2cb26e6f8c58a8ae588c74bcf16f5f.png"></a>
claude-opus-4-7claude-opus-4-6claude-sonnet-4-5claude-opus-4-5claude-haiku-4-5gpt-5.4 (기본값), gpt-5.4-mini, gpt-5.4-nanoai-base-url 필요)ai-api-key 또는 환경 변수 GOSEC_AI_API_KEY 설정: AI API에 접근하는 키
ai-base-url: (선택 사항) OpenAI 호환 API용 사용자 정의 기본 URL (예: Azure OpenAI, LocalAI, Ollama)
https://api.atlascloud.ai/v1을 사용하므로, 내장 atlas 제공자의 경우 ai-base-url은 선택 사항입니다.GOSEC_AI_PROVIDER: (선택 사항) ai-api-provider의 대체 환경 변수GOSEC_AI_BASE_URL: (선택 사항) ai-base-url의 대체 환경 변수ai-skip-ssl: (선택 사항) AI API에 대한 SSL 인증서 확인 건너뛰기 (자체 서명된 인증서에 유용)