SSL ile Güvenli TCP / IP Bağlantıları
PostgreSQL, artırılmış güvenlik gereksinimleriniz için istemci / sunucu iletişimini şifrelemek üzere SSL bağlantı desteğine sahiptir. Bu özelliğin kullanılabilir olması için OpenSSL’nin hem istemci hem de sunucu sistemlerinde kurulu ve derleme sırasında bu özelliğin etkinleştirilmiş olması gerekir.
PostgreSQL sunucusu, postgresql.conf dosyasından ssl
parametresi on
olarak ayarlanarak SSL etkinleştirilmiş halde başlatılabilir. Sunucu aynı TCP bağlantı noktasından hem SSL bağlantılarını hem normal bağlantıları dinler. Sunucu, SSL kullanıp kullanmama konusunda bağlanan istemciyle görüşür. SSL kullanımı, bağlantıların bir kısmı veya tamamı için gerektirecek şekilde ayarlanabilir.
SSL modunda başlamak için, sunucu sertifikası ve private key’i içeren dosyalar mevcut olmalıdır. Bu dosyaların, sunucunun veri dizininde sırasıyla server.crt
ve server.key
olarak adlandırılır. Başka isim ve konumlar için ssl_cert_file
ve ssl_key_file
yapılandırma parametreleri kullanılır.
Unix sistemlerinde server.key
üzerindeki izinler dışarıya veya gruba herhangi bir erişime izin vermemelidir. Bunu chmod 0600 server.key
komutuyla sağlayın.
OpenSSL Yapılandırması
PostgreSQL, sistem geneli OpenSSL yapılandırma dosyası openssl.cnf
‘ı kullanır. Bu dosya, openssl version -d
tarafından bildirilen dizinde bulunur.
OpenSSL, çeşitli cipher ve kimlik doğrulama algoritmalarını destekler. OpenSSL yapılandırma dosyasında bir cipher listesi belirtirken, postgresql.conf içindeki ssl_ciphers‘ı değiştirerek veritabanı sunucusu tarafından kullanılmak üzere spesifik olarak cipher belirtebilirsiniz.
İstemci Sertifikalarını Kullanma
İstemcinin güvenilir bir sertifika sağlamasını zorunlu kılmak için, güvendiğiniz kök sertifika otoritelerinin sertifikalarını veri dizinindeki bir dosyaya yerleştirin, postgresql.conf‘daki ssl_ca_file
parametresini yeni dosya adına ayarlayın ve pg_hba.conf içindeki ilgili hostssl
satırlarına clientcert=verify-ca
veya clientcert=verify-full
kimlik doğrulama seçeneğini ekleyin. Artık SSL bağlantısı geldiğinde istemciden bir sertifika istenecektir.
clientcert=verify-ca
ile istemci sertifikasının güvenilir sertifika otoriteleri tarafından imzalandığını doğrular. clientcert=verify-full
ayarında, sunucu yalnızca sertifika zincirini doğrulamakla kalmaz, aynı zamanda kullanıcı adının veya eşlemesinin sağlanan sertifika cn
(Common Name) ile eşleşip eşleşmediğini de kontrol eder. clientcert
kimlik doğrulama seçeneği hostssl
olarak belirtilen pg_hba.conf satırlarında tüm kimlik doğrulama yöntemleri için kullanılabilir.
SSL Sunucu Dosyası Kullanımı
Aşağıdaki tablo, sunucudaki SSL kurulumuyla ilgili dosyaları özetlemektedir.
Dosya | İçerik | Aksiyon |
---|---|---|
ssl_cert_file ($PGDATA/server.crt) |
sunucu sertifikası | Sunucunun kimliğini belirtmek için istemciye gönderilir |
ssl_key_file ($PGDATA/server.key) |
sunucu özel anahtarı ( private key ) | Sunucu sertifikasının sahibi tarafından gönderildiğini kanıtlar, sertifika sahibinin güvenilir olduğunu göstermez |
ssl_ca_file |
güvenilir sertifika otoriteleri | İstemci sertifikasının güvenilir bir sertifika otoritesi tarafından imzalanıp imzalanmadığını kontrol eder |
ssl_crl_file |
sertifika yetkilileri tarafından iptal edilen sertifikalar | İstemci sertifikası bu listede olmamalıdır |
Sunucu, bu dosyaları sunucu başlangıcında ve sunucu yapılandırması yeniden yüklendiğinde okur. Sunucu başlangıcınca, bu dosyalarda bir hata tespit edilirse sunucu başlatılmaz. Fakat, bir yapılandırma yeniden yüklemesi sırasında hata algılanırsa, dosyalar yok sayılır ve eski SSL yapılandırması kullanılmaya devam eder. Tüm bu olaylar sunucu günlüğünde raporlanır.
Sertifikaların Oluşturulması
Sunucu için 365 gün geçerli kendinden imzalı bir sertifika oluşturmak için aşağıdaki OpenSSL komutunu kullanın. dbhost.yourdomain.com
kısmını sunucunun ( host ) ismiyle değiştirin:
openssl req -new -x509 -days 365 -nodes -text -out server.crt \
-keyout server.key -subj "/CN=dbhost.yourdomain.com"
Sonra şunu uygulayın;
chmod og-rwx server.key
sertifika imzalama isteği ( CSR ) ve public / private anahtar dosyalarını oluşturun:
openssl req -new -nodes -text -out root.csr \
-keyout root.key -subj "/CN=root.yourdomain.com"
chmod og-rwx root.key
Ardından, kök sertifika otoritesi oluşturmak için isteği anahtarla imzalayın:
openssl x509 -req -in root.csr -text -days 3650 \
-extfile /etc/ssl/openssl.cnf -extensions v3_ca \
-signkey root.key -out root.crt
Son olarak, yeni root sertifika otoritesi tarafından imzalanmış bir sunucu sertifikası oluşturun:
openssl req -new -nodes -text -out server.csr \
-keyout server.key -subj "/CN=dbhost.yourdomain.com"
chmod og-rwx server.key
openssl x509 -req -in server.csr -text -days 365 \
-CA root.crt -CAkey root.key -CAcreateserial \
-out server.crt
server.crt
ve server.key
sunucuda, root.crt
ise istemcide depolanmalıdır. root.key
sonraki sertifikaların oluşturulmasında kullanılmak üzere depolanmalıdır.Ara sertifikaları içeren bir güven zinciri oluşturmak da mümkündür:
# root
openssl req -new -nodes -text -out root.csr \
-keyout root.key -subj "/CN=root.yourdomain.com"
chmod og-rwx root.key
openssl x509 -req -in root.csr -text -days 3650 \
-extfile /etc/ssl/openssl.cnf -extensions v3_ca \
-signkey root.key -out root.crt
# intermediate
openssl req -new -nodes -text -out intermediate.csr \
-keyout intermediate.key -subj "/CN=intermediate.yourdomain.com"
chmod og-rwx intermediate.key
openssl x509 -req -in intermediate.csr -text -days 1825 \
-extfile /etc/ssl/openssl.cnf -extensions v3_ca \
-CA root.crt -CAkey root.key -CAcreateserial \
-out intermediate.crt
# leaf
openssl req -new -nodes -text -out server.csr \
-keyout server.key -subj "/CN=dbhost.yourdomain.com"
chmod og-rwx server.key
openssl x509 -req -in server.csr -text -days 365 \
-CA intermediate.crt -CAkey intermediate.key -CAcreateserial \
-out server.crt
Kaynak: