Friday, September 20, 2013

Alfresco 4.2.dから追加されたCSRF Policyをひとまず無効にする

こんにちは、かわべです。
今回はAlfresco4.2.dから新規追加されたCSRF filterについて紹介します。内容はこちらの記事(英語)を参考にしています。

CSRFとは?


CSRF(クロスサイトリクエストフォージェリ)とは、悪意ある人間の細工によって、サイトの閲覧者が意図しない操作を本人も気づかないまま実行させるものです。CSRF対策のひとつにサイト内で発行するトークンを利用する方法があり、Alfresco Shareでもこの方法でCSRF対策を行うようになりました。

ユーザがShareでログインし、ページが遷移するごとに新規トークンが生成されます。Share上からHTTPリクエストを行う場合、そのページで生成されたトークンをリクエストへ埋め込みます。このトークンをチェックすることで、外部から送り込まれた不正なリクエストでないことを判断することができるという仕組みです。org.alfresco.web.site.servlet.CSRFFilterが実際の処理を行うクラスです。

さて、参考記事には「CSRF filterがカスタムコードに影響を与えることはそれほど多くありません」とあるのですが、4.2.dで動作確認中、CSRF filterが原因でカスタムモジュールが正常に動作しないということがありました。出力されたエラーログと、CSRF filterを簡単に無効にする方法を見てみましょう。

CSRF filterによるCSRF攻撃検知


正常に動作しなかったのは、認証のために連携したLDAPサーバのパスワードをShare上から変更するためのダッシュレットです。これは過去にaegifで作成したものです。




フォームで入力したパスワードをLDAPサーバへ送信して更新する…というものなのですが、パスワードを変更しようと送信ボタンをクリックしたところ、失敗してしまいました。




share.logを確認してみると…エラーが出ています。

(抜粋)
17:44:16,125 INFO  [org.alfresco.web.site.servlet.CSRFFilter] Possible CSRF attack noted when comparing token in session and request header. Request: POST /share/page/components/dashlets/ldaputil
17:44:16,166 ERROR [org.alfresco.web.site] javax.servlet.ServletException: Possible CSRF attack noted when comparing token in session and request header. Request: POST /share/page/components/dashlets/ldaputil


ダッシュレットからのPOSTリクエストがCSRFだと疑われてしまい、処理が実行されなかったようです。

CSRF Policyをとりあえず無効化する


せっかく追加された新機能、最大限に活用したいところですが、とりあえずコードには手を入れずにモジュールを動かしたい場合もあるかと思います。今回は定義ファイルを変更することでfilterを無効化する方法を紹介します。変更する定義ファイルはshare-config-custom.xmlです。

<tomcat_dir>/shared/classes/alfresco/web-extension/share-config-custom.xml

ここに、以下の定義を追加します。

<config evaluator="string-compare" condition="CSRFPolicy" replace="true">
   <filter>
      <rule>
         <request>
            <method>POST|PUT|DELETE</method>
            <session>
               <attribute name="_alf_USER_ID">.*</attribute>
            </session>
         </request>
         <action name="assertReferer">
            <param name="always">false</param>
         </action>
         <action name="assertOrigin">
            <param name="always">false</param>
         </action>
      </rule>
   </filter>
</config>

replace=trueとなっているため、元のCSRF Policy定義はすべて上書きされます。
(ちなみに、元のCSRF Policy定義は 
<tomcat_dir>/webapps/share/WEB-INF/classes/alfresco/share-security-config.xml
にあります。)

新しい定義に置き換えることで、リクエストに伴うトークンの比較は行われなくなります。ただし、RefererとOriginがリクエストヘッダに存在する場合、そのチェックは引き続き行います。

share-config-custom.xmlを変更したら、Alfrescoを再起動して、同じダッシュレットからもう一度LDAPパスワードの変更を試してみます。

今度はCSRF filterに引っかかることなく、無事にパスワードが変更できました。




注意!


今回ご紹介した方法ではデフォルトのCSRF Policyを弱めることになります。本来は発行されたトークンを正しく利用するよう、カスタムモジュールを変更することが推奨されているという点にご注意ください。具体的な変更方法は、最初にリンクした記事を参考にしてみてください。

Tuesday, September 10, 2013

Alfresco 4.2.dがリリースされたので早速インストールしてみた

こんにちは。おおたにです。

週末(と言っても先々週)に青森旅行に行き、十和田湖や奥入瀬あたりを散策してきたのですが、見事に暴風&土砂降りで思い描いた自然とはいまいち触れ合えませんでした。ただ、八戸で食べた寿司はとてもおいしかったので、旅行としてはそれなりに満足したものとなりました。


ついにリリースされたAlfresco Community 4.2.d


さて、そんな奥入瀬に宿泊しているタイミングでついにリリースされましたAlfresco Community 4.2.d! 現実世界に戻ってきて仕事がひと段落ついてからインストールしてみたところ、あれ、なんかおかしい?(インストールはこちらあたりを参照してください)


Shareのヘッダが表示されない?文字化けしてる?


まずは手元のWindowsにインストールしてアクセスしてみたところ、見事にShareのヘッダが表示されませんでした。



テストのために、CentOSにもインストールしてアクセスしてみたところ、Shareのヘッダは表示されたものの、文字化けしたりしなかったりでした(自分の環境では正常だったのですが、他のメンバの環境では文字化けしました…)。サービス起動か起動スクリプト直叩きかによって結果が異なったりする模様です。こうなると俄然環境変数周りが怪しくなってくるのですが、詳しい話はそのうち誰かがしてくれるはずです。ちなみに一応つたない(怪しい)英語でJIRAに報告済です…。


ちなみに、正常に表示されるとこんな感じです。マイナーバージョンアップなのにヘッダが劇的にかっこよくなってます!(まあそのためにこんな問題が発生してるんですが…)



ワークアラウンドはJAVA_OPTSでのデフォルトエンコーディング指定


ちょっと調べてみると、ヘッダのhtmlを生成するJavaScriptコードに文字化けしたリソースが入っていることが確認できました(ちなみに文字化けしないものは全て\uxxxxエスケープされてます)。なので、ワークアラウンドとしてJavaの起動オプションJAVA_OPTSでデフォルトエンコーディングをUTF-8に指定してみます。

LinuxやMacOSのインストーラを利用した場合は <tomcat_dir>/scripts/ctl.sh のJAVA_OPTSに"-Dfile.encoding=UTF-8"を追加し、Windowsインストーラを利用した場合は、以下のコマンドを実行して起動オプションに"-Dfile.encoding=UTF-8"を追加します。

<tomcat_dir>/bin/tomcat7w.exe //ES//AlfrescoTomcat 



Alfrescoを再起動すると、ヘッダが正しく表示されるようになるはずです。


さいごに


今回はヘッダ表示がうまくいかない場合のワークアラウンドの紹介だけになってしまいましたが、次はAlfresco Community 4.2.dの新機能を見ていく予定です。既に英語圏のblogでは色々紹介されているのですが、実際に触ってみた感じなどを日本語で紹介できればと思います。

Thursday, September 5, 2013

Liferay Social Networkingアプリケーションの紹介

はじめまして。こんにちは。かわべと申します。
先日aegifに新規メンバとして参加し、この度めでたく初ブログ記事を書くことになりました。何卒よろしくお願いします。

さて、この記事ではLiferayのSocial Networkingというアプリケーションを紹介します。このアプリケーションを追加することによって、LiferayでもFacebookライクなソーシャル機能をポートレットで実現することができるようになります。ソーシャル機能、とだけ聞いてもピンとこないかもしれませんが、最後まで読むとイメージを掴んでいただけると思います。ではアプリケーションのインストールから始めましょう。

Social Networkingアプリケーションの追加


Social NetworkingにもCommunity Edition(CE), Enterprise Edition(EE)がありますが、ここではEEを利用して説明していきます。(CEでも同様の手順でインストールが可能です)

まず、管理者でログインし、コントロールパネルからマーケットプレイスへと移動します。そこから"Social Networking EE"というアプリケーションを選択、ダウンロードします。以上でアプリケーションの追加は完了です。

一見何も変化はありませんが、ひとまずサイトのトップページにでも移動してみます。そこで、ページ上部の「追加」から「詳細」を選択し、追加ポートレット選択画面を表示します。デフォルトの設定では「Wiki」「コミュニティ」などのカテゴリが上から並んでいるはずですが、その中で「ソーシャル」のカテゴリをクリックして開くと…ここにSocial Networkingアプリケーションのダウンロードによって追加可能となったポートレットが並んでいます。



追加前・追加後の比較画像がないので、変化が…わからないですね!(すいませんスクリーンショットを取り忘れました)

さて気を取り直して追加可能となったポートレットについて。Social Networkingのポートレットはその機能によって
  • サイトページに追加するもの
  • ユーザの公開ページに追加するもの
の2種類に大別されます。それぞれ見ていきましょう。


サイトページに追加するもの

Map, Meetups, Members, Members' Activities


・Map
Mapはユーザの現在位置を表示することができます。
ただし、実際にMapポートレットを追加してみるとわかりますが、Mapを利用するためにはマーケットプレイスから更にポートレットを追加する必要があります。今回は割愛しますが、設定方法はこちらに解説されています。

・Meetups
日時、参加者数の上限、参加費などを指定してイベント(Meetup)を作成することができます。現状ではイベントを作成可能なのは管理者のみとなっています。イベントに対してはユーザそれぞれが参加・不参加の意思表示をすることができ、管理者は参加者を把握できます。



・Members
サイトメンバの一覧を表示します。メンバ名をクリックすると、そのメンバの公開ページへと移動します。



・Members' Activities
サイトメンバの直近のアクティビティを表示します。


ユーザの公開ページに追加するもの

Summary, Friends, Friends' Activities, Wall


ユーザの公開ページに追加するポートレットはFriends機能に関連するものです。Facebookを利用したことがある方には馴染みのあるものだと思いますが、Friends機能はユーザ間で密なコミュニケーションを取ることを容易にしてくれます。

・Summary
ユーザがポータルに登録している情報の一部を、簡単な自己紹介として表示します。他のユーザと友人になりたい場合は、友人になりたいメンバの公開ページにアクセスし、Summaryから友人申請をすることができます。



友人申請を受けた場合、その通知はリクエストというポートレット(「ソーシャル」カテゴリに最初から存在しています)に表示されます。友人機能を利用するためにはこちらのポートレットも追加しておきます。



・Friends
Friendsポートレットには、友人になったユーザがリスト表示されます。

・Friends' Activities
友人の直近のアクティビティを表示します。

・Wall
友人であるユーザ同士は、互いのWallにコメントを記入することができます。気軽なコミュニケーションツールとして利用できます。


おわりに


Social Networkingのポートレットを設置することで、使い勝手のよいソーシャルなページを作成することができるでしょう。もちろん他のポートレットと同様、表示権限の設定などを行うこともできるので、要件に合わせて設定してみてください。