APIキーを安全に保存するためのベストプラクティス

ホセ・フォンターノによる写真

過去に、多くの人々がGitリポジトリを使用して、プロジェクトに関連する機密情報を保存するのを見てきました。

最近、私は一部の人々がAPIキーをプライベートGitHubリポジトリに保存していることを発表するのを見てきました。 APIキーをコードに保存することのリスクを人々が理解する必要があるため、この記事を書いています。

この記事は、APIキーの保存に関する問題の恒久的な解決策を意図したものではありません。代わりに、それは問題の私自身の分析とそれを修正する方法に関する私の提案です。

それでは、Gitリポジトリのコードの近くに機密情報を保存することの問題は何ですか?

GitリポジトリにAPIキーを保存しない理由

APIキーやその他の機密情報をgitリポジトリに保存することは、どうしても避けたいものです。リポジトリがプライベートであっても、機密情報を保存するための安全な場所とは見なされません。

まず、公開gitリポジトリにAPIキーを保存することが悪い考えである理由を見てみましょう。

性質上、誰でもパブリックgitリポジトリにアクセスできます。

言い換えれば、インターネットに接続できる人はだれでもパブリックgitリポジトリのコンテンツにアクセスできます。それだけでなく、リポジトリ内のすべてのコードを参照し、場合によっては実行することもできます。 APIキーを公開リポジトリに保存すると、誰でも見ることができるように公開されます。

GitHubでclient_secretを最近検索したところ、APIキーとシークレットを公開する可能性のあるコミットが30,000件以上あることが明らかになりました。場合によっては、コードをコピーして貼り付けるだけで、すぐにAPIにアクセスできます。

この問題は非常に重要になっているため、一部の企業はリソースに投資して、APIキーとシークレットの漏洩がないことを確認しています。

昨年、Slackは公開されたAPIトークンの検索を開始し、それらを事前に無効化しました。このアクションにより、Slackのアカウントへの悪意のあるアクセスが防止されますが、漏れたトークンをすべて見つけることはできません。

そのため、これはパブリックGitリポジトリで行われています。プライベートなものはどうですか?なぜそれが問題なのですか?

GitHub、GitLab、Bitbucketなどのサービスでホストされているプラ​​イベートGitリポジトリは、異なるタイプのリスクにさらされています。サードパーティのアプリケーションを上記のサービスの1つと統合すると、それらのサードパーティにプライベートリポジトリを開くことになります。これらのアプリケーションは、プライベートリポジトリにアクセスし、その中に含まれる情報を読み取ることができます。

それだけではリスクは発生しませんが、これらのアプリケーションの1つが攻撃者に対して脆弱になるかどうかを想像してください。これらのサードパーティアプリケーションのいずれかに不正アクセスすることにより、攻撃者はAPIキーやシークレットなどの機密データにアクセスする可能性があります。

それでは、APIキーはどこに保存する必要がありますか?

APIキーとシークレットを安全に保存するための多くの選択肢があります。それらの中には、Gitリポジトリを使用して機密データを暗号化できるものがあります。他のツールはより洗練されており、展開ワークフローの一部として機密情報を解読します。利用可能なソリューションのいくつかを見てみましょう。

git-remote-gcrypt

最初のソリューションでは、Gitリポジトリ全体を暗号化できます。 git-remote-gcryptは、Gitリモートヘルパーに機能を追加して、新しい暗号化されたトランスポートレイヤーが利用できるようにすることでそれを行います。ユーザーは、新しい暗号化されたリモートをセットアップし、そこにコードをプッシュするだけです。

個々のファイルを暗号化できる、よりきめ細かいソリューションを探している場合は、続きを読んでください。

git-secret

git-secretは、ローカルマシンで動作し、リポジトリにプッシュする前に特定のファイルを暗号化するツールです。舞台裏では、git-secretは、GNU Privacy Guard(GPG)を使用して機密情報を含むファイルを暗号化および復号化するシェルスクリプトです。

git-crypt

別の解決策はgit-cryptです。 git-secretの動作方法は非常に似ていますが、興味深い違いがいくつかあります。

git-cryptについて最初に気づくのは、git-secretがそうであるように、それがシェルスクリプトではなくバイナリ実行可能ファイルであることです。バイナリ実行可能ファイルであるということは、それを使用するにはまずコンパイルする必要があるか、マシンのバイナリ配布物を見つける必要があることを意味します。

Macを使用している場合は、HomeBrewがすぐにインストールできるgit-cryptパッケージを提供しているので幸運です。必要なのは、ターミナルでbrew install git-cryptを実行することだけです。

ブラックボックス

BlackBoxは、Stack Overflowによって作成されたツールです。これは、Stack Overflow自体、Server Fault、Super Userなどの人気のQ&Aコミュニティの背後にある会社です。 BlackBoxは、Gitだけでなく、MercurialやSubversionなどの他のバージョン管理システムでも動作する堅牢なツールです。

また、ファイル全体だけでなく、小さな文字列の暗号化もサポートしています。 Puppetでの作業時にそれを行い、PuppetのHiera、構成データのキー値検索ツールを使用します。

個々の文字列を暗号化および復号化する機能を持つことにより、BlackBoxはAPIキーとシークレットを保護するための優れたソリューションになります。

Herokuの構成と構成変数

Herokuを使用している場合、APIキーや秘密などの機密情報をGitリポジトリに保存しないでください。 Herokuは、構成変数を設定できるソリューションを提供します。

アプリケーションは、対応する環境変数にアクセスすることにより、実行時にこれらの構成変数の内容にアクセスできます。値は暗号化されていませんが、このソリューションを使用すると、APIキーを保存するためにGitリポジトリを使用する必要がなくなります。

HerokuのようなオープンソースソリューションであるDokkuは、同じ機能を提供します。

Dockerシークレット

可能なソリューションの範囲の最後に、Dockerの秘密があります。このソリューションは、2017年2月にDockerによって導入されました。それ以来、人気が高まっています。

Dockerシークレットを使用すると、暗号化された変数を定義し、実行時に特定のサービスで使用できるようにすることができます。秘密は、転送中と保管中の両方で暗号化されます。

このアプローチにより、Dockerシークレットは、APIキーとシークレットを安全かつ暗号化された方法で保存および使用するための完璧なソリューションになります。

概要

これで、パブリックおよびプライベートGitリポジトリにAPIキーやシークレットなどの機密情報を保存することの危険性に気付くはずです。

リポジトリが公開される可能性のある方法を理解することは、情報漏洩に関連するリスクを評価および軽減するための鍵です。

また、この記事では、コードリポジトリを安全に使用できるように、APIキーとシークレットを暗号化できるいくつかの異なるソリューションを提案します。

同じ結果を達成するのに役立つソリューションが他にもあると確信しています。