1. 概要
ソースコードの安全な手法とは、ソースコードのセキュリティを向上させるために使用できる一連の手法です。これらの手法は、ソースコードの脆弱性を特定して修正し、ソースコードへの不正アクセスを防止し、ソースコードの変更を防止するのに役立ちます。
ソースコードの安全性を確保する一般的な手法には、次のようなものがあります。
- lint チェック: lint チェックとは、ソースコードにエラーやスタイルの問題がないかどうかを確認するプロセスです。実行には lint ツールを使用します。lint ツールは、ソースコードを分析して潜在的な問題を特定するプログラムです。lint ツールを使用すると、構文エラー、セマンティック エラー、スタイルエラー、セキュリティの脆弱性など、さまざまなエラーをチェックできます。
- 静的アプリケーション セキュリティ テスト(SAST): ソースコード、バイナリコード、バイトコードを分析してセキュリティの脆弱性を特定するセキュリティ テストの一種です。SAST ツールを使用すると、Go、Java、Python、C++、C# など、さまざまなプログラミング言語で脆弱性を検出できます。
- ライセンス スキャン: ライセンス スキャンは、ソフトウェア アプリケーションで使用されているサードパーティ ソフトウェア コンポーネントのライセンスを特定するプロセスです。これは、アプリケーションがライセンス条件に準拠していることを確認し、法的な問題を回避するために役立ちます。
これらの手法を使用すると、ソフトウェア開発ライフサイクルのすべての段階でソースコードのセキュリティを向上させることができます。lint を使用して開発プロセスの早い段階でエラーを特定したり、SAST を使用してコードをコンパイルまたはデプロイする前に脆弱性を検出したり、ライセンス スキャンを使用してアプリケーションがライセンスの条件を遵守していることを確認したりできます。
これらの手法を使用することで、ソースコードのセキュリティを高め、セキュリティ侵害のリスクを軽減できます。
学習内容
このラボでは、ソフトウェア ソースコードを保護するためのツールと手法に焦点を当てます。
- lint チェック
- 静的アプリケーション セキュリティ テスト
- ライセンスのスキャン
このラボで使用するツールとコマンドはすべて、Cloud Shell で実行します。
2. 設定と要件
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。
- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。この値はいつでも更新できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常、それが何であるかは関係ありません。ほとんどの Codelab では、プロジェクト ID を参照する必要があります(通常は
PROJECT_ID
として識別されます)。生成された ID が気に入らない場合は、別のランダムな ID を生成できます。または、ご自身でお試しになることもできます。このステップを終えた後は変更できず、プロジェクト期間中は維持されます。 - なお、3 つ目の値は、一部の API で使用される [プロジェクト番号] です。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に課金が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクト全体を削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell エディタを起動する
このラボは、Google Cloud Shell エディタで使用するように設計、テストされています。エディタにアクセスするには、
- https://console.cloud.google.com で Google プロジェクトにアクセスします。
- 右上にある Cloud Shell エディタのアイコンをクリックします。
- ウィンドウの下部に新しいペインが開きます
- [エディタを開く] ボタンをクリックします。
- エディタが開き、右側にエクスプローラ、中央部分にエディタが表示されます
- 画面の下部にターミナル ペインも表示されます。
- ターミナルが開いていない場合は、`Ctrl+` キーの組み合わせを使用して新しいターミナル ウィンドウを開きます。
環境設定
このラボで使用するコマンドを簡素化するために、GOPATH を単一のディレクトリに設定します。
export GOPATH=$HOME/gopath
作業内容を保存するディレクトリを作成する
mkdir -p workspace
cd workspace
ソースコード リポジトリのクローンを作成する
git clone https://gitlab.com/gcp-solutions-public/shift-left-security-workshop/source-code-lab.git
cd source-code-lab
export WORKDIR=$(pwd)
3. lint チェック
lint チェックは、構文に関連する一般的なスタイルベースの誤りや不具合をチェックするために使用されます。lint は、複数のチームに共通する構文パターンを提供することでセキュリティを支援します。これにより、コードレビューの迅速化、知識の共有、コードの明確化が可能になります。
また、Linting は、ライブラリやコア API の不適切な使用や非効率的な使用など、一般的な脆弱性につながるおそれのある一般的な構文ミスも特定します。
staticcheck
リンクツールをインストールする
go get honnef.co/go/tools/cmd/staticcheck@latest
プロジェクトのルート ディレクトリで Go Linter(staticcheck)を実行する
staticcheck
出力を確認する
main.go:42:29: unnecessary use of fmt.Sprintf (S1039)
http.ListenAndServe()
は文字列を受け入れますが、現在のコードでは文字列に変数を渡さずに Sprintf
を使用しているため、エラーが発生します。
コマンドの終了ステータスを確認します。
echo $?
この場合、コマンドがエラーになったため、終了ステータスは 1 以上になります。これは、ツールの成否を判断するために CI / CD パイプラインで使用できる方法の一つです。
main.go
ファイルを編集して、コードを修正します。
main()
メソッド内のLINTING - Step 1
の下の行の先頭にスラッシュ(//
)を追加してコメントアウトします。main()
メソッド内のLINTING - Step 2
のすぐ下にある 2 つの行をコメント化解除して、先頭のスラッシュを削除します。
プロジェクトのルート ディレクトリで staticcheck
を再実行する
staticcheck
このコマンドは結果を返しません(空白行)。
コマンドの終了ステータスを調べます。
echo $?
この場合、コマンドの結果がエラーにならなかったため、終了ステータスはゼロになります。
4. 静的アプリケーション セキュリティ テスト
AST/静的セキュリティ テスト - 一般的な脆弱性やリスクを特定する静的コード分析(CWE)を提供
AST ツールをインストールする(gosec
)
export GOSEC_VERSION="2.15.0"
curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | \
sh -s -- -b $(go env GOPATH)/bin v${GOSEC_VERSION}
ソースコードに対してポリシー ファイルを使用して gosec
を実行する
gosec -conf policies/gosec-policy.json -fmt=json ./...
出力は次のようになります。
{ "Golang errors": {}, "Issues": [ { "severity": "HIGH", "confidence": "LOW", "cwe": { "ID": "798", "URL": "https://cwe.mitre.org/data/definitions/798.html" }, "rule_id": "G101", "details": "Potential hardcoded credentials", "file": "/home/random-user-here/shift-left-security-workshop/labs/source-code-lab/main.go", "code": "31: \t// STEP 2: Change this and the reference below to something different (ie, not \"pawsword\" or \"password\")\n32: \tvar pawsword = \"im-a-cute-puppy\"\n33: \tfmt.Println(\"Something a puppy would use: \", username, pawsword)\n", "line": "32", "column": "6" } ], "Stats": { "files": 1, "lines": 89, "nosec": 0, "found": 1 } }
ツールで潜在的な問題(Potential hardcoded credentials
)が検出されました
5. ライセンスのスキャン
ライセンスは、公開したくないソースコードを公開することを法的に要求される場合があるため、セキュリティにとって重要です。このコンセプトは「copyleft"これらのライセンスで依存関係を使用する場合にソースコードを公開する必要があります。
golicense
をインストールします。
mkdir -p /tmp/golicense
wget -O /tmp/golicense/golicense.tar.gz https://github.com/mitchellh/golicense/releases/download/v0.2.0/golicense_0.2.0_linux_x86_64.tar.gz
pushd /tmp/golicense
tar -xzf golicense.tar.gz
chmod +x golicense
mv golicense $(go env GOPATH)/bin/golicense
popd
バイナリ ファイルをビルドする
go build
「BSD-3-Clause」を許可しない現在のポリシー ファイルでライセンス チェックを実行します。ライセンス
golicense policies/license-policy.hcl hello-world
注: これは次のような出力で失敗します。
🚫 rsc.io/sampler BSD 3-Clause "New" or "Revised" License 🚫 rsc.io/quote BSD 3-Clause "New" or "Revised" License 🚫 golang.org/x/text BSD 3-Clause "New" or "Revised" License
ポリシー ファイル policies/license-policy.hcl
を変更して「BSD-3-Clause」をdeny
リストから allow
リストに変更します。
ライセンス チェックを再実行する
golicense policies/license-policy.hcl hello-world
注: 成功すると次のような出力が表示されます。
✅ rsc.io/quote BSD 3-Clause "New" or "Revised" License ✅ rsc.io/sampler BSD 3-Clause "New" or "Revised" License ✅ golang.org/x/text BSD 3-Clause "New" or "Revised" License
6. 完了
お疲れさまでした。これでこの Codelab は終了です。
学習した内容
- ソースコードを保護するためのツールと手法
—
最終更新日: 2023 年 3 月 23 日