OpenmeetingsをそれでもProxyで動作させる(危険)

Openmeetingsを取り巻く環境…

  • OpenmeetingsがCSRF(Cross-Site Request Forgery)に対応したこと。
  • Google ChromeがHTTPSの通信でないとカメラとマイクを使わせないこと。

を考慮したとき、OpenmeetingsをHTTPSで動かすことが正しい、となって設定を試してみたけれども、フル機能をユーザーに使ってもらおうとした時にはハードルが高すぎる。



これは4部作の3つ目。
OpenmeetingsインストールからProxy設定(3.0.5~3.2.1近辺)
OpenmeetingsをSSLで動作させる設定(3.3.0以降)
OpenmeetingsをそれでもProxyで動作させる(危険)
Openmeetingsのアップグレード & ChromiumとFlash

Javaが内部で持っているキーストアに、ルート証明書をインストールするとか、もう荒行レベルと感じるだろうと思う。

Apacheの設定では逃げられない(逃げられるのかもしれないけれど、見つけられなかった)ので、Openmeetingsの設定でどうにかできないかと頑張ってみたものの、それも上手く働かせられなかった。

これは、ソースに手を入れるしかない…


えぇ、完全に危険なソース変更です。わざわざCSRF対応しているのに、それを無効化するのですから。

この問題の性質を調べてみると、クローズドな環境(ユーザーを自動で登録させていないので、アカウントは全て関係者のみ)ならば、いたずらされても問題は広がりにくい。

※IPAがわかりやすく情報公開をしてくれている。
3. CSRF (クロスサイト・リクエスト・フォージェリ)

ということで、ウチの中だけで考えれば「割り切り案件」と判断した。


やることは、

  • ソースのダウンロード
  • ソースの改変
  • コンパイル
  • モジュールの差し替え

である。

ソースは公式からたどって必要なバージョンを落としてくる。
3.3.0以降はCSRF対策されているので、お試しで3.3.2とした。

ファイルを展開したら、そのディレクトリに入る。
以降 $src と表記。

■ソースの改変

$src/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
//Add custom resource loader at the beginning, so it will be checked first in the
//chain of Resource Loaders, if not found it will search in Wicket's internal
//Resource Loader for a the property key
getResourceSettings().getStringResourceLoaders().add(0, new LabelResourceLoader());
getJavaScriptLibrarySettings().setJQueryReference(getV3());
getRequestCycleListeners().add(new CsrfPreventionRequestCycleListener() {
        @Override
        public void onEndRequest(RequestCycle cycle) {
                Response resp = cycle.getResponse();
                if (resp instanceof WebResponse && !(resp instanceof WebSocketResponse)) {
                        WebResponse wresp = (WebResponse)resp;
                        wresp.setHeader("X-XSS-Protection", "1; mode=block");
                        wresp.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains; preload");
                        wresp.setHeader("X-Content-Type-Options", "nosniff");
                        wresp.setHeader("X-Frame-Options", xFrameOptions);
                        wresp.setHeader("Content-Security-Policy", contentSecurityPolicy);
                }
        }

        @Override
        protected boolean isChecked(IRequestHandler handler) {
                if (handler instanceof WebSocketRequestHandler || handler instanceof WebSocketMessageBroadcastHandler) {
                        return false;
                }
                return super.isChecked(handler);
        }
        // CSRF対策の無効化
        @Override
        protected boolean isEnabled() {
                return false;
        }
});

■コンパイル

Mavenを使うのでインストール。

$ sudo apt install mvn

※コマンドの使い方は、「Maven2使い方メモ」がとてもわかり易かった。

コンパイル。情報は公式「How to Build a Distribution」にある。

$ mvn clean install -P allModules,unpacked,mysql -DskipTests=true -Dwicket.mode=DEVELOPMENT

※色々ダウンロードしながらコンパイルするので、長時間が掛かる。

■モジュールの差し替え

コンパイルした結果のモジュールを差し替える。

$red5/webapps/openmeetings/WEB-INF/lib/openmeetings-web-3.3.2.jar

$src/openmeetings-web/target/openmeetings-web-4.0.3/WEB-INF/lib/openmeetings-web-4.0.3.jar 2018/04/28修正

に置き換える。


後は、red5.shを再起動すればOK。

やることはこれだけなんだけれども、結局結構な紆余曲折をしてしまった。セキュリティ対策は大事なことだけれど、なんとか設定で逃げられるようにはできないものだろうか…。

お気軽にどうぞ ~ 投稿に関するご意見・感想・他

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です