GitHubで認証情報を盗まれないようにするために
- 2016年1月19日
- by SendGrid
- Category: 機能・使い方

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”をクリックしてください。

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

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

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

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

さて、再びエディタを開いて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にプッシュすることなくファイルシステムに安全に保存されています。


