初心者がAWSでミスって不正利用されて$6,000請求、泣きそうになったお話。

  • 924
    いいね
  • 15
    コメント
この記事は最終更新日から1年以上が経過しています。

こんにちは、2015年も終わりですね。昨年よりエンジニアのお仕事をはじめております自称エンジニアの@mochizukikotaroです。

お祭り記事ですので、皆様の箸休めの一助にでもなればと思いながら、全力で書きたいと思います。

まず感謝

当記事は、「素人がAWSに手を出し、のんきに過ごして気づいたら、自分のミスで不正利用され$6,000ほどの請求が来ていて」一週間ほど食べ物も喉を通らず、AWS様に泣きついた結果、「なんとか情け容赦を頂いた」という内容です。

本文中には多少ふざけた言葉選びが散見されるかもしれませんが、私は全力で AWSさんに感謝 をしております。

この先、 僕と同じような過ちを犯す可哀想な素人エンジニアを、この世から一人でも無くしたい。 と切に願っております。

最初にお断りしておきますが、

当記事から得られる、プログラミングインテリジェンスは1gくらいです。

  1. 一定レベル以上サーバとかAWSについて知識がある皆様 => 初心者とは、ここまでモノを知らない哀れな種族なのでございます。 呆れてください。 (そして、あなたのかわいい後輩が同じ轍を踏まぬよう..)
  2. 僕と同じサーバ初心者の皆様 => 今度飲みにでも行きましょう。そしてみんながどうやってサーバレベルを高めようとしているのか教えてくれ!(やっぱりLPICか転職かな!)
  3. その他の方 => こんな話もあるんだぁ、と思って頂ければ。

はじまりはRailsハッカソン

2015年8月某日。弊社で、学生を招き30時間耐久Railsハッカソンがありました。僕は普段PHPの仕事をしつつ、半分以上ディレクターのしごとをしているのですが、ハッカソンは参加します。

Rails?CakePHPみたいなもんでしょ?と、余裕のしたり顔で参加します。

一日目は、Railsチュートリアルを読み始めるところからです。深夜になって一人アイデアソンをし、 AmazonAPIをつかって本のデータを活用したサービスを作ることに決めました。

全部gemのせいだ。ではなく当然僕のせいです。

アマゾンAPI?ま、リクエストURL叩くだけでしょ。QiitaのAPI叩くようなもんでしょ?とりあえず、アマゾンAPIのページに行ってみる。

スクリーンショット 2015-12-23 19.14.17.png

....

おい、正気か。複雑すぎる。

無理だ。 あきらめたい。 もう、あきらめたい。別のプロダクトにしよう。もしくは別の楽天APIとかにしよう。。

「いや、gemあるっしょ。」

gemってだいたいなんでもあるもんなー :smiley: あった!!! :santa: しかも簡単だ!これでできる!なるほど、AWSのアクセスキーとシークレットキーが必要で、ここに記述すればよいのね。おけおけ!まずは、AWSのコンソールから認証情報をクリックして。ほう、これは...

aws_key.gif

左だ!!(なんかいろいろ書いてあるけど無視して)「セキュリティ認証情報に進む」をクリック! IAMユーザーとか知らないし。 APIを使うには左のチョイスじゃないとだめみたいだし。とりあえず、ポチポチして キーをゲット して、下のようにソースにちょこんと書いてみる。

:AWS_access_key_id => 'アクセスキー',
:AWS_secret_key =>   'シークレットキー'

できたー!!(^o^) gemのおかげで、複雑なリクエスト処理に一切工数かけずできたー!なんとか形にしてハッカソンの発表も終わりー! 一応共有のためにGitHubにソースも上げて と。ありがとうございました!

ハッカソン終了から、数日後

「あれ、不在着信がある。留守電も入ってる。はあ、めんどくさいなー、どうせ役所とかだろーなー。」とりあえず、留守電を聞いてみる。

留守電 :iphone: : 「Hi. 英語英語英語英語英語............................」

なんだこれ。しらない番号から、英語の留守電。

はあ、新手のオレオレ詐欺かー。 せめて国籍は間違えずにやってくれよなー。 :frowning:

翌日の電話

午前中に不在着信あり。「あれ、また海外から詐欺電話かかってきてる。しつこいなー。」ひとまず放置。そして午後にまた電話が鳴り出しました。

電話 :iphone: : 「プルルルるるるるるるるる」
ぼく :frowning: : こわい。けど、ここは、試しに出てみるか(笑)!

外人 :alien: :「Hi, 英語英語英語英語...........................?」
ぼく :frowning: :「Sorry, I cant speak English ....」
外人 :alien: :「おいおいまじかよ....。やれやれだぜ、OKわかった。じゃあ、あきらめるよ。メールするから見ておいてー。Bye. ガチャ。」
ぼく :frowning: : 「よくわかんなかった。けど、これでもう電話かかってこないでしょ。おけ!」

そして、ぼくは仕事に戻りました。

深夜のメールチェック

帰宅後、ふとメールの件を思い出した僕は、久しぶりにYahoo!メールをチェックする。「あー、英語のメールきてるー。あれ、AWSからだ。」

スクリーンショット 2015-12-23 21.24.03.png

え。

...。

おい。僕のTOEIC300点代の英語能力でもわかるぞ。

これは、 不幸のお知らせ だ。Credentials being exposed.

金額の桁数はよく見ちゃだめだ。とりあえず、AWSのコンソールに行ってみよう。
そして、僕は生まれてはじめてAWSの「請求とコスト管理」をクリックしました。

スクリーンショット 2015-12-23 21.33.30.png

はじめて見た、請求管理画面は、それはそれは見易いキレイな棒グラフでした。

青と緑の長方形。

青の長方形の上には「$5,000.00」みたいな記載があって、 これは.....5ドルのことかな? としばらくは「,」を「.」だと信じようとしました。が、1セントより小さい単位は無いらしく、どうもこれが日本円で50万円以上ということが分かって来ました。

現在進行形で増え続ける請求額。

増え続ける謎のインスタンス。聞いたこともないスポットリクエスト。

あらゆるリージョンで僕のインスタンスが活発に活動している様子。

まるで夢のようです。

フォースの力を持つ師匠に、深夜の電話

真夜中にもかかわらす、失礼千万承知の助で大先輩に電話をします。
この時点ですでに僕は正気を失っております。

ぼく :sob: :「師匠、たすけてください。」

師匠 :poop: :「まずは、おちつけ」

ぼく :sob: :「はい。AWSでやらかしました。」

師匠 :poop: :「会社のやつ?」

ぼく :sob: :「個人のアカウントです。」

師匠 :poop: :「お、じゃあ、大丈夫だね。」

ぼく :sob: :「50万くらい請求きてます。」

師匠 :poop: :「...........お。おお。やるな。なんで、そうなった?」

ぼく :sob:「AWSのアクセスキーとシークレットキーをGitHubで公開してました。数日前に。」

師匠 :poop: :「なるほど。じゃあ、とりあえず...」

ということで、
1. GitHubからソースを削除、というか、もうリポジトリごと削除。
2. 公開しちゃったアクセスキーとシークレットキーを削除。
3. 僕の預かり知らぬインスタンスを片っ端から、削除。
4. この後は、AWSさんに連絡して、返金してもらえるか連絡してみ。

ぼく :sob: :「ありがとうございます。その後は、どうしましょうか。」

師匠 :poop: :「前に同じようなことやらかしてた人のブログあるから、それ送るよ。」

ぼく :sob: :「ありがとうございます。」

AWSさんにメールを送りまくる件

師匠との電話を切り、その流れで以下の問い合わせを行う。

スクリーンショット 2015-12-23 22.28.54.png

5分待っても、レスがないので、立て続けに3回くらい、お問い合わせメールをおくりました。本当にすみませんでした。ちなみに、どこかにAWSの問い合わせ電話があったので、そこにかけたら、外人の方が出てくれまして、日本人いますか?と訪ねてみたのですが、日本人はおらず、メールしてと言われたりもしました。

3通送ってもレスがないので、慌ててビジネスプランに格上げする。

サポートプランには

  • ベーシック(無料)
  • デベロッパー(月額$49)
  • ビジネス(月額$100)
  • エンタープライズ(月額$15,000)

あるのですが、どうもビジネスだと1時間以内にレスがもらえるようなので、ビジネスに格上げ。正直60万請求されてる身としては、1万くらいなんてことはない。

格上げ後15分くらいすると、日本語のメールが!嬉しい!日本人だ!お電話が可能とのことで、早速お電話。諸々対処について確認をしたうえで、返金について伺ってみると、やはり 返金については担当者レベルでは決めることができない らしく、改めて連絡があるとのこと。

ぼく:「山田さん(仮名)の、感覚値でいいのですが、こういう場合は返金って、されたりするものですかねーー??」
山田さん(仮名):「そうですねぇー。私からは、なんともー。。」
ぼく:「ですよねぇーー。」

そして、改めてもらったメールがこちら。

スクリーンショット 2015-12-23 23.18.56.png

検討かよ!と叫びつつも、これに対しては、誠心誠意全霊を込めて、再発防止策について詳細を記載し返信をさせて頂きました。

ここから一週間ほど、先方の検討段階へ。

「もし返金されなかったら、エンジニアやめよう。」

と、この期間はずっと思っていました。一週間ずっと、元気なかったです。毎日やってた勉強も一切しなくなりました。 社内のエンジニアとも極力コミュニケーションを取りませんでした。

ご飯も味がしませんでした。毎日AWSコンソールのサポートボックスをチェックしていました。

ようやく訪れた歓喜

スクリーンショット 2015-12-23 22.46.15.png

本当に感謝しかございません。夜中にやさしく対応をして頂いた担当者様、ほんとうにありがとうございます。この場を借りて改めて感謝申し上げます。

おわりに

ぼくはこの件以来、AWS恐怖症になっておりました。けど、このまま立ち止まるわけにはいかないので、最近同じテーマでSwiftアプリの開発をすすめています。今回はAPIサーバをPHPでつくり、アマゾンAPIの部分もgemではなく、自信の理解をすすめるためにも、まず自前で実装しています。AWSさんにご迷惑をかけた分、微力ながら貢献したいと思っております。

サーバの勉強はまだまだこれからですので、頑張ります。

  • アクセスキーはGitHubなどで絶対公開しちゃだめ
  • アクセスキーは環境変数とかでやる
  • 認証情報の作成はルートじゃなくてIAMユーザーをできるだけ使おう

(けど、アマゾンのProduct Advertising APIはルートじゃないとだめなんですよね......)
https://forums.aws.amazon.com/thread.jspa?threadID=79313
http://docs.aws.amazon.com/ja_jp/AWSECommerceService/latest/GSG/GettingStarted.html

  • IAMユーザとかポリシーとかちゃんと勉強しよう
  • 英語であってもちゃんと読もう、理解しよう

以上です!

次回は、『素人ががんばってSwiftアプリつくったら$6,000儲かっちゃって笑いが止まらない話。』とかを記事にできるように頑張りたいと思います。

お祭り楽しい。プログラミング面白い。明日で、アドベントカレンダーも最終回です。