SSL이 필요하고 SELinux를 켜 놓은 상태로 유지하고 로그를 모니터링 하며 현재 PostgreSQL 버전을 사용하십시오 .
서버 측
SSL 필요
에서 postgresql.conf설정 ssl=on하고 (워드 프로세서와의 주석을 참조하여 키 파일 및 certfile가 적절하게 설치되어 있는지 확인하십시오 postgresql.conf).
클라이언트에 대한 특별한 설정없이 클라이언트가 인증서를 신뢰하게하려면 CA에서 인증서를 구입해야 할 수 있습니다.
에서 pg_hba.conf와 같은 사용 무언가 :
hostssl theuser thedatabase 1.2.3.4/32 md5
... 아마도 사용자 및 / 또는 데이터베이스에 대해 "all"을 사용하고 더 넓은 소스 IP 주소 필터를 사용합니다.
로그인 할 수있는 사용자 제한, 원격 수퍼 유저 로그인 거부
가능하면 사용자에게 "모두"를 허용하지 마십시오. 필요하지 않은 경우 수퍼 유저 로그인을 원격으로 허용하지 않습니다.
사용자의 권리 제한
로그인 할 수있는 사용자의 권한을 제한하십시오. 사용자 CREATEDB또는 CREATEUSER권한을 부여하지 마십시오 .
REVOKECONNECT에서 바로 PUBLIC모든 데이터베이스에 후 데이터베이스에 대한 액세스 할 수 있어야합니다 사용자 만 / 역할에 다시 제공합니다. (사용자를 역할로 그룹화하고 개별 사용자가 아닌 역할에 대한 권한을 부여하십시오).
원격 액세스 권한이있는 사용자는 필요한 DB에만 연결할 수 있고 실제로 필요한 스키마, 테이블 및 열에 대한 권한 만 보유해야합니다. 이것은 로컬 사용자에게도 좋은 방법입니다. 합리적인 보안입니다.
클라이언트 설정
PgJDBC에서 매개 변수를 전달하십시오ssl=true .
JDBC 드라이버가 SSL 연결을 시도하고 설정하도록 지시하려면 연결 URL 매개 변수 ssl = true를 추가해야합니다.
... 및 클라이언트의 신뢰 저장소에 서버 인증서를 설치하거나 사용자가 인증서를 설치하지 못하게하려면 Java의 내장 신뢰 저장소에있는 CA 중 하나가 신뢰하는 서버 인증서를 사용하십시오.
지속적인 행동
이제 PostgreSQL을 최신 상태로 유지하십시오 . PostgreSQL에는 몇 가지 사전 인증 보안 허점 만 있었지만 0보다 크므로 최신 상태로 유지하십시오. 어쨌든 버그 수정은 좋은 것입니다.
액세스 할 필요가없는 대규모 넷 블록 / 지역이있는 경우 방화벽을 앞에 추가하십시오.
연결 및 연결 끊기 (참조 postgresql.conf). 실용적인 경우 쿼리를 기록합니다. 가능한 경우 침입 감지 시스템 또는 fail2ban 또는 이와 유사한 장치를 앞에서 실행하십시오. postgres가있는 fail2ban의 경우 편리한 사용법이 있습니다.
로그 파일을 모니터하십시오.
보너스 편집증
고려해야 할 추가 단계 ...
클라이언트 인증서 필요
원하는 경우 pg_hba.conf클라이언트가 서버에서 신뢰하는 X.509 클라이언트 인증서를 제시하도록 요구할 수도 있습니다 . 서버 인증서와 동일한 CA를 사용할 필요가 없습니다. homebrew openssl CA를 사용하여이를 수행 할 수 있습니다. JDBC 사용자는 클라이언트 인증서를 Java Keystore로 가져 와서 keytool일부 JSSE 시스템 특성을 구성하여 Java를 해당 키 저장소로 지정해야합니다. 따라서 완전히 투명하지는 않습니다.
인스턴스 검역
실제로 편집증 환자가 되려면 별도의 컨테이너 / VM에서 또는 적어도 다른 사용자 계정으로 필요한 데이터베이스만으로 클라이언트 인스턴스를 실행하십시오.
그렇게하면 PostgreSQL 인스턴스가 손상되면 더 이상 얻을 수 없습니다.
SELinux 사용
나는 이것을 말할 필요는 없지만 ...
RHEL 6 또는 7과 같은 SELinux 지원 시스템을 실행하고 SELinux를 끄거나 허용 모드로 설정하지 마십시오 . 강제 모드로 유지하십시오.
기본이 아닌 포트 사용
에 의해 보안 에만 무명은 어리 석음이다. 현명한 일을 한 후에는 약간의 모호함을 사용하는 보안이 손상되지 않을 것입니다.
기본이 아닌 포트에서 Pg를 실행하면 자동화 된 공격자의 삶이 조금 더 어려워집니다.
프록시를 앞에 두십시오
연결 풀 및 프록시 역할을하는 PostgreSQL 앞에서 PgBouncer 또는 PgPool-II를 실행할 수도 있습니다. 그렇게하면 프록시가 실제 데이터베이스 호스트가 아닌 SSL을 처리하도록 할 수 있습니다. 프록시는 별도의 VM 또는 컴퓨터에있을 수 있습니다.
클라이언트 응용 프로그램에 이미 기본 제공 풀이없는 경우 연결 풀링 프록시를 사용하는 것이 일반적으로 PostgreSQL에서 좋은 생각입니다. 대부분의 Java 응용 프로그램 서버, Rails 등에는 기본 제공 풀링이 있습니다. 그럼에도 서버 측 풀링 프록시는 최악의 상태입니다.