連載
» 2010年03月18日 00時00分 公開

ゆったリラックス! CouchDBがあるところ(4):ここまでできる! CouchDBパワーアップ作戦 (2/3)

[z.ohnami,CouchDB JP]

CouchDBのユーザー認証

 実運用を考慮すると、ユーザー認証も気になります。データの参照や更新を特定のユーザーのみに制限したいという要件はよくあることです。

 CouchDBにもユーザー認証機能はありますが、正直なところあまり充実していません。CouchDBのコミュニティでも、セキュリティ面で課題があることは認識しており、認証などのセキュリティに関する開発が現在積極的に進められています。ここでは次の3つの手法を紹介していきます。

  • Basic認証
  • リバースプロキシを利用した認証
  • Cookieによる認証管理

Basic認証

 Basic認証を有効にすると、データベースの作成・削除や設定変更といった特定の操作は管理者権限(admin)を持ったユーザーのみが許可されるようになります。一般のユーザーは、ドキュメントに対する参照と更新のみができます。_config APIを使って、ユーザーを登録しましょう。local.iniを見ると、登録したユーザー名とハッシュ値に変換されたパスワードが追記されていることが分かります。

$ curl -X PUT http://site-a:5984/_config/admins/user1 -d'"password"' 
  
#/usr/local/etc/couchdb/local.ini の中 
  [admins] 
  user1 = -hashed-78ee325b0740490e578... 

 Futonの起動後にデータベースを選択すると、認証用のダイアログが現れて、ユーザー名とパスワードの入力が求められます。設定しておいたユーザー名とパスワードを入力しましょう。ここでキャンセルした場合は、一般ユーザーとしてデータベースを利用することになります。

fig1 図1 Futonでの認証画面

 curlやスクリプトでアクセスする場合は、指定するURLにユーザー名とパスワードを以下のように指定します。

$ curl -X PUT http://user1:password@site-a:5984/new_db 

リバースプロキシを利用した認証

 Basic認証では、ドキュメントへの参照と更新に制限をかけることができません。また、認証時のユーザーIDとパスワードは平文でやりとりされるため、セキュアな認証とはいえません。

 これらの課題への解決策として、リバースプロキシで認証の仕組みを用意する方法があります。例えば、Apacheを使って以下の設定を行うことで、リバースプロキシとしてCouchDBへの認証を肩代わりさせることができます。

 以下の例では認証の仕組みにダイジェスト認証を採用しています。まずはhtdigestコマンドでユーザーの情報を登録します。コマンドを実行すると、パスワードの設定を要求されます。

$ sudo htdigest -c /etc/apache2/digestpass "Digest Auth" user1 

 次に、Apacheの設定を変更します。httpd.confの書き方はUbuntu Linux 9.10 Server Editionのパッケージを利用した場合を想定しています。設定例の場合、site-a:8080を経由してlocalhost:5984のCouchDBにアクセスすることになります。

 #/etc/apache2/sites-available/default に以下を追加 
 <VirtualHost *:8080> 
    ServerAdmin z.ohnami@site-a 
    DocumentRoot "/usr/local/share/www" 
    ServerName site-a 
    AllowEncodedSlashes On 
    ProxyRequests Off 
    KeepAlive Off 
   <Location /> 
      AuthType Digest 
      AuthName "Digest Auth" 
      AuthUserFile "/etc/apache2/digestpass" 
      Require valid-user 
   </Location> 
   <Proxy *> 
      Order deny,allow 
      Deny from all 
      Allow from 127.0.0.1 
   </Proxy> 
  
   ProxyPass / http://localhost:5984/ nocanon 
   ProxyPassReverse / http://localhost:5984/ 
                                             
   ErrorLog "/var/log/apache2/couchdb.localhost-error_log" 
   CustomLog "/var/log/apache2/couchdb.localhost-access_log" common 
 </VirtualHost> 
#/etc/apache2/ports.conf に以下を記述 
  NameVirtualHost *:8080 
  Listen 8080

 mod_proxy,mod_proxy_http,mod_auth_digestを読み込むように設定します。

  $ sudo a2enmod proxy
  $ sudo a2enmod proxy_http
  $ sudo a2enmod auth_digest

 以上で設定完了です。Apacheを再起動させましょう。

 $sudo apache2ctl graceful

 http://site-a:8080/をブラウザのアドレスバーに入力し、"{"couchdb":"Welcome","version":"0.10.1"}"と返ってくれば成功です。また、以下のようにLocationディレクテブをVitualhostの設定内に記述すれば、DBやviewといった単位でアクセス制限をかけることもできます。

   <Location /want-restrict-dir> 
      Order deny,allow 
      Deny from all 
      ... 
   </Location>

 Apacheによるリバースプロキシについては、公式のWikiにも解説があります。他にも、Nginxを使用したが載っています。そちらもぜひご覧ください。

Cookieによる認証管理

 CouchDBではCookieを利用した認証機能が提供されています。CouchDB上に構築したWebアプリケーションの画面にログイン/ログアウト機能を実装するときなどに利用できます。一度認証されれば、しばらくの間は認証の手続きが不要になるため、ユーザーにとって快適なシステムを提供することができます。

 では、Cookieをどのように設定していくのか見ていきましょう。まずは、default.iniとlocal.iniの設定を以下のように変更します。

;/usr/local/etc/couchdb/default.ini 内部
[httpd] 
authentication_handlers = {couch_httpd_auth, cookie_authentication_handler}, 
  {couch_httpd_auth, default_authentication_handler}
;/usr/local/etc/couchdb/local.ini 内部
;Cookieのトークン生成時に使用する任意の値を指定します。 
[couch_httpd_auth] 
secret = abcdef

 CouchDB内にusersというデータベースを作成し、その中にCookieで認証すべきユーザーIDを登録します。登録には_user APIを使います。すでに管理者権限を設定している場合は、管理者でないとAPIを使うことはできません。

 API実行後にFutonでusersデータベースを見てみると、ユーザーの情報が1つのドキュメントとして登録されていることが分かります。

$ curl -X  PUT http://admin:password@site-a:5984/users
$ curl -X POST http://admin:password@site-a:5984/_user \ 
    -d 'username=user1&password=hoge&roles=_admin'  

 これで準備が整いました。_session APIで認証を実行してみます。API実行時に発行されるトークンを利用することで都度、認証情報を送受信しなくて済みます。

$ curl -vX POST http://site-a:5984/_session \ 
     -H 'application/x-www-form-urlencoded' \
     -d 'username=user1&password=user'

 “Set-Cookie: AuthSession=dXNlcjE6NEI0MzRBM0M ? ;”といったように、トークンが実行結果に現れたでしょうか。以後、認証が必要なときはこのトークンを指定します。

$ curl -vX PUT http://site-a:5984/testdb \ 
     -H 'X-CouchDB-WWW-Authenticate: Cookie'  \ 
     -H 'Content-Type: application/x-www-form-urlencoded' \ 
      --cookie AuthSession=dXNlcjE6NEI0MzRBM0M 〜

 トークンの有効期間は、timeoutというパラメーターを[couch_httpd_auth]に秒単位で指定して調整できます。Basic認証のユーザー登録と同じように、_config APIで変更可能です。セッション管理は便利ですが、初期設定では誰もがusersデータベースを閲覧、操作することができてしまいます。ユーザーの情報を管理する上では望ましくないでしょうから、実際の運用ではリバースプロキシなどを利用してアクセス制限をかける必要があるでしょう。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。