Go開発者向けのセキュリティベストプラクティス

Goセキュリティに戻る

このページでは、Go開発者向けに、プロジェクトのセキュリティを優先するためのベストプラクティスを提供します。ファジングによるテストの自動化から、競合状態の簡単なチェックまで、これらのヒントはコードベースのセキュリティと信頼性を向上させるのに役立ちます。

ソースコードとバイナリを脆弱性についてスキャンする

コードとバイナリを定期的に脆弱性についてスキャンすることで、潜在的なセキュリティリスクを早期に特定できます。govulncheckGo脆弱性データベースによってバックアップされています)を使用して、コードの脆弱性をスキャンし、実際に影響を受ける脆弱性を分析できます。govulncheckチュートリアルから始めましょう。

GovulncheckはCI/CDフローにも統合できます。Goチームは、GitHub MarketplaceでgovulncheckのGitHub Actionを提供しています。Govulncheckは-jsonフラグもサポートしており、開発者は他のCI/CDシステムと脆弱性スキャンを統合しやすくなります。

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自体のセキュリティ修正がいつ予定されているかを知りたい場合は、購読してください。