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。
やることはこれだけなんだけれども、結局結構な紆余曲折をしてしまった。セキュリティ対策は大事なことだけれど、なんとか設定で逃げられるようにはできないものだろうか…。
コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他