アプリケーションのプロキシ・ロールの構成

プロキシ・ロールを使用すると、認証アカウント(ロール)が別のロールを使用してCQL文を実行できるようになります。

DSEプロキシ管理を使用すると、ロールがログインし、別のロールとしてCQLクエリーを実行できるようになります。この機能は、Webサーバーなどのセキュアなミドルウェアで特に役立ちます。Webサーバーは一度ログインしたら、監査ログを完全な状態で保ち、DSEのロールベース・アクセス制御を活用して、クライアントとしてクエリーを代理実行できます。

アプリケーションの認証とロールの割り当て

アプリケーションは独自の認証情報(前述の例ではKerberosチケット)を送信し、この認証情報はDSEによって検証されます。アプリケーションの認証ユーザー名は、DSE Role Manager(DSEロール・マネージャー)に渡されます。role_management_optionsモード設定を使用する場合、認証ユーザーへのロールの割り当ては以下のように決定されます。
  • internalロールの認証ユーザーへの割り当ては、認証情報で指定されているユーザー名とロール名を照合することによって行われます。

    前述の例では、REALMを含むアプリケーションの完全なプリンシパル名がロール名と一致している必要があります。

  • ldapはLDAPで認証ユーザーを検索し、グループのリストを返した後で、グループ名をロール名と照合します。

    LDAPでは、アプリケーション・アカウントのグループ名が、別のロールを代理できるロールと一致していなければなりません。

    注: このロールには、グループの任意のメンバーを割り当てることができます。プロキシ・ロールをLDAPグループ管理とともに使用する場合は、アプリケーション・アカウントごとに単一のグループ・ロールのペアを作成します。LDAPのグループには、単一のメンバー(アプリケーション・アカウント)のみを含めます。
警告:

アプリケーション・アカウントのプライマリ・ロールを作成する場合は、Role Manager(ロール・マネージャー)によって正しいロールがそのアカウントと照合されるようにする必要があります。

プロキシ・ロールとアプリケーション・アカウントの関連付け

ユーザーがDSEに直接アクセスすることがない場合は、LOGIN、PASSWORD、SUPERUSERなど、認証スキームにバインドされていない、追加のオプションを持たないプロキシ・ロールの作成が推奨されます。そのため、権限管理オプションのスキーム・パーミッションがtrueに設定されている場合、そのロールを使用できるのは対応するアプリケーション・アカウントに限られます。

DSE Role Manager(DSEロール・マネージャー)内部モードを使用してアプリケーション・ロールを設定するには:

手順

  1. 認証スキームに基づいてアプリケーション・ロールを作成します。
    • 内部スキーム:
      CREATE ROLE role_name WITH LOGIN = true AND PASSWORD = 'password';
    • LDAPスキーム:
      CREATE ROLE LDAP_service_account WITH LOGIN = true;

      ここで、LDAP_service_accountは、認証オプションのユーザー・フィルターに指定された属性と一致します。たとえば、UIDやsamAccountNameのほか、ロール管理をLDAPで使用する場合にLDAPでサービス・アカウントに割り当てられているグループ名などです。

    • Kerberosスキーム:
      CREATE ROLE 'user_principal_name' WITH LOGIN = true;

      ここで、user_principal_nameは、大文字と小文字を区別する、完全なユーザー・プリンシパル名(jane@EXAMPLE.COMなど)と一致します。

      注: 内部スキームに対して認証を行う場合は、内部で格納されているパスワードが必要です。アプリケーション・ロールには、データベース・オブジェクトに対するパーミッションは必要ありません。
  2. loginオプションを指定せずにプロキシ・ロールを作成します。
    CREATE ROLE proxy_role_name;
    注: DataStaxでは、LOGIN、SUPERUSER、PASSWORD(内部で格納されているパスワード)を使用せずにプロキシ・アカウントをパーミッション・セットとして管理することを推奨しています。
  3. データベース・リソースに対するパーミッションをプロキシ・ロールに割り当てます。
    GRANT permission_name ON resource_name TO proxy_role_name;
    注: 割り当てるパーミッションごとにGRANT文を繰り返し実行します。パーミッションとサポートされているデータベース・オブジェクトの完全なリストについては、「CQLパーミッション・マトリックス」を参照してください。
  4. アプリケーション・ロールをプロキシ・ロールと関連付けます。
    • 認証後にすべての要求を代理で処理することをサービス・ロールに許可します。
      GRANT PROXY.LOGIN ON proxy_role_name TO service_role_name;
    • 認証後に各要求を代理で処理することをサービス・ロールに許可します。
      GRANT PROXY.EXECUTE ON proxy_role_name TO service_role_name;
  5. アプリケーション・ロールがプロキシ・ロールを使用してコマンドを実行できるかどうかをテストします。
    1. アプリケーション・ロールの認証情報を使用してCQLシェルを起動します。
      cqlsh -u application_role_name
      Password:
      警告: -pオプションを使用してコマンドラインからパスワードを指定すると、パスワードがプレーン・テキストで提供され、マシンにアクセスできるユーザーなら誰でもターミナル履歴を通じてパスワードにアクセスできる可能性があります。
    2. プロキシ・ロールを使用してセッションを開始します。
      EXECUTE AS proxy_role_name;
    3. CQL文を実行してパーミッションを検証します。
    4. プロキシ・ロールを使用してCQL文の実行を停止します。
      EXECUTE AS

プロキシ・ロールのもう1つのユース・ケースとして、ワークフローの追跡があります。この例では、サイクリングWebアプリケーションのアプリケーション・アカウントを作成し、チーム管理およびサイクリスト経費ワークフロー用に対応するプロキシ・アカウントを作成します。

  1. 内部認証を使用して、サイクリング・アプリケーションのロールを作成します。
    CREATE ROLE cycling_app WITH LOGIN=true AND PASSWORD='password'; GRANT EXECUTE ON INTERNAL SCHEME TO cycling_app;
    注: このロールを認証スキームにバインドする必要があるのは、認証オプションのスキーム・パーミッションがtrueに設定されている場合のみです。
  2. 経費管理のパーミッションを持つロールを作成します。
    1. プロキシ・ロールを作成します。
      CREATE ROLE cycling_expense_management;
    2. このロールにアクセス・パーミッションを割り当てます。
      GRANT MODIFY ON cycling.cyclist_expenses to cycling_expense_management;
  3. サイクリング・チーム管理用のロールを作成します。
    CREATE ROLE update_teams; GRANT MODIFY ON cycling.cyclist_name TO update_teams; GRANT MODIFY ON cycling.cyclist_teams TO update_teams; GRANT MODIFY ON cycling.cyclist_id TO update_teams;
  4. チーム管理ロールと経費管理ロールを使用してCQLコマンドを実行することをサイクリング・アプリケーションに許可します。
    GRANT PROXY.EXECUTE ON ROLE cycling_expense_management to cycling_app; GRANT PROXY.EXECUTE ON ROLE update_teams to cycling_app;
  5. サイクリング・アプリケーション・ロールからコマンドの実行をテストします。
    cqlsh -u cycling_app -p 'password' -e "EXECUTE AS cycling_expense_management; INSERT INTO cycling.cyclist_expenses (cyclist_name,expense_id,amount,description) VALUES ('Michael MATTHEWS',47,25,'lunch');"
    挿入コマンドではエラー・メッセージのみが返されるため、クエリーが正しいロールを使用して実行されたことだけが出力に示されます。
    Executing queries as cycling_expense_management.