Bruce Momjian wrote: > Peter Eisentraut wrote: > > Using the attached patch, SSL will act over Unix-domain sockets. AFAICT, > > this just works. I didn't find a way to sniff a Unix-domain socket, > > however. > > > > How should we proceed with this? > > I am confused by the shortness of this patch. Right now pg_hba.conf > has: > > # host DATABASE USER CIDR-ADDRESS METHOD [OPTION] > # hostssl DATABASE USER CIDR-ADDRESS METHOD [OPTION] > # hostnossl DATABASE USER CIDR-ADDRESS METHOD [OPTION] > > These are all for TCP connections. How do we handle 'local' SSL > connection specification? Do we want to provide similar functionality > for local connections?
Here is a patch that implements "localssl" as well. It is quite simple. (Note that the code in hba.c is all copy and paste.) -- Peter Eisentraut http://developer.postgresql.org/~petere/
diff -ur ../cvs-pgsql/doc/src/sgml/client-auth.sgml ./doc/src/sgml/client-auth.sgml --- ../cvs-pgsql/doc/src/sgml/client-auth.sgml 2008-01-05 11:58:42.000000000 +0100 +++ ./doc/src/sgml/client-auth.sgml 2008-01-05 13:55:28.000000000 +0100 @@ -97,6 +97,8 @@ A record can have one of the seven formats <synopsis> local <replaceable>database</replaceable> <replaceable>user</replaceable> <replaceable>auth-method</replaceable> <optional><replaceable>auth-option</replaceable></optional> +localssl <replaceable>database</replaceable> <replaceable>user</replaceable> <replaceable>auth-method</replaceable> <optional><replaceable>auth-option</replaceable></optional> +localnossl <replaceable>database</replaceable> <replaceable>user</replaceable> <replaceable>auth-method</replaceable> <optional><replaceable>auth-option</replaceable></optional> host <replaceable>database</replaceable> <replaceable>user</replaceable> <replaceable>CIDR-address</replaceable> <replaceable>auth-method</replaceable> <optional><replaceable>auth-option</replaceable></optional> hostssl <replaceable>database</replaceable> <replaceable>user</replaceable> <replaceable>CIDR-address</replaceable> <replaceable>auth-method</replaceable> <optional><replaceable>auth-option</replaceable></optional> hostnossl <replaceable>database</replaceable> <replaceable>user</replaceable> <replaceable>CIDR-address</replaceable> <replaceable>auth-method</replaceable> <optional><replaceable>auth-option</replaceable></optional> @@ -112,8 +114,36 @@ <listitem> <para> This record matches connection attempts using Unix-domain - sockets. Without a record of this type, Unix-domain socket - connections are disallowed. + sockets. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><literal>localssl</literal></term> + <listitem> + <para> + This record matches connection attempts using Unix-domain + sockets, but only when the connection is made with <acronym>SSL</acronym>. + </para> + + <para> + To make use of this option the server must be built with + <acronym>SSL</acronym> support. Furthermore, + <acronym>SSL</acronym> must be enabled at server start time + by setting the <xref linkend="guc-ssl"> configuration parameter (see + <xref linkend="ssl-tcp"> for more information). + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term><literal>localnossl</literal></term> + <listitem> + <para> + This record type has the opposite logic to <literal>localssl</>: + it only matches connection attempts made over Unix-domain sockets + that do not use <acronym>SSL</acronym>. </para> </listitem> </varlistentry> @@ -144,8 +174,7 @@ <listitem> <para> This record matches connection attempts made using TCP/IP, - but only when the connection is made with <acronym>SSL</acronym> - encryption. + but only when the connection is made with <acronym>SSL</acronym>. </para> <para> diff -ur ../cvs-pgsql/src/backend/libpq/hba.c ./src/backend/libpq/hba.c --- ../cvs-pgsql/src/backend/libpq/hba.c 2008-01-05 11:58:45.000000000 +0100 +++ ./src/backend/libpq/hba.c 2008-01-05 12:12:54.000000000 +0100 @@ -668,8 +668,36 @@ line_item = list_head(line); /* Check the record type. */ token = lfirst(line_item); - if (strcmp(token, "local") == 0) + if (strcmp(token, "local") == 0 + || strcmp(token, "localssl") == 0 + || strcmp(token, "localnossl") == 0) { + + if (token[5] == 's') /* "localssl" */ + { +#ifdef USE_SSL + /* Record does not match if we are not on an SSL connection */ + if (!port->ssl) + return; + + /* Placeholder to require specific SSL level, perhaps? */ + /* Or a client certificate */ + + /* Since we were on SSL, proceed as with normal 'local' mode */ +#else + /* We don't accept this keyword at all if no SSL support */ + goto hba_syntax; +#endif + } +#ifdef USE_SSL + else if (token[5] == 'n') /* "localnossl" */ + { + /* Record does not match if we are on an SSL connection */ + if (port->ssl) + return; + } +#endif + /* Get the database. */ line_item = lnext(line_item); if (!line_item) diff -ur ../cvs-pgsql/src/backend/libpq/pg_hba.conf.sample ./src/backend/libpq/pg_hba.conf.sample --- ../cvs-pgsql/src/backend/libpq/pg_hba.conf.sample 2007-08-11 19:12:25.000000000 +0200 +++ ./src/backend/libpq/pg_hba.conf.sample 2008-01-05 12:17:27.000000000 +0100 @@ -10,15 +10,18 @@ # databases they can access. Records take one of these forms: # # local DATABASE USER METHOD [OPTION] +# localssl DATABASE USER METHOD [OPTION] +# localnossl DATABASE USER METHOD [OPTION] # host DATABASE USER CIDR-ADDRESS METHOD [OPTION] # hostssl DATABASE USER CIDR-ADDRESS METHOD [OPTION] # hostnossl DATABASE USER CIDR-ADDRESS METHOD [OPTION] # # (The uppercase items must be replaced by actual values.) # -# The first field is the connection type: "local" is a Unix-domain socket, -# "host" is either a plain or SSL-encrypted TCP/IP socket, "hostssl" is an -# SSL-encrypted TCP/IP socket, and "hostnossl" is a plain TCP/IP socket. +# The first field is the connection type: "local" is a Unix-domain +# socket, "host" is a TCP/IP socket, both either a plain or +# SSL-encrypted. "localssl" and "hostssl" are SSL-encrypted sockets; +# "localnossl" and "hostnossl" are plain sockets. # # DATABASE can be "all", "sameuser", "samerole", a database name, or # a comma-separated list thereof. diff -ur ../cvs-pgsql/src/backend/postmaster/postmaster.c ./src/backend/postmaster/postmaster.c --- ../cvs-pgsql/src/backend/postmaster/postmaster.c 2008-01-05 11:58:46.000000000 +0100 +++ ./src/backend/postmaster/postmaster.c 2008-01-05 12:17:13.000000000 +0100 @@ -1448,8 +1448,8 @@ char SSLok; #ifdef USE_SSL - /* No SSL when disabled or on Unix sockets */ - if (!EnableSSL || IS_AF_UNIX(port->laddr.addr.ss_family)) + /* No SSL when disabled */ + if (!EnableSSL) SSLok = 'N'; else SSLok = 'S'; /* Support for SSL */ diff -ur ../cvs-pgsql/src/interfaces/libpq/fe-connect.c ./src/interfaces/libpq/fe-connect.c --- ../cvs-pgsql/src/interfaces/libpq/fe-connect.c 2008-01-05 11:58:53.000000000 +0100 +++ ./src/interfaces/libpq/fe-connect.c 2008-01-05 12:17:13.000000000 +0100 @@ -1261,11 +1261,6 @@ * If SSL is enabled and we haven't already got it running, * request it instead of sending the startup message. */ - if (IS_AF_UNIX(conn->raddr.addr.ss_family)) - { - /* Don't bother requesting SSL over a Unix socket */ - conn->allow_ssl_try = false; - } if (conn->allow_ssl_try && !conn->wait_ssl_try && conn->ssl == NULL) {
---------------------------(end of broadcast)--------------------------- TIP 4: Have you searched our list archives? http://archives.postgresql.org