1. 概要
安全なソースコードの手法は、ソースコードのセキュリティを強化するために使用できる一連のプラクティスです。これらの手法は、ソースコードの脆弱性を特定して修正し、ソースコードへの不正アクセスを防ぎ、ソースコードの改変を防止するのに役立ちます。
一般的な安全なソースコードの手法には、次のようなものがあります。
- Linting(リンティング): リンティングは、ソースコードのエラーとスタイル上の問題をチェックするプロセスです。これは、ソースコードを分析して潜在的な問題を特定するプログラムである lint ツールを使用して行われます。Lint ツールを使用すると、構文エラー、セマンティック エラー、スタイル エラー、セキュリティの脆弱性など、さまざまなエラーをチェックできます。
- 静的アプリケーション セキュリティ テスト(SAST): SAST は、ソースコード、バイナリコード、バイトコードを分析してセキュリティの脆弱性を特定するセキュリティ テストの一種です。SAST ツールは、Go、Java、Python、C++、C# など、さまざまなプログラミング言語の脆弱性を検出するために使用できます。
- ライセンス スキャン: ライセンス スキャンは、ソフトウェア アプリケーションで使用されているサードパーティ ソフトウェア コンポーネントのライセンスを特定するプロセスです。これは、アプリケーションがライセンスの条件を遵守していることを確認し、法的問題を回避するうえで重要です。
これらの手法は、ソフトウェア開発ライフサイクルのすべての段階でソースコードのセキュリティを強化するために使用できます。Linting を使用すると、開発プロセスの早い段階でエラーを特定できます。SAST を使用すると、コードがコンパイルまたはデプロイされる前に脆弱性を検出できます。ライセンス スキャンを使用すると、アプリケーションがライセンスの条件に準拠していることを確認できます。
これらの手法を使用すると、ソースコードのセキュリティを強化し、セキュリティ侵害のリスクを軽減できます。
学習内容
このラボでは、ソフトウェアのソースコードを保護するためのツールと手法に焦点を当てます。
- lint チェック
- 静的アプリケーション セキュリティ テスト
- ライセンス スキャン
このラボで使用するツールとコマンドはすべて、Cloud Shell で実行します。
2. 設定と要件
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。



- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。この設定はいつでも変更できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は
PROJECT_IDと識別されます)を参照する必要があります。生成された 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 チェック
Linting は、構文に関連する一般的なスタイルベースのミスや欠陥をチェックするために使用されます。Linting は、複数のチームに共通の構文パターンを提供することで、コードレビューの迅速化、知識の共有、コードの明確化につながり、セキュリティを支援します。
また、Linting は、ライブラリやコア API の不適切な使用や非効率的な使用など、一般的な脆弱性につながる可能性のある一般的な構文ミスを特定します。
staticcheck リンクツールをインストールする
go get honnef.co/go/tools/cmd/staticcheck@latest
プロジェクトのルート ディレクトリで Go リンター(staticcheck)を実行する
staticcheck
出力を確認する
main.go:42:29: unnecessary use of fmt.Sprintf (S1039)
http.ListenAndServe() は String を受け取りますが、現在のコードでは変数に文字列を渡さずに Sprintf を使用しているため、エラーが発生します。
コマンドの終了ステータスを確認します。
echo $?
この場合、コマンドがエラーになったため、終了ステータスは 1 以上になります。これは、CI/CD パイプラインでツールの成功/失敗を判断するために使用できる方法の 1 つです。
main.go ファイルを編集して、コードを修正します。
main()メソッド内のLINTING - Step 1の下の行を、先頭にスラッシュ(//)を追加してコメントアウトします。main()メソッド内のLINTING - Step 2のすぐ下の 2 行の先頭のスラッシュを削除して、コメント化解除します。
プロジェクトのルート ディレクトリで staticcheck を再実行する
staticcheck
このコマンドは結果を返しません(空行)。
コマンドの終了ステータスを調べます。
echo $?
この場合、コマンドでエラーが発生しなかったため、終了ステータスは 0 になります。
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. ライセンス スキャン
ライセンスは、公開したくないソースコードの公開を法的に義務付ける可能性があるため、セキュリティ上重要です。このコンセプトは「コピーレフト」ライセンスと呼ばれ、このライセンスの依存関係を使用する場合はソースコードを公開する必要があります。
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 日