Go開発者のためのセキュリティに関するベストプラクティス
このページでは、Go開発者がプロジェクトのセキュリティを優先するためのベストプラクティスを提供します。ファジングによるテストの自動化から、競合状態の簡単なチェックまで、これらのヒントはコードベースをより安全で信頼性の高いものにするのに役立ちます。
脆弱性のためにソースコードとバイナリをスキャンする
コードとバイナリを定期的に脆弱性のためにスキャンすることは、潜在的なセキュリティリスクを早期に特定するのに役立ちます。Go脆弱性データベースに裏打ちされたgovulncheckを使用して、コードを脆弱性のためにスキャンし、実際に影響を与えるものを分析できます。govulncheckチュートリアルから始めましょう。
GovulncheckはCI/CDフローに統合することもできます。GoチームはGitHub Marketplaceでgovulncheck用のGitHub Actionを提供しています。Govulncheckは、開発者が脆弱性スキャンを他のCI/CDシステムと統合するのに役立つ-jsonフラグもサポートしています。
Visual Studio Code用のGo拡張機能を使用して、コードエディタで直接脆弱性をスキャンすることもできます。このチュートリアルから始めましょう。
Goのバージョンと依存関係を最新の状態に保つ
Goのバージョンを最新の状態に保つことで、最新の言語機能、パフォーマンスの改善、既知のセキュリティ脆弱性に対するパッチにアクセスできます。更新されたGoバージョンは、新しいバージョンの依存関係との互換性も保証し、潜在的な統合の問題を回避するのに役立ちます。Goリリース履歴を確認して、リリース間でGoにどのような変更が加えられたかを確認してください。Goチームは、セキュリティバグに対処するためにリリースサイクル全体でポイントリリースを発行します。最新のセキュリティ修正があることを確認するために、最新のマイナーGoバージョンに更新してください。
サードパーティの依存関係を最新の状態に保つことも、Goエコシステムにおけるソフトウェアのセキュリティ、パフォーマンス、および最新の標準への準拠にとって非常に重要です。ただし、徹底的なレビューなしに最新バージョンに更新することは、リスクを伴う可能性があり、新しいバグ、互換性のない変更、さらには悪意のあるコードを導入する可能性があります。したがって、最新のセキュリティパッチと改善のために依存関係を更新することは不可欠ですが、各更新は慎重にレビューおよびテストする必要があります。
ファジングでテストしてエッジケースの悪用を発見する
ファジングは、カバレッジガイダンスを使用してランダムな入力を操作し、コードをウォークスルーして、SQLインジェクション、バッファオーバーフロー、サービス拒否、クロスサイトスクリプティング攻撃などの潜在的な脆弱性を発見および報告する自動テストの一種です。ファジングは、プログラマーが見落としたり、テストするには確率が低すぎると見なしたりするエッジケースに到達することがよくあります。このチュートリアルから始めましょう。
Goのレース検出器で競合状態をチェックする
競合状態は、2つ以上のゴルーチンが同じリソースに同時にアクセスし、それらのアクセスの少なくとも1つが書き込みである場合に発生します。これは、ソフトウェアで予測不能で診断が困難な問題につながる可能性があります。組み込みのレース検出器を使用してGoコードの潜在的な競合状態を特定し、並行プログラムの安全性と信頼性を確保するのに役立ちます。ただし、レース検出器は実行時に発生するレースを検出するため、実行されないコードパスのレースは検出されません。
レース検出器を使用するには、テストを実行するかアプリケーションをビルドするときに-raceフラグを追加します。たとえば、go test -raceとします。これにより、レース検出器が有効になった状態でコードがコンパイルされ、実行時に検出された競合状態が報告されます。レース検出器がプログラムでデータ競合を検出すると、競合するアクセスに関するスタックトレースと、関連するゴルーチンが作成されたスタックを含むレポートを出力します。
Vetを使用して疑わしい構造を調べる
Goのvetコマンドは、ソースコードを分析し、構文エラーではないが実行時に問題を引き起こす可能性のある潜在的な問題を検出するように設計されています。これには、到達不能なコード、未使用の変数、ゴルーチンに関する一般的な間違いなどの疑わしい構造が含まれます。これらの問題を開発プロセスの早い段階で捕捉することで、go vetはコード品質の維持、デバッグ時間の短縮、および全体的なソフトウェアの信頼性の向上に役立ちます。指定されたプロジェクトに対してgo vetを実行するには、以下を実行します。
go vet ./...
セキュリティリリースの通知のためにgolang-announceを購読する
セキュリティ修正を含むGoリリースは、低ボリュームのメーリングリストgolang-announce@googlegroups.comに事前にアナウンスされます。Go自体へのセキュリティ修正がいつ行われるかを知りたい場合は、購読してください。