
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/.:" ./...