組み込みシステムアクセス制御

システムアクセス制御プラグインは、コネクタレベルの承認の前に、グローバルレベルで承認を強制します。Prestoの組み込みプラグインのいずれかを使用するか、システムアクセス制御のガイドラインに従って独自のプラグインを提供できます。Prestoは3つの組み込みプラグインを提供します。

プラグイン名

説明

allow-all (デフォルト値)

すべての操作が許可されます。

読み取り専用

データまたはメタデータを読み取る操作は許可されますが、データまたはメタデータを書き込む操作は許可されません。読み取り専用システムアクセス制御の詳細を参照してください。

file

構成プロパティsecurity.config-fileで指定された構成ファイルを使用して、承認チェックが実行されます。ファイルベースのシステムアクセス制御の詳細を参照してください。

すべてのシステムアクセスを許可

このプラグインでは、すべての操作が許可されます。このプラグインはデフォルトで有効になっています。

読み取り専用システムアクセス制御

このプラグインでは、SELECTまたはSHOWなど、データまたはメタデータを読み取る操作を実行できます。システムレベルまたはカタログレベルのセッションプロパティの設定も許可されます。ただし、CREATEINSERTDELETEなど、データまたはメタデータを書き込む操作は禁止されています。このプラグインを使用するには、次の内容のetc/access-control.propertiesファイルを追加します。

access-control.name=read-only

ファイルベースのシステムアクセス制御

このプラグインを使用すると、ファイルにアクセス制御ルールを指定できます。このプラグインを使用するには、2つの必須プロパティを含むetc/access-control.propertiesファイルを追加します。access-control.namefileと等しくなければならず、security.config-fileは構成ファイルの場所と等しくなければなりません。たとえば、rules.jsonという名前の構成ファイルがetcにある場合は、次の内容のetc/access-control.propertiesを追加します。

access-control.name=file
security.config-file=etc/rules.json

構成ファイルはJSON形式で指定されます。

  • どのユーザーがどのカタログにアクセスできるかを定義するルールが含まれています(以下のカタログルールを参照)。

  • どのユーザーがどのスキーマにアクセスできるかを定義するスキーマアクセルルール(以下のスキーマルールを参照)。

  • どのプリンシパルがどのユーザーとして識別できるかを指定するプリンシパルルール(以下のプリンシパルルールを参照)。

このプラグインは現在、カタログアクセス制御ルール、スキーマアクセス制御ルール、およびプリンシパルルールをサポートしています。他の方法でシステムレベルのアクセスを制限する場合は、カスタムSystemAccessControlプラグインを実装する必要があります(システムアクセス制御を参照)。

更新

デフォルトでは、security.config-fileに変更が加えられた場合、変更をロードするためにPrestoを再起動する必要があります。Prestoの再起動を必要とせずにプロパティを更新するためのオプションのプロパティがあります。etc/access-control.propertiesで更新期間が指定されます。

security.refresh-period=1s

カタログルール

これらのルールは、特定のユーザーがアクセスできるカタログを管理します。ユーザーには、上から下に読み取られた最初のマッチングルールに基づいて、カタログへのアクセス権が付与されます。一致するルールがない場合、アクセスは拒否されます。各ルールは、次のフィールドで構成されます。

  • user(オプション):ユーザー名と照合する正規表現。デフォルトは.*です。

  • catalog(オプション):カタログ名と照合する正規表現。デフォルトは.*です。

  • allow(必須):ユーザーがカタログにアクセスできるかどうかを示す文字列。この値はallread-only、またはnoneにすることができ、デフォルトはnoneです。この値をread-onlyに設定すると、read-onlyシステムアクセス制御プラグインと同じ動作になります。

注記

デフォルトでは、すべてのユーザーがsystemカタログにアクセスできます。ルールを追加してこの動作をオーバーライドできます。

ブール値truefalseも、下位互換性をサポートするためにallowのレガシー値としてサポートされています。trueallに、falsenoneにマップされます。

たとえば、ユーザーadminのみがmysqlsystemカタログにアクセスできるようにし、すべてのユーザーがhiveカタログにアクセスできるようにし、ユーザーalicepostgresqlカタログへの読み取り専用アクセスを許可し、その他のアクセスをすべて拒否する場合は、次のルールを使用できます。

{
  "catalogs": [
    {
      "user": "admin",
      "catalog": "(mysql|system)",
      "allow": "all"
    },
    {
      "catalog": "hive",
      "allow": "all"
    },
    {
      "user": "alice",
      "catalog": "postgresql",
      "allow": "read-only"
    },
    {
      "catalog": "system",
      "allow": "none"
    }
  ]
}

スキーマルール

これらのルールを使用すると、スキーマの所有権を付与できます。スキーマの所有権を持つと、ユーザーはDROP SCHEMAALTER SCHEMACREATE SCHEMAを実行できます。ユーザーには、上から下に読み取られた最初のマッチングルールに基づいて、スキーマの所有権が付与されます。一致するルールがない場合、所有権は付与されません。各ルールは、次のフィールドで構成されます。

  • user(オプション):ユーザー名と照合する正規表現。デフォルトは.*です。

  • schema(オプション):スキーマ名と照合する正規表現。デフォルトは.*です。

  • owner(必須):ユーザーがスキーマの所有者と見なされるかどうかを示すブール値。デフォルトはfalse

例えば、ユーザーadminにすべてのスキーマの所有権を与え、すべてのユーザーをdefaultスキーマの所有者として扱い、ユーザーguestがどのスキーマの所有権も持てないようにするには、次のルールを使用できます。

{
  "catalogs": [
    {
      "allow": true
    }
  ],
  "schemas": [
    {
      "user": "admin",
      "schema": ".*",
      "owner": true
    },
    {
      "user": "guest",
      "owner": false
    },
    {
      "schema": "default",
      "owner": true
    }
  ]
}

プリンシパルルール

これらのルールは、プリンシパルと指定されたユーザー名の間の特定の一致を強制するために役立ちます。プリンシパルは、上から下に読み込まれた最初の一致するルールに基づいて、ユーザーとして認証されます。ルールが指定されていない場合、チェックは実行されません。どのルールにも一致しない場合、ユーザー認証は拒否されます。各ルールは次のフィールドで構成されています。

  • principal(必須):プリンシパルに一致し、グループ化する正規表現。

  • user(オプション):ユーザー名と照合する正規表現。一致した場合、allowの値に基づいて認証を許可または拒否します。

  • principal_to_user(オプション):プリンシパルに代入する置換文字列。置換の結果がユーザー名と同じ場合、allowの値に基づいて認証を許可または拒否します。

  • allow(必須):プリンシパルがユーザーとして認証できるかどうかを示すブール値。

注記

プリンシパルルールでは、少なくとも1つの基準を指定する必要があります。プリンシパルルールに両方の基準を指定した場合、いずれかの基準を満たすと、目的の結果が返されます。

以下は、LDAPおよびKerberos認証の完全なプリンシパル名の完全一致を実装しています。

{
  "catalogs": [
    {
      "allow": true
    }
  ],
  "principals": [
    {
      "principal": "(.*)",
      "principal_to_user": "$1",
      "allow": true
    },
    {
      "principal": "([^/]+)/?.*@.*",
      "principal_to_user": "$1",
      "allow": true
    }
  ]
}

ユーザーがKerberosプリンシパル名とまったく同じ名前を使用できるようにし、alicebobgroup@example.netという名前のグループプリンシパルを使用できるようにするには、次のルールを使用できます。

{
  "catalogs": [
    {
      "allow": true
    }
  ],
  "principals": [
    {
      "principal": "([^/]+)/?.*@example.net",
      "principal_to_user": "$1",
      "allow": true
    },
    {
      "principal": "group@example.net",
      "user": "alice|bob",
      "allow": true
    }
  ]
}