Hatena::Groupsubtech

#生存戦略 、それは

-> 13 { 11 / 26 }

gerry++

10:20 | はてなブックマーク - gerry++ - #生存戦略 、それは

いつでも必ず入れる個室がある安心感って幸福度に直結しそう。

と久しぶりに個室探して冷や汗ダッシュしたので感じたのでした。

トラックバック - http://subtech.g.hatena.ne.jp/secondlife/20131126

-> 13 { 02 / 08 }

Rack のセキュリティフィックスと Timing Attack の話し

14:17 | はてなブックマーク - Rack のセキュリティフィックスと Timing Attack の話し - #生存戦略 、それは

さきほど Rack にセキュリティフィックスバージョンが出たんだけど、セキュリティ的に何故に問題があるのかわからなった(Timing Attack をよく解ってなかった) のでメモ。

  • https://github.com/rack/rack/commit/0cd7e9aa397f8ebb3b8481d67dbac8b4863a7f07
  • このコミットで直った。HMAC で生成するハッシュ値の比較チェックを == から別のメソッドで行うようになった。
  • https://github.com/rack/rack/blob/master/lib/rack/utils.rb#L399-L408
  • え、これ戻り値の bool は Ruby の String#== と同一じゃん、なにが問題なんだろう?
  • 攻撃者が指定した digest により、== の比較速度が異なり、HMAC が推測可能になるのが問題
    • これが Timing Attack か!
    • Response Header で X-Runtime を出してると usec 単位で処理時間がばれる
  • secure_compare だとバイト列の比較で最後まで舐めるため、処理速度にばらつきが無くなる

ナルホディウスデスゾ~。mrkn / miyagawa さんに教えて貰った。

なお Rails は

use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore

な別の middleware で処理をしてるため、Rack の影響は受けない、と。

トラックバック - http://subtech.g.hatena.ne.jp/secondlife/20130208

-> 13 { 01 / 24 }

GitHub Enterprise TechTalk に見る、各社の運用法

09:34 | はてなブックマーク -  GitHub Enterprise TechTalk に見る、各社の運用法 - #生存戦略 、それは

弊社もバリバリ GHE を使ってるので落ちると開発が回らなくなる(pull request できないのは、master に merge できないのとほぼ等価)ので、他社どうやってるのかーと大変気になってたのでしれて良かった。

間違ってたら教えてくだしぃ

  • クックパッド
    • 開発者は GHE へ push, webhook でメインの git サーバに同期
    • GHE の git レポジトリは本番からは利用しない
    • GHE が死んだ場合はメインの git サーバを向けることで継続開発・デプロイ可能
  • はてな社
    • 開発者は GHE に push したり場合により別のサーバに push したり
    • GHE から webhook でミラーリング
    • GHE / 別 git を開発者がうまく使いこなす必要がある。混乱するので git-hatena コマンドを用意してよしなにラップしてる
    • GHE のサーバは Active Standby 構成らしいけどどうやってるのか聞きそびれた!
  • DeNA 社
    • 開発者は GHE へ push
    • GHE から各種 ghe- ツールを使いバックアップ
    • repos は巨大すぎるので ghe- ツールで無くて rsync
      • 某権限でゴニョゴニョ…仮想マシン上のウブンツですし…
    • 構成は Cold Standby 構成
  • - VMWare の仮想冗長化はお値段が…
  • GREE 社
    • 大場さんがんばって(´;ω;`)

というわけで

  • GHE が死んで pull request できなくなると死ぬ
    • DeNA でやってる Cold Standby 構成で
  • 本番に deploy やレポジトリ参照できなくて死ぬ
    • 参照するのは GHE レポジトリで無く別のメインのレポジトリで

が良さそうだナーと思いました。へーしゃも DeNA 社的なアプローチとりたいなぁ。あと GHE も日々進化してるので、そのうちきっと低コストな手法で SPOF が排除される機能がつく…はず…といいなぁ…

あと感想で GHE 使うの苦行だけじゃ、って話しを何件か見たけど、実際 github.com の運用だけで問題ない会社なら

  • github.com を使ったときのセキュリティリスクをとれる
  • github.com が死んでてもなかない

なら、github.com を使うべきですよ。GHE に github.com で実装された機能が入ってくるのにも時差あるし、github .com を使わない理由は無いです。安易に GHE を使うと運用をしっかりしないと死ぬので。

トラックバック - http://subtech.g.hatena.ne.jp/secondlife/20130124

-> 12 { 12 / 25 }

github で git diff from..to を表示する

16:46 | はてなブックマーク - github で git diff from..to を表示する - #生存戦略 、それは

いつも忘れるのでメモ。compare だ!(なんで diff じゃないの…)

で表示。

で text/plain な diff が表示される。.. じゃなくて ... 。

(thanks @sora_h, @kakutani)

hirose31hirose312012/12/26 02:08あわせてよみたい: http://d.hatena.ne.jp/hirose31/20120614/1339641769

secondlifesecondlife2012/12/26 09:20参考になる: +1

トラックバック - http://subtech.g.hatena.ne.jp/secondlife/20121225

-> 12 { 12 / 20 }

Capybara の using_session でセッションを切り替えつつインテグレーションテストをする

18:50 | はてなブックマーク - Capybara の using_session でセッションを切り替えつつインテグレーションテストをする - #生存戦略 、それは

ユーザAとユーザBが順番にアクセスしに来て云々という spec を書きたい、ので ググったら Capybara に using_session なんつー便利メソッドがあった!のでみなさん使うと良いです。

ドキュメント素っ気ない…。便利なのに…。

以下は wiki のページ衝突の example。片方が更新したのに、それを知らずにページ更新しようとするとコンフリクト画面が出る、みたいな。

using_session(:bob) {
  login(bob)
  visit page_edit_path(target_page)
}
using_session(:tom) {
  login(tom)
  visit page_edit_path(target_page)
}
using_session(:bob) {
  fill_in 'page_content', with: "# bob's page"
  click_button 'Save'
  page.should have_selector 'h3', text: "bob's page"
}
using_session(:tom) {
  fill_in 'page_content', with: "# tom's page"
  click_button 'Save'
  page.should_not have_selector 'h3', text: "tom's page"
  page.should have_selector '#page_content', text: "# tom's page"

  page.should have_selector('#confrict')
...

Rails でアプリ内部から発行してる http をトレースする

16:17 | はてなブックマーク - Rails でアプリ内部から発行してる http をトレースする - #生存戦略 、それは

の続き。デバッグ用にセットしたら便利だったのでメモ。

Gemfile

group :test, :development do
  gem 'webmock', require: false
end

しておいて

config/environments/development.rb

if ENV['WEBMOCK_ENABLE']
  require 'webmock'

  WebMock.allow_net_connect!
  WebMock.after_request do |request_signature, response|
    res = ["=== HTTP Request ===",  "#{request_signature}", "", response.status.join(' ')]
    res << response.headers.map {|key, val| "#{key}: #{val}" }.join("\n")
    unless response.body.empty?
      res << ""
      res << response.body
    end
    res << "=" * res.first.size
    Rails.logger.debug res.join("\n")
  end
end
```

しておいて

WEBMOCK_ENABLE=1 rails s

すると、http 叩いてるところが以下みたいに出て便利。

=== HTTP Request ===
GET http://example.com/ with headers {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}

302 Found
Location: http://www.iana.org/domains/example/
Server: BigIP
Connection: Keep-Alive
Content-Length: 0
====================
=== HTTP Request ===
GET http://www.iana.org/domains/example/ with headers {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}

200 OK
Date: Thu, 20 Dec 2012 07:16:22 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Thu, 06 Dec 2012 19:40:14 GMT
Content-Length: 606
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=UTF-8
....
トラックバック - http://subtech.g.hatena.ne.jp/secondlife/20121220