GitHubで認証情報を盗まれないようにするために

GitHubで認証情報を盗まれないようにするために

この記事はDon’t Let Your Credentials Get Stolen on GitHubの抄訳です。

GitHubをはじめとするクラウドベースのVCSはとても人気がありますね。社内はもちろんのこと、世界中のデベロッパとコラボレートするときの快適さは類を見ません。しかし、GitHubのようなパブリックプラットフォームが広く知られるようになったため、悪意のあるハッカーたちが注視しています。

もしデベロッパが秘密鍵をGitHub上に過って公開したら、悪意のあるハッカーがすぐに飛びついてくるでしょう。彼らはGitHub上のリポジトリに公開されているAWSの秘密鍵を発見する仕組みをすでに自動化していて、これらの秘密鍵を使ってEC2インスタンスをスピンアップし、ビットコイン採掘をしてしまいます。

また悪意のあるハッカーは、SendGridのようなESPの認証情報もGitHub上でしらみつぶしに探しています。

自分のアカウントを守る方法

極力悪い奴らにアカウントを乗っ取られないようにするために、SendGridユーザとしてできることがあります(注1)。まずはじめに、必ずAPIキーを使用してください。APIキーは、ユーザ名とパスワードの代わりとして、ご利用のインテグレーションからSendGridアカウントにアクセスする際の認証に使います。そして、メール配信のために生成したAPIキーには、メール配信の権限だけを与えていることを確かめてください。

次に、プログラムにAPIキーを記憶させるときは、APIキーをハードコーディングするのではなく、必ず環境変数を使うようにしてください。通常は、ウェブサーバのドキュメントルートの外に置いたファイルにAPIキーを保存しておき、SendGridインテグレーションをコールする時やブートする時にそのファイルを読み込む方法をとります。

それでは、SendGridのGoライブラリを使って、環境変数に設定されたAPIキーを利用する例を見ていきましょう。

まず、SendGridアカウントにログインして、”SETTINGS -> API Keys”をクリックしてください。

API Keys 1

“Create API Key”をクリックし、続けて”General API Key”をクリックしてください。APIキーに名前をつけ、”Mail Send”にだけ”FULL ACCESS”を付与してください。

API Keys 2

“Save”をクリックすると、APIキーが生成され、画面上に一度だけ表示されます。

Generate API Key

ブラウザの別タブを開き、SendGrid Goライブラリのページを開いてください。そして、お好みの方法でクローンしてください。私の場合はターミナル上でコマンドを打つのが好きです。

git clone

ローカル環境にクローンしたSendGrid Goライブラリのディレクトリに移動(cd sendgrid-go)した後、sendgrid.env.templateファイルを複製してsendgrid.envという名前にしてください(cp sendgrid.env.template sendgrid.env)。sendgrid.envファイルには新規作成したAPIキーを保存しておきます。でも、このファイルは絶対にGitHubにプッシュしたくありませんね。ですから、お好きなエディタを使って.gitignoresendgrid.envを追記してください。この特別なファイル(.gitignore)があれば、APIキーを含むファイルはGitHubにプッシュされません。

gitignore

さて、再びエディタを開いてsendgrid.envファイルにAPIキーを記入しましょう。

ファイルを保存してエディタを閉じたら、ファイルを読み込みましょう(source sendgrid.env)。以下に示したGoプログラムのサンプルコードをコピーして、適当なファイルに貼り付けてください(例: sendgrid-test.go)。

package main

import (
	"fmt"
	"github.com/sendgrid/sendgrid-go"
	"os"
)

func main() {
	sendgridKey := os.Getenv("SENDGRID_API_KEY")
	if sendgridKey == "" {
		fmt.Println("Environment variable SENDGRID_API_KEY is undefined.  Did you forget to source sendgrid.env?")
		os.Exit(1);
	}
	sg := sendgrid.NewSendGridClientWithApiKey(sendgridKey)
	message := sendgrid.NewMail()
	message.AddTo("community@sendgrid.com")
	message.AddToName("SendGrid Community Dev Team")
	message.SetSubject("SendGrid Testing")
	message.SetText("WIN")
	message.SetFrom("your@yourdomain.com")
	if r := sg.Send(message); r == nil {
		fmt.Println("Email sent!")
	} else {
		fmt.Println(r)
	}
}

ソースコード内の送信元(message.SetFrom)と宛先(message.AddTo)は適宜変更してください。さあ、コンパイル(go build sendgrid-test.go)してプログラムを実行(./sendgrid-test)してみましょう。

以上で終わりです。上に示した簡単な手順を踏めば、SendGridのユーザ名とパスワードを使う代わりに、APIキーを利用してメールを送信することができます。しかも、そのAPIキーは環境変数として安全に利用されていますし、GitHubにプッシュすることなくファイルシステムに安全に保存されています。

関連記事

注1) 本記事のコンテンツにつきましては、正確な情報を掲載するよう努めておりますが、必ずしもその正確性や安全性を保証するものではございません。本記事の情報をご利用になったこと、またはご利用にならなかったことにより生じたいかなるトラブル・損失・損害に関しても、当社(株式会社構造計画研究所)は一切の責任を負いかねます。