18.8. 암호화 옵션

PostgreSQL은 데이터베이스 서버 도난, 비양심적인 관리자 및 불안정한 네트워크로 인해 데이터가 공개되지 않도록 보호하는 데 있어 몇 가지 단계의 암호화와 유연성을 제공한다. 또한 암호화는 의료 기록 또는 금융 트랜잭션 같은 중요 데이터의 보호를 위해서도 필요하다.

패스워드 암호화

Database user passwords are stored as hashes (determined by the setting password_encryption), so the administrator cannot determine the actual password assigned to the user. If SCRAM or MD5 encryption is used for client authentication, the unencrypted password is never even temporarily present on the server because the client encrypts it before being sent across the network. SCRAM is preferred, because it is an Internet standard and is more secure than the PostgreSQL-specific MD5 authentication protocol.

특정 칼럼에 대한 암호화

pgcrypto 모듈은 특정 필드를 암호화해서 저장하는 것을 허용한다. 일부 데이터만 중요한 경우에 이것이 유용하다. 클라이언트가 암호 해독 키를 제공하고 데이터가 서버에서 암호 해독된 다음, 클라이언트로 전송된다.

암호 해독된 데이터 및 암호 해독 키는 암호가 해독되고 클라이언트와 서버 간에 통신이 일어나는 짧은 시간 동안 서버에 제공된다. 여기에는 시스템 관리자처럼 데이터베이스 서버에 대한 전체 액세스 권한이 있는 누군가가 데이터와 키를 가로챌 수 있는 짧은 순간이 존재한다.

데이터 파티션 암호화

스토리지 암호화는 파일 시스템 레벨 또는 블록 레벨에서 수행된다. Linux 파일 시스템 암호화 옵션에는 eCryptfs 및 EncFS가 포함되는 반면, FreeBSD는 PEFS를 사용한다. 블록 레벨 또는 풀 디스크 암호화 옵션에는, Linux에서는 dm-crypt + LUKS가 포함되고 FreeBSD에서는 GEOM 모듈 geli 및 gbde가 포함된다. Windows를 비롯한 여러 가지 다른 운영 체제에서 이 기능이 지원된다.

드라이브 또는 전제 컴퓨터가 도난 당한 경우 이 메커니즘은 암호화되지 않은 데이터를 드라이브에서 읽지 못하게 한다. 파일 시스템이 마운트될 때 운영 체제가 암호화되지 않은 데이터 뷰를 제공하므로 파일 시스템이 마운트된 상태에서는 공격으로부터 데이터를 보호하지 못한다. 그러나, 파일 시스템을 마운트하려면 암호화 키를 운영 체제에 전달하는 방법이 필요하며, 디스크를 마운트하는 호스트 어딘가에 키를 저장해야 할 때도 있다.

네트워크에서 데이터 암호화

SSL 연결은 네트워크로 전송된 모든 데이터(패스워드, 쿼리 및 리턴 데이터)를 암호화한다. pg_hba.conf 파일은 어떤 호스트가 암호화되지 않은 연결을 사용할 수 있는지(host) 및 어떤 것이 SSL-암호화된 연결을 요구하는지(hostssl)를 관리자가 지정할 수 있게 한다. 또한 클라이언트는 SSL을 통해서만 서버에 연결하도록 지정 가능하다.

GSSAPI-encrypted connections encrypt all data sent across the network, including queries and data returned. (No password is sent across the network.) The pg_hba.conf file allows administrators to specify which hosts can use non-encrypted connections (host) and which require GSSAPI-encrypted connections (hostgssenc). Also, clients can specify that they connect to servers only on GSSAPI-encrypted connections (gssencmode=require).

Stunnel or SSH can also be used to encrypt transmissions.

SSL 호스트 인증

이것은 클라이언트 및 서버 양쪽에서 서로 간에 SSL 인증서를 제공하는 것이 가능하다. 양쪽에서 추가적인 설정이 일부 필요하지만 이로써 단순히 패스워드만 사용하는 것보다 훨씬 강력한 ID 검증이 가능하다. 이것은 클라이언트가 보낸 패스워드를 읽는 데 필요한 시간만큼 컴퓨터가 서버인 척하는 것을 방지한다. 또한 클라이언트와 서버 사이에 있는 컴퓨터가 서버인 척 해서 클라이언트와 서버 사이의 모든 데이터를 읽고 전달하는 중간자(man in the middle) 공격을 방지하는 데에도 효과가 있다.

클라이언트 측 암호화

서버 머신의 시스템 관리자를 신뢰할 수 없는 경우 클라이언트가 데이터를 암호화해야 한다. 이러한 방식으로 암호화되지 않은 데이터를 데이터베이스 서버에 절대 나타나지 않는다. 데이터는 서버로 전송되기 전에 클라이언트에서 암호화되고 데이터베이스 결과는 사용 전에 클라이언트에서 암호가 해독되어야 한다.