
Network üzerinden bağlantıların şifreli olması artık günümüzde bir tercih olmaktan çıktı bir zorunluluk haline geldi, elbette bu durum bazı ek maliyetler getirmektedir. Bu yazıda SSL sertifikası oluşturarak bu SSL sertifikası ile PostgreSQL database SSL özelliğini nasıl etkinleştirilir konuları üzerinde durulacaktır. Burada SSL üzerinde detaylı bilgi verilmeyecektir.
Sertifika oluşturmak için Linux ortamda
Kısaca ve toplu adımlar şu şekilde ;
##CA (certificate authority)
openssl genrsa 2048 > ca.key
openssl req -new -x509 -nodes -days 365000 -key ca.key -out ca.cert
##server
openssl req -newkey rsa:2048 -nodes -days 365000 -keyout server.key -out server.csr
openssl x509 -req -days 365000 -set_serial 01 -in server.csr -out server.cert -CA ca.cert -CAkey ca.key
Bu adımları tek tek açarsak;
--CA (certificate authority)
$ openssl genrsa 2048 > ca.key
Generating RSA private key, 2048 bit long modulus (2 primes)
...............+++++
.................................................................................................
openssl req -new -x509 -nodes -days 365000 -key ca.key -out ca.cert
--server
openssl req -newkey rsa:2048 -nodes -days 365000 -keyout server.key -out server.csr
openssl x509 -req -days 365000 -set_serial 01 -in server.csr -out server.cert -CA ca.cert -CAkey ca.key
ca.key içeriğine baktığımızda RSA private key oluşturulduğunu görürüz.
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA27D2duZLrD331cOFCfuGLB2qbJKE91cRH8F7xCYFe6AO5Fj8
fd7y6/Ns1dATIpgg56//i2wKcUuuVDY1HZ3gqpcvjwCg9/M4C9CsA5e56DcXfZi4
JkSjUfC9k2VZ++SDdPPKp1Ewaw067M8IXvxyTs2941KJzxG8391Qhhq0v7lZ6tit
xAEDXd67sMGyEGhlo4S46sqkKrZsRQoRP7aHaWSqfi7hjV6czTOdVGnHnD7bvFKJ
NvzCK6bSct3WMdv5iiiBnkmEntjfpG487uisn4s9TsZ9paNK6g/xqwCpKENY1L98
hUYHWhbwoH7wlf9xBgrDMpq7j1sqwxfxBXnPHwIDAQABAoIBAQCvQvbslf7Ks0kT
LP7mntVEPopmQWF4XOpZVibhrZ90J5WZz+/mjsVnPPSXgn6xe4HMs9h/JrsR9Vlm
7zPio7/G+APF5q+D/3G340pHN3Tlb4X6+an3RYyxYwgqHZHy5TOGSrNiVd/1l0Fq
CCRaerTKb1JMlt0/55uxUELcKVQHGmHOOjFloTY0vB1ZuC0jNOMGKO/2mZ+aK6kk
mvJnZb2GWOXtJmXCa0EnaPENhbbnwZrKOkFmtPCP9ejDnku4ZMlPz5zFeIufBaiE
hsk/FctwQjaddM1eUAJBAxS9GSchz2YP6cnrxSa8LjHHQZ3mvoqzLzHgx+MnTfMz
9WIRDcaxAoGBAPHl/WJZOIlEaQdDarv37BPTz0eKPsxYOgjjVOIrAtYdGuboJHQF
RDSgjrLjoeALMzATEhAeL+zXCMhpREFGWbN4zFE+S+rE9zOm8G5ikuEu44rQmtop
mSafY8qqx16NDEVFlj4twxgcUbgU4+Eim26YU2TrBlARVNMwCZWF+usZAoGBAOh/
j6bJDROkVevxkfCDCCQQVP9P64Xvcm1mAaG+ZtLr3Zc759rIG/TPr14NgcVaWZg0
HAVcM+Rc8aCjp+52ZMOtiXfhyx0LEdcbdMJkF1fTR9hplDUl2I7ItbYeIvjt3UCF
h9Lhz40nhrkakJdM5w4qqkPfj6kvtLTSjhSlAgr3AoGBALbS2JsIS86TQb4XmgfO
7UJfB35OYgAXfmVRS8pUL6ScAsUaFtMJV+9emftiR+oJDPr8rt43sokSTLULumaL
QSh/2AxfRQl/LEaBmZ4UKma/BYLY/vB8GCA0vzthr6UqfWetnEwKUjVa0fiK8WAq
w8bmocDYUMEbGD01RUkZJfehAoGBAMmClh02sJDPpHDlZVoSF6I6TZEj0by6NnE/
Mjbf8frp15tWnrPvMNvUjeh0yH8mufTDZW335joNnJdggRKbpuY6qKUxHHxFtea8
s0wwuFK0mtalW4FdFf9bUrNQF3utnlBn67sJYHy1P3172spoKvMKY5yETd2TrYnz
3JVkFwstAoGAOQNXz59Cek9Z9pE/zr5rh5/ncIpU9K3FiioGFOGcXoC8pAhALFB0
EOWmjCLaZ0sxove7e638uUFbCCRnL6LZoL/1iSHSaOQfVVqKfX2lqlWu8uejsZtG
7/ao5RabEAWt8w+HslvluicF6f11JqXOWcEVZk54pHxJTIzJ0kN8BwQ=
-----END RSA PRIVATE KEY-----
Sonrasında bu private key (ca.key) kullanarak bir -CA (Ceritificates Authority) bir cert file oluşturacağız. Bize bazı sorular soracak
$ openssl req -new -x509 -nodes -days 365000 -key ca.key -out ca.cert
Country Name (2 letter code) [XX]:tr
State or Province Name (full name) []:ankara
Locality Name (eg, city) [Default City]:ankara
Organization Name (eg, company) [Default Company Ltd]:farukcevik
Organizational Unit Name (eg, section) []:DBA
Common Name (eg, your name or your server's hostname) []:www.farukcevik.com.tr
Email Address []:yfarukcevik@gmail.com
ca.cert file da oluştu. Şimdi Server Kısmına geliyoruz bu private key ve bu private keyden oluşturulan sertifika kullanılarak PostgreSQL SSL bağlantı için ihtiyaç duyulan dosyaları üretelim.
##server
$ openssl req -newkey rsa:2048 -nodes -days 365000 -keyout server.key -out server.csr
Country Name (2 letter code) [XX]:tr
State or Province Name (full name) []:ankara
Locality Name (eg, city) [Default City]:ankara
Organization Name (eg, company) [Default Company Ltd]:farukcevik
Organizational Unit Name (eg, section) []:DBA
Common Name (eg, your name or your server's hostname) []:www.farukcevik.com.tr
Email Address []:yfarukcevik@gmail.com
$ openssl x509 -req -days 365000 -set_serial 01 -in server.csr -out server.cert -CA ca.cert -CAkey ca.key
Signature ok
subject=C = tr, ST = ankara, L = ankara, O = farukcevik, OU = B\7FDBA, CN = "www.farukcevik.com.tr,", emailAddress = yfarukcevik@gmail.com
Getting CA Private Key
Dosyalarımızı kontrol edelim
- ca.key -> Certificate authority key. Ortak kullanım için gerekli değildir.
- ca.cert -> Certificate authority certificate. Gerekli.
- server.key -> Key dosyası. Gerekli.
- server.csr -> İmzalama isteği. Ortak kullanım için gerekli değildir.
- server.cert -> Sertifika dosyası. Gerekli.
PostgreSQL
postgresql.conf ve pg_hba.conf dosyalaını düzenlemeliyiz, postgresql.conf için
ssl = on
ssl_ca_file = '/var/lib/pgsql/11/data/ssl/ca.cert'
ssl_cert_file = '/var/lib/pgsql/11/data/ssl/server.cert'
ssl_key_file = '/var/lib/pgsql/11/data/ssl/server.key'
pg_hba.conf için ; hangi bağlantıların ssl olmasını istiyor isek o bağlantıları host yerine hostssl olarak tanımlamalıyız.
hostssl all all 0.0.0.0/0 md5
Bu operasyon restart gerektirir.
$ pg_ctl stop
$ pg_ctl start
postgres=# show ssl;
ssl
-----
on
(1 row)
Bağlantı test edelim
$ psql -h 146.190.18.50 -d postgres -U bfmuser -W
Password:
psql (14.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=# SELECT * FROM pg_stat_ssl;
pid | ssl | version | cipher | bits | client_dn | client_serial | issuer_dn
-------+-----+---------+------------------------+------+-----------+---------------+-----------
28529 | t | TLSv1.3 | TLS_AES_256_GCM_SHA384 | 256 | | |
(1 row)
Bir yanıt yazın