えんじにゃーず・ハイ

主にエンジニアや技術情報についてつらつら書き連ねるブログです

Java Day Tokyo 2016に参加してきました

Java Day Tokyoに参加してきました

5/24に開催されたJava Day Tokyo 2016に参加してきました。

www.oracle.co.jp

このイベントと先日行われたJJUG CCC目当てに東京へ弾丸ツアー3泊4日で行ってきました。今後Javaをやるかどうかはさておき、昔から参加したかったイベントなので楽しみです。

朝4時に起きて築地で寿司食って余裕かましていたら、電車を乗り間違えて基調講演に遅れるという大失態をかましました。

基調講演

途中から参戦。

損保ジャパンさんのCOBOLからJavaEEへの移行に関しては今後各業種でどんどん出てくる気がしています。 汎用機で動いていたシステムはまず仕様が無い、なんてのもあるので、リプレイス案件は相当大変だろうなあという印象です。 Web化することによるメリットと、今後の運用/保守も考えるとまだまだ雇用は安泰ですね。

ドローンを利用したIoTもやはりセキュリティ面を重要視している印象でした。あとドローン結構煩いのね…。ちょっとびっくり。

ペッパーを利用したクラウド連携などIoT推しですね。

Introduction to MVC 1.0 (JSR 371)

Webアプリケーション開発におけるMVCモデルの仕様紹介。JAX-RSアノテーションをちょっと追加すればMVCとして機能しそう、という感触。View側を色々選択できるのは強みだけど、最近はView側はサーバーレンダリングでなくて純粋なHTML5JavaScriptで組むことが多いのでどうかな…。導入タイミングとしてはJavaEE7がベストだったんじゃないか感はしています。

セッションメモ

MVCには二種類あり

  • Action-Base MVC(Struts1,2,JSFなど)
  • Component-Base MVD(Springなど)

今回のMVCはAction-Base MVCとなる

どちらが良いか、ではなく採用する選択肢として検討する

Compornent-Base MVCはControllerの実装が不要でバリデーションなど様々な機能が提供されている Action-Base MVCでは低レイヤでいろいろ実際できる

@Viewと@ControllerのアノテーションJAX-RSからMVCモデルへ対応可能 ViewはJSPJSFだけでなく、その他テンプレート(ThemeLeafなど)と組み合わせ可能 古いWebプロジェクトも移行がしやすいようになっている

Java EE 7アプリケーションとWebセキュリティ

うらがみさんのセッション。スーツ姿!

知っている内容のおさらいも含めて面白かった。クリックジャッキングは知らなかったので対策したい。

対策方法として知っておくという点と、対策漏れが無いか検証可能かどうかのアプローチの観点が非常に面白かった。実践的! これはチームにおけるセキュリティ対策ですね。取り入れたい。

セッションメモ

Webセキュリティへの意識

  • 若い頃は社内イントラのシステムという閉じた世界
  • XSSぐらいしかセキュリティ対策はしていなかった

インターネットに公開されるシステムを作成

  • 企業からセキュリティ診断が行われ、NGが頻発した
  • セキュリティについての意識が芽生えた

最初からセキュアなコードを書く

  • コストがかかるため、抑えるための方法を検討する

IPAが開示している「安全なウェブサイトの作り方:を参考にしている

様々な脆弱性JavaEEでどのように対策するかみていく

XSS対策

  • <>などをエスケープする
  • JSP -> JSTLのc:outタグを使うが、インライン展開されたコードがタグの入れ子二なり見づらいため、エスケープするメソッドを自作する(TLDファイルを編集する必要があり少々面倒)
  • クラスをリクエストスコープに格納し、そのインスタンスからエスケープメソッドを呼び出す -> リクエストスコープにオブジェクトを格納することによる弊害はないのか?
  • JSF -> #{hoge}で自動的にエスケープされる
  • 確実に呼び出されているかどうかを調査するコストを考慮すると、JSPでは面倒なためJSFを採用することが容易

CSRF対策

  • トークンをセッションに設定し、ポストする際に一緒にトークンを送付する
  • hiddenか独自リクエストヘッダに設定する。クッキーではブラウザが自動的に送信してしまう
  • JSP -> 対応していないので自力実装が必要
  • JSF -> ViewStateがCSRFトークンとして機能している
  • Statelessだとトークン値がstatelessと固定されてしまう

SQLインジェクション対策

  • JPA -> JPQLでパラメータをバインドできるが、文字列連結されていないかどうかを検出するのが厳しい。
  • @NamedQueryで記述することもできるため、そちらを使うように統一すれば検出が可能
  • Criteria APIを採用することでクエリの組み立てがメソッド呼び出しによる定義になるため、文字列連結が起きにくい
  • ただ、学習コストが少し高いため、トレードオフで。

セッション管理の不備における対策

  • セッションIDの盗用やセッションIDの固定化する攻撃
  • ログインしたタイミングでセッションIDをリフレッシュするHttpServletRequest.changeSessionId()を呼び出すのが良い

パス名パラメータの未チェックにおける対策

  • リクエストで送信された値でファイルを開くなどで重要なファイルが開かれてしまう
  • ファイルパスにおける対策は開いてよいパスかどうかチェックするしかない
  • 自前ラッパーを用意することで検出ができる。他にも外部リソースを扱う場合はinterfaceを挟むとよい(テストもしやすい)

クリックジャッキング

  • X-Frae-Optionsレスポンスヘッダをつければframe要素、iframe要素が無効になるがSAMEORIGIがおすすめ
  • DENYだとAJAX風にiframeを使用しているとそれもアウトになる。サーブレットフィルタでレスポンスヘッダに設定しよう

HTTPヘッダインジェクション対策

  • JavaEEなら対策無効(レスポンスに設定できない)

メールヘッダインジェクション

  • JavaMailではaddHeaderに改行を含めてしまうとヘッダが書き出されてしまう
  • メールヘッダには設定しないのが望ましい

Content-Security-Policy

  • 最強のXSS対策レスポンスヘッダ
  • default-src 'self'
  • CSSやimg要素なども影響を受けるので、個別にselfとすることで設定可能

Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか

@kawasimaさんのセッション。

@kawasimaさんのセッションは初めて聞きました。TwitterSIerアドベントカレンダーで有名な方でしたがここまでぶっとんだ技術者とは…。 こんなに勉強になるセッションも久々な気がします。JJUG CCCではenkanFWについてのセッションがあったので見ておけばよかったと非常に後悔しました。

技術はぶっ飛んでいるけどSIerらしく運用面が本当に考慮されていて、私は口をあんぐり開けながらただひたすら頷きまくっていました。うーん、素晴らしい…。

セッションメモ

Embrace null

  • Optionalを使ってどう設計するかでなく、nullが発生しうる箇所をOpionalで包み込む設計にするのが望ましい

  • interfaceのデフォルト実装を使ってMixinさせる

  • 今までは多重継承ができなかったのでとんでも量のメソッドが用意されていた
  • default実装のinterfaceを定義することで必要な処理を切り分けることができる
  • また、データをもたせたい場合はinterfaceを継承させてうまくスルーさせるとデータwも取り扱いできる
  • Proxy.newProxyInstanc()を使って動的にInterfaceをimplementsして振る舞いを足す
  • リフレクションdと実装していないdefaultメソッドが呼び出せないが、MethodHandles.lookup()を使えばdefaultMethodがよびだせる
  • ただしリフレクションより遅いので、実用的でない。開発時は簡単に差し替えられるように動的Mixinさせて、運用時は明示的にimplementsしてあげるのが良いのでは

システム挙動の動的な変更(REPL)

  • よくサービスを停止したい場合などにDBでフラグを立ててそれを参照する設計があるが、それだと全てのリクエストで参照してしまいよくない
  • enkanFWを使うことでREPLでサービスを503にしたり簡単にできる

Java9時代の無停止デプロイ * 今まではサーバを複数台用意し、縮退する方法でやっていた * APサーバの機能で無停止デプロイもできるが、メモリリークが発生する可能性があるため根本的解決になっていない * Java9からでは同じポートで別プロセスをListenできるようになった。昔はエラー(Address already...) * ただし、Linux環境のみ可能

ここでPCも携帯も充電が切れる…

実践してわかったJavaマイクロサービス開発

@cero_t さんのセッション。Twitterではすべり芸として名を馳せているようなのですが、初めてセッションを聞くことができました。 (Java Night Sessionのインタビューは見ました!) 前振りや観客が想定していないところで自ら敢えてすべりに行く姿勢はベテランの域でした。シュールなネタとして私は大好きです。

なんて感想を呟いていたらご本人様より固定ツイートに選ばれました!光栄です!

さて内容ですが、 マイクロサービスにするんじゃなくて、なるというのは目からウロコでした。昔のPJで今でいうマイクロサービス化しようとして失敗した経験を思い出しました。

実体験を元にどのようなアプローチと問題が発生し、次にどのように対策したのか。今後のWeb開発において非常に参考になったセッションでした。画面単位でのAPI設計は本当にハマりますね…。

また、マイクロサービス化するにあたりEurekaを導入することで柔軟にスケーリングすることができるなど、インフラも考慮することが大事だと再認識しました。

Javaエンジニアのための"クラウド時代の過ごし方"

昔はモノを作ることに注力していたけど、今はもうモノを作るだけでなくてその周り全てのことについて関わっていかなくてはいけない。

今後は

  • 開発においてとことん掘り下げたスペシャリスト
  • 業務と開発を横断できるゼネラリスト

キャリアパスとして今後求められてくるとの話でした。

ちょうど今、自分は何ができるのか、どこに価値があるのかを見つめ直しているところなので頷くばかりでした。いやあ、いいセッションでした。もう一度聞きたいぐらい。信念が伝わりました。

Java Day Night Session

寺田さんがde:codeより駆けつけてくれた!

日本語で質問可能でしたが、そもそももっと積極的に質問しなきゃいけないよね、という話になったり。なるべく英語で聞こうとしていましたが難しい!結局同時翻訳だと会話のテンポが遅れてちょっと寂しいなと感じた。

ラズベリーパイ3Dプリンタでゲームエミュレータを作ってしまった話など、内容はとても面白いものでした。次は英語で質問できるようになれるといいな。

ぷち懇親会

品川でちょっとした懇親会があったので参加しました。みんな初対面!もっと色々話したかったなぁ。もう一泊すれば良かった。 開発の話から論文の話や野球の話まで、賑やかで楽しい懇親会でした。人が多いのっていいね。

普段は全然飲めないのですが、頼んだビールが美味しくてなんと一杯飲んでしまいました。帰りはまっすぐ歩けないほどふらふらになりました。最高の気分でした。

最後に

本当に楽しかったです!頑張ろうJava!!