安全なソースコード

1. 概要

安全なソースコードの手法は、ソースコードのセキュリティを強化するために使用できる一連のプラクティスです。これらの手法は、ソースコードの脆弱性を特定して修正し、ソースコードへの不正アクセスを防ぎ、ソースコードが変更されないように保護するのに役立ちます。

一般的な安全なソースコードの手法には、次のようなものがあります。

  • Linting: Linting は、ソースコードのエラーやスタイル上の問題を確認するプロセスです。これは、lint ツールを使用して行われます。lint ツールは、ソースコードを分析して潜在的な問題を特定するプログラムです。Lint ツールを使用すると、構文エラー、セマンティック エラー、スタイルエラー、セキュリティの脆弱性など、さまざまなエラーをチェックできます。
  • 静的アプリケーション セキュリティ テスト(SAST): SAST は、ソースコード、バイナリコード、バイトコードを分析してセキュリティの脆弱性を特定するセキュリティ テストの一種です。SAST ツールを使用すると、Go、Java、Python、C++、C# など、さまざまなプログラミング言語の脆弱性を見つけることができます。
  • ライセンス スキャン: ライセンス スキャンは、ソフトウェア アプリケーションで使用されているサードパーティ ソフトウェア コンポーネントのライセンスを特定するプロセスです。これは、アプリがライセンスの利用規約に準拠し、法的トラブルを回避できるようにするため、重要です。

これらの手法は、ソフトウェア開発ライフサイクルのすべての段階でソースコードのセキュリティを強化するために使用できます。リンティングは、開発プロセスの早い段階でエラーを特定するために使用できます。SAST は、コードがコンパイルまたはデプロイされる前に脆弱性を見つけるために使用できます。ライセンス スキャンは、アプリケーションがライセンスの条件に準拠していることを確認するために使用できます。

これらの手法を使用すると、ソースコードのセキュリティを強化し、セキュリティ侵害のリスクを軽減できます。

学習内容

このラボでは、ソフトウェアのソースコードを保護するためのツールと手法について説明します。

  • lint チェック
  • 静的アプリケーション セキュリティ テスト
  • ライセンス スキャン

このラボで使用するツールとコマンドはすべて、Cloud Shell で実行します。

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。この場所はいつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクト全体を削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell エディタを起動する

このラボは、Google Cloud Shell エディタでの使用を想定して設計、テストされています。エディタにアクセスするには、次の操作を行います。

  1. https://console.cloud.google.com で Google プロジェクトにアクセスします。
  2. 右上の Cloud Shell エディタ アイコンをクリックします。

8560cc8d45e8c112.png

  1. ウィンドウの下部に新しいペインが開きます。
  2. [エディタを開く] ボタンをクリックします。

9e504cb98a6a8005.png

  1. エディタが開き、右側にエクスプローラ、中央の領域にエディタが表示されます。
  2. 画面の下部にターミナル ペインも表示されます。
  3. ターミナルが開いていない場合は、Ctrl+`` キーの組み合わせを使用して新しいターミナル ウィンドウを開きます。

環境設定

このラボで使用するコマンドを簡素化するため、GOPATH を 1 つのディレクトリに設定します。

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 は、ライブラリやコア 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/静的セキュリティ テスト - 一般的な弱点と露出(CWEs)を探す静的コード分析を提供します。

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 日