web-dev-qa-db-ja.com

Postgresカラムレベルセキュリティ

データベースtestdb内にスキーマsnowがあります。ユーザー向けに列レベルのセキュリティを実現しようとしています。私のユーザーはbossmanagerおよびインターン。このテーブルをすべてスーパーユーザーmeとして設定しました。それらはすべてグループcompanyに属しています。

私が持っているテーブルはこれです:snow.company_table

 property_id |     property_address     |     city     | Zip_code | state
-------------+--------------------------+--------------+----------+-------
           1 | 2564 Wescam Court        | Reno         |    89511 | NV    
           2 | 1732 Rubaiyat Road       | Grand Rapids |    49603 | MI    
           3 | 4094 Francis Mine        | Standish     |    96128 | CA    
           4 | 3193 Ashton Lane         | Briggs       |    78608 | TX    
           5 | 1519 North Street        | Alamosa      |    81102 | CO    

bossmanagerinternはすべてcompany内にあります。

CREATE ROLE company WITH LOGIN CONNECTION LIMIT 0;  
CREATE ROLE boss WITH LOGIN CONNECTION LIMIT 1 PASSWORD '1234' IN ROLE company;
CREATE ROLE manager WITH LOGIN CONNECTION LIMIT 1 PASSWORD '1234' IN ROLE company;
CREATE ROLE intern WITH LOGIN CONNECTION LIMIT 1 PASSWORD '1234 IN ROLE company;

bossがすべての列を選択できるようにアクセスできるようにしたいのですが、managerproperty_id、zipcodeおよびstate、およびinternproperty_idstate。これらのコマンドを使用して、ロールとその付与を作成しました。列の特権を付与するために、最初にすべてを取り消してから、付与し直しました。

REVOKE ALL ON snow.property_table FROM snow; --remove all privileges automatically assigned to everybody
GRANT ALL ON snow.company_table TO boss; --boss has the ability to do anything to this table
GRANT SELECT( property_id, Zip_code, state) ON snow.company_table TO manager;
GRANT SELECT( property_id, state) ON snow.company_table TO intern;  

詳細については、\ dn +を実行すると結果が得られます。

  Name  |    Owner     |      Access privileges       |
--------+--------------+------------------------------
 snow   |     me       | me=UC/me                    +|
        |              | boss=U/me                   +|
        |              | company=U/me                +|
        |              | manager=U/me                +|
        |              | intern=U/me                  |

私の問題は:ユーザーに接続するとき(例intern)、私はアクセスする権限がありません上記の表。列の権限を保持したいのですが、指定した列のみをユーザーに表示し、全体に対する完全な権限は付与しませんcompany_table

ここにエラーがあります:

STATEMENT:  select * from snow.company_table;
ERROR:  permission denied for table company_table
1
smulard

管理者または上司として、そのユーザーが表示できるようにする列のみを含むユーザー固有のビューを作成できます。次に、基になるテーブルではなく、特定のビューへのアクセスをユーザーに許可します。これを行う場合、列のアクセスはビューを介して既に制限されているため、最初に列の権限を使用する必要はありません。不要な列を誤ってビューに含めた場合、ビューがビューの呼び出し元ではなくビューの所有者として実行されるため、列の権限によって保存されることはなく、とにかく列を提供します。

または、各ユーザーが自分の都合に合わせて独自のビューを作成することもできます。その場合、基になるテーブルの列特権は引き続き適用されます。

多くの人は、「select *」は開発とテストのための松葉杖であり、とにかく本番コードで使用すべきではないと考えていることに注意してください。

1
jjanes