背景
- Railsのジョブ実行サーバであるSidekiqにはかっこいいジョブ管理のWebインターフェイスがもれなくついてきます
- 下記のような感じでroutes.rbに追記するだけ
mount Sidekiq::Web => '/sidekiq'
環境
- Puma
- Clusterで複数プロセス起動
- 複数サーバ
問題
- この画面を使ってジョブの参照をしているには問題なかったのですが、
- ジョブの削除とかリトライのような更新をしようとするとなぜか
403 forbidden
が発生することがありました
原因
- Sidekiq::WebひいてはSinatraがデフォルトではマルチプロセスでセッション管理できない
- 結果的にRack::ProtectionのCSRFチェックにひっかかっていたのが原因です
- Sidekiq::Webはsinatraで書かれた簡易なRackアプリです
- Sinatraは一部独自のセッション管理をしている場所があり、session_secretをプロセス起動時にランダムに指定します
- 結果的にプロセスごとに異なるsession_secretが指定され、セッション値の復号化に失敗していました
- セッション管理できないと、Rack::Protectionに脆弱性として検出されて落ちていました
対応
- 下記の対応をroutes.rbに入れてsinatraのsession_secretを固定すれば治ります
require 'sidekiq/web'
Sidekiq::Web.set :session_secret, 'secret secret'
mount Sidekiq::Web => '/sidekiq'