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 --helpgosec 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 : ./...SARIFファイルとしてデータをアップロードすることにより、サードパーティのコード分析ツールをGitHubコードスキャンと統合できます。
ワークフローは、 results.sarifを出力するGitHubアクションワークフローのステップとしてgosecを実行する例を示しています。Sarifファイル。ワークフローは、 results.sarifファイルをupload-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@latestGOSECは、ルールのサブセットのみを実行し、特定のファイルパスを除外し、異なる形式でレポートを作成するように構成できます。デフォルトでは、すべてのルールが提供された入力ファイルに対して実行されます。現在のディレクトリから再帰的にスキャンするには、入力引数として./...を提供できます。
デフォルトでは、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 . 一部のルールでは、構成フラグも受け入れます。これらのフラグは、rool.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は、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 G401 */ #nosecアノテーション内で抑制されるルールをリストすることができます//#nosec G201 G202 G203
注釈の説明または正当化テキストを配置できます。正当化は、2つ以上のダッシュを抑制して開始するための規則の後である必要があります//#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コメントに2回以上ダッシュした後のテキストである抑制情報を記録します。注: SARIFとJSONフォーマットのみが追跡抑制をサポートしています。
GoSecは、Go Buildタグをアナライザーに渡すことができます。次のように、コンマ分離リストとして提供できます。
gosec -tags debug,ignore ./...GoSec json text 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にレポートをインポートする必要があります。
Convributing.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画像およびバイナリファイルの署名を確認できます。
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 gosecツールは、地元のGOプロジェクトに対してコンテナで実行できます。次のように、プロジェクトをボリュームにマウントするだけです。
docker run --rm -it -w / < PROJECT > / -v < YOUR PROJECT PATH > / < PROJECT > :/ < PROJECT > securego/gosec / < PROJECT > /...注: Goモジュールファイルからの依存関係を正常に解決するために、現在の作業ディレクトリを-wオプションで設定する必要があります
TLSルールの構成は、MozillaのTLS Ciphers推奨から生成できます。
まず、ジェネレーターツールをインストールする必要があります。
go get github.com/securego/gosec/v2/cmd/tlsconfig/...プロジェクトのルートでgo generateを呼び出すことができます。
go generate ./...これにより、Mozillaからの現在の暗号化の推奨事項が含まれるrules/tls_config.goファイルが生成されます。
これは、GoSecのユーザーの一部を含むリストです。
スポンサーになることにより、このプロジェクトをサポートします。あなたのロゴはあなたのウェブサイトへのリンクでここに表示されます