Skip to main content

SnykでGitHubプロジェクトに露出したハードコードされたシークレットを見つけて修正する

feature insights context

2024年6月25日

0 分で読めます

Snykは、ハードコードされたシークレットを含む、プロジェクトの脆弱性を検出する優れたツールです。このブログでは、Snykを使ってハードコードされたシークレットや認証情報を見つけ、コードをリファクタリングして、代わりにDopplerでシークレットを管理する方法をご紹介します。オープンソースのSnyk goofプロジェクトをNode.jsのボイラープレートアプリケーションの例として使用します。ぜひ一緒に試してみてください。

Snyk goofプロジェクトを始める

まず、Snyk goofプロジェクトをGitHubアカウントにフォークします。このサンプルプロジェクトには脆弱性が多数含まれており、Snykで検出できます。

次に、Snykのログインページにアクセスし、GitHubアカウント(または任意のプロバイダーのアカウント)でサインインして、無料のSnykアカウントを作成します。

「無料で始める」「クレジットカード不要」と表示されたサインアップ画面。GitHubボタンと、Bitbucket、Google、Azure AD、Docker IDの選択肢がある

アカウントに登録されているメールアドレスへのアクセスをSnykに許可する必要があります。Snykはこのメールアドレスを使って、セキュリティ通知やレポートなど、インポートしたプロジェクトに関する重要な情報をお送りします。

Snykを初めて利用する場合は、Snykがプロジェクトを定期的にスキャンし、リポジトリに修正用プルリクエストを自動生成できるよう、アクセス設定も行う必要があります。そのため、GitHubアカウントから追加の権限を付与してください。

プロジェクトのコードソースとしてGitHub(またはコードを保存している場所)を選択します。次に、以下のスクリーンショットに示すデフォルト設定を承認すると、推奨されるSnykの機能をすべて利用できます。必要に応じてこれらの権限を無効にできますが、その場合、セキュリティ修正や依存関係のアップグレードを自動化する、Snykの高度で便利な修正用プルリクエスト機能を利用できなくなります。

Pull Request Checks、新しいFix Pull Requests、Dependency Upgrade Pull Requests、Snyk Codeが有効になっている機能一覧。

次に、GitHubリポジトリの一覧からSnyk goofプロジェクトを選択し、Snykアカウントにプロジェクトとして追加します。

チェックされたリポジトリ「chandler767/nodejs-goof」と、すべてのリポジトリを表示するリンクが示されたリポジトリ選択画面。

依存関係グラフを作成するために、Snykはgoof Node.jsプロジェクトのマニフェストファイル`package.json`を解析します。このグラフには、goofプロジェクトが直接使用する依存関係と、それらの直接依存関係が依存する推移的依存関係の両方が含まれます。こうして完全な依存関係グラフが作成されます。次にSnykは、これらの依存関係を脆弱性データベースと照合し、詳細なレポートを生成します。

chandler767/nodejs-goofプロジェクトのセキュリティ分析ダッシュボード。Dockerfile、package.json、コード分析で検出された問題の件数を一覧表示。

goofプロジェクトには、かなり多くの問題があります。Snykを使えば、直接依存関係を脆弱性のないバージョンにアップグレードしたり、脆弱性にパッチを適用したりして、多くの問題を修正できます。コード解析の内容を詳しく見て、修正が必要なハードコードされたシークレットを確認しましょう。

GitHubにプッシュしたシークレットを修正する

Code Analysisビューを開き、ハードコードされた認証情報の使用とハードコードされたシークレット。で絞り込みます。

「ハードコードされた認証情報の使用」と「ハードコードされたシークレット」のカテゴリにチェックが入り、脆弱性数が表示された脆弱性タイプの一覧。

いくつかのシークレットを修正する必要があります。まず、これらのシークレットをDopplerに追加しましょう。これにより、シークレットが誤って露出するのを防ぎ、一元管理できるようになります。また、開発環境と本番環境で異なるシークレットを設定できます。これで、シークレットをGitHubにプッシュしてしまう心配もなくなります。

GitでGoofプロジェクトをクローンし、必要なコード変更を行います。次に、GoofプロジェクトのREADMEの手順に沿って、プロジェクトをローカルで実行します。

まず、`app.js`ファイルにハードコードされたトークンを修正します。

セキュリティコードスキャンで、CWE-547「ハードコードされたシークレット」ルールに基づき、app.js 内のハードコードされたシークレットトークンが検出されています。

お使いのコードエディターで`app.js`を開き、トークン変数を見つけます。トークンをコピーしたら、Dopplerに移動して無料アカウントを作成します。

GoogleとGitHubのサインインボタン、勤務先メールアドレス欄、パスワード再設定リンク、紫色のログインボタンを備えたダークテーマのログイン画面

Dopplerアカウントで、`Goof`という名前の新しいプロジェクトを作成します。

「プロジェクト」ページに「プロジェクトを追加」ボタンと、サンプルのシークレットを含むプロジェクト例が表示されている

デフォルトで環境が作成されているのを確認できます。すべてのシークレットをDevelopment > Dev設定に追加します。これで、分岐した設定にあるシークレットを更新できます。Development > Dev設定をクリックし、次にAdd First Secretをクリックします。

「最初のシークレットを追加」と表示された紫色のドロップダウンボタン

シークレットの名前を`SECRET_TOKEN`にし、ハードコードされていた値を入力して保存します。

未保存の変更が1件あるSecretsダッシュボード。SECRET_TOKENの値が表示され、赤い矢印がSaveボタンを指している

Dopplerにシークレットを追加したので、コードから利用できます。ハードコードされたトークンの値を環境変数に置き換えます。Doppler CLIを使って、アプリケーションにシークレットを注入します。コードは次のようになります。

var token = process.env.SECRET_TOKEN;

Doppler CLIを使うと、ローカル開発、CI/CD、ステージング、本番環境など、あらゆる環境でシークレットにアクセスできます。軽量なバイナリとして提供されており、主要なOS、パッケージマネージャー、Dockerで利用できます。

Doppler CLIのインストールページにある手順に沿って、お使いのシステムでDoppler CLIを設定します。Dopplerでは、プロジェクトのシークレットへのアクセスは、ファイルシステム内の特定のディレクトリに紐付けられます。これにより、1台のマシンで複数のプロジェクトのシークレットを取得できます。

ターミナルでGoofプロジェクトのディレクトリに移動し、Dopplerを設定します。

# Login to your Doppler account (if you haven't already)
doppler login

# Change to your project's directory
cd ./your/project/directory/nodejs-goof

# Select project and config
doppler setup

goofプロジェクトを選択します。

プロジェクト「a-goof-project」が選択されたDopplerのセットアップを示すターミナルプロンプト。

dev設定を選択します。

設定を選択するターミナルプロンプト。「dev_personal」と、dev、stg、prdの各オプションが表示されています。

アプリケーションの起動時に`‘doppler run’`コマンドを付けると、シークレットを利用できます。このコマンドによって、アプリケーションの環境にシークレットが注入されます。

doppler run npm start

すべてのシークレットを追加し、アプリケーションやチームのニーズに合わせて設定を行ってください。シークレットの編集時にアプリケーションを自動再起動する機能にも関心があるかもしれません。

SnykとDopplerでシークレットを保護する

SnykとDopplerは、組み合わせて使うことでさらに効果を発揮する開発者向けツールの好例です。今すぐSnykとDopplerを連携して、強力なツールが開発プロセスを効率化する様子をぜひご体験ください。SnykとDopplerの連携を試して、より安全で効率的なワークフローへの第一歩を踏み出しましょう。

続きを読む

feature insights context
Blog

自律型攻撃はすでに始まっている。防御もそのスピードに追いつかなければならない。

自律型攻撃者によって、防御に使える時間は短くなっています。継続的な検出、修復、検証、予防で、セキュリティチームが攻撃に歩調を合わせる方法をご紹介します。

illustration hero ai
Blog

AIハリケーンが到来

AIはソフトウェア開発とサイバー攻撃の双方を加速させています。リーダーは、エージェントとコードを開発の初期段階から保護し、実行時に制御を徹底するとともに、防御策を独立して検証しなければなりません。

feature insights context
Blog

予防は、本質的に解決済みの問題なのでしょうか?

エージェントが生成するコードの予防策はアーキテクチャ上解決されていますが、開発を遅らせることなくセキュリティを守る制御を選ぶことが、依然として課題です。