SSL sertifikası kullanmak, bağlantımızı şifrelediği için araya girebilecek kötü niyetli kişilerin paketlerimizi dinlemek istediğinde şifrelenmiş bir mesajla karşılaşmasını sağlıyor. Bu sayede paketimizde taşıdığımız bağlantı bilgilerimiz güvende oluyor.

STIG(Security Technical Implemention Guide) kurallarına göre SSL kullanmamız kesinlikle gereklidir. Detaylı bilgi için: PostgreSQL Security Technical Implementation Guide

Nasıl Kullanılır?

PostgreSQL Sunucusunun ayarları: 

Öncelikle PostgreSQL sunucumuz için "data" dizinimizin altında sertifikalarımızı "postgres" Linux kullanıcısı ile oluşturalım:

1) Bu komut ile sunucumuz için bir özel anahtar oluşturuyoruz. Burada özel anahtarımıza bir parola vermemiz gerekiyor fakat bu parolayı daha sonra kaldıracağız. Çünkü PostgreSQL'in yeniden başlaması durumunda sorulan parola girilemeyeceği için hata verecektir ve bağlantı kurulamayacaktır.
 
openssl genrsa -des3 -out /var/lib/pgsql/11/data/server.key 4096

2) Oluşturduğumuz anahtardan parolayı kaldıralım:
 
openssl rsa -in /var/lib/pgsql/11/data/server.key -out /var/lib/pgsql/11/data/server.key

3) Sunucumuzun "self-signed" sertifikasını oluşturalım:
 
openssl req -newkey rsa:4096 -x509 -days 3650 -subj '/CN=Sunucunun-IP-Adresi' -key /var/lib/pgsql/11/data/server.key -out /var/lib/pgsql/11/data/server.crt

Common Name(CN) bölümüne;
Eğer IP ile bağlantı sağlanıyorsa IP adresini,
Eğer bir "hostname" ile bağlantı sağlanıyorsa "hostname" yazılmalıdır.
("Wildcard" için kullanabilirsiniz.)

4) Oluşturduğumuz sertifika ve özel anahtarın yetkilerinden emin olalım:
 
chmod 400 /var/lib/pgsql/11/data/server.key

5) Son oluşturduğumuz "self-signed" sertifikayı, bağlantı isteği gönderecek uygulamanın kullanacağı "root" sertifikası olarak da kullanabileceğimiz için adını değiştirelim:
 
cp /var/lib/pgsql/11/data/server.crt /var/lib/pgsql/11/data/root.crt

6) PostgreSQL'in "postgresql.conf" dosyasında bulunan iki parametreyi düzenleyerek SSL'i aktif hale getirip, "root" sertifikasının yerini belirlememiz gerekiyor.Bunlar şu şekilde:
 
ssl = 'on'
ssl_ca_file = 'root.crt'

7) Daha sonra bağlantı yönetimini ayarlamamız gerekiyor. Bunun için "pg_hba.conf" içerisinde bulunan dört adet bağlantı yöntemi vardır. Bunlar şu şekilde açıklanabilir:

local: Bu bağlantı tipi unix-domain soketini kullanacak bağlantılar için kullandığımız bir bağlantı tipidir.
host: SSL ile şifrelenmiş veya normal IPv4/IPv6 bağlantılar için kullanacağımız bir bağlantı tipidir.
hostssl: Sadece SSL ile şifrelenmiş bağlantılar için kullanılabilecek bir bağlantı tipidir.
hostnossl: Sadece SSL ile şifrelenmemiş bağlantılar için kullanılabilecek bir bağlantı tipidir.

Bu bağlantı yöntemlerine göre SSL ile bağlanması istenilen kullanıcı için şu şekilde bir ayar yapabilirsiniz:
 
hostssl  <veritabanı-adı> <kullanıcı-adı> <IP-adresi> cert clientcert=1

Burada belirtiğimiz "cert" metodu, sertifikanın içindeki Common Name 'in bağlanan kullanıcının adı ile eşleşip eşleşmediğini kontrol eder. Eğer Common Name ile değil de parola ile kontrol etmek istiyorsak buraya "scram-sha-256" gibi başka bir kontrol metodu da belirtebiliriz.

Belirtilen "clientcert=1" seçeneği ile bağlantının bizim sunucumuzda ürettiğimiz sertifikalar ile imzalanmış bir sertifikayla gelip gelmediğini kontrol edilmesini sağlamış oluruz.
 

Bağlantı İsteği Gönderecek Sunucu Ayarları:

Bağlantı isteğinin SSL ile şifrelenmesini istediğimiz sunucu için bir özel anahtar oluşturalım:

1) Önce bu özel anahtar ile bağlantı kurmasını istediğimiz kullanıcıda bir "~/.postgresql" dizini oluşturalım:
 
mkdir -m 700 ~/.postgresql

2) Daha sonra bu komut ile sunucumuz için bir özel anahtar oluşturuyoruz. Burada özel anahtarımıza bir parola vermemiz gerekiyor fakat bu parolayı daha sonra kaldıracağız. Çünkü otomatik olarak yeniden bağlantı kurulması gereken bir durumda sorulan parola girilemeyeceği için hata verecektir ve bağlantı kurulamayacaktır.

 
openssl genrsa -des3 -out ~/.postgresql/postgresql.key 4096

3) Oluşturduğumuz özel anahtardan parolayı kaldıralım:
 
openssl rsa -in ~/.postgresql/postgresql.key -out ~/.postgresql/postgresql.key

4) Özel anahtarımızla imzaladığımız ve sunucu tarafından onay için imzalanmasını istediğimiz Certificate Signing Request(CSR) oluşturalım:
 
openssl req -newkey rsa:4096 -subj '/CN=Kullanıcı-Adı' -key ~/.postgresql/postgresql.key -out ~/.postgresql/postgresql.csr

Burada Common Name(CN) bölümüne;
bu sertifikayı kullanarak bağlantı yapacak PostgreSQL kullanıcısının adı yazılmalıdır.

5) Bağlantı yapılacak sunucuda; bağlantı isteği gönderecek sunucu için "root" sertifikasıyla ve bağlantının yapılacağı sunucunun özel anahtarıyla, bağlantı yapacak sunucunun sertifikasını imzalayalım:
 
openssl x509 -req -in postgresql.csr -CA root.crt -CAkey server.key -out postgresql.crt -CAcreateserial

6) Son olarak bağlantı isteği gönderecek olan sunucunun özel anahtarının yetkilerinden emin olalım:
 
chmod 400 ~/.postgresql/postgresql.key

Aşağıdaki sorgu ile SSL kullanan bağlantıları ve bağlantı detaylarını görüntüleyebilirsiniz:
 
SELECT FROM pg_stat_ssl;


 

No comments

The author does not allow comments to this entry