Thread: Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Tom Lane
Date:
Stephen Frost <sfrost@snowman.net> writes:
> * Tom Lane (tgl@sss.pgh.pa.us) wrote:
>> At least on dromedary, this seems to be the problem:
>> 
>> pg_audit.c: In function 'stack_pop':
>> pg_audit.c:387: warning: format '%ld' expects type 'long int', but argument 3 has type 'int64'
>> pg_audit.c: In function 'stack_valid':
>> pg_audit.c:406: warning: format '%ld' expects type 'long int', but argument 3 has type 'int64'
>> pg_audit.c:406: warning: format '%ld' expects type 'long int', but argument 4 has type 'int64'
>> pg_audit.c: In function 'log_audit_event':
>> pg_audit.c:676: warning: format '%ld' expects type 'long int', but argument 4 has type 'int64'
>> pg_audit.c:676: warning: format '%ld' expects type 'long int', but argument 5 has type 'int64'
>> 
>> Will push a fix shortly and we'll see what happens.

> Ah, ok.

Pushed that, but some further notes:

* The actual audit reports ought to be ereport() not elog().  I made them
so but did not insert an errcode().  ISTM that it would likely be a good
thing to assign a not-used-for-any-other-purpose errcode for this, but I'm
not terribly sure what category to put it in.

* The comments in the code betray utter ignorance of how logging actually
works, in particular this:
* Administrators can choose which log level the audit log is to be logged* at.  The default level is LOG, which goes
intothe server log but does* not go to the client.  Set to NOTICE in the regression tests.
 

All the user has to do is change client_min_messages and he'll see all the
reports, which means if you think that letting the user see the audit
reports is a security problem then you have a hole a mile wide.

(I assume BTW that we're not considering it a security problem that
superusers can trivially escape auditing.)
        regards, tom lane



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Stephen Frost
Date:
* Tom Lane (tgl@sss.pgh.pa.us) wrote:
> Stephen Frost <sfrost@snowman.net> writes:
> > Ah, ok.
>
> Pushed that, but some further notes:

Thanks!  Looking much better.

> * The actual audit reports ought to be ereport() not elog().  I made them
> so but did not insert an errcode().  ISTM that it would likely be a good
> thing to assign a not-used-for-any-other-purpose errcode for this, but I'm
> not terribly sure what category to put it in.

Right, I had seen that too and had intended to change it, but somehow
missed it in the other changes I was doing.  I'll take a look at the
categories and try to figure out what makes sense.

> * The comments in the code betray utter ignorance of how logging actually
> works, in particular this:
>
>  * Administrators can choose which log level the audit log is to be logged
>  * at.  The default level is LOG, which goes into the server log but does
>  * not go to the client.  Set to NOTICE in the regression tests.

I had rewored that last night and will reword it again to be more clear.

> All the user has to do is change client_min_messages and he'll see all the
> reports, which means if you think that letting the user see the audit
> reports is a security problem then you have a hole a mile wide.

There are certainly use-cases for this where that's not an issue and
also ones where the user wouldn't be able to use pg_audit due to this.

I'll update the docs to make the risk of this clear.  At least for the
use-cases we've been involved in, they've not been concerned about this.
Still, any thoughts you have on this would certainly be welcome.  I've
been thinking about how we might re-route and tag messages in the
backend for a number of years and I feel like this summer I'll have
resources and time to spend working towards it.  Providing a way to
decide if a message should be sent only to the server log, or only to
the client, or to an external system (syslog, pgQ, rabbitMQ, etc), or to
some combination of those, is definitely one of the items on that list.

> (I assume BTW that we're not considering it a security problem that
> superusers can trivially escape auditing.)

No, that's entirely understood and expected, which is one of the reasons
it'd be good to reduce the number of superusers running around.
Thanks!
    Stephen

Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Noah Misch
Date:
On Thu, May 14, 2015 at 01:38:49PM -0400, Tom Lane wrote:
> * The comments in the code betray utter ignorance of how logging actually
> works, in particular this:
> 
>  * Administrators can choose which log level the audit log is to be logged
>  * at.  The default level is LOG, which goes into the server log but does
>  * not go to the client.  Set to NOTICE in the regression tests.
> 
> All the user has to do is change client_min_messages and he'll see all the
> reports, which means if you think that letting the user see the audit
> reports is a security problem then you have a hole a mile wide.

That indicates the patch's general readiness:

> +        /* These are DDL, unless they are ROLE */
> +        case LOGSTMT_DDL:
> +            className = CLASS_DDL;
> +            class = LOG_DDL;
> +
> +            /* Identify role statements */
> +            switch (stackItem->auditEvent.commandTag)
> +            {
> +                /* We know these are all role statements */
> +                case T_GrantStmt:
> +                case T_GrantRoleStmt:
> +                case T_CreateRoleStmt:
> +                case T_DropRoleStmt:
> +                case T_AlterRoleStmt:
> +                case T_AlterRoleSetStmt:
> +                    className = CLASS_ROLE;
> +                    class = LOG_ROLE;
> +                    break;

Not T_AlterDefaultPrivilegesStmt?

> +static void
> +pg_audit_ProcessUtility_hook(Node *parsetree,
> +                             const char *queryString,
> +                             ProcessUtilityContext context,
> +                             ParamListInfo params,
> +                             DestReceiver *dest,
> +                             char *completionTag)
> +{
> +    AuditEventStackItem *stackItem = NULL;
> +    int64 stackId = 0;
> +
> +    /*
> +     * Don't audit substatements.  All the substatements we care about should
> +     * be covered by the event triggers.
> +     */
> +    if (context <= PROCESS_UTILITY_QUERY && !IsAbortedTransactionBlockState())

They aren't covered.  A GRANT inside CREATE SCHEMA escapes auditing:

create extension pg_audit;
SET pg_audit.log = 'role';
SET pg_audit.log_catalog = OFF;
SET pg_audit.log_level = 'warning';
SET pg_audit.log_parameter = on;
SET pg_audit.log_relation = on;
SET pg_audit.role = auditor;
SET pg_audit.log_statement_once = ON;
create table t ();
create role alice;
grant select on t to alice;
revoke select on t from alice;
\z t
create schema foo grant select on public.t to alice;
\z t

I'm wary of the ease of forgetting to run CREATE EXTENSION.  One gets much
auditing from GUCs alone; for example, we audit "CREATE TABLE t ()" with or
without the extension, but only with the extension do we audit the inner
CREATE TABLE of "CREATE SCHEMA s CREATE TABLE t ()".  A user that creates a
database without creating the extension might look at the audit messages and
mistakenly think the database is all set.

> +    /* Return objects affected by the (non drop) DDL statement */
> +    query = "SELECT UPPER(object_type), object_identity\n"
> +            "  FROM pg_event_trigger_ddl_commands()";

This SPI query neglects to schema-qualify its function calls.

> +    DefineCustomStringVariable(
> +        "pg_audit.log",
> +
> +        "Specifies which classes of statements will be logged by session audit "
> +        "logging. Multiple classes can be provided using a comma-separated "
> +        "list and classes can be subtracted by prefacing the class with a "
> +        "- sign.",
> +
> +        NULL,

The short_desc is several lines long, while long_desc is NULL.

> --- /dev/null
> +++ b/contrib/pg_audit/sql/pg_audit.sql

I do applaud the breadth of test coverage.

> +-- Set pg_audit parameters for the current (super)user.
> +ALTER ROLE :current_user SET pg_audit.log = 'Role';
> +ALTER ROLE :current_user SET pg_audit.log_level = 'notice';

Do not ALTER the initial login role in a regression test.  In the installcheck
case, the role belongs to the test operator; it is not ours to modify.

> +CREATE USER user1;
> +ALTER ROLE user1 SET pg_audit.log = 'ddl, ROLE';
> +ALTER ROLE user1 SET pg_audit.log_level = 'notice';
> +
> +--
> +-- Create, select, drop (select will not be audited)
> +\connect - user1

Adding new CREATE USER statements, as opposed to CREATE ROLE, to regression
tests is almost always wrong.  During "make check" on Windows, such users
cannot connect.  "REGRESS_OPTS = --create-role=user1" fixes that problem but
does not help installcheck to pass under MD5 authentication (which it did as
of commit c82725e).  Skip past these challenges by using SET statements
instead of ALTER ROLE + \connect.

> +    <para>
> +      Settings can be specified globally (in
> +      <filename>postgresql.conf</filename> or using
> +      <literal>ALTER SYSTEM ... SET</>), at the database level (using
> +      <literal>ALTER DATABASE ... SET</literal>), or at the role level (using
> +      <literal>ALTER ROLE ... SET</literal>).  Note that settings are not
> +      inherited through normal role inheritance and <literal>SET ROLE</> will
> +      not alter a user's <literal>pg_audit</> settings.  This is a limitation
> +      of the roles system and not inherent to <literal>pg_audit</>.
> +    </para>

This paragraph applies equally to every SUSET GUC in PostgreSQL.

> +    <para>
> +      The <literal>pg_audit</> extension must be loaded in
> +      <xref linkend="guc-shared-preload-libraries">.  Otherwise, an error
> +      will be raised at load time and no audit logging will occur.
> +    </para>

The test suite is a counterexample to that.

> +    <para>
> +      Object audit logging logs statements that affect a particular relation.
> +      Only <literal>SELECT</>, <literal>INSERT</>, <literal>UPDATE</> and
> +      <literal>DELETE</> commands are supported.  <literal>TRUNCATE</> is not
> +      included because there is no specific privilege for it.
> +    </para>

PostgreSQL has a TRUNCATE privilege:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }   [, ...] | ALL [ PRIVILEGES ] }   ON {
[TABLE ] table_name [, ...]        | ALL TABLES IN SCHEMA schema_name [, ...] }   TO role_specification [, ...] [ WITH
GRANTOPTION ]
 

> +      <para>
> +        Object-level audit logging is implemented via the roles system.  The
> +        <xref linkend="guc-pgaudit-role"> setting defines the role that
> +        will be used for audit logging.  A relation (<literal>TABLE</>,
> +        <literal>VIEW</>, etc.) will be audit logged when the audit role has
> +        permissions for the command executed or inherits the permissions from
> +        another role.  This allows you to effectively have multiple audit roles
> +        even though there is a single master role in any context.
> +      </para>

This is clever, but it means that any user can add to the list of audited
objects by granting individual object permissions, or the role itself, to the
audit role.  Crowding the audit log is one thing, but object owners can also
use REVOKE to stop auditing an object.  Perhaps the answer is to put all
important objects under trusted owners, but that's a heavy restriction.  Do
other RDBMS auditing features behave this way?


Stephen, please revert this feature.  Most pg_audit bugs will create security
vulnerabilities, so incremental development in the PostgreSQL tree is the
wrong approach.  The feature needs substantial hacking, then an additional
committer's thorough review.  (The above sampling of defects and weak areas
was not a thorough review.)

nm



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Stephen Frost
Date:
Noah,

* Noah Misch (noah@leadboat.com) wrote:
> On Thu, May 14, 2015 at 01:38:49PM -0400, Tom Lane wrote:
> > * The comments in the code betray utter ignorance of how logging actually
> > works, in particular this:
> >
> >  * Administrators can choose which log level the audit log is to be logged
> >  * at.  The default level is LOG, which goes into the server log but does
> >  * not go to the client.  Set to NOTICE in the regression tests.
> >
> > All the user has to do is change client_min_messages and he'll see all the
> > reports, which means if you think that letting the user see the audit
> > reports is a security problem then you have a hole a mile wide.
>
> That indicates the patch's general readiness:

While I agree that the comment was poorly worded and agreed with Tom
that it should be changed, I do not agree that it's indicative of the
patch's readiness, nor do I feel it's an issue that clients can see the
auditing information, provided that it's clearly documented.

I'm planning to commit a number of documentation updates (along with
other updates) to pg_audit to address that.  Using ereport() for query
information isn't anything new- we do that in auto_explain, and we also
report the query in the CONTEXT lines of error messages.  We should (and
I plan to) document that in the appropriate places and note that there
are risks associated with it (eg: with security definer functions).

> > +        /* These are DDL, unless they are ROLE */
> > +        case LOGSTMT_DDL:
> > +            className = CLASS_DDL;
> > +            class = LOG_DDL;
> > +
> > +            /* Identify role statements */
> > +            switch (stackItem->auditEvent.commandTag)
> > +            {
> > +                /* We know these are all role statements */
> > +                case T_GrantStmt:
> > +                case T_GrantRoleStmt:
> > +                case T_CreateRoleStmt:
> > +                case T_DropRoleStmt:
> > +                case T_AlterRoleStmt:
> > +                case T_AlterRoleSetStmt:
> > +                    className = CLASS_ROLE;
> > +                    class = LOG_ROLE;
> > +                    break;
>
> Not T_AlterDefaultPrivilegesStmt?

Agreed, that would be more sensible under ROLE than DDL.

> > +static void
> > +pg_audit_ProcessUtility_hook(Node *parsetree,
> > +                             const char *queryString,
> > +                             ProcessUtilityContext context,
> > +                             ParamListInfo params,
> > +                             DestReceiver *dest,
> > +                             char *completionTag)
> > +{
> > +    AuditEventStackItem *stackItem = NULL;
> > +    int64 stackId = 0;
> > +
> > +    /*
> > +     * Don't audit substatements.  All the substatements we care about should
> > +     * be covered by the event triggers.
> > +     */
> > +    if (context <= PROCESS_UTILITY_QUERY && !IsAbortedTransactionBlockState())
>
> They aren't covered.  A GRANT inside CREATE SCHEMA escapes auditing:

Actually, they are covered.  David and I discussed this extensively,
prior to your review, and concluded that this approach works because the
items not under the EventTrigger charter are shared catalogs, updates to
which wouldn't ever make sense to happen under a CREATE SCHEMA.  I do
hope that we are able to improve on EventTriggers by supporting them for
shared catalogs one day, but that is a discussion for another thread.

The issue which you discovered here is that GRANTs were categorized
under CLASS_ROLE, but we have a check at the top of the DDL event
trigger which does an early-exit if DDL isn't selected for inclusion.
That clearly needs to be changed, so that the GRANT under CREATE SCHEMA
is caught and logged properly.

We put a great deal of thought into any and all places where we filter
data to do our best to prevent this from happening, taking steps beyond
what a simple module would do to capture information and make sure that
something is logged, even when we don't have all of the information
available.  That isn't to say there aren't bugs- certainly issues have
been found through the various reviews and comments provided by multiple
individuals now, and I don't pretend that there are no others, but I
don't believe that this module is particularly more bug-ridden than
other contrib modules or even parts of core.

> I'm wary of the ease of forgetting to run CREATE EXTENSION.  One gets much
> auditing from GUCs alone; for example, we audit "CREATE TABLE t ()" with or
> without the extension, but only with the extension do we audit the inner
> CREATE TABLE of "CREATE SCHEMA s CREATE TABLE t ()".  A user that creates a
> database without creating the extension might look at the audit messages and
> mistakenly think the database is all set.

I agree with this concern, but I don't believe there's a lot that we can
do about it except to document it.  I had asked, during the discussion
of deparse and related pieces, that it be possible for us to directly
call the necessary functions to get at the information we needed without
having to go through the event trigger system.  That didn't happen and I
accepted that we would need to use CREATE EXTENSION.  Users are
certainly able to monitor their databases or include the extension in
template1 to make sure it is pulled in for any new databases.

> > +    /* Return objects affected by the (non drop) DDL statement */
> > +    query = "SELECT UPPER(object_type), object_identity\n"
> > +            "  FROM pg_event_trigger_ddl_commands()";
>
> This SPI query neglects to schema-qualify its function calls.

Agreed, will fix.

> > +    DefineCustomStringVariable(
> > +        "pg_audit.log",
> > +
> > +        "Specifies which classes of statements will be logged by session audit "
> > +        "logging. Multiple classes can be provided using a comma-separated "
> > +        "list and classes can be subtracted by prefacing the class with a "
> > +        "- sign.",
> > +
> > +        NULL,
>
> The short_desc is several lines long, while long_desc is NULL.

Good point, will address.

> > --- /dev/null
> > +++ b/contrib/pg_audit/sql/pg_audit.sql
>
> I do applaud the breadth of test coverage.

Thanks!  We'll be adding more based on your feedback and that of Fujii
and others.

> > +-- Set pg_audit parameters for the current (super)user.
> > +ALTER ROLE :current_user SET pg_audit.log = 'Role';
> > +ALTER ROLE :current_user SET pg_audit.log_level = 'notice';
>
> Do not ALTER the initial login role in a regression test.  In the installcheck
> case, the role belongs to the test operator; it is not ours to modify.

Alright, we could address that, but I imagine the right answer is to
take the approach discussed below, instead of modifying the roles.

> > +CREATE USER user1;
> > +ALTER ROLE user1 SET pg_audit.log = 'ddl, ROLE';
> > +ALTER ROLE user1 SET pg_audit.log_level = 'notice';
> > +
> > +--
> > +-- Create, select, drop (select will not be audited)
> > +\connect - user1
>
> Adding new CREATE USER statements, as opposed to CREATE ROLE, to regression
> tests is almost always wrong.  During "make check" on Windows, such users
> cannot connect.  "REGRESS_OPTS = --create-role=user1" fixes that problem but
> does not help installcheck to pass under MD5 authentication (which it did as
> of commit c82725e).  Skip past these challenges by using SET statements
> instead of ALTER ROLE + \connect.

Unfortunately, it's not possible to avoid the CREATE USER statements, if
we wish to exercise the GUCs set via ALTER ROLE.  GUCs set that way are
only set on brand new connections as that specific role, and given that
these are all SUSET GUCs, non-superusers wouldn't be able to change
them.

That said, the GUC system isn't really what we're trying to test here,
and, I agree, we can simply SET/RESET from the initial superuser role
throughout the regression tests and use SET ROLE instead.  It's not
exactly the same as testing with a real user who has GUCs set on their
role, but it should work for the testing requirements of this module.

> > +    <para>
> > +      Settings can be specified globally (in
> > +      <filename>postgresql.conf</filename> or using
> > +      <literal>ALTER SYSTEM ... SET</>), at the database level (using
> > +      <literal>ALTER DATABASE ... SET</literal>), or at the role level (using
> > +      <literal>ALTER ROLE ... SET</literal>).  Note that settings are not
> > +      inherited through normal role inheritance and <literal>SET ROLE</> will
> > +      not alter a user's <literal>pg_audit</> settings.  This is a limitation
> > +      of the roles system and not inherent to <literal>pg_audit</>.
> > +    </para>
>
> This paragraph applies equally to every SUSET GUC in PostgreSQL.

Agreed, we should make sure this is adequately documented in the main
docs and reference that from here instead.

> > +    <para>
> > +      The <literal>pg_audit</> extension must be loaded in
> > +      <xref linkend="guc-shared-preload-libraries">.  Otherwise, an error
> > +      will be raised at load time and no audit logging will occur.
> > +    </para>
>
> The test suite is a counterexample to that.

This was a relatively late change to appease the buildfarm.  It was not,
previously, the case, so the docs do need updating here.

> > +    <para>
> > +      Object audit logging logs statements that affect a particular relation.
> > +      Only <literal>SELECT</>, <literal>INSERT</>, <literal>UPDATE</> and
> > +      <literal>DELETE</> commands are supported.  <literal>TRUNCATE</> is not
> > +      included because there is no specific privilege for it.
> > +    </para>
>
> PostgreSQL has a TRUNCATE privilege:
>
> GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
>     [, ...] | ALL [ PRIVILEGES ] }
>     ON { [ TABLE ] table_name [, ...]
>          | ALL TABLES IN SCHEMA schema_name [, ...] }
>     TO role_specification [, ...] [ WITH GRANT OPTION ]

Excellent point, we should be able to fix that.  As I expect many of
us remember, it wasn't always the case.

> > +      <para>
> > +        Object-level audit logging is implemented via the roles system.  The
> > +        <xref linkend="guc-pgaudit-role"> setting defines the role that
> > +        will be used for audit logging.  A relation (<literal>TABLE</>,
> > +        <literal>VIEW</>, etc.) will be audit logged when the audit role has
> > +        permissions for the command executed or inherits the permissions from
> > +        another role.  This allows you to effectively have multiple audit roles
> > +        even though there is a single master role in any context.
> > +      </para>
>
> This is clever, but it means that any user can add to the list of audited
> objects by granting individual object permissions, or the role itself, to the
> audit role.  Crowding the audit log is one thing, but object owners can also
> use REVOKE to stop auditing an object.  Perhaps the answer is to put all
> important objects under trusted owners, but that's a heavy restriction.  Do
> other RDBMS auditing features behave this way?

Indeed, that's correct.  It is certainly a limitation and one which I
hope to remove eventually, but until then, we need to document it.  I
don't believe it's a reason to not have this capability.  Object owners
can also DROP objects or columns, or add columns which may not be
included.  There has been very little discussion about segregating
permissions (or auditing) from object ownership, but we will hopefully,
eventually, get there.  However, even with such a heavy restriction, I
have confidence that there will be significant users; certainly I have
worked in a number of environments where this would have been a very
welcome capability, even with its limitations.  Please understand that
these limitations were understood at the time of the design of the
feature, they are not surprises, nor is there a misunderstanding
regarding them.

Further, I would be mildly surprised if our first pass at supporting
auditing in-core doesn't have that same limitation of being subject to
the object owner.  It's a fall-back we've used for a long time and
changing that will be quite difficult.

> Stephen, please revert this feature.  Most pg_audit bugs will create security
> vulnerabilities, so incremental development in the PostgreSQL tree is the
> wrong approach.  The feature needs substantial hacking, then an additional
> committer's thorough review.  (The above sampling of defects and weak areas
> was not a thorough review.)

I certainly understand the concern about this code potentially creating
more security vulnerabilities than other areas, but I don't agree that
we should avoid including the capability due to that fear.  The prior
discussion about incremental development was about adding the necessary
pieces to core to eventually provide better auditing than what this
provides; this module is very clearly intended to be a complete feature,
with limitations which users need to be aware of prior to deploying it.

I have a reasonably high degree of confidence that users who are
interested in this capability will properly research the limitations and
be able to decide for themselves if they are able to deploy it in their
environments.

The feature which is "auditing", as a whole, needs a great deal more
than even simply removing the limitations associated with the design of
this module.  This was never intended to be the one true auditing
solution, nor was it ever portrayed as such, but rather it's a good
start with specific limitations that users need to be aware of.  This is
a step along the route to proper in-core auditing support, much the
same as the various changes which have been made for logical replication
and BDR, and as dblink was a step on the road towards FDWs.  Just as we
did not have the ultimate solution land in core in one release cycle
for any of those, I don't expect this initial capability to be without
limitations.

I do not take this position lightly and it has been top-of-mind for me
over these past days.  I've further discussed it with community members,
users of PG (those who are not our clients, who I've discussed it
extensively with already), and read some of the discussion about how
this capability may be used in non-auditing situations.  Perhaps it
should have been given a different name, one which would not come across
as trying to address such a large, difficult, and contentious problem,
but that is a two-edged sword, as users who this module would work for
may not realize the capability that this module provides in that case.

I certainly welcome review from others and if there is not another
committer-level formal review before we get close on 9.5 (say, end of
August), then I'll revert it.  There is certainly no concern that doing
so would be difficult to do, as it is entirely self-contained.
Thanks!
    Stephen

Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Robert Haas
Date:
On Tue, May 26, 2015 at 8:10 PM, Stephen Frost <sfrost@snowman.net> wrote:
> I certainly welcome review from others and if there is not another
> committer-level formal review before we get close on 9.5 (say, end of
> August), then I'll revert it.  There is certainly no concern that doing
> so would be difficult to do, as it is entirely self-contained.

Like Noah, I'm unhappy that this patch went in.  I stated a few days
before it was committed that I felt the code quality and documentation
were well below the level we normally expect.  Your response was to do
a little more work on the patch and then commit it without so much as
reposting it.  Clearly, we have completely different ideas about what
constitutes an appropriate response to the sort of comments I sent.

A near-record number of committers have objected to this patch in all
kinds of different ways.  There have been concerns about process,
concerns about code quality, and concerns about whether this is really
something that we want.  The normal way that works is that you either
(a) revise the patch or (b) try to convince the person raising the
concern that it's OK.  The concern is addressed when the person who
raised it says it is, and not just because you thought about it and
decided it was OK.  This can be taken too far in the other direction,
but we're not close to that in this instance.

I am particularly troubled by the fact that what has happened with
this patch is very much like what happened with row-level security: a
patch that clearly wasn't finished and clearly had not had adequate
review got abruptly committed - by you - without any consensus so to
do.  It seems likely to me that by now row-level security has had
enough review that it is solid enough to be in the tree - in
particular, I am encouraged by Dean Rasheed's work to improve the
patch.  However, it is absolutely not the community process for that
stuff to happen after the code is already in the tree.  It is the
community process for that stuff to happen before the code is in the
tree.

It will be impossible for our community to continue delivering quality
software if you persist in taking this approach.  Either the other
committers will have to spend an inordinate effort fixing (or
convincing you to fix) the stuff you break - instead of working on our
own projects - and other people's patches - or we will have to ignore
your commits, and the things that are broken in those commits will
become bugs in our releases.  Either way, the community loses.

-- 
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Stephen Frost
Date:
Robert,

Thank you for your response.

* Robert Haas (robertmhaas@gmail.com) wrote:
> On Tue, May 26, 2015 at 8:10 PM, Stephen Frost <sfrost@snowman.net> wrote:
> > I certainly welcome review from others and if there is not another
> > committer-level formal review before we get close on 9.5 (say, end of
> > August), then I'll revert it.  There is certainly no concern that doing
> > so would be difficult to do, as it is entirely self-contained.
>
> Like Noah, I'm unhappy that this patch went in.  I stated a few days
> before it was committed that I felt the code quality and documentation
> were well below the level we normally expect.  Your response was to do
> a little more work on the patch and then commit it without so much as
> reposting it.  Clearly, we have completely different ideas about what
> constitutes an appropriate response to the sort of comments I sent.

Just to be clear, I understand you're referring to this email:

CA+TgmobtrK9ndfBeAhui1KDKpnUp4cNv07KukD73jOAfd=4dUg@mail.gmail.com

David and I both spent a great deal of time reviewing that email and
working to address your comments.  I had David do as much of it as I
felt that I could, as it is a learning experience for him as he works to
become another dedicated PostgreSQL developer for the community.  He
then passed it on to me, and I took it further and he reviewed the
results of my changes.

To clarify, that email noted style issues (which I worked to fix,
though I should have run pgindent, of course..  the discussed
'make indent' option would help a great deal with that), concerns about
the design limitations (server crashes, using the permission system),
a similar comment regarding where log messages go to the comment in the
code which has had much discussion due to it, and issues with the
documentation and comments.  I did spend a good bit of time working to
improve the comments, but did not focus on the documentation as that
could be done post-feature freeze.

Your comment at the bottom of that email and the subsequent lack of any
other feedback from you or others regarding concern when I voiced my
intention to work on pg_audit for 9.5 in response to Tom's summary
thread lead me to believe that a full review by a qualified committer,
with appropriate improvement to the comments and code, would satisfy the
process requirements to move forward.  There was no hidden agenda here
or an attempt to hold off until the last minute, nor was it any secret
that I was working on it.  There was another, much larger, feature added
to core, rather than simply a contrib module, which I have concerns may
have issues too, but I don't believe that there was any problem with the
process there either.  The concerns were raised by one committer, a
review and quite large rework was done by another, in conjunction with
the author, and then the patch was committed.

I agree that the documentation needs improvement.  I don't agree with
your assessment that the code quality is well below the level we
normally expect, as committed.  That's clearly a difficult thing to
judge, hence my compromise proposal to ensure that it either has a full
review or gets reverted and not included in a released version.

> A near-record number of committers have objected to this patch in all
> kinds of different ways.  There have been concerns about process,
> concerns about code quality, and concerns about whether this is really
> something that we want.  The normal way that works is that you either
> (a) revise the patch or (b) try to convince the person raising the
> concern that it's OK.  The concern is addressed when the person who
> raised it says it is, and not just because you thought about it and
> decided it was OK.  This can be taken too far in the other direction,
> but we're not close to that in this instance.

I worked to address all of those concerns, including those raised by the
individuals you noted in our private discussion, all of whom have been
silent on this since before it went in.  There was clear agreement by
a number of individuals on the need for the broader capability, but I
don't believe that's going to spring forth and land in the tree in one
fell swoop.  This is a good step in that direction.  The patch was
revised numerous times and I did work to convince the individuals
raising concerns that it was OK.  I don't believe there is any doubt
about either of those, but I would be happy to go through the archives
and point out why I feel that my statements are accurate.

> I am particularly troubled by the fact that what has happened with
> this patch is very much like what happened with row-level security: a
> patch that clearly wasn't finished and clearly had not had adequate
> review got abruptly committed - by you - without any consensus so to
> do.  It seems likely to me that by now row-level security has had
> enough review that it is solid enough to be in the tree - in
> particular, I am encouraged by Dean Rasheed's work to improve the
> patch.  However, it is absolutely not the community process for that
> stuff to happen after the code is already in the tree.  It is the
> community process for that stuff to happen before the code is in the
> tree.

I agreed with you regarding row level security and we had a great
discussion about how it's a large feature which needed more review than
most and, further, that it's important us to all realize that we are
custodians of the whole tree and the patches which we commit in
particular and that being a committer is about being trusted to maintain
and address bugs and issues which arise from what we have committed,
across the years.  I have been in this community for a long time, nearly
all of that time in a purely volunteer fashion, working as best I could
in my spare time.  Should things change for me in the future, though I
truely hope they don't, I will continue to fulfill my obligations to the
community in my role as a committer to the best of my abilities.

> It will be impossible for our community to continue delivering quality
> software if you persist in taking this approach.  Either the other
> committers will have to spend an inordinate effort fixing (or
> convincing you to fix) the stuff you break - instead of working on our
> own projects - and other people's patches - or we will have to ignore
> your commits, and the things that are broken in those commits will
> become bugs in our releases.  Either way, the community loses.

I find it confusing that there is no appreciation here for the level of
interest and excitment which has happened around these features, or how
having these capabilities will grow our community, or how working with
David and others to develop new PostgreSQL developers who may some day
become committers and continue to carry PostgreSQL forward long past
when we are gone is a worthwhile goal.

I do believe that this is a quality piece of software and that it will
be a benefit to the community, or I wouldn't have committed it in the
first place.  There are certainly other patches which I've bounced back
while doing reviews, others that I've rewritten nearly from scratch, or
reviewed, tweaked, and committed.  I've also reverted my share of
patches when issues have been pointed out with them, and held off on
moving forward when there has been clear opposition to the patch being
committed at the time.  Further, as I said above, I will continue to
maintain these features and any others which I commit (which I truely
hope to be numerous) over the years to come.  I hope that's clear from
the history which I have with the community.  I'm sure bugs will be
found in our releases in many areas, but I do not believe that this
feature will have substantially more than others, even so, I'm willing
to set that aside and work with another committer to review the feature,
to make sure that doesn't happen with this patch, and have agreed to
revert it if I'm unable to do so because there is no one willing to.  I
am not asking anyone to do this against their will or to take time away
from their own projects, nor do I wish for the community to lose, as
that would mean I'd be losing too.
Thanks!
    Stephen

Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Noah Misch
Date:
On Tue, May 26, 2015 at 08:10:04PM -0400, Stephen Frost wrote:
> * Noah Misch (noah@leadboat.com) wrote:

> > > +    /*
> > > +     * Don't audit substatements.  All the substatements we care about should
> > > +     * be covered by the event triggers.
> > > +     */
> > > +    if (context <= PROCESS_UTILITY_QUERY && !IsAbortedTransactionBlockState())
> > 
> > They aren't covered.  A GRANT inside CREATE SCHEMA escapes auditing:
> 
> Actually, they are covered.  David and I discussed this extensively,
> prior to your review, and concluded that this approach works because the
> items not under the EventTrigger charter are shared catalogs, updates to
> which wouldn't ever make sense to happen under a CREATE SCHEMA.  I do
> hope that we are able to improve on EventTriggers by supporting them for
> shared catalogs one day, but that is a discussion for another thread.
> 
> The issue which you discovered here is that GRANTs were categorized
> under CLASS_ROLE, but we have a check at the top of the DDL event
> trigger which does an early-exit if DDL isn't selected for inclusion.
> That clearly needs to be changed, so that the GRANT under CREATE SCHEMA
> is caught and logged properly.

The test case demonstrated a hole in GRANT auditing, and your diagnosis is
incorrect.  GRANT statements aren't subject to event triggers.  Selecting DDL
too, with pg_audit.log=all, does not audit the GRANT substatement.

> > Stephen, please revert this feature.  Most pg_audit bugs will create security
> > vulnerabilities, so incremental development in the PostgreSQL tree is the
> > wrong approach.  The feature needs substantial hacking, then an additional
> > committer's thorough review.  (The above sampling of defects and weak areas
> > was not a thorough review.)

pg_audit already has enough demonstrated bugs to be the most defective commit
I have ever studied.  Its defect level, routine for a mere Ready for Committer
patch, is unprecedented among committed work.  If that fails to astonish, look
at you continuing to _defend pg_audit's integrity_:

> I don't believe that this module is particularly more bug-ridden than
> other contrib modules or even parts of core.

Your negligence with respect to this commit calls into question every one of
your past commits and anything you might commit for years to come.

> I certainly welcome review from others and if there is not another
> committer-level formal review before we get close on 9.5 (say, end of
> August), then I'll revert it.  There is certainly no concern that doing
> so would be difficult to do, as it is entirely self-contained.

Not good enough.  I need those would-be reviewers' help reviewing ~100 other
sfrost commits before 9.5 final.

nm



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Stephen Frost
Date:
* Noah Misch (noah@leadboat.com) wrote:
> The test case demonstrated a hole in GRANT auditing, and your diagnosis is
> incorrect.  GRANT statements aren't subject to event triggers.  Selecting DDL
> too, with pg_audit.log=all, does not audit the GRANT substatement.

GRANT statements are subject to event triggers in the most recent code-
see ExecGrantStmt_oids, src/backend/catalog/aclchk.c:592 and
EventTriggerCollectGrant(), src/backend/commands/event_trigger.c:1822.

Perhaps I've missed something in my analysis, but I don't believe you're
correct.  I can certainly understand the confusion as GRANT statement
which are granting *roles* are not subject to event triggers, as they
are shared objects and therefore outside the scope of what event
triggers support, but they are also not supported by the CREATE SCHEMA
command.

> pg_audit already has enough demonstrated bugs to be the most defective commit
> I have ever studied.  Its defect level, routine for a mere Ready for Committer
> patch, is unprecedented among committed work.  If that fails to astonish, look
> at you continuing to _defend pg_audit's integrity_:

I truely hope you're able to review more patches.  I certainly would
appreciate any further insight you can give me on issues beyond the
three which you found.

> > I don't believe that this module is particularly more bug-ridden than
> > other contrib modules or even parts of core.
>
> Your negligence with respect to this commit calls into question every one of
> your past commits and anything you might commit for years to come.

I stand by the commits that I've made.  There have been ones I've
reverted, ones that I've realized were a mistake and have subsequently
apologized for and worked to address, and others.  I am certainly not
above question, nor do I feel that I'm any more able to commit bugless
patches than the next committer.  I look forward to reviews of my past
and future commits.

> > I certainly welcome review from others and if there is not another
> > committer-level formal review before we get close on 9.5 (say, end of
> > August), then I'll revert it.  There is certainly no concern that doing
> > so would be difficult to do, as it is entirely self-contained.
>
> Not good enough.  I need those would-be reviewers' help reviewing ~100 other
> sfrost commits before 9.5 final.

It was my understanding that we do not direct what committers or
reviewers work on.  Still, I encourage you to do so and, further, to
review the work authored by myself and committed by others, along with
the work I've done for pginfra.  All-in-all, this ~1800 line contrib
module strikes me as a relatively modest amount of work relative to the
role system and RLS.  I'm already planning to put resources (beyond
myself) into review of what's been committed to 9.5 over the next few
months, including commits that I've made, but more eyes are certainly
welcome.

To be clear, I'm not saying that I will not revert this, but I am trying
to respond to the concerns raised in the best possible way that I can.
I had been hoping that there would be some attempt to explain to me why
you feel that the module is bug ridden and the worst commit you've ever
seen.  I can certainly understand concern with the GRANT-based design,
or with ereport() being used for the audit log and how those aren't
ideal and I could respect an argument being made that it's not
acceptable for us to provide even a contrib module which uses that
approach, but this attack is certainly not what I was expecting nor do I
feel it's appropriate for this community.
Thanks!
    Stephen

Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Robert Haas
Date:
On Wed, May 27, 2015 at 9:24 AM, Stephen Frost <sfrost@snowman.net> wrote:
> I agree that the documentation needs improvement.  I don't agree with
> your assessment that the code quality is well below the level we
> normally expect, as committed.  That's clearly a difficult thing to
> judge, hence my compromise proposal to ensure that it either has a full
> review or gets reverted and not included in a released version.

That's not really acceptable in my view.  I looked at it shortly
before it was committed and said that it did not appear to me to be
close to being ready.  Noah took a look at it shortly after it was
committed and said that it did not appear to him to be close to being
ready.  Apparently, that's not good enough for you.  Your "compromise
proposal" is that a third committer other than yourself should go look
at it.

But that's not the way our community works.  It's hard to get one
extra committer to look at most patches, let alone three.  Committer
bandwidth is too precious for that.  Parallel sequential scan would be
in this release but for the fact that Andres wasn't confident in
certain portions of it, and I respected that by not committing even
though not a single other person backed up his concerns.

Basically, you're attempting to place the onus on other committers to
find the bugs in your patch.  If a third committer DOES come along and
review it, you'll fix whatever they find and say "well, now it doesn't
need to be reverted".  That's just not right.  As a committer, you are
responsible for getting it right the first time, not committing stuff
that is seriously broken and then cleaning it up as the issues are
reported, or when you have time.  If everyone adopted the approach
you're taking here, we'd have an order of magnitude more serious bugs
in a typical major release (and I would quit the project).

I note that there are already 11 followup commits fixing bugs in
pg_audit, including 7 in the first 24 hours.  It's usually not a good
thing when you can get the regression tests for a piece of
platform-independent code to pass in less than 8 tries.  I suspect,
but do not know for certain, that this is just the tip of the iceberg.

> I find it confusing that there is no appreciation here for the level of
> interest and excitment which has happened around these features, or how
> having these capabilities will grow our community, or how working with
> David and others to develop new PostgreSQL developers who may some day
> become committers and continue to carry PostgreSQL forward long past
> when we are gone is a worthwhile goal.

Those things are true of many patches.  They don't excuse committing
poor code or stream-rolling community process.

-- 
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Stephen Frost
Date:
Robert,

* Robert Haas (robertmhaas@gmail.com) wrote:
> I note that there are already 11 followup commits fixing bugs in
> pg_audit, including 7 in the first 24 hours.  It's usually not a good
> thing when you can get the regression tests for a piece of
> platform-independent code to pass in less than 8 tries.  I suspect,
> but do not know for certain, that this is just the tip of the iceberg.

Having many commits immediately following a patch going in is certainly
a reasonable reason to be concerned.  What may not have been apparent is
that all but one of those were specifically due to issues with how the
regression tests were being run rather than any issues in the code.

In an attempt to provide clarity and bring an objective view to the
issues which have been identified in the pg_audit code since it was
committed, I've developed the following list, which I kindly ask you
and Noah to review objectivly.  This list includes all issues that I've
identified from the commits done to master, comments made by the
numerous individuals who have taken time to look at the patch and
comment, and those found by the ongoing work of David and I (which has
continued after the commit).  If you both still feel that these are
indicative of being just 'the tip of the iceberg', then I'll revert it.
I do not ask that you provide any further explanation as it's ultimately
a judgement call.

Note that I intentionally filtered out documentation and comment typo
changes (either committed or planned), and the issues which were caused
by how the regression tests were being run, as those are not germane to
the code quality concerns.

I would ask others to comment, but I can, understandably, appreciate
that they would prefer to stay out of a conversion with such poor tone.

I've attempted to order the list by severity, though that's clearly up
for some debate, so take it for what you feel it is worth.

SPI query qualify - Noah
 This is absolutely an issue, but we are kidding ourselves if we believe that this will never happen again.  A holistic
solutionto this issue is needed.
 

CREATE SCHEMA .. GRANT - Noah
 This is definitely an issue which needs to be addressed, but I don't believe this is an issue with the approach used
(trustingevent triggers to cover everything under CREATE SCHEMA).  The event trigger is correctly collecting the GRANT
commandand pg_audit is outputting a record based on that (when DDL is enabled), but it's not detecting that the
subcommandis a GRANT.  That's certainly not great, but it's not an insurmountable problem either- correct the early
exitlogic, pull the command tag from pg_event_trigger_ddl_commands and use it.
 

Portability issue wrt %ld - Tom
 Clearly an issue, but one which the buildfarm is specifically intended to catch and address.  Note that this is the
onlycode-level issue found by the buildfarm- all of the other commits associated with the buildfarm were due to how the
regressiontests were being run.
 

T_AlterDefaultPrivilegesStmt classification fix - Noah
 This should clearly be ROLE instead of DDL.

Use ereport() instead of elog() - Tom
 Clearly better, but I don't see how this could be exploited or necessairly rises to the level of 'bug', but I included
ithere for completeness.
 

Reclassify REINDEX - Fujii
 This was done to match what is done in core regarding REINDEX.  Note that it was intentionally set to DDL, and
documentedaccordingly, as we felt the comment in the core code was correct, but, even so, we agreed with Fujii that we
shouldprobably match what core actually does here regardless.
 

Suppress STATEMENT output - Fujii
 Makes sense but is just about reducing the amount of log traffic.

Suppress CONTEXT output - David
 Similar to the STATEMENT case above, creates unnecessary noise in the logs.

Further classification questions - Fujii
 These questions will undoubtably come up and there isn't one answer here but rather a case where we simply need to
decideon something and document it accordingly.
 

Remove ERROR, PANIC, and FATAL from log_level options - David
 This is a SUSET variable, so there isn't a particular security risk here, but it doesn't make sense to include these
options.

I'm hopeful, as I'm sure you understand, that the number of issues being
reported is due principally to the amount of review and testing which
has happened on this module since it went in and not because the quality
of the code is particularly poor.  I feel it's far more than happens for
many commits, even ones which are backpatched, and I'm certainly hopeful
that it makes for a better end result.  I certainly do not intend to ask
the community to accept a patch which is bugridden or full of holes, nor
will I stand in the way of the community requesting that a feature be
reverted.
Thanks!
    Stephen

Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Noah Misch
Date:
On Wed, May 27, 2015 at 04:36:53PM -0400, Stephen Frost wrote:
> This list includes all issues that I've
> identified from the commits done to master, comments made by the
> numerous individuals who have taken time to look at the patch and
> comment, and those found by the ongoing work of David and I (which has
> continued after the commit).  If you both still feel that these are
> indicative of being just 'the tip of the iceberg', then I'll revert it.

This list is just the tip of the iceberg.

> I do not ask that you provide any further explanation as it's ultimately
> a judgement call.



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Stephen Frost
Date:
Noah,

* Noah Misch (noah@leadboat.com) wrote:
> On Wed, May 27, 2015 at 04:36:53PM -0400, Stephen Frost wrote:
> > This list includes all issues that I've
> > identified from the commits done to master, comments made by the
> > numerous individuals who have taken time to look at the patch and
> > comment, and those found by the ongoing work of David and I (which has
> > continued after the commit).  If you both still feel that these are
> > indicative of being just 'the tip of the iceberg', then I'll revert it.
>
> This list is just the tip of the iceberg.

Thank you for your honest comments and your concern.

I sincerely hope you're able to be involved in developing auditing for
PostgreSQL in the future, as it is a key requirement in any secure
environment.
Thanks again!
    Stephen

Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
"Joshua D. Drake"
Date:
On 05/27/2015 06:11 PM, Stephen Frost wrote:

> Thank you for your honest comments and your concern.
>
> I sincerely hope you're able to be involved in developing auditing for
> PostgreSQL in the future, as it is a key requirement in any secure
> environment.


Guys,

I think we are overlooking the rather obvious elephant in the room. This 
is an extension. There is no reason for it to be in core. Revert the 
patch, gain independence, the ability to innovate mid-cycle and move on 
to bigger fish.

Sincerely,

JD


-- 
Command Prompt, Inc. - http://www.commandprompt.com/  503-667-4564
PostgreSQL Centered full stack support, consulting and development.
Announcing "I'm offended" is basically telling the world you can't
control your own emotions, so everyone else should do it for you.



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Stephen Frost
Date:
JD,

* Joshua D. Drake (jd@commandprompt.com) wrote:
> On 05/27/2015 06:11 PM, Stephen Frost wrote:
> >Thank you for your honest comments and your concern.
> >
> >I sincerely hope you're able to be involved in developing auditing for
> >PostgreSQL in the future, as it is a key requirement in any secure
> >environment.
>
> I think we are overlooking the rather obvious elephant in the room.
> This is an extension. There is no reason for it to be in core.
> Revert the patch, gain independence, the ability to innovate
> mid-cycle and move on to bigger fish.

While I certainly appreciate the support, I don't believe auditing will
be able to work as an extension over the long term and if the community
is unwilling or unable to accept steps in that direction through contrib
modules or even changes to core to improve what we are able to provide
in this area, I have very serious doubts about the willingness of
organizations (particularly those in the financial and government space)
to continue to seek out and support PostgreSQL as a viable open source
alternative to the commerical RDBMS's which have had these capabilities
for years.

I'm, again, not suggesting that a contrib module is going to be a
workable long-term solution for all use-cases, but it would solve quite
a few and would be known to be supported, and to have the support of the
community, if released as part of PostgreSQL.  These are extremely
serious organizations who care about the reputation of PostgreSQL and
the community for delivering quality software.  I certainly have no
intention to tarnish that in any way as it would be quite detrimental to
myself and the community.  If that means reverting a patch of my own, or
one which I have supported, so be it.
Thanks!
    Stephen

Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
"Joshua D. Drake"
Date:
On 05/27/2015 06:38 PM, Stephen Frost wrote:

> While I certainly appreciate the support, I don't believe auditing will
> be able to work as an extension over the long term and if the community
> is unwilling or unable to accept steps in that direction through contrib
> modules or even changes to core to improve what we are able to provide
> in this area,

It seems to me that perhaps the solution is then to pull pg_audit into 
user space and instead work on a general solution (an API? custom 
backend?) that provides what is needed.


> I have very serious doubts about the willingness of
> organizations (particularly those in the financial and government space)
> to continue to seek out and support PostgreSQL as a viable open source
> alternative to the commerical RDBMS's which have had these capabilities
> for years.

This may or may not be true considering and I am not sure it really 
matters in the context of this argument.

>
> I'm, again, not suggesting that a contrib module is going to be a
> workable long-term solution for all use-cases, but it would solve quite
> a few and would be known to be supported, and to have the support of the
> community, if released as part of PostgreSQL.

If the demand for this module is there, it will receive the support it 
needs regardless if it is in core.

> These are extremely
> serious organizations who care about the reputation of PostgreSQL and
> the community for delivering quality software.  I certainly have no
> intention to tarnish that in any way as it would be quite detrimental to
> myself and the community.  If that means reverting a patch of my own, or
> one which I have supported, so be it.

I can not speak to the quality of the patch. I can speak to what others, 
people of repute in this community speak of this patch. The leaning 
tower seems as if it is clearly in the, "we might want to think about 
reverting this".

As it is currently an extension, it does not need to be in core. If this 
extension reaches a point where it needs to be in core to achieve some 
level of integration not currently provided then we can evaluate that 
problem. Currently, that is not the case.

Sincerely,

Joshua D. Drake


>
>     Thanks!
>
>         Stephen
>


-- 
Command Prompt, Inc. - http://www.commandprompt.com/  503-667-4564
PostgreSQL Centered full stack support, consulting and development.
Announcing "I'm offended" is basically telling the world you can't
control your own emotions, so everyone else should do it for you.



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Stephen Frost
Date:
JD,

* Joshua D. Drake (jd@commandprompt.com) wrote:
> On 05/27/2015 06:38 PM, Stephen Frost wrote:
> >While I certainly appreciate the support, I don't believe auditing will
> >be able to work as an extension over the long term and if the community
> >is unwilling or unable to accept steps in that direction through contrib
> >modules or even changes to core to improve what we are able to provide
> >in this area,
>
> It seems to me that perhaps the solution is then to pull pg_audit
> into user space and instead work on a general solution (an API?
> custom backend?) that provides what is needed.

I am planning on working on the necessary changes to core to include
auditing capabilities.  Hopefully, that will go more smoothly.  I do not
believe that auditing should or even can be an external module, indeed,
pg_audit was exactly that attempt and, even with significant resources
put into it over the past year, it falls far short of what any
organization who is familiar with the capabilities in other RDBMSs would
expect.  That doesn't mean that I feel it's bad- it's a step in the
right direction, but it isn't a complete solution.

> >I have very serious doubts about the willingness of
> >organizations (particularly those in the financial and government space)
> >to continue to seek out and support PostgreSQL as a viable open source
> >alternative to the commerical RDBMS's which have had these capabilities
> >for years.
>
> This may or may not be true considering and I am not sure it really
> matters in the context of this argument.

I'm confused by this comment.  I've had discussions with both financial
and government organizations who are interested in this capability and
have been assured that they are interested in the PostgreSQL community
building and supporting this, and are conversely utterly disinterested
in either commerical or open-source products put out by individual
organizations which can come and go.  In my mind, this simply isn't a
question.  I wish that everyone could have the same experiences that I
have had and to have been in the discussions that I've been in, but
that's simply impractical and I would hope that my years in this
community would count in my favor when I make these statements.

> >I'm, again, not suggesting that a contrib module is going to be a
> >workable long-term solution for all use-cases, but it would solve quite
> >a few and would be known to be supported, and to have the support of the
> >community, if released as part of PostgreSQL.
>
> If the demand for this module is there, it will receive the support
> it needs regardless if it is in core.

Please see above as I believe it addresses this point.

> >These are extremely
> >serious organizations who care about the reputation of PostgreSQL and
> >the community for delivering quality software.  I certainly have no
> >intention to tarnish that in any way as it would be quite detrimental to
> >myself and the community.  If that means reverting a patch of my own, or
> >one which I have supported, so be it.
>
> I can not speak to the quality of the patch. I can speak to what
> others, people of repute in this community speak of this patch. The
> leaning tower seems as if it is clearly in the, "we might want to
> think about reverting this".

I have been doing my best to follow all of the comments and concerns
raised regarding this patch.  I'm not sure that I share the optimism
that you express in the quote above, but if two other committers feel
that the feature needs to be reverted, then I will revert it.  That is
not a documented and formal policy in the community, as far as I'm
aware, but it strikes me as reasonable, in the absence of any obvious
collusion or hidden agendas.  Should another committer speak up
regarding the patch, perhaps things would change, but I have no
disillusionment that such will happen in this case and have accepted it.

> As it is currently an extension, it does not need to be in core. If
> this extension reaches a point where it needs to be in core to
> achieve some level of integration not currently provided then we can
> evaluate that problem. Currently, that is not the case.

This simply doesn't make sense- all extensions can hook into the backend
in the same way, regardless of if they are included in the main git repo
or not.  Being in the repo represents the support of the overall
community and PGDG, which is, understandably in my view, highly valuable
to the organizations which look to PostgreSQL as an open source
solution for their needs.
Thanks!
    Stephen

Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Pavel Stehule
Date:


2015-05-28 3:30 GMT+02:00 Joshua D. Drake <jd@commandprompt.com>:

On 05/27/2015 06:11 PM, Stephen Frost wrote:

Thank you for your honest comments and your concern.

I sincerely hope you're able to be involved in developing auditing for
PostgreSQL in the future, as it is a key requirement in any secure
environment.


Guys,

I think we are overlooking the rather obvious elephant in the room. This is an extension. There is no reason for it to be in core. Revert the patch, gain independence, the ability to innovate mid-cycle and move on to bigger fish.

any work in contrib has bigger progress.

I wrote plpgsql_check - and the living out of contrib is neutral  - I can do some changes freely, but it is used 1% users who can has benefit from this extension. 9.5 will be released after three months and lot  of potential bugs can be fixed. It is contrib - it can be moved, removed, but better if can works.

Regards

Pavel
 

Sincerely,

JD


--
Command Prompt, Inc. - http://www.commandprompt.com/  503-667-4564
PostgreSQL Centered full stack support, consulting and development.
Announcing "I'm offended" is basically telling the world you can't
control your own emotions, so everyone else should do it for you.



--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Tom Lane
Date:
Stephen Frost <sfrost@snowman.net> writes:
> * Joshua D. Drake (jd@commandprompt.com) wrote:
>> It seems to me that perhaps the solution is then to pull pg_audit
>> into user space and instead work on a general solution (an API?
>> custom backend?) that provides what is needed.

> I am planning on working on the necessary changes to core to include
> auditing capabilities.  Hopefully, that will go more smoothly.  I do not
> believe that auditing should or even can be an external module, indeed,
> pg_audit was exactly that attempt and, even with significant resources
> put into it over the past year, it falls far short of what any
> organization who is familiar with the capabilities in other RDBMSs would
> expect.  That doesn't mean that I feel it's bad- it's a step in the
> right direction, but it isn't a complete solution.

I'm fairly confused by your line of argument.  If auditing can be done
by non-core code, then there is no great urgency to have it as a contrib
module.  If it can't be done by non-core code, then creating a contrib
module is just a dead end that will soon leave nothing behind except
backwards-compatibility problems.  Our experience with pulling contrib
modules into core has not been good in that respect.

As far as I can tell, pg_audit at this point is most charitably described
as "experimental", and I'm not sure that we want to put it into contrib
on that basis.  Of late we've generally acted as though contrib modules
have the same kind of cross-version compatibility expectations that core
code does.  It seems to me that that sort of promise is *way* premature
in this case; but I'm not seeing any large red warnings in pgaudit.sgml
that the described facilities are subject to change.

Quite aside from the question of whether we're ready to put a stake in the
ground about user-visible features of an audit facility, there seem to be
a lot of technical issues here:

* Do we have adequate hooks in the backend with which auditing code can
detect events of interest (with acceptably low overhead)?  I dunno, but
if we do not, having a contrib module doesn't fix it.

* Do we have an adequate design for specifying which out of the possible
auditable events should be logged?  I dunno about this either, but it
seems like this is an area best kept out of core if at all possible.
The design space seems pretty vast and I doubt that one size will fit all,
or needs to fit all.

* Do we have an appropriate mechanism for performing logging of events
that we've decided to log?  Here I think the answer is unquestionably
"no"; basing audit logging on the existing elog mechanism with no changes
is simply broken.  elog is designed to be flexible about whether messages
get reported and to where, which is exactly what you do *not* want for
audit logs.  This might not be too hard to fix, eg add another elevel with
hard-wired rules about where it goes ... but the current patch didn't do
that.  A larger problem is that maybe the audit message stream shouldn't
go to the postmaster log in the first place, but someplace else.

* Do we have an appropriate mechanism for configuring the audit facility?
I'm not totally sure, but again I think that the existing GUC mechanisms
were not designed for this sort of thing and are probably too easy to
subvert.  (It might be hopeless to try to ensure that superusers can't
escape auditing, but as it stands pg_audit doesn't even pretend to try.
Even without the possibility of intentional subversion, there are too
many ways to turn auditing off by accident.)

On the whole, I think sticking this into contrib is premature.  What it
does today could be done just as well as a third-party extension.  What
it doesn't do today, we should work on, but I'm unconvinced that having
this in contrib will make it easier to get there.
        regards, tom lane



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
"Joshua D. Drake"
Date:
On 05/27/2015 07:02 PM, Stephen Frost wrote:
> JD,
>
>> As it is currently an extension, it does not need to be in core. If
>> this extension reaches a point where it needs to be in core to
>> achieve some level of integration not currently provided then we can
>> evaluate that problem. Currently, that is not the case.
>
> This simply doesn't make sense- all extensions can hook into the backend
> in the same way,

That is exactly my point.


> regardless of if they are included in the main git repo
> or not.  Being in the repo represents the support of the overall
> community and PGDG, which is, understandably in my view, highly valuable
> to the organizations which look to PostgreSQL as an open source
> solution for their needs.

I can't get behind this. Yes, there is a mysticism about the "core" 
support of modules but it is just that "mysticism". People are going to 
run what the experts tell them to run. If pg_audit is that good the 
experts will tell people to use it...

Just look at your own experience with pgBackrest. I am aware that 
pgBackrest is not an extension but it is a relatively new open source 
project that is gaining community based on its quality and contribution. 
It is arguably the best backup software available for Pg. It is not in 
core, it is not shipped with core.

Your extension could be the best audit software available for Pg. It is 
not in core, because we don't need it to be. (slogan)

JD

>
>     Thanks!
>
>         Stephen
>


-- 
Command Prompt, Inc. - http://www.commandprompt.com/  503-667-4564
PostgreSQL Centered full stack support, consulting and development.
Announcing "I'm offended" is basically telling the world you can't
control your own emotions, so everyone else should do it for you.



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Stephen Frost
Date:
Tom,

Many thanks for your comments and for jumping into this discussion.

* Tom Lane (tgl@sss.pgh.pa.us) wrote:
> Stephen Frost <sfrost@snowman.net> writes:
> > * Joshua D. Drake (jd@commandprompt.com) wrote:
> >> It seems to me that perhaps the solution is then to pull pg_audit
> >> into user space and instead work on a general solution (an API?
> >> custom backend?) that provides what is needed.
>
> > I am planning on working on the necessary changes to core to include
> > auditing capabilities.  Hopefully, that will go more smoothly.  I do not
> > believe that auditing should or even can be an external module, indeed,
> > pg_audit was exactly that attempt and, even with significant resources
> > put into it over the past year, it falls far short of what any
> > organization who is familiar with the capabilities in other RDBMSs would
> > expect.  That doesn't mean that I feel it's bad- it's a step in the
> > right direction, but it isn't a complete solution.
>
> I'm fairly confused by your line of argument.  If auditing can be done
> by non-core code, then there is no great urgency to have it as a contrib
> module.  If it can't be done by non-core code, then creating a contrib
> module is just a dead end that will soon leave nothing behind except
> backwards-compatibility problems.  Our experience with pulling contrib
> modules into core has not been good in that respect.

I consider it similar to dblink and FDWs.  dblink is non-core code which
allows querying other servers, but is ultimately a dead-end as,
hopefully, we will eventually replace all of its capabilities with
proper FDW support.  Does that mean that it was a poor move to include
it?  No; it provided an extremely useful capability which a lot of users
have been quite happy with.  There are warts all over it and limitations
to what it can do, issues with how it doesn't have any kind of analyze
like information, no way for optimization to consider how best to
integrate the query being run through dblink, etc, but would I use it?
Absolutely.  Is it a dead-end?  Certainly, it'll eventually be
completely replaced by FDWs.

> As far as I can tell, pg_audit at this point is most charitably described
> as "experimental", and I'm not sure that we want to put it into contrib
> on that basis.  Of late we've generally acted as though contrib modules
> have the same kind of cross-version compatibility expectations that core
> code does.  It seems to me that that sort of promise is *way* premature
> in this case; but I'm not seeing any large red warnings in pgaudit.sgml
> that the described facilities are subject to change.

You're correct- we should probably be putting something into the
documentation which warns that the interfaces and auditing capabilities
are likely to change in the future.  On the other hand, I have been
understandably chided regarding documentation changes which attempt to
predict the future (see: changing include_realm).  Further, as was
discussed earlier this year, should we have a close enough match between
pg_audit and in-core auditing support (something I'm certainly hopeful
for- see the discussion about just how close the GRANT syntax used is to
the AUDIT command in a certain very large RDBMS whose name starts with
'O'), we could provide a perl script or similar to facilitate the
migration for users of the module to an in-core solution.

> Quite aside from the question of whether we're ready to put a stake in the
> ground about user-visible features of an audit facility, there seem to be
> a lot of technical issues here:
>
> * Do we have adequate hooks in the backend with which auditing code can
> detect events of interest (with acceptably low overhead)?  I dunno, but
> if we do not, having a contrib module doesn't fix it.

I certainly agree with you here.  The hooks in the Executor and
ProcessUtility really aren't *ideal*, but it turns out that they
actually are *sufficient* in a large number of cases.  The addition of
the event triggers/deparse code has helped that a great deal because it
provides information which we weren't able to get previously.  That was
a rather late addition to the tree overall and I believe lead to the
issue found regarding CREATE SCHEMA; it's not unreasonable for
integration of such large changes like these late in the release cycle
to least to an issue or two.

There was quite a bit of consideration over the auditing information
which was being collected, starting from the module as proposed last
year around this time which covered one set of auditing, to the module
as it is today which provides a somewhat different but largely
overlapping and significantly more granular set of auditing information.
Certainly, operating through the hooks and with the other capabilities
offered by the extension system has been difficult and the module, as a
whole, would be far simpler if in core, but I'm of the firm belief that
the proposed extension will address many use-cases, not address many
others, and provide extremely useful feedback for us as we work to
develop a better, in-core, solution.

> * Do we have an adequate design for specifying which out of the possible
> auditable events should be logged?  I dunno about this either, but it
> seems like this is an area best kept out of core if at all possible.
> The design space seems pretty vast and I doubt that one size will fit all,
> or needs to fit all.

This is an excellent point for consideration.  One of the big concerns
which has been raised regarding this feature has been how auditable
events are defined and tracked, because this module leverages the GRANT
system for something it was not designed for.  As it turns out, however,
the GRANT system has a great deal of similarity with regard to the
specificity of what users would like to be logged- again, I would draw
the line between the GRANT command and the AUDIT command implemented in
other systems.  AUDIT INSERT ON mytable; isn't far from GRANT INSERT ON
mytable to joe;.  That's not to say that this is complete; as noted
previously, this comes very close to what a certain v10 (or v11?  it's
late and I forget) AUDIT capability that another RDBMS has, but the v12
version includes more.  Still- is this a useful capability, even given
the limitations?  Absolutely, based on the discussions I've had.
Indeed, the entire GRANT-based approach was suggested by an individual
in the finance community who saw how well it matched up to their needs.

> * Do we have an appropriate mechanism for performing logging of events
> that we've decided to log?  Here I think the answer is unquestionably
> "no"; basing audit logging on the existing elog mechanism with no changes
> is simply broken.  elog is designed to be flexible about whether messages
> get reported and to where, which is exactly what you do *not* want for
> audit logs.  This might not be too hard to fix, eg add another elevel with
> hard-wired rules about where it goes ... but the current patch didn't do
> that.  A larger problem is that maybe the audit message stream shouldn't
> go to the postmaster log in the first place, but someplace else.

pg_audit tried quite hard to avoid changing core.  Changing where
logging goes for different kinds of events has been on my personal to-do
list for years and, as Peter pointed out very plainly recently, it's not
been done yet.  I certainly agree with you regarding this point, but
would such a hard-wired rule have been acceptable?  I sincerely doubt
it; I know that I wouldn't have been happy with it and it would have
been a stop-gap measure rather than a proper design.  I feel bad about
attempting to predict the future here, given the discussion, but I will
go out on a limb and say that this is one of the specific pieces which
I was planning to address next as it is extremely important and will
require serious consideration to ensure that we don't break error
logging as we change it.  This is the kind of change which will require
an entire release cycle to handle, isn't directly related to auditing
but at the same time required by it, and which is beyond what I would
consider my personal level of capability to handle by myself.  I'm
certainly hopeful that others will be willing to step up and help with
it, but I have little doubt that, had I tried to change the logging
system along with adding a contrib module which simply uses it, I would
have broken things badly.

That is not to say that I feel that using the elog system makes the
module useless on its face.  It certainly reduces the number of use
cases for which it can be used, and that's unfortunate, but it's
certainly not a death knell.  Many environments which I've worked in
have very strict control over who can access the production systems and
have absolutely zero free-form user access other than by superusers.  As
was discussed in NY earlier this year, organizations have developed
entire proxy systems for managing access to PG through controlled
systems which also provide certain amounts of auditing, to address the
lack of any support in this area.  That's beyond what I've personally
done but is certainly another point to consider.

> * Do we have an appropriate mechanism for configuring the audit facility?
> I'm not totally sure, but again I think that the existing GUC mechanisms
> were not designed for this sort of thing and are probably too easy to
> subvert.  (It might be hopeless to try to ensure that superusers can't
> escape auditing, but as it stands pg_audit doesn't even pretend to try.
> Even without the possibility of intentional subversion, there are too
> many ways to turn auditing off by accident.)

I find it a bit bizarre that we would hope to "try" when it comes to
preventing superusers from escaping auditing, particularly in a contrib
module.  Indeed, wouldn't that simply open up an avenue of never ending
attacks regarding such an attempt?  I can think of any number of ways
which auditing could be subverted, broken, disabled, or otherwise
escaped by a superuser, and I don't consider myself anywhere near the
most intelligent or creative individual in the room.  Even an in-core
solution, in my view at least, is going to have to accept that
superusers won't be contained or guaranteed to be audited, or at least,
not with outside help (eg: SELinux or similar capability).

> On the whole, I think sticking this into contrib is premature.  What it
> does today could be done just as well as a third-party extension.  What
> it doesn't do today, we should work on, but I'm unconvinced that having
> this in contrib will make it easier to get there.

You are certainly correct that evertyhing pg_audit does today could be
done just as well as a third-party extension- just like everything which
exists inside of contrib.  Having it in contrib will *greatly* increase
the visibility of the capability and the amount of feedback we will get
regarding it.  For evidence of this, I would submit this:

http://www.depesz.com/2015/05/22/waiting-for-9-5-add-pg_audit-an-auditing-extension/

To be clear- I am not suggesting that we have to consider this when
deciding if the capability should be reverted or not; I've not brought
it up in the earlier discussions at all, but I felt it germane to this
discussion as to if having something in contrib changes anything
regarding how a particular module is viewed by the outside world.  It
is, absolutely, a game changer, and for a feature which we hope to
eventually fold into core, having the community see how it's used, what
issues come up, what concerns are raised, and how the limitations impact
its uptake, is quite useful to guide a proper in-core solution and feed
into the design of the capability.

Tom, as this is your first mail on the subject, I'd ask that you
consider my comments, but I have no problem if you feel they are not
sufficient to sway your feeling that the addition of pg_audit is
premature.  I'm very glad to hear that, at a high level, you are in
support of having such a capability eventually added.  I don't mean to
draw this out, but I did want to answer your questions, as best I could,
as to why I felt this was progress.  Long story short, I'm happy to pull
it out if my responses don't sway you.
Thanks!
    Stephen

Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Heikki Linnakangas
Date:
On 05/28/2015 06:04 AM, Joshua D. Drake wrote:
> On 05/27/2015 07:02 PM, Stephen Frost wrote:
>> regardless of if they are included in the main git repo
>> or not.  Being in the repo represents the support of the overall
>> community and PGDG, which is, understandably in my view, highly valuable
>> to the organizations which look to PostgreSQL as an open source
>> solution for their needs.
>
> I can't get behind this. Yes, there is a mysticism about the "core"
> support of modules but it is just that "mysticism". People are going to
> run what the experts tell them to run. If pg_audit is that good the
> experts will tell people to use it...

Yeah, there are many popular tools and extensions that people use 
together with PostgreSQL. PostGIS, pgbouncer, slony, pgbarman etc. The 
criteria for what should be in contrib, in core, or a 3rd party 
extension is a contentious topic.

The argument here is basically that if something is in core, it's 
officially supported and endorsed by the PGDG. If that's the argument 
for putting this in contrib, then you have to ask yourself if the PGDG 
community is really willing to endorse this. I'm hearing a lot of 
pushback from other committers, which points to "no", even if all their 
technical arguments and worries turn out to be wrong.

I wrote the above without looking at the code or the documentation. I 
haven't followed the discussion at all. I'm now looking at the 
documentation, and have some comments based on just that:

* I think it's a bad idea for the audit records to go to the same log as 
other messages. Maybe that's useful as an option, but in general there 
is no reason to believe that the log format used for general logging is 
also a good format for audit logging. You probably wouldn't care about 
process ID for audit logging, for example. Also, how do you prevent 
spoofing audit records with something like "SELECT \nAUDIT: SESSION, 2, 
...". Maybe the log formatting options can be used to prevent that, but 
just by looking at the examples in the manual, I don't see how to do it.

* I don't understand how the pg_audit.role setting and the audit role 
system works.

* Using GUCs for configuring it seems like a bad idea, because:

1. it's not flexible enough. How do you specify that all READs on 
super_secret table must be logged, but on less_secret table, it's enough 
to log only WRITEs?

2. GUCs can be changed easily on-the-fly, and configured flexibly. But 
that's not really what you want for auditing. You want to have a clear 
specification in one place. You'd want it to be more like pg_hba.conf 
than postgresql.conf. Or more like Mandatory Access Control, rather than 
Discretionary Access Control.

A separate config file in $PGDATA would be a better way to configure 
this. You would then have all the configuration in one place, and that 
file could have a more flexible format, with per-schema rules etc. 
(Wouldn't have to implement all that in the first version, but that's 
the direction this should go to)


I recommend making pg_audit an external extension, not a contrib module. 
As an extension, it can have its own life-cycle and not be tied to 
PostgreSQL releases. That would be a huge benefit for pg_audit. There is 
a lot of potential for new features to be added: more flexible 
configuration, more details to be logged, more ways to log, email 
alerts, etc. As an extension, all of those things could be developed 
independent of the PostgreSQL life-cycle. If there is need to fix 
vulnerabilities or other bugs, those can also be fixed independently of 
PostgreSQL minor releases.

- Heikki




Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Stephen Frost
Date:
Heikki,

* Heikki Linnakangas (hlinnaka@iki.fi) wrote:
> On 05/28/2015 06:04 AM, Joshua D. Drake wrote:
> >On 05/27/2015 07:02 PM, Stephen Frost wrote:
> >>regardless of if they are included in the main git repo
> >>or not.  Being in the repo represents the support of the overall
> >>community and PGDG, which is, understandably in my view, highly valuable
> >>to the organizations which look to PostgreSQL as an open source
> >>solution for their needs.
> >
> >I can't get behind this. Yes, there is a mysticism about the "core"
> >support of modules but it is just that "mysticism". People are going to
> >run what the experts tell them to run. If pg_audit is that good the
> >experts will tell people to use it...
>
> Yeah, there are many popular tools and extensions that people use
> together with PostgreSQL. PostGIS, pgbouncer, slony, pgbarman etc.
> The criteria for what should be in contrib, in core, or a 3rd party
> extension is a contentious topic.

Thanks!  I certainly agree.  PostGIS is relatively easy to reason about-
there is an entire community with a long history there also.  pgbouncer
and the others are not quite to that level.  I agree it's a contentious
topic and perhaps has been overly stressed.

> The argument here is basically that if something is in core, it's
> officially supported and endorsed by the PGDG. If that's the
> argument for putting this in contrib, then you have to ask yourself
> if the PGDG community is really willing to endorse this. I'm hearing
> a lot of pushback from other committers, which points to "no", even
> if all their technical arguments and worries turn out to be wrong.

That's absolutely a fair point and one which I take seriously.  You're
right to point out that, even if one committer is behind a particular
feature, that others may not be and therefore it's not really community
supported.  Clearly there is some general risk over time that contrib
modules and features will be abandoned by the original authors and have
to be taken up by others committers, but if there isn't support for the
initial version then that's pretty unlikely and it could certainly
deteriorate the reputation which PostgreSQL has earned.

> I wrote the above without looking at the code or the documentation.
> I haven't followed the discussion at all. I'm now looking at the
> documentation, and have some comments based on just that:

Understood, and thanks for reviewing the documentation.  I have to admit
that, just based on the above (I've not read all of the below quite
yet), you make an excellent argument and one which I understand and
agree with regarding the position of this particular module.

> * I think it's a bad idea for the audit records to go to the same
> log as other messages. Maybe that's useful as an option, but in
> general there is no reason to believe that the log format used for
> general logging is also a good format for audit logging. You
> probably wouldn't care about process ID for audit logging, for
> example. Also, how do you prevent spoofing audit records with
> something like "SELECT \nAUDIT: SESSION, 2, ...". Maybe the log
> formatting options can be used to prevent that, but just by looking
> at the examples in the manual, I don't see how to do it.

I entirely agree with you here- the existing logging structure was used
as there is not a trivial way to use another and still support
file-based logging.  We could limit pg_audit to syslog only or to only
support some other mechanism, but that tends to be even further limiting
than the existing logging system.  As I mentioned in my response to Tom,
this is absolutely an area which needs improvement.

> * I don't understand how the pg_audit.role setting and the audit
> role system works.

No problem, I'm happy to explain it.  Essentially, the 'role' set there
is the role checked for as a target of GRANT commands, which are used as
a proxy for AUDIT commands, as we can't add metadata to tables from
extensions today.

> * Using GUCs for configuring it seems like a bad idea, because:

I certainly agree with this, we need much more flexibility than what
GUCs can provide but that's not easily done from an extension.  This was
always a compromise between based on what capabilities are provided for
extensions from core and GUCs tend to be an "easy" answer, though
certainly not always the correct one.

> 1. it's not flexible enough. How do you specify that all READs on
> super_secret table must be logged, but on less_secret table, it's
> enough to log only WRITEs?

This is actually what that pg_audit.role setting was all about.  To do
the above, you would do:

CREATE ROLE pgaudit;
SET pg_audit.role = pgaudit;
GRANT SELECT ON TABLE super_secret TO pgaudit;
GRANT INSERT, UPDATE, DELETE ON TABLE less_secret TO pgaudit;

With this, all commands executed which require SELECT rights on the
table super_secret are logged, and all commands execute which require
INSERT, UPDATE, or DELETE on the less_secret table are logged.

> 2. GUCs can be changed easily on-the-fly, and configured flexibly.
> But that's not really what you want for auditing. You want to have a
> clear specification in one place. You'd want it to be more like
> pg_hba.conf than postgresql.conf. Or more like Mandatory Access
> Control, rather than Discretionary Access Control.

I certainly appreciate the MAC vs. DAC discussion here, but I don't
believe our AUDIT capability should explicitly require restarts of PG to
be adjusted.  We could certainly require that of the GUCs, but it's
unclear to me how that would really be beneficial.  What matters is
controlling how those parameters are changed, I believe.

> A separate config file in $PGDATA would be a better way to configure
> this. You would then have all the configuration in one place, and
> that file could have a more flexible format, with per-schema rules
> etc. (Wouldn't have to implement all that in the first version, but
> that's the direction this should go to)

The difficulty with a separate config file is that we don't have any way
of properly attaching information to the existing tables in the
database- table renames, dropped columns, etc, all become an issue then.

> I recommend making pg_audit an external extension, not a contrib
> module. As an extension, it can have its own life-cycle and not be
> tied to PostgreSQL releases. That would be a huge benefit for
> pg_audit. There is a lot of potential for new features to be added:
> more flexible configuration, more details to be logged, more ways to
> log, email alerts, etc. As an extension, all of those things could
> be developed independent of the PostgreSQL life-cycle. If there is
> need to fix vulnerabilities or other bugs, those can also be fixed
> independently of PostgreSQL minor releases.

I'm certainly all about adding new capabilities to pg_audit, but, as
discussed elsewhere, I believe we really want many of those same
capabilities in core (eg: being able to send logs to different places;
my thinking is a rabbitMQ type of store rather than email, but perhaps
we could support both..) and that's what I'm hoping to work towards in
the near future.

Still I do understand that there is little support for including this as
an extension among the general PostgreSQL community and, in particular,
the top committers.  I really do appreciate your feedback on this.
Thanks again!
    Stephen

Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Stephen Frost
Date:
All,

Replying to Heikki's email as it's quite late here and I want to
respond.  Barring any further commentary, I'm planning to pull pg_audit
out tomorrow (it wouldn't be intelligent for me to attempt to do so now).
I really do appreciate all of the excellent feedback and comments, the
excellent discussion, and the honest concerns raised about it.  I truely
love being a member of this community and to be among such highly
respected and intelligent individuals, even if, on occation, I may be a
bit brash.

Thanks again, and I look forward to many interesting and positive
discussions in Ottawa.
Stephen

Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Heikki Linnakangas
Date:
On 05/28/2015 11:14 AM, Stephen Frost wrote:
> * Heikki Linnakangas (hlinnaka@iki.fi) wrote:
>> 1. it's not flexible enough. How do you specify that all READs on
>> super_secret table must be logged, but on less_secret table, it's
>> enough to log only WRITEs?
>
> This is actually what that pg_audit.role setting was all about.  To do
> the above, you would do:
>
> CREATE ROLE pgaudit;
> SET pg_audit.role = pgaudit;
> GRANT SELECT ON TABLE super_secret TO pgaudit;
> GRANT INSERT, UPDATE, DELETE ON TABLE less_secret TO pgaudit;
>
> With this, all commands executed which require SELECT rights on the
> table super_secret are logged, and all commands execute which require
> INSERT, UPDATE, or DELETE on the less_secret table are logged.

Ah, I see. Wow, that's really Rube Goldbergian.

>> 2. GUCs can be changed easily on-the-fly, and configured flexibly.
>> But that's not really what you want for auditing. You want to have a
>> clear specification in one place. You'd want it to be more like
>> pg_hba.conf than postgresql.conf. Or more like Mandatory Access
>> Control, rather than Discretionary Access Control.
>
> I certainly appreciate the MAC vs. DAC discussion here, but I don't
> believe our AUDIT capability should explicitly require restarts of PG to
> be adjusted.

Sure, I didn't mean we should require a restart. Requiring SIGHUP seems 
reasonable though.

>> A separate config file in $PGDATA would be a better way to configure
>> this. You would then have all the configuration in one place, and
>> that file could have a more flexible format, with per-schema rules
>> etc. (Wouldn't have to implement all that in the first version, but
>> that's the direction this should go to)
>
> The difficulty with a separate config file is that we don't have any way
> of properly attaching information to the existing tables in the
> database- table renames, dropped columns, etc, all become an issue then.

True. I wouldn't be too worried about that though. If you rename a 
table, that hopefully gets flagged in the audit log and someone will ask 
"why did you rename that table?". If you're paranoid enough, you could 
have a catch-all rule that audits everything that's not explicitly 
listed, so a renamed table always gets audited.

Of course, you could still support a labeling system, similar to the 
pg_audit.role setting and GRANTs. For example, you could tag tables with 
a label like "reads_need_auditing", and then in the config file, you 
could specify that all READs on tables with that label need to be 
audited. I think security labels would be a better system to abuse for 
that than GRANT. You'd want to just label the objects, and specify the 
READ/WRITE etc. attributes in the config file.

Who do you assume you can trust? Is it OK if the table owner can 
disable/enable auditing for that table?

> I'm certainly all about adding new capabilities to pg_audit, but, as
> discussed elsewhere, I believe we really want many of those same
> capabilities in core (eg: being able to send logs to different places;
> my thinking is a rabbitMQ type of store rather than email, but perhaps
> we could support both..) and that's what I'm hoping to work towards in
> the near future.

Sure, adding features like sending logs to different places in core is 
totally reasonable, independently of pg_audit. (Or not, but in any case, 
it's orthogonal :-) )

- Heikki




Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Stephen Frost
Date:
Heikki,

* Heikki Linnakangas (hlinnaka@iki.fi) wrote:
> On 05/28/2015 11:14 AM, Stephen Frost wrote:
> >* Heikki Linnakangas (hlinnaka@iki.fi) wrote:
> >>1. it's not flexible enough. How do you specify that all READs on
> >>super_secret table must be logged, but on less_secret table, it's
> >>enough to log only WRITEs?
> >
> >This is actually what that pg_audit.role setting was all about.  To do
> >the above, you would do:
> >
> >CREATE ROLE pgaudit;
> >SET pg_audit.role = pgaudit;
> >GRANT SELECT ON TABLE super_secret TO pgaudit;
> >GRANT INSERT, UPDATE, DELETE ON TABLE less_secret TO pgaudit;
> >
> >With this, all commands executed which require SELECT rights on the
> >table super_secret are logged, and all commands execute which require
> >INSERT, UPDATE, or DELETE on the less_secret table are logged.
>
> Ah, I see. Wow, that's really Rube Goldbergian.

It's certainly not ideal.  It was discussed back in January, iirc.

> >>2. GUCs can be changed easily on-the-fly, and configured flexibly.
> >>But that's not really what you want for auditing. You want to have a
> >>clear specification in one place. You'd want it to be more like
> >>pg_hba.conf than postgresql.conf. Or more like Mandatory Access
> >>Control, rather than Discretionary Access Control.
> >
> >I certainly appreciate the MAC vs. DAC discussion here, but I don't
> >believe our AUDIT capability should explicitly require restarts of PG to
> >be adjusted.
>
> Sure, I didn't mean we should require a restart. Requiring SIGHUP
> seems reasonable though.

I wouldn't have any issue with that.

> >>A separate config file in $PGDATA would be a better way to configure
> >>this. You would then have all the configuration in one place, and
> >>that file could have a more flexible format, with per-schema rules
> >>etc. (Wouldn't have to implement all that in the first version, but
> >>that's the direction this should go to)
> >
> >The difficulty with a separate config file is that we don't have any way
> >of properly attaching information to the existing tables in the
> >database- table renames, dropped columns, etc, all become an issue then.
>
> True. I wouldn't be too worried about that though. If you rename a
> table, that hopefully gets flagged in the audit log and someone will
> ask "why did you rename that table?". If you're paranoid enough, you
> could have a catch-all rule that audits everything that's not
> explicitly listed, so a renamed table always gets audited.

The general 'catch-all' approach was how we approached pg_audit in
general, so, yes, that's the kind of auditing we expect people to want
(or, at least, we would need to support it).  You're right, in some
environments that may be workable, but then it also has to be entirely
managed outside of the database, which would make it extremely difficult
to use in many environments, if not impossible..

> Of course, you could still support a labeling system, similar to the
> pg_audit.role setting and GRANTs. For example, you could tag tables
> with a label like "reads_need_auditing", and then in the config
> file, you could specify that all READs on tables with that label
> need to be audited. I think security labels would be a better system
> to abuse for that than GRANT. You'd want to just label the objects,
> and specify the READ/WRITE etc. attributes in the config file.

Using SECURITY LABELs is certainly an interesting idea.  GRANT was
chosen because, with it, we also get information regarding the action
that the user wants to audit (select/insert/update/delete, etc), without
having to build all of that independently with some custom structure in
the SECURITY LABEL system.

> Who do you assume you can trust? Is it OK if the table owner can
> disable/enable auditing for that table?

In an ideal world, you would segregate the rights which the table owner
has from both the permission system and the audit system.  This has come
up a number of times already and is, really, an independent piece of
work.  Having the permissions and auditing controlled by the same group
is better than having all three pieces controlled by the ownership role,
but having three distinct groups would be preferred.
Thanks!
    Stephen

Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Noah Misch
Date:
Ian, Abhijit, and David,

My condemnation of the pg_audit commits probably hurt you as the feature's
authors.  I am sorry for that.  Your code was better than most "Ready for
Committer" code, and I hope you submit more patches in the future.

Regards,
nm



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
David Steele
Date:
Hi Noah,

On 6/8/15 10:13 AM, Noah Misch wrote:
> My condemnation of the pg_audit commits probably hurt you as the feature's
> authors.  I am sorry for that.  Your code was better than most "Ready for
> Committer" code, and I hope you submit more patches in the future.

I appreciate you saying this and especially for saying it publicly.

I've certainly had quite the experience as a first-time contributor
working on this patch.  Perhaps I bit off more than I should have and I
definitely managed to ruffle a few feathers along the way.  I learned a
lot about how the community works, both the good and the bad.  Fear not,
though, I'm not so easily discouraged and you'll definitely be hearing
more from me.

My honest, albeit novice, opinion is that it was a mistake to pull
pg_audit from contrib.  I know more than anyone that it had flaws,
mostly owing to its implementation as an extension, but it also provided
capability that simply does not exist right now.  Recent conversations
about PGXN demonstrate why that is not (currently) a good alternative
for distributing extensions.  That means pg_audit will have a more
limited audience than it could have had.  That's a shame, because people
are interested in pg_audit, warts and all.

The stated purpose of contrib is: "include porting tools, analysis
utilities, and plug-in features that are not part of the core PostgreSQL
system, mainly because they address a limited audience or are too
experimental to be part of the main source tree. This does not preclude
their usefulness."

Perhaps we should consider modifying that language, because from my
perspective pg_audit fit the description perfectly.

Of course, I understand this is a community effort and I don't expect
every contribution to be accepted and committed.  Consider me
disappointed yet determined.

--
- David Steele
david@pgmasters.net


Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Tom Lane
Date:
David Steele <david@pgmasters.net> writes:
> My honest, albeit novice, opinion is that it was a mistake to pull
> pg_audit from contrib.  I know more than anyone that it had flaws,
> mostly owing to its implementation as an extension, but it also provided
> capability that simply does not exist right now.  Recent conversations
> about PGXN demonstrate why that is not (currently) a good alternative
> for distributing extensions.  That means pg_audit will have a more
> limited audience than it could have had.  That's a shame, because people
> are interested in pg_audit, warts and all.

FWIW, I did not think that the consensus was that pg_audit could never
be in contrib.  As I understood it, people felt that (1) the API might
not be sufficiently stable yet, and (2) there might be parts that should
be in core eventually.  (2) is problematic only because we do not have
very good tools for migrating things from contrib to core without creating
user-visible compatibility issues; which is not pg_audit's fault but it's
still a constraint we have to keep in mind.  So I'd encourage you to keep
working on it and trying to address the issues that were brought up.
        regards, tom lane



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Noah Misch
Date:
On Tue, Jun 09, 2015 at 03:54:59PM -0400, David Steele wrote:
> I've certainly had quite the experience as a first-time contributor
> working on this patch.  Perhaps I bit off more than I should have and I
> definitely managed to ruffle a few feathers along the way.  I learned a
> lot about how the community works, both the good and the bad.  Fear not,
> though, I'm not so easily discouraged and you'll definitely be hearing
> more from me.

Glad to hear it.

> The stated purpose of contrib is: "include porting tools, analysis
> utilities, and plug-in features that are not part of the core PostgreSQL
> system, mainly because they address a limited audience or are too
> experimental to be part of the main source tree. This does not preclude
> their usefulness."
> 
> Perhaps we should consider modifying that language, because from my
> perspective pg_audit fit the description perfectly.

"What is contrib?" attracts enduring controversy; see recent thread "RFC:
Remove contrib entirely" for the latest episode.  However that discussion
concludes, that documentation passage is not too helpful as a guide to
predicting contrib patch reception.  (Most recent contrib additions had an
obvious analogy to an existing module, sidestepping the question.)



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Thom Brown
Date:
On 10 June 2015 at 14:41, Noah Misch <noah@leadboat.com> wrote:
> On Tue, Jun 09, 2015 at 03:54:59PM -0400, David Steele wrote:
>> I've certainly had quite the experience as a first-time contributor
>> working on this patch.  Perhaps I bit off more than I should have and I
>> definitely managed to ruffle a few feathers along the way.  I learned a
>> lot about how the community works, both the good and the bad.  Fear not,
>> though, I'm not so easily discouraged and you'll definitely be hearing
>> more from me.
>
> Glad to hear it.
>
>> The stated purpose of contrib is: "include porting tools, analysis
>> utilities, and plug-in features that are not part of the core PostgreSQL
>> system, mainly because they address a limited audience or are too
>> experimental to be part of the main source tree. This does not preclude
>> their usefulness."
>>
>> Perhaps we should consider modifying that language, because from my
>> perspective pg_audit fit the description perfectly.
>
> "What is contrib?" attracts enduring controversy; see recent thread "RFC:
> Remove contrib entirely" for the latest episode.  However that discussion
> concludes, that documentation passage is not too helpful as a guide to
> predicting contrib patch reception.  (Most recent contrib additions had an
> obvious analogy to an existing module, sidestepping the question.)

Is pg_audit being resubmitted for 9.6 at all?

Thom



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
David Steele
Date:
Hi Thom,

On 11/18/15 8:54 AM, Thom Brown wrote:
> On 10 June 2015 at 14:41, Noah Misch <noah@leadboat.com> wrote:
>> On Tue, Jun 09, 2015 at 03:54:59PM -0400, David Steele wrote:
>>> I've certainly had quite the experience as a first-time contributor
>>> working on this patch.  Perhaps I bit off more than I should have and I
>>> definitely managed to ruffle a few feathers along the way.  I learned a
>>> lot about how the community works, both the good and the bad.  Fear not,
>>> though, I'm not so easily discouraged and you'll definitely be hearing
>>> more from me.
>>
>> Glad to hear it.
>>
>>> The stated purpose of contrib is: "include porting tools, analysis
>>> utilities, and plug-in features that are not part of the core PostgreSQL
>>> system, mainly because they address a limited audience or are too
>>> experimental to be part of the main source tree. This does not preclude
>>> their usefulness."
>>>
>>> Perhaps we should consider modifying that language, because from my
>>> perspective pg_audit fit the description perfectly.
>>
>> "What is contrib?" attracts enduring controversy; see recent thread "RFC:
>> Remove contrib entirely" for the latest episode.  However that discussion
>> concludes, that documentation passage is not too helpful as a guide to
>> predicting contrib patch reception.  (Most recent contrib additions had an
>> obvious analogy to an existing module, sidestepping the question.)
>
> Is pg_audit being resubmitted for 9.6 at all?

A number of people have asked me about this over the last few months.  I 
would certainly be interested in resubmitting this for 9.6.

I fixed many of the issues that caused complaints at the end of the 9.5 
cycle, but there are still two remaining items I would want to address 
before resubmitting:

1) There was concern about audit messages being sent to the clients.
I'm looking at adding an option to the ereport macro to suppress sending
messages to the clients.  I'll submit that patch soon.

2) I would like make install-check to work with modules that require 
shared_preload_libraries.  My understanding is that Andrew may have 
already fixed this, but if not I'll look into it.

-- 
-David
david@pgmasters.net



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
Noah Misch
Date:
On Fri, Nov 20, 2015 at 12:11:00PM -0500, David Steele wrote:
> I fixed many of the issues that caused complaints at the end of the 9.5
> cycle, but there are still two remaining items I would want to address
> before resubmitting:
> 
> 1) There was concern about audit messages being sent to the clients.
> I'm looking at adding an option to the ereport macro to suppress sending
> messages to the clients.  I'll submit that patch soon.

I don't object to audit messages being client-visible; did anyone feel that
was a blocker?  I did make a related point, namely, the documentation must not
assert that you can hide messages from clients if you in fact cannot.

> 2) I would like make install-check to work with modules that require
> shared_preload_libraries.  My understanding is that Andrew may have already
> fixed this, but if not I'll look into it.

It would be nice to standardize a pattern for that, agreed.



Re: [COMMITTERS] pgsql: Add pg_audit, an auditing extension

From
David Steele
Date:
On 11/21/15 2:47 PM, Noah Misch wrote:
> On Fri, Nov 20, 2015 at 12:11:00PM -0500, David Steele wrote:
>> I fixed many of the issues that caused complaints at the end of the 9.5
>> cycle, but there are still two remaining items I would want to address
>> before resubmitting:
>>
>> 1) There was concern about audit messages being sent to the clients.
>> I'm looking at adding an option to the ereport macro to suppress sending
>> messages to the clients.  I'll submit that patch soon.
>
> I don't object to audit messages being client-visible; did anyone feel that
> was a blocker?  I did make a related point, namely, the documentation must not
> assert that you can hide messages from clients if you in fact cannot.

I don't think anyone felt it was a blocker but it seemed nobody thought
it was ideal, either.  I certainly don't.

The error in the documentation was unfortunate but that's what the
review process is all about.  I'm appreciative of everyone who had a
look at the patch.

--
-David
david@pgmasters.net