diff options
Diffstat (limited to 'doc/src')
| -rw-r--r-- | doc/src/sgml/ddl.sgml | 111 | ||||
| -rw-r--r-- | doc/src/sgml/ref/alter_policy.sgml | 2 | ||||
| -rw-r--r-- | doc/src/sgml/ref/create_policy.sgml | 6 | 
3 files changed, 114 insertions, 5 deletions
diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml index 98e897aeb6c..f9dc151a0cc 100644 --- a/doc/src/sgml/ddl.sgml +++ b/doc/src/sgml/ddl.sgml @@ -1615,7 +1615,7 @@ REVOKE ALL ON accounts FROM PUBLIC;     and foreign key references, will bypass row security to ensure that     data integrity is maintained.  Care must be taken when developing     schemas and row level policies to avoid a "covert channel" leak of -   information through these referntial integrity checks. +   information through these referential integrity checks.    </para>    <para> @@ -1674,6 +1674,115 @@ CREATE POLICY user_policy ON users     normal privileges system.    </para> +  <para> +   Below is a larger example of how this feature can be used in +   production environments, based on a unix password file. +  </para> + +<programlisting> +-- Simple passwd-file based example +CREATE TABLE passwd ( +  username              text UNIQUE NOT NULL, +  pwhash                text, +  uid                   int  PRIMARY KEY, +  gid                   int  NOT NULL, +  real_name             text NOT NULL, +  home_phone            text, +  extra_info            text, +  home_dir              text NOT NULL, +  shell                 text NOT NULL +); + +CREATE ROLE admin;  -- Administrator +CREATE ROLE bob;    -- Normal user +CREATE ROLE alice;  -- Normal user + +-- Populate the table +INSERT INTO passwd VALUES +  ('admin','xxx',0,0,'Admin','111-222-3333',null,'/root','/bin/dash'); +INSERT INTO passwd VALUES +  ('bob','xxx',1,1,'Bob','123-456-7890',null,'/home/bob','/bin/zsh'); +INSERT INTO passwd VALUES +  ('alice','xxx',2,1,'Alice','098-765-4321',null,'/home/alice','/bin/zsh'); + +-- Be sure to enable row level security on the table +ALTER TABLE passwd ENABLE ROW LEVEL SECURITY; + +-- Create policies +-- Administrator can see all rows and add any rows +CREATE POLICY admin_all ON passwd TO admin USING (true) WITH CHECK (true); +-- Normal users can view all rows +CREATE POLICY all_view ON passwd FOR SELECT USING (true); +-- Normal users can update their own records, but +-- limit which shells a normal user is allowed to set +CREATE POLICY user_mod ON passwd FOR UPDATE +  USING (current_user = username) +  WITH CHECK ( +    current_user = username AND +    shell IN ('/bin/bash','/bin/sh','/bin/dash','/bin/zsh','/bin/tcsh') +  ); + +-- Allow admin all normal rights +GRANT SELECT, INSERT, UPDATE, DELETE ON passwd TO admin; +-- Users only get select access on public columns +GRANT SELECT +  (username, uid, gid, real_name, home_phone, extra_info, home_dir, shell) +  ON passwd TO public; +-- Allow users to update certain columns +GRANT UPDATE +  (pwhash, real_name, home_phone, extra_info, shell) +  ON passwd TO public; +</programlisting> + +  <para> +   As with any security settings, it's important to test and ensure that +   the system is behaving as expected.  Using the example above, this +   demonstrates that the permission system is working properly. +  </para> + +<programlisting> +-- admin can view all rows and fields +postgres=> set role admin; +SET +postgres=> table passwd; + username | pwhash | uid | gid | real_name |  home_phone  | extra_info | home_dir    |   shell    +----------+--------+-----+-----+-----------+--------------+------------+-------------+----------- + admin    | xxx    |   0 |   0 | Admin     | 111-222-3333 |            | /root       | /bin/dash + bob      | xxx    |   1 |   1 | Bob       | 123-456-7890 |            | /home/bob   | /bin/zsh + alice    | xxx    |   2 |   1 | Alice     | 098-765-4321 |            | /home/alice | /bin/zsh +(3 rows) + +-- Test what Alice is able to do +postgres=> set role alice; +SET +postgres=> table passwd; +ERROR:  permission denied for relation passwd +postgres=> select username,real_name,home_phone,extra_info,home_dir,shell from passwd; + username | real_name |  home_phone  | extra_info | home_dir    |   shell    +----------+-----------+--------------+------------+-------------+----------- + admin    | Admin     | 111-222-3333 |            | /root       | /bin/dash + bob      | Bob       | 123-456-7890 |            | /home/bob   | /bin/zsh + alice    | Alice     | 098-765-4321 |            | /home/alice | /bin/zsh +(3 rows) + +postgres=> update passwd set username = 'joe'; +ERROR:  permission denied for relation passwd +-- Allowed to change her own real_name, but no others +postgres=> update passwd set real_name = 'Alice Doe'; +UPDATE 1 +postgres=> update passwd set real_name = 'John Doe' where username = 'admin'; +UPDATE 0 +postgres=> update passwd set shell = '/bin/xx'; +ERROR:  new row violates WITH CHECK OPTION for "passwd" +postgres=> delete from passwd; +ERROR:  permission denied for relation passwd +postgres=> insert into passwd (username) values ('xxx'); +ERROR:  permission denied for relation passwd +-- Alice can change her own password +postgres=> update passwd set pwhash = 'abc'; +UPDATE 1 +</programlisting> +   </sect1>   <sect1 id="ddl-schemas"> diff --git a/doc/src/sgml/ref/alter_policy.sgml b/doc/src/sgml/ref/alter_policy.sgml index 37615fcab5d..ab717f31c51 100644 --- a/doc/src/sgml/ref/alter_policy.sgml +++ b/doc/src/sgml/ref/alter_policy.sgml @@ -94,7 +94,7 @@ ALTER POLICY <replaceable class="parameter">name</replaceable> ON <replaceable c        security-barrier qualification to queries which use the table        automatically.  If multiple policies are being applied for a given        table then they are all combined and added using OR.  The USING -      expression applies to records which are being retrived from the table. +      expression applies to records which are being retrieved from the table.       </para>      </listitem>     </varlistentry> diff --git a/doc/src/sgml/ref/create_policy.sgml b/doc/src/sgml/ref/create_policy.sgml index 3c5bdc69cdc..eff062c114f 100644 --- a/doc/src/sgml/ref/create_policy.sgml +++ b/doc/src/sgml/ref/create_policy.sgml @@ -81,7 +81,7 @@ CREATE POLICY <replaceable class="parameter">name</replaceable> ON <replaceable     referenced table.  These issues can be addressed by carefully crafting     policies which prevent users from being able to insert, delete, or update     records at all which might possibly indicate a value they are not otherwise -   able to see, or by using generated values (eg: surrogate keys) instead. +   able to see, or by using generated values (e.g.: surrogate keys) instead.    </para>    <para> @@ -218,7 +218,7 @@ CREATE POLICY <replaceable class="parameter">name</replaceable> ON <replaceable           records from the relation which pass the <literal>SELECT</literal>           policy will be returned, even if other records exist in the relation.           The <literal>SELECT</literal> policy only accepts the USING expression -         as it only ever applies in cases where records are being retrived from +         as it only ever applies in cases where records are being retrieved from           the relation.         </para>        </listitem> @@ -272,7 +272,7 @@ CREATE POLICY <replaceable class="parameter">name</replaceable> ON <replaceable           for the <literal>DELETE</literal>, and rows which are not visible           through the <literal>SELECT</literal> policy may be deleted if they           pass the <literal>DELETE</literal> USING policy.  The -         <literal>DELETE</literal> policy only accept the USING expression as +         <literal>DELETE</literal> policy only accepts the USING expression as           it only ever applies in cases where records are being extracted from           the relation for deletion.         </para>  | 
