こんにちは!システム開発の現場で、日々コードを書いたりインフラを整えたりしている新人の皆さん、セキュリティ対策に奮闘していませんか?
「コードを書いて動かすだけで精一杯なのに、セキュリティのことも考えなきゃいけないなんて……」と、ため息をつきたくなる気持ち、よく分かります。でも、安心してください。セキュリティは最初から完璧にできる人なんていません。一つずつ、身近な例えから紐解いていけば必ず理解できるようになりますよ。
今回は、開発現場でついやってしまいがちな「APIキーのハードコーディングとリポジトリからの漏洩」について、お話ししていきます。攻撃者がどのようにしてあなたのコードを狙っているのか、そしてどうやってそれを防げばいいのか、一緒に一歩ずつ学んでいきましょう!
—
1. 家の鍵を「玄関のマットの下」に置いていませんか?
まずは、今回テーマにする「APIキーのハードコーディング」が、現実の世界でどういうことなのかを考えてみましょう。
皆さんは、自宅の合鍵をどこに保管していますか?まさか、玄関のドアマットの下や、郵便受けの隙間に「ご自由にどうぞ」と言わんばかりに入れていたりしませんよね。もしそんなことをしたら、空き巣に入ってくださいと言っているようなものです。
プログラミングの世界における「APIキー」は、まさにクラウドサービスや外部システムへアクセスするための「デジタルな合鍵」です。例えば、AIサービスや決済システム、地図サービスなどを使うとき、「うちはこういう正規のユーザーですよ」と証明するためにAPIキーが必要になります。
この大切なAPIキーを、プログラムのソースコードの中に直接書き込んでしまうこと、これを「ハードコーディング」と呼びます。
例えば、JavaScriptやPHPのコードに、こんな風に書いてしまったことはありませんか?
// 【危険な例】APIキーをコードの中に直接書いてしまっています
const apiKey = "sk_live_9999999999abcdefg_secret_key_desu";
function callAiService(userPrompt) {
// このキーを使ってAIにリクエストを送る処理...
}
コードの中に直接キーを書くということは、いわば「プログラムという家の中に、合鍵のパスワードをデカデカと貼り紙にして貼っている状態」なんです。これでは、中に入られた瞬間に鍵が盗まれてしまいますよね。
—
2. 攻撃者はどうやって鍵を探し出すのか?(自動スクレイピングの脅威)
「でも、社内の限られた人しか見えない場所だから大丈夫でしょ?」
そう思ったそこのあなた、甘いですよ!現代のサイバー犯罪者たちは、人間の目ですべてのコードを目視して探しているわけではありません。彼らはもっと効率的な「自動お掃除ロボット」のようなプログラムを使っています。
攻撃者たちは、GitHubなどの公開ソースコード共有プラットフォームを、24時間365日クローラー(自動巡回プログラム)で監視しています。そして、以下のようなキーワードをものすごいスピードで検索し続けています。
api_key =password =secret_tokensk_live_(特定のAIサービス等のキーによく使われる接頭辞)
もし、あなたがテストのつもりで、あるいはうっかりミスで、本物のAPIキーが含まれたコードをGitHubの公開リポジトリ(Publicな場所)にプッシュしてしまったらどうなるでしょうか?
わずか数分〜数時間以内に、世界中のどこかにいる攻撃者の自動プログラムがそれを検知します。あなたのリポジトリからAPIキーが抜き取られ、勝手に高額なクラウドサービスを利用されたり、不正アクセスの踏み台にされたりしてしまうのです。朝起きたら、クラウド事業者から「今月の利用料金が100万円を超えました」という青ざめるような請求書が届く……なんてインシデントが、現実の現場で毎日のように起きています。
—
3. では、どうやって防ぐ?(シークレット管理の基本と環境変数)
「じゃあ、コードに書いちゃいけないなら、キーはどこに書けばいいの?」
安心してください。ちゃんとした安全な置き場所が用意されています。それが「環境変数(Environment Variables)」という仕組みです。
実例を見てみましょう。PHPやNode.jsなどのモダンな開発では、設定値をコード本体から切り離して、サーバー側や専用の設定ファイル(.envファイルなど)で管理するのが鉄則です。
対策されたコードの書き方(Node.jsの例)
まず、実際のAPIキーはコードの中ではなく、プロジェクトのルートディレクトリにある.envというファイルに隠します。
# .envファイル(このファイルは絶対にGitHubにアップロードしてはいけません!)
AI_API_KEY=sk_live_9999999999abcdefg_secret_key_desu
そして、実際のプログラム側では、以下のように環境変数から値を呼び出すように書きます。
// dotenvライブラリなどを使って環境変数を読み込む
require('dotenv').config();
// コードの中には「環境変数から読み込む」という命令だけを書く
const apiKey = process.env.AI_API_KEY;
function callAiService(userPrompt) {
// 安全にAPIを利用する処理
console.log("安全にAPIキーを読み込めました!");
}
これなら、もしコードをGitHubにアップロードしたとしても、肝心の.envファイルはアップロード対象外(.gitignoreで除外)に設定しておけば、大切な合鍵が外の世界に漏れることはありません。
忘れずに設定しよう! .gitignore の書き方
Gitを使うときは、必ずプロジェクトのルートに.gitignoreというファイルを作り、秘密情報が入ったファイルをうっかり共有しないように除外設定を書き込んでおきましょう。
# .gitignore の設定例
# この中に書かれたファイルは、Gitの管理対象外(GitHubに飛ばないファイル)になります
node_modules/
.env
*.log
secrets.json
—
4. 万が一、漏れてしまったときの「泥臭い」初動対応
どれだけ気をつけていても、人間誰しもうっかりミスはあります。「あ、やばい、テスト用のつもりで本物のキーをGitHubにpushしちゃったかも……!」と気づいたとき、インシデントハンドリングの現場ではどう動くべきでしょうか。
パニックになって頭が真っ白になってしまうかもしれませんが、手順はシンプルです。順番に落ち着いて対処していきましょう。
1. 一にも二にも、まずは「キーの無効化(ローテーション)」
焦ってGitHubのコミット履歴を消そうとする前に、まずはAPIキーを発行した大元のサービス(AWSや各APIのダッシュボード)にログインし、その漏洩したキーを即座に削除・無効化(リフレッシュ)してください。鍵を盗まれたなら、一刻も早く新しい鍵に作り変えるのが最優先です。
2. ログの確認
そのキーがすでに不正利用されていないか、提供元のダッシュボードでアクセスログや料金の発生状況を確認します。
3. Git履歴の完全削除(またはリポジトリの作り直し)
コードの履歴に残ってしまっている場合、単にファイルを消しただけでは過去の履歴(コミットログ)から復元されてしまいます。git-filter-repoなどのツールを使って履歴から完全に消去するか、思い切ってリポジトリを作り直すのが確実です。
—
5. まとめ:今日からできる一歩
今回は、APIキーのハードコーディングとリポジトリスキャンによる漏洩の仕組み、そしてその対策について解説しました。
- APIキーはプログラムという家の中の「合鍵」である。
- コードに直接書く(ハードコーディング)と、自動プログラムに秒で見つけられてしまう。
- キーは
.envなどの環境変数に逃がし、コード本体から切り離す。 .gitignoreでうっかり共有を防ぐ。
セキュリティ対策は、最初は少し面倒に感じるかもしれません。「めんどくさいな」と思ったそのひと手間が、未来のあなたや会社を大きなトラブルから救ってくれます。
「一歩ずつ、確実に安全なコードを書けるようになっていけば大丈夫!」
焦らず、今日から環境変数の使い方を意識したコーディングを心がけてみてくださいね。応援しています!
コメント