第 6 章 アクセス制御

1. デフォルトのアクセス権限

明示的なアクセス権限の設定を行っていない場合、あるアカウント配下のコンテナおよびオブジェクトへのアクセスは、admin 権限を持ったユーザのみに許されます。

2. コンテナのACL設定

Swift では、コンテナ単位でアクセス制御を行うことが可能です。各コンテナは ACL (アクセスコントロールリスト) を持っており、コンテナ配下のオブジェクトの読み出し権限と、オブジェクトへの書き込み権限を各々設定できます。ACL には、Swift のユーザに基づく指定と、referer ヘッダによる指定方法があり、それぞれ複数の設定を登録することができます。

コンテナへの ACL 設定は、コンテナに対する PUT リクエスト、または POST リクエストにて行います。X-Container-Read ヘッダには読み出しアクセス用の ACL 情報を載せ、X-Container-Write ヘッダには書き込みアクセスに関する ACL 情報を載せます。コンテナの新規作成時に ACL を設定することも、コンテナ作成後に後から ACL を設定変更することも可能です。
コンテナの ACL 設定は、コンテナに対する HEAD または GET にて読み出すことができます。

3. ユーザベースのアクセス制御

ACL として、コンテナへのアクセスを許可するアカウントの名前、もしくはユーザの名前をカンマ “,” を挟んで列挙します。ユーザは「アカウント名:ユーザ名」の書式で指定します。「アカウント名」のみを指定した場合、そのアカウント配下の全てのユーザにアクセス権が与えられます。

アカウント orion が持つコンテナ foo に、ACL を設定する例を紹介します。この例では、「アカウント orion 配下の全てのユーザ」および「アカウント pleiades 内のユーザ beth と joe 」に対して、オブジェクトを読み出す権限が与えられます。
書き込み権限は、「アカウント orion 配下のユーザ mary と cris」に与えています。アカウント orion に属するユーザでも、ユーザ bob と tony はコンテナ foo 配下にオブジェクトを書き込むことができません。

アカウントの admin 権限を持っているユーザは、コンテナの ACL 設定の状態に関わらず、常にコンテナ配下のオブジェクトの読み書き、およびコンテナの設定変更が可能です。この例の場合、アカウント orion のユーザ joe はコンテナ foo の ACL に登録されていませんが、admin 権限を持っているためコンテナ foo 配下のオブジェクトに書き込むことができます。

POST /v1/AUTH_orion-cabinet/foo HTTP/1.1
User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: objstore.example.jp
Accept: */*
X-Auth-Token: AUTH_tk4967d312608749e39c49956dd889589d
X-Container-Read: orion,pleiades:beth,pleiades:joe
X-Container-Write: orion:mary,orion:cris
HTTP/1.1 204 No Content
Content-Length: 0
Content-Type: text/html; charset=UTF-8
Date: Fri, 22 Jul 2011 12:56:52 GMT

コンテナ foo に対して HEAD リクエストを送信することにより、指定した ACL が期待とおりに登録されていることを確認できます。

HEAD /v1/AUTH_orion-cabinet/foo HTTP/1.1
User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/.2.3.3 libidn/1.15
Host: objstore.example.jp
Accept: */*
X-Auth-Token: AUTH_tk4967d312608749e39c49956dd889589d
HTTP/1.1 204 No Content
X-Container-Object-Count: 1
X-Container-Write: orion:joe,orion:cris
X-Container-Read: orion,pleiades:beth,pleiades:joe
X-Container-Bytes-Used: 4
Content-Length: 0
Date: Fri, 22 Jul 2011 12:56:52 GMT

4. リファラに基づくアクセス制御

リファラ (HTTP referer) ヘッダを利用し、アクセス元ごとに読み出しアクセスの許可・禁止を設定できます。ただし、書き込みアクセスを許可することはできません。
読み出しアクセス用の ACL に、以下の形式でアクセスを許可するホストとドメインをカンマ”,”を挟んで複数列挙します。

 

  • ホストは、”.r:ホスト名 (FQDN表記)” と指定する。
  • ドメインは、”.r:.ドメイン名” もしくは “.r:*.ドメイン名” という表記で指定する。
  • “.r:*” という指定を行った場合は、すべてのアクセスの許可を意味する。
  • “.r:-ホスト名(FQDN表記)”、”.r:-.ドメイン名”、”.r:-*.ドメイン名” という表記は、その指定されたホストやドメインからのアクセスを禁止することを意味する。

この例では、アカウント orion のコンテナ baz 配下のオブジェクトを、サイト example.com と valinux.co.jp に対して公開するように設定しています。この時、アカウント orion 内の全ユーザもコンテナ配下のオブジェクトを参照できるよう、アカウント名 orion を ACL の設定に加えることにします。

POST /v1/AUTH_orion-cabinet/baz HTTP/1.1
User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: objstore.example.jp
Accept: */*
X-Auth-Token: AUTH_tk52b871ea91cc4fe9a78c130029545bcd
X-Container-Read: .r:.example.com,r:.valinux.co.jp,orion

このリファラによる ACL 設定により、上記 2 つのサイト (example.com、valinux.co.jp) から、baz コンテナ配下のオブジェクトを参照できるようになります。しかし、この設定だけでは baz コンテナ配下のオブジェクトの一覧取得 (コンテナ baz に対する GET リクエスト)はエラー (401 Unauthorized)になります。オブジェクトの一覧取得を許可しても良いときは、読み出しアクセス用の ACL にさらにキーワード “.rlistings” を加える必要があります。

example.com サイトのうち、spam.example.com からのアクセスだけは禁止したいこともあるでしょう。
その場合、これらを反映したACLの設定は次のようになります。

X-Container-Read: .r:.example.com,r:.-spam.example.com,.r:.valinux.co.jp,orion,.rlistings

5. 特権ユーザとアクセス制御

特権を与えられたユーザは、ここで説明してきた ACL 設定の影響は受けません。admin 権限を与えられたユーザは、ユーザが属するアカウント内の全てのコンテナやオブジェクトに対して、あらゆるアクセスが許されます。 reseller 権限を与えられたユーザも ACL 設定の影響を受けません。reseller 権限はサービス提供事業者用の権限であり、ACL 設定に関わらず全てのアカウントのあらゆるコンテナとオブジェクトのアクセスを許されます。