RubyEncoderを使えばRubyやRuby on Railsのファイルをコンパイルし、暗号化することにより、保護できる。コード化したスクリプトはその後で、RubyEncoderのローダーにかけられる。RubyEncoderを開発したのはInovica社(リンク)で、同社はPHP向けにもSourceGuardian(リンク)という同様のツールを制作している。
RubyEncoderはさらに、プロジェクトの一部分だけを保護することもでき、Rubyファイルとコンフィギュレーション・ファイルにプレーンテキストが使える。もしくはアプリケーションを特定のホストや制限時間内のみに限定して、トライアル版を作成できる(RubyEncoderのFAQには(リンク)、さらにたくさんのシナリオが紹介されている)。
InfoQでは、RubyEncoderの開発リーダー、Alexander Belonosov氏に、同プロジェクトの技術面をさらに詳しく教えてもらった。
InfoQ: コード化やローディング/実行はどのように機能しているのでしょうか。
Rubyのソースコードを中間的な内部フォーマットにコンパイルし、そのあとで暗号化します。ひとたびコード化されたら、オリジナルのソースコードは保護されたスクリプトには存在しません。保護されたスクリプトを実行するためにはRubyEncoder Loaderのインストールが必要です。このローダーはRubyの機能拡張で、保護されたスクリプトを解読し、実行します。保護されたスクリプトはプラットフォームに依存しませんが、これは非常に重要なことで、サポートされているあらゆるプラットフォーム上で保護されたスクリプトが使えるわけです。ローダーはOSとプラットフォームに応じて異なります。RubyEncoderで保護されたスクリプトを実行するプラットフォームとしては、OSX、Linux、FreeBSDをサポートしており、Solaris x86についてはサポートを始めたばかりです。近い将来にはWindowsや他のUNIXにもサポートを広げる予定です。
InfoQ: ソースは中間フォーマットに翻訳されるのですね。実行には独自のインタプリタがあるのでしょうか。それともオリジナルのRubyソースコードを復元するのでしょうか。
オリジナルのRubyソースコードが復元されることはありません。内部の中間形式を利用します。[..] 内部的なバイナリであり、実行可能で、オリジナルのソースコードに復号することは決してありせん。
InfoQ: 独自のインタプリタがあるのでしたら、Rubyのメタプログラミング、その他の動的な振る舞いとどのようにして相互作用するのでしょうか。いかなるものであれ、制限はまったくない のでしょうか。
.現在のところ、ローダーはコードの内部表現をRubyに渡し返し、Rubyが実行します。こうすることでRubyコードに最大限の互換性と動的な性質を保持できます。しかし、他の方法についても観察を続けているので、プロダクトの次期バージョンでは変更するか、新しいスキーマを実装する可能性もあります。とにかくRubyEncoderで保護されたプロダクトはエンドユーザーには見えませんし、Ruby開発者向けには、アップデートして効果を高めたエンコーダーを用意する予定です。
InfoQ: ParseTreeのジェムを使えば、クラスやメソッドのパースツリーにアクセスできます。RubyEncoderはこのアクセスに影響しますか。
ParseTreeはRuby内部の調査やコードの最適化などといったことに利用できる素晴らしい機能拡張です。ParseTreeの使用が制限されるか、という意味の質問でしたら、答えはノーです。しかし、ParseTreeのようなツールを使用する場合に理解しておくべき重要なことは、Ruby内部から何を抽出する必要があり、いかにしてそれを見つけ出すかです。また、どういった理由で必要なのか、時間はどれほどかかるか、最終結果はどうなるか、といったことの考慮も重要と思います。:-)
InfoQ: たとえばJRubyなど、他のRuby実装をサポートする予定はありますか。JavaにローダーをポートしてJRubyのコードを走らせることは可能でしょうか。
現在のサポートは標準のRubyのみです。JRubyは素晴らしいプロジェクトで、成長しています。しかし、対象とする市場が少々違っています。
InfoQ: JRubyとコンパイルしたRubyのソースを使って、ByteCodeで難読化すれば、RubyEncoderが提供するのと同じ保護になるでしょうか。
JRubyとコンパイルしたRubyのソースを使えば、非常に望ましいレベルの保護が出来上がるかもしれません。しかしそれは、Java環境向けです。私たちの当初の目的はネイティブのRubyとRuby-on-Railsプロジェクトを保護することであり、プロダクトの強化や拡張についての検討は、後になってから決めるかもしれません。
InfoQ: RubyEncoderの記述にはどの言語を使っているのでしょうか。Rubyを使った後にセルフエンコードしているのでしょうか。
いいえ、Rubyのメタプログラミングを悪く言うつもりはありません :-)。でも、RubyEncoderとローダーはCで書いています。
RubyEncoderは商用製品であり(リンク)、30日間の試用版もある(リンク)。
みなさんはRubyEncoderのようなコード保護ツールをお使いになったことがあるだろうか。どのような経験をお持ちだろうか。