Slide 1

Slide 1 text

出張!Railsウォッチ
 in 銀座Rails#32
 森 雅智 / @morimorihoge 2021/04/23 1
 特集:~MimeMagic騒動を振り返る~
 
 


Slide 2

Slide 2 text

About Me
 ● 森 雅智: @morimorihoge
 ● BPS株式会社でRailsの受託開発チームをやってたり、週1大学非常勤で Web開発を教えてたりします
 ● Ruby/Rails歴は11年くらい。Web開発は17年くらい
 ● 銀座Ralis #10でActiveRecordでVIEWを使おうという話をしました
 ● 銀座Rails #27でアプリケーションコンフィグの話をしました
 About BPS & TechRacho
 ● Web受託開発や電子書籍製品開発をやっている会社です
 ● TechRachoという自社技術Blogを運営しています
 ○ 4年ほど前から平日毎日更新してます
 ○ https://techracho.bpsinc.jp/ ● お仕事相談、転職相談、TechRachoへのご意見など気軽にどうぞ
 ○ https://www.bpsinc.jp/ 2


Slide 3

Slide 3 text

Railsウォッチとは?
 技術ブログTechRachoで毎週連載しているRails / Ruby界隈を中 心とした雑多な情報を提供する技術雑談マガジン
 3


Slide 4

Slide 4 text

これまでの出張Railsウォッチのピックアップテーマ
 ● Rails6新機能特集
 ○ 銀座Rails#12: 複数DB対応
 ○ 銀座Rails#13: ActionText、Trix
 ○ 銀座Rails#14: ActionMailbox
 ● Railsアプリケーション開発に関する雑多なテーマ
 ○ 銀座Rails#15: production、development、staging環境について
 ○ 銀座Rails#16: 機能開発の設計レビューについて
 ○ 銀座Rails#17: リソース管理スコープについて
 ● 開発一般な話
 ○ 銀座Rails#19: 開発チームの冗長化について
 ○ 銀座Rails#20: Excelと仲良くしよう
 ○ 銀座Rails#21: 標準仕様を読むためのABNF
 ○ 銀座Rails#22: CLIプログラムにOptionParserを使う
 ○ 銀座Rails#23: ActiveRecordのSELECTベンチマーク
 ○ 銀座Rails#24: 令和Devise事情
 ○ 銀座Rails#28: 2020年の銀座Railsを振り返る
 ○ 銀座Rails#29: Serverless Railsを試す
 ○ 銀座Rails#30: Railsインフラ環境Overview
 ○ 銀座Rails#31: Railsプロジェクトあるある
 4
 各回資料に興味がある方はこちらからどうぞ:https://speakerdeck.com/morimorihoge 


Slide 5

Slide 5 text

MimeMagic騒動を振り返る
 5


Slide 6

Slide 6 text

概要
 6
 ● 2021/03/24、突然Railsのbundle installが失敗するようになった
 ○ 「何もしてないのに動かなくなった」事例が発生 
 ● 原因はActiveStorageの依存しているmimemagicというGemにあった
 ● 様々な要因から「待ってればそのうち直る」タイプの問題ではなかったため、世の中 のあらゆるRailsアプリが影響を受ける結果となった
 ● 2021/04/23現在、一通りの対策は完了し、対応手順についてもまとまっている
 ※何もしてないのに壊れたのイメージ 


Slide 7

Slide 7 text

何があったかをおさらいしていく
 7
 ● 時系列・事実ベース視点
 ● それぞれの背景視点
 ● 今回の教訓をどう今後に活かすか
 という視点で話していきます


Slide 8

Slide 8 text

時系列・事実ベース視点
 8


Slide 9

Slide 9 text

GitHub rails/rails Issueの盛り上がり
 100近いコメントの応酬で一種の祭り状態の図
 9


Slide 10

Slide 10 text

MimeMagicとは?
 ● Railsが依存しているActiveStorageが依存しているMarcelが依存していたGem
 ● MimeMagicはファイル名拡張子からMimeTypeを判別する機能を持っている
 ○ ActiveStorageがアップロードされたファイルの種別を判定するために使われていたと見られる 
 ● Railsを使っていてもActiveStorageを入れてなければ本騒動の影響はなかった
 10
 Gemのdependency tree(当時) 


Slide 11

Slide 11 text

MimeMagicの何がまずかったのか?
 ● 拡張子とMimeTypeを結びつける辞書データにfreedesktop.orgの提供する freedesktop.org.xmlというXMLデータベースファイルを利用していた
 ○ このファイルは本来GPLv2ライセンスで提供されていた 
 ● MimeMagicはMITライセンスで配布されていた
 ○ が、freedesktop.org.xmlを リポジトリ内にバンドルしていた 
 ○ MITライセンスとGPLv2ライセンスではGPLv2の方がより厳密なため、混ぜるならGPLv2にしないくて はならず、ライセンス違反の状態であった 
 ○ XMLファイルを提供するshared-mime-infoのメンテナからライセンス問題を指摘するIssueが来てい た
 ■ https://github.com/mimemagicrb/mimemagic/issues/97 
 ● MimeMagicがライセンス違反のバージョンをこれ以上ダウンロードできないようにす るため、当該バージョンをRubyGemsから削除(yank)した
 ○ これにより、RailsリポジトリでGemfile.lockしたバージョンがbundle installでインストールできなくなっ た
 11


Slide 12

Slide 12 text

MimeMagicの背景にあったかもしれないもの
 ● 実はGolang版のzRedShift/mimemagicで同様の議論がされていた 
 ○ https://github.com/zRedShift/mimemagic/issues/4 
 ● ここで議論されていたのはDMCA takedownに関する問題で、とにかく対応しなきゃ だね、というやり取り
 ● もし仮にMimeMagicがRailsへの影響を考慮して本件を放置していた場合、GitHub から先にtakedownされてしまう可能性もあった
 ○ takedownされた場合、復帰処理にはもっと時間がかかった可能性もあった 
 ● そういう意味ではMimeMagicの今回の対応は仕方なかった部分も大いにあると思 われる
 12
 # DMCA takedownとは? 
 
 * Webサイトにおいて著作権侵害コンテンツがアップロードされた際、DMCA通告に従って速やかにコンテ ンツの配信を停止することで、サイト運営者が損害賠償を免責される仕組み 
 * 「速やかに」というのが最優先されており、通告を受けたら アップロードした本人の確認を待たずにとに かく先に配信停止される 
 * 異議申し立てはできるが、それは配信停止の後 になってしまう(ので配信停止を拒否できない) 
 * GitHubにもDMCA takedown policyがある 
 * 連絡はしてくれるが1営業日以内に対応する必要がある 


Slide 13

Slide 13 text

GitHub: DMCAテイクダウンポリシー
 https://docs.github.com/ja/github/site-policy/dmca-takedown-policy
 13


Slide 14

Slide 14 text

Rails側の対応とその後
 ● 前提として、RailsがGPLv2ライセンスのライブラリに依存するのは避ける必要が あった(Rails全体がGPLv2になってしまうため)
 ○ GPLv2になると、Railsの利用形態によってはソースコード開示義務が発生する可能性がある 
 ○ ※一般的なASPサービスは問題ないが、GitHub Enterpriseのようなユーザー側の環境でRailsサー バーを動かすようなシステムだと問題になると言われている 
 ● 諸々の議論がされたが、最終的にはfreedesktop.org.xmlに依存せず、Apache Tika の提供するデータ(Apacheライセンス)を使うようにRails側を修正し、mimemagicは 使わなくなった
 ● mimemagicは引き続き提供されているが、shared-mime-infoパッケージのインス トールが別途必要で、環境によってはXMLファイルパスを与えてやる必要がある
 ○ Railsバージョンを最新に上げられない事情がある場合はmimemagicを使い続けるのもできる 
 ○ 古いminimagicを使い続けているとGPL違反になる可能性があるため、該当しそうなパッケージソフ トなどを作っている人は要確認を 
 14


Slide 15

Slide 15 text

その他の教訓
 15
 ● 今回のような問題はあらかじめ予見することができたか?
 ○ かなり難しい。マイナーGemならともかく、Railsが依存しているようなGemがバージョンごと消滅する ようなケースを考慮するのはなかなか現実的ではなさそう 
 ● 今回の問題に対策するとしたらどんなことができたか?
 ○ ActiveStorageを使わないなら外しておく ということはできた
 ○ bundlerのキャッシュ を持っていればyankには耐えられた 
 ■ が、キャッシュ状態に依存するdeploy環境は健全なのかという問題もある 
 ○ 自前でRubyGemsのミラーサーバーを立てておき、buildが成功した時のGemバージョンを保持する ような機構を用意しておくとか 
 ○ 同業者のTwitterアカウントやコミュニティSlackなどを普段から見ておき、最新の情報を追いかけら れるようにしておく
 https://ruby-jp.github.io/ 


Slide 16

Slide 16 text

おわりに
 16
 今回の問題を端的に表した画像→ 
 
 
 その他、具体的な対策をまとめた日本語情報で はruby-jp Slack議論をまとめた以下の @mametterさんまとめが参考になります 
 https://hackmd.io/@mametter/mimemagic-info -ja
 refer: https://xkcd.com/2347/ 


Slide 17

Slide 17 text

次回以降もブラッシュアップしていきます
 感想・リクエストなどあればTwitter
 #ginzarails
 @morimorihoge
 @hachi8833
 までお声かけください
 17