kagamihogeの日記

kagamihogeの日記です。

Apache Shiro Terminologyをテキトーに訳した

Apache Shiroのチュートリアルの一部で用語集に関する部分の https://shiro.apache.org/terminology.html をテキトーに訳した。

Apache Shiro Terminology

この用語集を読み終えるには2分程度ですが、Shiroではこれらの用語の理解は重要です。以下の用語と概念はドキュメント全般で使われているため、セキュリティ一般とShiroを素早く理解するのにこの用語集を活用してください。

セキュリティはそこで使われる用語が原因で大変混乱しやすいです。コアの概念を明確化にして理解しやすく整理したので、ShiroのAPIにその概念がどのように反映されているかを見てみてください。

  • 認証(Authentication)
    認証とは、サブジェクトのアイデンティティを検証するプロセスで、基本的には、ある人物が自分を誰であると言ってきているのかを確認するものです。認証の試行が成功すると、アプリケーションはそのサブジェクトをアプリケーションが期待するものである、として信頼します。
  • 認可(Authorization)
    認可、別名ではアクセス制御(Access Control)は、あるユーザ/サブジェクトに許可されるまたは許可されない何かを決定するプロセスです。このプロセスは通常、サブジェクトのロールやパーミッションを参照したり処理することで実行され、その後、リクエストされたリソースや関数に対するアクセスの許可もしくは拒否が行われます。
  • 暗号(Cipher)
    暗号は、暗号化または復号化を処理するアルゴリズムを指します。通常、アルゴリズムはキーと呼ばれる情報に依存します。暗号化はキーによって変化するため、複合化をキー無しで行うのは非常に難しくなります。
    暗号には色々なバリエーションがあります。ブロック暗号(Block Ciphers)は通常は固定サイズのシンボルのブロックを処理し、一方、ストリーム暗号(Stream Ciphers)はシンボルの逐次的なストリームを処理します。対称暗号(Symmetric Ciphers)は暗号化と複合化に同一のキーを使うのに対し、非対称暗号(Asymmetric Ciphers)は異なるキーを使います。また、非対称暗号のキーはもう片方からは生成出来ないので、公開鍵/秘密鍵のペアを生成して公開鍵を公開します。
  • クレデンシャル(Credential)
    クレデンシャルとは、ユーザ/サブジェクトのアイデンティティを検証するための情報です。プリンシパルと共にユーザ/サブジェクトはクレデンシャルをサブミットし、認証でそれを検証します。クレデンシャルはユーザと関連付けられています。クレデンシャルは、通常は個々のユーザ/サブジェクトだけが知る秘密事項で、パスワード・PGPキー・生体情報・などが挙げられます。
    プリンシパルとの関連では、唯一人だけがそのプリンシパルと'ペア'になる正しいクレデンシャルを把握しています。カレントのユーザ/サブジェクトがシステムに格納されているものと正しくマッチするクレデンシャルを与えられる場合、システムはカレントのユーザ/サブジェクトが自身を誰と言ってきてるのかを信頼します。信頼の度合いはよりセキュアなクレデンシャルを使うことで高まります(例えば、生体認証 > パスワード)。
  • 暗号化(Cryptography)*1
    暗号化は想定外のアクセスから情報を防御するもので、データを隠したり読めない形式に変換するなどします。Shiroには二つのコア要素があり、一つは公開鍵または秘密鍵でemailなどのデータを暗号化するciphersと、もう一つはパスワードなどのデータを不可逆的に暗号化するハッシュ(メッセージダイジェストなど)があります。
  • ハッシュ(Hash)
    ハッシュ関数は、片方向で、入力ソースの不可逆変換を行い、メッセージをエンコードしたハッシュ値はメッセージダイジェストと呼びます。ハッシュは、パスワード・デジタルフィンガープリント・基底バイト配列のデータ、に対して使うことが多いです。
  • パーミッション(Permission)
    パーミッションとは、少なくともShiroが解釈するものとしては、アプリケーションにおける最も細かい機能の記述の表明です。パーミッションセキュリティポリシーにおける最も低レベルの構成要素で、アプリケーションが"何を"実行可能かのみ定義します。"誰が"そのアクションを実行可能かは記述しません。パーミッションは振る舞いの表明でしかありません。以下はパーミッションの例です。
    • ファイルをオープンする。
    • ‘/user/list'のwebページを閲覧する。
    • ドキュメントを印刷する。
    • ‘jsmith'ユーザを削除する。
  • プリンシパル(Principal)
    プリンシパルとは、アプリケーションユーザ(サブジェクト)の何らかの識別属性(identifying attribute)です。'識別属性'となりうるモノは、ユーザの姓名・社会保障番号・ユーザID、など、ただそれだけのモノです。
    Shiroはサブジェクトのプライマリープリンシパルと呼ばれるものを参照します。プライマリープリンシパルはアプリケーション全体でサブジェクトを一意に識別する何らかのプリンシパルです。理想的なプライマリープリンシパルRDBMSのユーザーテーブルのプライマリキーとなるユーザ名やIDなどが該当します。あるアプリケーションにおいてユーザ(サブジェクト)のプライマリープリンシパルは一つだけしか存在しません。
  • レルム(Realm)
    レルムとは、ユーザ・ロール・パーミッションなどのアプリケーション固有のセキュリティデータにアクセスするコンポーネントです。セキュリティ用のDAO(Data Access Object)と言えます。レルムはアプリケーション固有のデータをShiroの形式に変換し、それから理解しやすい単一のサブジェクトAPIをShiroが提供します。このAPIの裏で動くものは、データソースの数やアプリケーション固有のデータの提供方法が何であっても構いません。
    レルムは通常は、RDBLDAPディレクトリ・ファイルシステムやその他類似のリソースと1対1の関係を持ちます。そのため、レルムインタフェースの実装は認証データ(ロール・パーミッションなど)の取得にデータソース固有のAPI、例えばJDBC・ファイルIO・HibernateJPAなどのデータアクセスAPI、を用います。
  • ロール(Role)
    The definition of a Role can vary based on who you talk to.*2 たいていのアプリケーションにおいて、暗黙的なセキュリティポリシー定義が関の山です。Shiroはロールをシンプルな名前のパーミッションのコレクションとして使うのを推奨します。言い換えると、アプリケーションは一つ以上のパーミッション宣言を集約したものに一意の名前を付けます。
    これにより、多数のアプリケーションで使われている暗黙的定義よりも明確な定義が作れます。Shiroが想定するデータモデルにすれば、セキュリティポリシーの運用をより強力なものにできるでしょう。
  • セッション(Session)
    セッションは一つのユーザ/サブジェクトと関連付けられるステートフルなデータコンテキストです。このユーザ/サブジェクトは、ある一定期間ソフトウェアシステムと相互作用を行います。サブジェクトがアプリケーションを使用している間、セッションからデータを追加・取得・削除可能で、それからアプリケーションは必要に応じてそのデータを使用可能です。ユーザ/サブジェクトがアプリケーションをログアウトあるいはタイムアウトするとセッションは終了します。
    HttpSessionを知っている人向けに補足すると、ShiroのSessionは同様な目的に使えますが、ShiroのセッションはServletコンテナやEJBコンテナが無い環境でも使用可能な点が異なります。
  • サブジェクト(Subject)
    サブジェクトは、基本的にはアプリケーションユーザをセキュリティ視点から見た'ビュー'を意味する、ちょっと格式ばった言い方のセキュリティ用語です。サブジェクトは常に人間である訳ではなく、アプリケーションを外部から呼び出す何らかのプロセスを意味します。また、ある一定期間ごとに何らかの処理を実行するデーモンシステムアカウント(cronジョブなど)の場合もあります。サブジェクトは基本的には、アプリケーションを用いて何らかの処理をするエンティティを指します。

Lend a hand with documentation

Apache Shiroで何かを作る際にこのドキュメントが役に立つことを願いますが、コミュニティが成長すればドキュメントも常に拡張していきます。もしShiroプロジェクトに興味がある場合、必要だと感じたドキュメントの追加・修正・収集をお願いしたいと思います。ほんの少しの助けであってもコミュニティは前進し、結果としてShiroも前進します。

ドキュメントをコントリビュートする最も簡単な方法はこのページ下のEditリンクをクリックしてプルリクエストをサブミットするか、User ForumあるいはUser Mailing List送信します。

*1:この用語集のみ読む限りでは、Cryptographyの一つにCipherがある、って感じらしい。俺自身セキュリティにはさして詳しくないんで、どっちも『暗号』にしてしまってます。

*2:よくわからん