ページの先頭行へ戻る
Enterprise Postgres 15 セキュリティ運用ガイド

B.5 機密オブジェクト操作関数

関数名

戻り値

説明

pgx_add_object_to_confidential_level(confidential_matrix_name varchar, confidential_level_name varchar, object_name json)

void

指定された機密マトリクスの機密管理ロールだけが、この関数を実行できます。

confidential_level_nameで指定された機密レベルに、object_nameで指定された機密オブジェクトを追加します。

この関数は、内部的にGRANT文を使って、この機密レベルに関連付けされた機密権限にしたがって、機密グループロールに権限を付与します。

ただし、機密オブジェクトの型がrowsetの場合は、内部的にCREATE POLICY文を使って、この機密レベルに関連付けされた機密権限にしたがって、機密グループロールに権限を付与します。また、POLICYを有効化するために、ENABLE ROW LEVEL SECURITY 句を指定して、ターゲットのテーブルに対してALTER TABLE文を実行します。

今は、table型の機密オブジェクトとして外部テーブルを登録することはできません。

PUBLICへ権限を付与した機密オブジェクトをターゲットにするときには、注意が必要です。なぜならば、PUBLICへ権限を付与することは、機密マトリクスに登録されたすべてのロールへ権限を与えていることと同じだからです。もし、各ロールにPUBLICを利用して間接的に付与された権限が、そのロールに与えられるべきではないことが機密権限で定義されているならば、この関数は失敗します。同様に、機密マトリクスに登録されていないグループロールを利用して間接的に付与された権限も、この関数は検査します。このとき、継承のチェインを先祖まで検査します。

rowset型の機密オブジェクトの場合には、ターゲットのテーブルに、この機能を使わずに作成されたPOLICYが定義されていたならば、付与された権限の内容にかかわらず、この関数は失敗します。

このような検査は、機密グループロールや機密グループに登録されたロールだけを対象にします。そうではないロールをターゲットにしたPOLICYが存在していても、この関数は失敗しません。

object_nameは、以下のように指定します。rowsetだけが少し異なります。以下の例では、複数の種類のオブジェクトを1回で登録しようとしています。

'[{
  "type":"schema",
  "object":[
    {"schema":"schema1"},
    {"schema":"schema2"}
  ]
},

{
  "type":"table",
  "object":[
    {
      "schema":"schema1",
      "table":["table1","table2"]
    },
    {
      "schema":"schema2",
      "table":["table8","table9"]
    }
  ]
},

{
  "type":"column",
  "object":[
    {
      "schema":"schema1",
      "table":"table1",
      "column":["column1", "column2"]
    },
    {
      "schema":"schema1",
      "table":"table2",
      "column":["column8", "column9"]
    }
  ]
}]'

rowset型の場合には、次に示す例のように、どのような行の集合であるかを定義し、名前を付けます。この名前は、pgx_remove_object_from_confidential_level関数で、rowset型の機密オブジェクトを除去するときに、その機密オブジェクトを識別するために使用します。

この例では、以下のことを示しています。

  • schema1.table1において、条件式(user = current_user OR manger = current_user)がtrueであるような行の集合(rowset)を表している。

  • manager=current_userがtrueである場合には、INSERTするレコードまたはUPDATE後のレコードのcol1の値がゼロよりも大きくなければならない。

'[{
  "type":"rowset",
  "object":[
    {
      "schema":"schema1",
      "table":"table1",
      "rowset_name":"rowset1",
      "rowset_expression": [
        {
          "as":"permissive",
          "using":"user = current_user"
        },
        {
          "as":"permissive",
          "using":"manager = current_user",
          "with check":"col1 > 0"
        }
      ]
    }
  ]
}]'

各キー(as、using、wich check)は、CREATE POLICY文の同じ名前の句と同じ意味です。

このことからも分かるように、rowset_expressionに指定した配列の1つの要素は、CREATE POLICY文で作成する1つのPOLICYオブジェクトに対応します。

実際に、この関数は内部的にCREATE POLICY文を配列の要素の数だけ実行します。このときのPOLICYの名前は、'pgx_cms_policy_${cpolid}'です。

${cpolid}は、この拡張が自動的にナンバリングします。

<注意>

pgx_cms_policy_で始まるような名前のポリシーを作成しないでください。この関数が失敗する可能性があるためです。

pgx_remove_object_from_confidential_level(confidential_matrix_name varchar, confidential_level_name varchar, object_name json)

void

機密レベルから機密オブジェクトを除去します。

指定された機密マトリクスの機密管理ロールだけが、この関数を実行できます。

confidential_level_nameで指定された機密レベルから、object_nameで指定された機密オブジェクトを除去します。

object_nameのフォーマットは、pgx_add_object_to_confidential_level関数のobject_nameと同じです。ただし、rowset_expressionキーは省略できます。また、指定されても単に無視します。これによって、単純にpgx_add_object_to_confidential_levelのobject_nameに指定したJSON形式の値を、修正せずに指定できます。

このときに、機密権限にもとづいて機密グループに付与されていた権限は、剥奪されます。

もし、機密オブジェクトがrowset型の場合には、内部的に作成していたポリシーを削除します。

このときに、テーブルに関連づけられたポリシーがない場合には、内部的にDISABLE ROW SECURITY句を付けたALTER TABLE文を実行して、行レベルセキュリティを無効にします。