【ゼロから始めるFlutter×GitHub入門】第4回:事故を防ぐ!APIキーや秘密鍵の管理術

この記事は、プラハからの帰国便に乗る直前に書いています。旅の締めくくりが、連載でいちばん気を引き締めたいテーマというのも、なんだか縁を感じます。

今回のテーマは「機密情報の流出」です。開発の中でいちばん事故を起こしやすく、かつ起きてしまうと影響が大きいポイントなので、じっくり扱います。

目次

なぜAPIキーや設定ファイルをそのままプッシュしてはいけないのか

Flutterアプリを作っていると、FirebaseやGoogle Maps、決済サービスなど、外部サービスと連携するための「鍵」を扱う場面が出てきます。代表的なのが、

  • google-services.json / GoogleService-Info.plist(Firebaseの設定ファイル)
  • APIキーそのものを書いたコード
  • サーバーへのログイン情報

これらをうっかりそのままGitHubにプッシュしてしまうと、リポジトリが公開設定であれば誰でも見られる状態になりますし、非公開設定であっても「一度インターネット上の記録に残った」という事実は簡単には消せません。悪意のある第三者にキーを使われ、想定外の課金や不正利用につながるリスクもあります。

「非公開リポジトリだから大丈夫」と思ってしまいがちですが、公開・非公開に関わらず、機密情報は最初からGitの管理対象に入れない、という前提で進めるのが安全です。

.env ファイルや環境変数の使い方

具体的な対策として、機密情報はコードの中に直接書かず、.env のような別ファイルにまとめ、それを読み込む形にします。

# .env
API_KEY=xxxxxxxxxxxxxxxx

そしてこの .env を、第2回で扱った .gitignore に必ず追加します。

.env
google-services.json
GoogleService-Info.plist

こうしておけば、コード自体はGitHubに置きつつ、鍵の中身だけは自分のパソコンにしか存在しない状態を保てます。チームで開発する場合は、.env.example のように「キーの名前だけ書いて値は空」のファイルを別途用意し、そちらはGitHub管理に含める、というやり方もよく使われます。

もし間違えてプッシュしてしまったときの緊急対処法

ここが今回いちばんお伝えしたいところです。もし機密情報を含んだファイルを誤ってプッシュしてしまったら、次の2つを両方行う必要があります。

1. まずキーそのものを無効化する

Firebaseやサービス側の管理画面から、流出してしまったAPIキーを削除・再発行します。これが最優先です。Gitの履歴を消す作業よりも先に、キーを無効化してください。履歴を消しても、その間に誰かがキーを取得・利用してしまっている可能性はゼロにできないためです。

2. Gitの履歴からも該当ファイルを取り除く

直近のコミットだけであれば、コミットをやり直すことである程度対応できますが、すでに複数回プッシュしてしまっている場合は、履歴そのものから消す必要があります。この作業は少し専門的になるため、git filter-repo のようなツールを使う方法があるということだけ、ここでは触れておきます(詳しい手順は改めて別記事で扱えたらと思います)。

大事なのは、「履歴から消せば安心」ではなく「キーを無効化することが最優先」という順番です。

やらかしレスキュー策:コミットメッセージを打ち間違えた

機密情報とは別の、地味だけどよくある事故です。直前のコミットメッセージだけを打ち間違えた場合、まだプッシュしていなければ次のコマンドで修正できます。

git commit --amend -m "正しいメッセージ"

すでにプッシュしてしまっている場合は、

git push --force-with-lease

で修正後の状態に上書きできます。ただし、--force 系のコマンドは他の人の作業を巻き込んで壊してしまう可能性があるため、一人開発以外の場面では慎重に扱う必要があります。

次回予告

次回は、コード管理だけでなく「TODO管理・タスク整理」の道具としてGitHubを使う回です。GitHub IssuesとProjectsを使って、バグ報告や次に追加したい機能を整理する方法を扱います。

今回で旅先からの更新は最後になります。帰国後、また地に足つけて続きを書いていきます。ここまでお付き合いいただき、ありがとうございました。

目次