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

Thursday, August 29, 2013

Removing the middle man: WebCMIS runs in your browser and connects directly to CMIS

Tired of the unflexible Web interface you use all day to work on your documents repository?

Then try WebCMIS! (login:admin password:admin)

WebCMIS does not require any additional server: it runs in your Web browser, and communicates directly with any CMIS document management server (Alfresco, Nuxeo, SharePoint, Documentum, FileNet, Nemakiware, etc).

Bypassing the Web UI app server means better security (one less attack vector), faster access, and reduced hosting costs.

I created WebCMIS as an showcase for the new Browser Binding feature of CMIS 1.1, and have made it Open Source. It is rudimentary right now, but I hope it will grow into a very useful tool.


Wednesday, August 21, 2013

AlfrescoとLDAP(Active Directory)を連携させた時に、特定のユーザに管理者権限を与える

こんにちは。大谷です。 お盆休みは祖母の実家のある山梨に帰省しました。今年は涼を求めて富岳風穴というところに行ってみましたが、さすがは気温0度だけあって終始肌寒いくらいでした。娘がもう少し大きくなったら、西湖コウモリ穴とかにも行ってみたいなと考えています。こっちの方がアドベンチャー感があってよいかなと。

さて、今回は認証連携についてのお話です。AlfrescoをLDAPActive Directoryと連携させる際、特定のユーザにAlfrescoの管理者権限を付与したいという話がよくあります。その場合は、alfresco-global.propertiesに以下のプロパティを追記し、管理者権限を与えるユーザのIDをカンマ区切りで列挙します(Alfresco Community 4.2.cで確認)。

ldap.authentication.defaultAdministratorUserNames=Administrator,adtest1

Alfrescoを再起動してユーザadtest1でログインするとこんな感じで管理者コンソールにアクセスできるようになっていることが確認できると思います。




クライアントOSのログイン情報を利用したSSOなどでpassthru認証を利用する場合は、 passthru.authentication.defaultAdministratorUserNames を上記同様に指定する必要があります。詳しくはAlfresco Authentication Subsystems - alfrescowikiを参照してください。

Wednesday, August 14, 2013

Just released: Ready-to-use Kerberos server VM

Kerberos: A wonder for network security, but a pain to install.

Many applications wish they had Kerberos support, but have not taken the time to implement it, mostly by lack of a Kerberos server to perform the tests.

So I created a ready-to-use Kerberos server VM!
Feel free to use it: Download the VM, start it in VirtualBox, and you have a working Kerberos server to test your applications!

The VM is 450MB, based on Turnkey Linux Domain Controller and Kerberos installed via this excellent guide. Accounts are described on the Kerberos VM SourceForge page.

Monday, August 5, 2013

Alfresco勉強会#17 振り返り

こんにちは。てらしたです。  

8/1(木)に第17回Alfresco勉強会が開催されました。参加者が少しずつ増えてきているので、この調子で増えていって弊社メンバー以外の方から発表していただけるようになるといいなぁと思っています。

今回のテーマは以下の2つです。それぞれ簡単にご紹介します。

1. LDAP連携 入門(寺下)

資料はこちら

AlfrescoでLDAP連携を行う際の最も簡単な設定例を紹介しました。LDAP連携の目的として認証と同期の2つがあるのですが、認証のみ、同期のみ、認証+同期の3パターンについて設定例を示し、簡単なデモを行いました。

最後におまけとして、ファイルアップロードによるユーザ登録の方法についても紹介しました。この方法についてはこちらのエントリに詳しく載っています。アップロードボタンの名前が「ユーザーCSVファイルのアップロード」なのでCSVファイルしか受け付けないかと思いきや、実はExcelファイル(xlsxまたはxls)にも対応しています。CSVファイルでは日本語が含まれる場合に文字コードをUTF-8にしないと文字化けしてしまう、といったことに注意しなければならないので、ユーザの属性情報として登録する内容に日本語が含まれている場合はExcelファイルを使った方が無難だと思われます。

2. Alfrescoのカスタマイズの全体像(戸谷氏)

資料はこちら

タイトルにもあるとおり、Alfrescoをカスタマイズして実現したい機能がある場合に、どこに手を入れればいいのかという勘所を掴むための全体像についての説明でした。こういうことやりたいんだよなぁという具体的な要望がある方は、一度目を通しておくとどこを触ればよさそうかイメージが掴みやすいと思います。過去の勉強会発表資料へのリンクもまとめられているので、個別のカスタマイズ方法についてより詳しく知りたい場合にも役に立ちそうです。

次回の第18回勉強会は2013年9月25日(水)19時〜を予定しています。
内容の1つとして、もともとは今回の勉強会で発表する予定だった「Alfrescoのバックアップとリストア」が予定されています。発表はもう1枠残っているため、内容のご希望があればイベントのコメント欄に書いていただければと思います。それでは、ご参加をお待ちしております。