オプト株式会社で2週間のインターンをしてきた件
こんにちは,なめこです.
9月の後半2週間を利用してオプト株式会社でインターンをしてきたので,その体験記を残します.
オプト株式会社に関して
インターネット広告代理店です.
顧客への手法の提案,データの解析,可視化など,広告という媒体を扱うだけでもいろいろあるんだなと...
オフィスが広かったです.ビルの4,5階分(もっとあったかも?)くらいは全部オプトでした.
会議やら勉強会やらで階段を登ったり降りたりしてました.
経緯
前回に引き続きpaiza経由での応募でした.
面接時にまともに受けごたえをできた覚えがないので,何故受け入れてくれたのかは謎です.
期間
タイトルにもありますが2週間でした.
といっても運悪く祝日が2回も被ってしまったので,実際の日数としては8日でした...
配属先
稼働中のサービスの開発部のSREチームでした.
SRE(Site Reliability Engineering)はサイトのセキュリティ向上や緊急対応,ログ解析,開発に必要なツール作成など,主に運用に関する部分をプログラミングによって対応・改善し,品質の維持・向上を行います.その仕事の特性上,フロントエンドからバックエンドまで結構幅広く仕事をすることになります.
詳細に関してはここら辺を見るとだいたいわかるかと.
Googleが提唱した「Site Reliability Engineering(SRE)」とは|フリエン
やったこと
大きな括りとしてはセキュリティの強化にあたります.
具体的には以下のような対策を,実際のサービスで行いました.
- CSRF対策
- XSSI対策
CSRFに関して
CSRFに関しては以前以下のような記事で一応まとめてあります.
XSSIに関して
こちらはまとめてないので簡単に説明しておきます.
※ザックリ説明なので必要な部分が省かれている可能性があります.
XSSI(Cross-Site Script Inclusion)はクロスドメインのjsをscriptタグとして埋め込むことでそのjsで扱っているデータにアクセスする攻撃です.
scriptタグはクロスドメインでも実行が可能なため,ブラウザやフレームワークが勝手に良きに計らってくれないのが特徴的ですね(これがデフォルトで止められると,例えばjQueryを大元のURLで呼び出すことができなくなる).
対策としてはCSRFトークンの発行が有効です.
ただ,そもそもjsで重要な情報を扱うべきではないという考えもあるので,守るべき情報なら他の手段で扱う方がいいのかもしれません.
以下に参考文献を載せておきます. あまり知られていないのか対策の必要が出る自体あまりないのか,調べてもそういった記事があまりヒットしないですね
XSSIに関連しているJSONPに関しても載せておきます(Wikipediaですが...).
事前準備
Scala, TypeScript, Playframeworkの勉強をしました.
勉強に使えるサイトなども教えてもらえたのでそちらを参考に進めました.
業務で使う言語やフレームワークはどれも全くの未経験でしたが,TypeScriptは静的JavaScriptだったり,Playframeworkがrailsライクだったりしたのでなんとか業務開始までには間に合いました.(なのでtsとplayはふわっとした理解)
体験記
入社研修から環境構築まで
初日の午前中はお話を聞くお仕事でした.目の前に支給されるMacBook Pro(持ってない)が置いてあって,待てをされ続けるペットの気分でした...
その後諸々の記入などを終え,環境構築に入ったのですが...正直この環境構築が最も鬼門でした.
READMEに不備があったり(これはまあ,バージョンなどは社内では共通認識の部分があるので多少は仕方がない),環境構築の過程で自動的にインストールされるイメージが自分の入社する数日前の段階から仕様が変わってしまっていたり...(直近で1から環境構築してる人なんていないので誰も気づけない)
そんな感じで2日もかかりました...全8日なので1/4が消えたことになります.つらい.
その後お仕事中に動作がおかしくなって結果的に再度環境構築をすることになるのですがそれはまた別のお話.
CSRF対策
インターンが決まってからあらかじめ説明されていたのがCSRF対策です.事前にある程度まとめられたサイトのURLなども教えてもらってたので,(一応)勉強済みです.
まずは実際どこにその脆弱性があるのかを確認する作業から始まりました.リクエストやレスポンスのログを見ながらいろんな部分にfetchリクエストを飛ばしてました.また毎回コンソール叩くのは大変なので,攻撃用(対策がなされたかの確認用でもある)ページを作って不正なアクセスを繰り返しました.合法的に攻撃できるのは中々レアな経験な気がします.
この際,全く同じ脆弱性だと思われていたものが違うものだと判明したので,そちらも後ほど対策をすることになりました.
その後,対策案の作成をしました.ポピュラーなやり方としてはCSRFトークンの発行ですが,トークンの諸々の処理を実装するのにかかる時間的コストが重めなので他の手法でできないかを調べたり考えたりしてました.
そして実際にコードをいじくりまわして対策...しましたが,まあ初めましてのコードでどこにどう突っ込めばいいのかはあんまりわからなかったので,ここはほとんどメンターさんがやってくれました...何しに来たのだろうか.
XSSI対策
XSSIは最初はCSRFだと認識されていたみたいです(まあ対策としては同じトークン発行で解決できます).が,今回の場合トークン発行はコストが大きかったため,他の方法で解決するのを目標に対策を考えました.
結果的に,「そもそもこのAPI(のような何か)の存在がよくないから消したい」ということになり,若干メンターさんに渋られましたが(残り日数的に間に合うかわからないため)押し通して謎API削除に乗り出しました.
詳細は省きますが,ルーティング周りやAPI周り,フロントエンドの処理まで編集しまくって見事某API撲滅に成功しました.結局バックエンドからフロントエンドまで全部いじりましたね...
その他
定期|不定期で開催される勉強会や会議などにも参加させていただけました.「こんなのが出たので使ってみた」とか「こんな本読んだのでまとめてみた」といった感じの話を聞けて楽しかったです. SREの本の輪読会といったものも開催していて,そこでようやくSREについての理解が追いついた気がします.
あといろんな方とランチを食べにいったりもしました.
経歴が中々すごい方とかもいて色々と話が聞けたのがよかったです.Slackのおかげでコミュ障でも大丈夫...
感想
環境構築だけは死にかけてましたが(READMEって大切だなととても実感しました),全体としてはかなり良かったです.
セキュリティは高専や大学の授業でもありましたが,実際に対策を行うといったことは今までほとんどなかったので良い経験になったと思います.
問題の特定,対策案の検討,実装,PRまでの一通りの流れを経験させていただけたので,エンジニアとしての未来像もうっすらとイメージできるようになった気がします.
インターン終了後の打ち上げで,お褒めの言葉をいただけたのがとても嬉しかったです.
ある程度の数の言語に触れてきたおかげか,新しい言語の理解も早くできるようになった気がします.
というかまあ,先人のプログラムを軽めにいじるだけならそこまで深い理解じゃなくても十分だなと感じました.
あと余談ですが,MBPやっぱりいいですね...Touch Bar派ではなかったのですが,Touch IDの前に陥落しました.
早くお金貯めて買おうと思います.
謝辞
今回受け入れてくださったオプト株式会社さん,実際に面倒を見ていただいたメンターさん,ランチなどで色々な話をしてくださった方々,2週間(それも8日間)の短い間でしたがお世話になりました.実際に仕事で貢献しつつ,自分にもプラスとなったのでとても良かったです.ありがとうございました.
また,今回もお仕事中の糖分補給を支えてくれた,なめこの生命の源ことSANGARIAのまろやかいちご&ミルクに最大限の感謝を捧げ,締めの言葉とさせていただきます.