Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20210423_出張!Railsウォッチ in 銀座Rails#32

20210423_出張!Railsウォッチ in 銀座Rails#32

Masato Mori

April 23, 2021
Tweet

More Decks by Masato Mori

Other Decks in Programming

Transcript

  1. 出張!Railsウォッチ

    in 銀座Rails#32

    森 雅智 / @morimorihoge
    2021/04/23
    1

    特集:~MimeMagic騒動を振り返る~



    View full-size slide

  2. 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


    View full-size slide

  3. Railsウォッチとは?

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

    3


    View full-size slide

  4. これまでの出張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 


    View full-size slide

  5. MimeMagic騒動を振り返る

    5


    View full-size slide

  6. 概要

    6

    ● 2021/03/24、突然Railsのbundle installが失敗するようになった

    ○ 「何もしてないのに動かなくなった」事例が発生 

    ● 原因はActiveStorageの依存しているmimemagicというGemにあった

    ● 様々な要因から「待ってればそのうち直る」タイプの問題ではなかったため、世の中
    のあらゆるRailsアプリが影響を受ける結果となった

    ● 2021/04/23現在、一通りの対策は完了し、対応手順についてもまとまっている

    ※何もしてないのに壊れたのイメージ 


    View full-size slide

  7. 何があったかをおさらいしていく

    7

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

    ● それぞれの背景視点

    ● 今回の教訓をどう今後に活かすか

    という視点で話していきます


    View full-size slide

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

    8


    View full-size slide

  9. GitHub rails/rails Issueの盛り上がり

    100近いコメントの応酬で一種の祭り状態の図

    9


    View full-size slide

  10. MimeMagicとは?

    ● Railsが依存しているActiveStorageが依存しているMarcelが依存していたGem

    ● MimeMagicはファイル名拡張子からMimeTypeを判別する機能を持っている

    ○ ActiveStorageがアップロードされたファイルの種別を判定するために使われていたと見られる 

    ● Railsを使っていてもActiveStorageを入れてなければ本騒動の影響はなかった

    10

    Gemのdependency tree(当時) 


    View full-size slide

  11. 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


    View full-size slide

  12. 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営業日以内に対応する必要がある 


    View full-size slide

  13. GitHub: DMCAテイクダウンポリシー

    https://docs.github.com/ja/github/site-policy/dmca-takedown-policy

    13


    View full-size slide

  14. 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


    View full-size slide

  15. その他の教訓

    15

    ● 今回のような問題はあらかじめ予見することができたか?

    ○ かなり難しい。マイナーGemならともかく、Railsが依存しているようなGemがバージョンごと消滅する
    ようなケースを考慮するのはなかなか現実的ではなさそう 

    ● 今回の問題に対策するとしたらどんなことができたか?

    ○ ActiveStorageを使わないなら外しておく ということはできた

    ○ bundlerのキャッシュ を持っていればyankには耐えられた 

    ■ が、キャッシュ状態に依存するdeploy環境は健全なのかという問題もある 

    ○ 自前でRubyGemsのミラーサーバーを立てておき、buildが成功した時のGemバージョンを保持する
    ような機構を用意しておくとか 

    ○ 同業者のTwitterアカウントやコミュニティSlackなどを普段から見ておき、最新の情報を追いかけら
    れるようにしておく

    https://ruby-jp.github.io/ 


    View full-size slide

  16. おわりに

    16

    今回の問題を端的に表した画像→



    その他、具体的な対策をまとめた日本語情報で
    はruby-jp Slack議論をまとめた以下の
    @mametterさんまとめが参考になります

    https://hackmd.io/@mametter/mimemagic-info
    -ja

    refer: https://xkcd.com/2347/ 


    View full-size slide

  17. 次回以降もブラッシュアップしていきます

    感想・リクエストなどあればTwitter

    #ginzarails

    @morimorihoge

    @hachi8833

    までお声かけください

    17


    View full-size slide