@ -18,12 +18,10 @@
# include "postgres.h"
# include "postgres.h"
# include <sys/stat.h>
# include <signal.h>
# include <signal.h>
# include <fcntl.h>
# include <fcntl.h>
# include <ctype.h>
# include <ctype.h>
# include <sys/socket.h>
# include <sys/socket.h>
# include <unistd.h>
# include <netdb.h>
# include <netdb.h>
# include <netinet/in.h>
# include <netinet/in.h>
# ifdef HAVE_NETINET_TCP_H
# ifdef HAVE_NETINET_TCP_H
@ -320,70 +318,3 @@ secure_raw_write(Port *port, const void *ptr, size_t len)
return n ;
return n ;
}
}
bool
check_ssl_key_file_permissions ( const char * ssl_key_file , bool isServerStart )
{
int loglevel = isServerStart ? FATAL : LOG ;
struct stat buf ;
if ( stat ( ssl_key_file , & buf ) ! = 0 )
{
ereport ( loglevel ,
( errcode_for_file_access ( ) ,
errmsg ( " could not access private key file \" %s \" : %m " ,
ssl_key_file ) ) ) ;
return false ;
}
if ( ! S_ISREG ( buf . st_mode ) )
{
ereport ( loglevel ,
( errcode ( ERRCODE_CONFIG_FILE_ERROR ) ,
errmsg ( " private key file \" %s \" is not a regular file " ,
ssl_key_file ) ) ) ;
return false ;
}
/*
* Refuse to load key files owned by users other than us or root .
*
* XXX surely we can check this on Windows somehow , too .
*/
# if !defined(WIN32) && !defined(__CYGWIN__)
if ( buf . st_uid ! = geteuid ( ) & & buf . st_uid ! = 0 )
{
ereport ( loglevel ,
( errcode ( ERRCODE_CONFIG_FILE_ERROR ) ,
errmsg ( " private key file \" %s \" must be owned by the database user or root " ,
ssl_key_file ) ) ) ;
return false ;
}
# endif
/*
* Require no public access to key file . If the file is owned by us ,
* require mode 0600 or less . If owned by root , require 0640 or less to
* allow read access through our gid , or a supplementary gid that allows
* to read system - wide certificates .
*
* XXX temporarily suppress check when on Windows , because there may not
* be proper support for Unix - y file permissions . Need to think of a
* reasonable check to apply on Windows . ( See also the data directory
* permission check in postmaster . c )
*/
# if !defined(WIN32) && !defined(__CYGWIN__)
if ( ( buf . st_uid = = geteuid ( ) & & buf . st_mode & ( S_IRWXG | S_IRWXO ) ) | |
( buf . st_uid = = 0 & & buf . st_mode & ( S_IWGRP | S_IXGRP | S_IRWXO ) ) )
{
ereport ( loglevel ,
( errcode ( ERRCODE_CONFIG_FILE_ERROR ) ,
errmsg ( " private key file \" %s \" has group or world access " ,
ssl_key_file ) ,
errdetail ( " File must have permissions u=rw (0600) or less if owned by the database user, or permissions u=rw,g=r (0640) or less if owned by root. " ) ) ) ;
return false ;
}
# endif
return true ;
}