mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Add SSL documentation info to README.SSL
This commit is contained in:
		@@ -52,7 +52,10 @@
 | 
			
		||||
         |
 | 
			
		||||
   Fail with unknown
 | 
			
		||||
 | 
			
		||||
Comments from Bear Giles:
 | 
			
		||||
---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
			 COMMENTS FROM BEAR GILES
 | 
			
		||||
 | 
			
		||||
On a related note, I had mentioned this before but it's a subtle point 
 | 
			
		||||
and I'm sure that it's slipped everyone's mind...
 | 
			
		||||
@@ -79,3 +82,402 @@ etc.) that uses anonymous servers.
 | 
			
		||||
- if you don't need confidentiality, e.g., you're on a trusted network 
 | 
			
		||||
segment, then use direct access to the server port.
 | 
			
		||||
 | 
			
		||||
---------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
			   EMAIL ABOUT DOCUMENTATION
 | 
			
		||||
 | 
			
		||||
From: Bear Giles <bgiles@coyotesong.com>
 | 
			
		||||
Subject: [HACKERS] 2nd cut at SSL documentation
 | 
			
		||||
To: pgsql-hackers@postgresql.org
 | 
			
		||||
Date: Tue, 21 May 2002 14:27:00 -0600 (MDT)
 | 
			
		||||
 | 
			
		||||
A second cut at SSL documentation....
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SSL Support in PostgreSQL
 | 
			
		||||
=========================
 | 
			
		||||
 | 
			
		||||
Who needs it?
 | 
			
		||||
=============
 | 
			
		||||
 | 
			
		||||
The sites that require SSL fall into one (or more) of several broad
 | 
			
		||||
categories.
 | 
			
		||||
 | 
			
		||||
*) They have insecure networks. 
 | 
			
		||||
 | 
			
		||||
   Examples of insecure networks are anyone in a "corporate hotel,"
 | 
			
		||||
   any network with 802.11b wireless access points (WAP) (in 2002,
 | 
			
		||||
   this protocol has many well-known security weaknesses and even
 | 
			
		||||
   'gold' connections can be broken within 8 hours), or anyone 
 | 
			
		||||
   accessing their database over the internet.
 | 
			
		||||
 | 
			
		||||
   These sites need a Virtual Private Network (VPN), and either
 | 
			
		||||
   SSH tunnels or direct SSL connections can be used.
 | 
			
		||||
 | 
			
		||||
*) They are storing extremely sensitive information.
 | 
			
		||||
 | 
			
		||||
   An example of extremely sensitive information is logs from
 | 
			
		||||
   network intrusion detection systems.  This information *must*
 | 
			
		||||
   be fully encrypted between front- and back-end since an attacker
 | 
			
		||||
   is presumably sniffing all traffic within the VPN, and if they
 | 
			
		||||
   learn that you know what they are doing they may attempt to
 | 
			
		||||
   cover their tracks with a quick 'rm -rf /' and 'dropdb'
 | 
			
		||||
 | 
			
		||||
   In the extreme case, the contents of the database itself may
 | 
			
		||||
   be encrypted with either the crypt package (which provides
 | 
			
		||||
   symmetrical encryption of the records) or the PKIX package
 | 
			
		||||
   (which provides public-key encryption of the records).
 | 
			
		||||
 | 
			
		||||
*) They are storing information which is considered confidential
 | 
			
		||||
   by custom, law or regulation.
 | 
			
		||||
 | 
			
		||||
   This includes all records held by your doctor, lawyer, accountant,
 | 
			
		||||
   etc.  In these cases, the motivation for using encryption is not
 | 
			
		||||
   a conscious evaulation of risk, but the fear of liability for 
 | 
			
		||||
   'failure to perform due diligence' if encryption is available but
 | 
			
		||||
   unused and an attacker gains unauthorized access to the harm of
 | 
			
		||||
   others.
 | 
			
		||||
 | 
			
		||||
*) They have 'road warriors.'
 | 
			
		||||
 | 
			
		||||
   This includes all sites where people need to have direct access
 | 
			
		||||
   to the database (not through a proxy such as a secure web page)
 | 
			
		||||
   from changing remote addresses.  Client certificates provide a
 | 
			
		||||
   clean way to grant this access without opening up the database
 | 
			
		||||
   to the world.
 | 
			
		||||
 | 
			
		||||
Who does not need it?
 | 
			
		||||
---------------------
 | 
			
		||||
 | 
			
		||||
It's at least as important to know who does not need SSL as it
 | 
			
		||||
is to know who does.  Sites that do not need SSL fall into several
 | 
			
		||||
broad categories.
 | 
			
		||||
 | 
			
		||||
*) Access is limited to the Unix socket.
 | 
			
		||||
 | 
			
		||||
*) Access is limited to a physically secure network.
 | 
			
		||||
 | 
			
		||||
   "Physically secure" networks are common in the clusters and
 | 
			
		||||
   colocation sites - all database traffic is restricted to dedicated
 | 
			
		||||
   NIC cards and hubs, and all servers and cabling are maintained in
 | 
			
		||||
   locked cabinets.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Using SSH/OpenSSH as a Virtual Private Network (VPN)
 | 
			
		||||
====================================================
 | 
			
		||||
 | 
			
		||||
SSH and OpenSSH can be used to construct a Virtual Private Network
 | 
			
		||||
(VPN) to provide confidentiality of PostgreSQL communications.  
 | 
			
		||||
These tunnels are widely available and fairly well understood, but 
 | 
			
		||||
do not provide any application-level authentication information.
 | 
			
		||||
 | 
			
		||||
To set up a SSH/OpenSSH tunnel, a shell account for each
 | 
			
		||||
user should be set up on the database server.  It is acceptable
 | 
			
		||||
for the shell program to be bogus (e.g., /bin/false), if the
 | 
			
		||||
tunnel is set up in to avoid launching a remote shell.
 | 
			
		||||
 | 
			
		||||
On each client system the $HOME/.ssh/config file should contain
 | 
			
		||||
an additional line similiar to
 | 
			
		||||
 | 
			
		||||
 LocalForward 5555 psql.example.com:5432
 | 
			
		||||
 | 
			
		||||
(replacing psql.example.com with the name of your database server).
 | 
			
		||||
By putting this line in the configuration file, instead of specifying
 | 
			
		||||
it on the command line, the tunnel will be created whenever a 
 | 
			
		||||
connection is made to the remote system.
 | 
			
		||||
 | 
			
		||||
The psql(1) client (or any client) should be wrapped with a script
 | 
			
		||||
that establishes an SSH tunnel when the program is launched:
 | 
			
		||||
 | 
			
		||||
  #!/bin/sh
 | 
			
		||||
  HOST=psql.example.com
 | 
			
		||||
  IDENTITY=$HOME/.ssh/identity.psql
 | 
			
		||||
  /usr/bin/ssh -1 -i $IDENTITY -n $HOST 'sleep 60' & \
 | 
			
		||||
	/usr/bin/psql -h $HOST -p 5555 $1
 | 
			
		||||
 | 
			
		||||
Alternately, the system could run a daemon that establishes and maintains
 | 
			
		||||
the tunnel.  This is preferrable when multiple users need to establish
 | 
			
		||||
similar tunnels to the same remote site.
 | 
			
		||||
 | 
			
		||||
Unfortunately, there are many potential drawbacks to SSL tunnels:
 | 
			
		||||
 | 
			
		||||
*) the SSH implementation or protocol may be flawed.  Serious problems
 | 
			
		||||
   are discovered about once every 18- to 24- months.
 | 
			
		||||
 | 
			
		||||
*) the systems may be misconfigured by accident.
 | 
			
		||||
 | 
			
		||||
*) the database server must provide shell accounts for all users
 | 
			
		||||
   needing access.  This can be a chore to maintain, esp. in if
 | 
			
		||||
   all other user access should be denied.
 | 
			
		||||
 | 
			
		||||
*) neither the front- or back-end can determine the level of
 | 
			
		||||
   encryption provided by the SSH tunnel - or even whether an
 | 
			
		||||
   SSH tunnel is in use.  This prevents security-aware clients
 | 
			
		||||
   from refusing any connection with unacceptly weak encryption.
 | 
			
		||||
 | 
			
		||||
*) neither the front- or back-end can get any authentication
 | 
			
		||||
   information pertaining to the SSH tunnel.
 | 
			
		||||
 | 
			
		||||
Bottom line: if you just need a VPN, SSH tunnels are a good solution.
 | 
			
		||||
But if you explicitly need a secure connection they're inadequate.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Direct SSL Support
 | 
			
		||||
==================
 | 
			
		||||
 | 
			
		||||
Insecure Channel: ANONYMOUS DH Server
 | 
			
		||||
-------------------------------------
 | 
			
		||||
 | 
			
		||||
"ANONYMOUS DH" is the most basic SSL implementation.  It does
 | 
			
		||||
not require a server certificate, but it is vulnerable to
 | 
			
		||||
"man-in-the-middle" attacks.
 | 
			
		||||
 | 
			
		||||
The PostgreSQL backend does not support ANONYMOUS DH sessions.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Secure Channel: Server Authentication
 | 
			
		||||
-------------------------------------
 | 
			
		||||
 | 
			
		||||
Server Authentication requires that the server authenticate itself
 | 
			
		||||
to clients (via certificates), but clients can remain anonymous.
 | 
			
		||||
This protects clients from "man-in-the-middle" attacks (where a
 | 
			
		||||
bogus server either captures all data or provides bogus data),
 | 
			
		||||
but does not protect the server from bad data injected by false
 | 
			
		||||
clients.
 | 
			
		||||
 | 
			
		||||
The community has established a set of criteria for secure
 | 
			
		||||
communications:
 | 
			
		||||
 | 
			
		||||
*) the server must provide a certificate identifying itself
 | 
			
		||||
   via its own fully qualified domain name (FDQN) in the
 | 
			
		||||
   certificate's Common Name (CN) field.
 | 
			
		||||
 | 
			
		||||
*) the FQDN in the server certificate must resolve to the
 | 
			
		||||
   IP address used in the connection.
 | 
			
		||||
 | 
			
		||||
*) the certificate must be valid.  (The current date must be
 | 
			
		||||
   no earlier than the 'notBefore' date, and no later than the
 | 
			
		||||
   'notAfter' date.)
 | 
			
		||||
 | 
			
		||||
*) the server certificate must be signed by an issuer certificate
 | 
			
		||||
   known to the clients.
 | 
			
		||||
 | 
			
		||||
   This issuer can be a known public CA (e.g., Verisign), a locally
 | 
			
		||||
   generated root cert installed with the database client, or the 
 | 
			
		||||
   self-signed server cert installed with the database client.
 | 
			
		||||
 | 
			
		||||
   Another approach (used by SSH and most web clients) is for the
 | 
			
		||||
   client to prompt the user whether to accept a new root cert when
 | 
			
		||||
   it is encountered for the first time.  psql(1) does not currently
 | 
			
		||||
   support this mechanism.
 | 
			
		||||
 | 
			
		||||
*) the client *should* check the issuer's Certificate Revocation
 | 
			
		||||
   List (CRL) to verify that the server's certificate hasn't been
 | 
			
		||||
   revoked for some reason, but in practice this step is often
 | 
			
		||||
   skipped.
 | 
			
		||||
 | 
			
		||||
*) the server private key must be owned by the database process
 | 
			
		||||
   and not world-accessible.  It is recommended that the server
 | 
			
		||||
   key be encrypted, but it is not required if necessary for the
 | 
			
		||||
   operation of the system.  (Primarily to allow automatic restarts
 | 
			
		||||
   after the system is rebooted.)
 | 
			
		||||
  
 | 
			
		||||
The 'mkcert.sh' script can be used to generate and install 
 | 
			
		||||
suitable certificates
 | 
			
		||||
 | 
			
		||||
Finally, the client library can have one or more trusted root
 | 
			
		||||
certificates compiled into it.  This allows clients to verify
 | 
			
		||||
certificates without the need for local copies.  To do this,
 | 
			
		||||
the source file src/interfaces/libpq/fe-ssl.c must be edited
 | 
			
		||||
and the database recompiled.
 | 
			
		||||
 | 
			
		||||
Secure Channel: Mutual Authentication
 | 
			
		||||
-------------------------------------
 | 
			
		||||
 | 
			
		||||
Mutual authentication requires that servers and clients each
 | 
			
		||||
authenticate to the other.  This protects the server from
 | 
			
		||||
false clients in addition to protecting the clients from false
 | 
			
		||||
servers.
 | 
			
		||||
 | 
			
		||||
The community has established a set of criteria for client
 | 
			
		||||
authentication similar to the list above.
 | 
			
		||||
 | 
			
		||||
*) the client must provide a certificate identifying itself.
 | 
			
		||||
   The certificate's Common Name (CN) field should contain the
 | 
			
		||||
   client's usual name.
 | 
			
		||||
 | 
			
		||||
*) the client certificate must be signed by a certificate known
 | 
			
		||||
   to the server.
 | 
			
		||||
 | 
			
		||||
   If a local root cert was used to sign the server's cert, the
 | 
			
		||||
   client certs can be signed by the issuer.
 | 
			
		||||
 | 
			
		||||
*) the certificate must be valid.  (The current date must be
 | 
			
		||||
   no earlier than the 'notBefore' date, and no later than the
 | 
			
		||||
   'notAfter' date.)
 | 
			
		||||
 | 
			
		||||
*) the server *should* check the issuer's Certificate Revocation
 | 
			
		||||
   List (CRL) to verify that the clients's certificate hasn't been
 | 
			
		||||
   revoked for some reason, but in practice this step is often
 | 
			
		||||
   skipped.
 | 
			
		||||
 | 
			
		||||
*) the client's private key must be owned by the client process
 | 
			
		||||
   and not world-accessible.  It is recommended that the client
 | 
			
		||||
   key be encrypted, but because of technical reasons in the
 | 
			
		||||
   architecture of the client library this is not yet supported.
 | 
			
		||||
 | 
			
		||||
PostgreSQL can generate client certificates via a four-step process.
 | 
			
		||||
 | 
			
		||||
1. The "client.conf" file must be copied from the server.  Certificates
 | 
			
		||||
   can be highly localizable, and this file contains information that
 | 
			
		||||
   will be needed later.
 | 
			
		||||
 | 
			
		||||
   The client.conf file is normally installed in /etc/postgresql/root.crt.
 | 
			
		||||
   The client should also copy the server's root.crt file to
 | 
			
		||||
   $HOME/.postgresql/root.crt.
 | 
			
		||||
 | 
			
		||||
2. If the user has the OpenSSL applications installed, they can
 | 
			
		||||
   run pgkeygen.sh.  (An equivalent compiled program will be available
 | 
			
		||||
   in the future.)  They should provide a copy of the
 | 
			
		||||
   $HOME/.postgresql/postgresql.pem file to their DBA.
 | 
			
		||||
 | 
			
		||||
3. The DBA should sign this file the OpenSSL applications:
 | 
			
		||||
 | 
			
		||||
     $ openssl ca -config root.conf -ss_cert ....
 | 
			
		||||
 | 
			
		||||
   and return the signed cert (postgresql.crt) to the user.
 | 
			
		||||
 | 
			
		||||
4. The user should install this file in $HOME/.postgresql/postgresql.crt.
 | 
			
		||||
 | 
			
		||||
The server will log every time a client certificate has been
 | 
			
		||||
used, but there is not yet a mechanism provided for using client
 | 
			
		||||
certificates as PostgreSQL authentication at the application level.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
---------------------------(end of broadcast)---------------------------
 | 
			
		||||
TIP 5: Have you checked our extensive FAQ?
 | 
			
		||||
 | 
			
		||||
http://www.postgresql.org/users-lounge/docs/faq.html
 | 
			
		||||
 | 
			
		||||
------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
Date: Tue, 21 May 2002 19:50:38 -0400
 | 
			
		||||
From: Neil Conway <nconway@klamath.dyndns.org>
 | 
			
		||||
To: "Bear Giles" <bgiles@coyotesong.com>
 | 
			
		||||
cc: pgsql-hackers@postgresql.org
 | 
			
		||||
Subject: Re: [HACKERS] 2nd cut at SSL documentation
 | 
			
		||||
 | 
			
		||||
On Tue, 21 May 2002 14:27:00 -0600 (MDT)
 | 
			
		||||
"Bear Giles" <bgiles@coyotesong.com> wrote:
 | 
			
		||||
> A second cut at SSL documentation....
 | 
			
		||||
 | 
			
		||||
I've pointed out some minor things I noticed while reading through.
 | 
			
		||||
Yeah, I was bored :-)
 | 
			
		||||
 | 
			
		||||
> The sites that require SSL fall into one (or more) of several broad
 | 
			
		||||
> categories.
 | 
			
		||||
> 
 | 
			
		||||
> *) They have insecure networks. 
 | 
			
		||||
> 
 | 
			
		||||
>    Examples of insecure networks are anyone in a "corporate hotel,"
 | 
			
		||||
 | 
			
		||||
What's a corporate hotel?
 | 
			
		||||
 | 
			
		||||
> *) They have 'road warriors.'
 | 
			
		||||
 | 
			
		||||
This section title sounds confusingly similar to the 1st item.
 | 
			
		||||
Perhaps "They need to authentication clients securely" or something
 | 
			
		||||
similar? The need to use client certificates does not apply only to
 | 
			
		||||
"road warriors" -- I've seen situations where client-certs are used for
 | 
			
		||||
clients to connecting to a server over a LAN.
 | 
			
		||||
 | 
			
		||||
> *) Access is limited to the Unix socket.
 | 
			
		||||
 | 
			
		||||
"the" sounds wrong, there's more than just 1 :-)
 | 
			
		||||
 | 
			
		||||
> *) Access is limited to a physically secure network.
 | 
			
		||||
> 
 | 
			
		||||
>    "Physically secure" networks are common in the clusters and
 | 
			
		||||
>    colocation sites - all database traffic is restricted to dedicated
 | 
			
		||||
>    NIC cards and hubs, and all servers and cabling are maintained in
 | 
			
		||||
>    locked cabinets.
 | 
			
		||||
 | 
			
		||||
Perhaps add a note on the performance hit here?
 | 
			
		||||
 | 
			
		||||
> Using SSH/OpenSSH as a Virtual Private Network (VPN)
 | 
			
		||||
 | 
			
		||||
I'm unsure why you're bothering to differentiate between SSH
 | 
			
		||||
and OpenSSH.
 | 
			
		||||
 | 
			
		||||
> SSH and OpenSSH can be used to construct a Virtual Private Network
 | 
			
		||||
> (VPN)
 | 
			
		||||
 | 
			
		||||
No need to include the abbreviation for VPN here, you've explained
 | 
			
		||||
the term before.
 | 
			
		||||
 | 
			
		||||
> to provide confidentiality of PostgreSQL communications.  
 | 
			
		||||
> These tunnels are widely available and fairly well understood, but 
 | 
			
		||||
> do not provide any application-level authentication information.
 | 
			
		||||
 | 
			
		||||
You might want to clarify what "application-level authentication
 | 
			
		||||
information" means, or else leave out all discussion of drawbacks
 | 
			
		||||
until later.
 | 
			
		||||
 | 
			
		||||
> To set up a SSH/OpenSSH tunnel, a shell account for each
 | 
			
		||||
> user should be set up on the database server.  It is acceptable
 | 
			
		||||
> for the shell program to be bogus (e.g., /bin/false), if the
 | 
			
		||||
> tunnel is set up in to avoid launching a remote shell.
 | 
			
		||||
> 
 | 
			
		||||
> On each client system the $HOME/.ssh/config file should contain
 | 
			
		||||
> an additional line similiar to
 | 
			
		||||
> 
 | 
			
		||||
>  LocalForward 5555 psql.example.com:5432
 | 
			
		||||
 | 
			
		||||
"pgsql.example.com" strikes me as a better example hostname (I always
 | 
			
		||||
think that psql == DB client, postgres/postmaster/pgsql == DB server).
 | 
			
		||||
 | 
			
		||||
> Unfortunately, there are many potential drawbacks to SSL tunnels:
 | 
			
		||||
 | 
			
		||||
I think you mean SSH tunnels.
 | 
			
		||||
 | 
			
		||||
> *) the SSH implementation or protocol may be flawed.  Serious problems
 | 
			
		||||
>    are discovered about once every 18- to 24- months.
 | 
			
		||||
 | 
			
		||||
I'd be skeptical whether this weakness if specific to SSH -- there
 | 
			
		||||
can be security holes in OpenSSL, the SSL protocol, the SSL
 | 
			
		||||
implementation in PostgreSQL, etc.
 | 
			
		||||
 | 
			
		||||
> *) the database server must provide shell accounts for all users
 | 
			
		||||
>    needing access.  This can be a chore to maintain, esp. in if
 | 
			
		||||
 | 
			
		||||
Remove the "in".
 | 
			
		||||
 | 
			
		||||
> *) neither the front- or back-end can determine the level of
 | 
			
		||||
>    encryption provided by the SSH tunnel - or even whether an
 | 
			
		||||
>    SSH tunnel is in use.  This prevents security-aware clients
 | 
			
		||||
>    from refusing any connection with unacceptly weak encryption.
 | 
			
		||||
 | 
			
		||||
Spelling error.
 | 
			
		||||
 | 
			
		||||
> Finally, the client library can have one or more trusted root
 | 
			
		||||
> certificates compiled into it.  This allows clients to verify
 | 
			
		||||
> certificates without the need for local copies.  To do this,
 | 
			
		||||
> the source file src/interfaces/libpq/fe-ssl.c must be edited
 | 
			
		||||
> and the database recompiled.
 | 
			
		||||
 | 
			
		||||
"PostgreSQL" recompiled -- database versus RDBMS can be ambiguous.
 | 
			
		||||
 | 
			
		||||
> Mutual authentication requires that servers and clients each
 | 
			
		||||
> authenticate to the other.  This protects the server from
 | 
			
		||||
> false clients in addition to protecting the clients from false
 | 
			
		||||
> servers.
 | 
			
		||||
 | 
			
		||||
"false" in this context?
 | 
			
		||||
 | 
			
		||||
Cheers,
 | 
			
		||||
 | 
			
		||||
Neil
 | 
			
		||||
 | 
			
		||||
-- 
 | 
			
		||||
Neil Conway <neilconway@rogers.com>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user