Client kimlik doğrulaması (authentication ), pg_hba.conf olarak adlandırılan ve $PGDATA’da depolanan bir yapılandırma dosyası tarafından kontrol edilir. (HBA, host-based authentication anlamına gelir.) pg_hba.conf dosyası varsayılan olarak initdb aşamasında $PGDATA dizininde oluşturulduğunu söyledik eğer istersek  hba_file parametresi ile başka bir dizinde belirtebiliriz.

Dosyada ki her kayıt bağlantı tipi, client ip adres aralığı(bağlantı tipi için uygunsa), veritabanı adı, kullanıcı adı ve bu parametrelerle eşleşen kimlik doğrulama(authentication) yöntemini belirtir. Dosyadaki kayıtlar aşağıdaki örnekler gibi birkaç farklı biçimde olabilir.

 local         database  user  auth-method [auth-options]
host          database  user  address     auth-method  [auth-options]
hostssl       database  user  address     auth-method  [auth-options]
hostnossl     database  user  address     auth-method  [auth-options]
hostgssenc    database  user  address     auth-method  [auth-options]
hostnogssenc  database  user  address     auth-method  [auth-options]
host          database  user  IP-address  IP-mask      auth-method  [auth-options]
hostssl       database  user  IP-address  IP-mask      auth-method  [auth-options]
hostnossl     database  user  IP-address  IP-mask      auth-method  [auth-options]
hostgssenc    database  user  IP-address  IP-mask      auth-method  [auth-options]
hostnogssenc  database  user  IP-address  IP-mask      auth-method  [auth-options]
  • local : Bu kayıt, Unix domain soketleri kullanan bağlantı girişimleriyle eşleşir. Bu tür bir kayıt olmadan, Unix domain soket bağlantılarına izin verilmez dolayısıyla localhost’dan gelen isteklerde başarısız olur.
  • host : TCP/IP protokolü ile veri tabanına bağlantı kurmak isteyen clientlar için kural tanımlamayı sağlar.
  • hostssl : TCP/IP protokolü kullanılarak sadece SSL bağlantı taleplerine karşılık vermek için kullanılan tanımlamadır. Bu seçeneği kullanmak için sunucu SSL desteği ile oluşturulmalıdır. SSL yapılandırma parametresi ayarlanarak etkinleştirilmelidir. Aksi takdirde, hostssl kaydı, herhangi bir bağlantıyla eşleşemeyeceğine dair bir uyarı loga yazılması dışında yok sayılır.
  • hostnossl : SSL kullanmadan sadece TCP/IP üzerinden gelen bağlantı taleplerini karşılamak için kullanılan tanımlamadır.
  • hostgssenc : Bu kayıt, TCP / IP kullanılarak yapılan bağlantı girişimleriyle eşleşir, ancak yalnızca bağlantı GSSAPI şifrelemesiyle yapıldığında gerçekleşir. Bu seçenekten yararlanmak için sunucu GSSAPI desteği ile oluşturulmalıdır. GSSAPI şifrelemesiyle kullanılmak üzere desteklenen authentication yöntemlerinin gss, reject ve trust olduğunuda bilmeliyiz.
  • hostnogssenc : Bu kayıt türü, hostgssenc’in ters davranışına sahiptir; yalnızca GSSAPI şifrelemesini kullanmayan TCP / IP üzerinden yapılan bağlantı girişimleriyle eşleşir.

NOT : Sunucu, listen_addresses yapılandırma parametresi için uygun bir değerle başlatılmadıkça TCP / IP bağlantıları mümkün olmayacaktır, çünkü varsayılan davranış TCP / IP bağlantılarını yalnızca local loopback adresinde localhost’da dinlemektir.

  • database : Kaydın hangi veritabanı adlarıyla eşleştiğini belirtir. “all” değeri, tüm veritabanlarıyla eşleştiğini belirtir. Birden çok veritabanı adı, virgülle ayırarak sağlanabilir. Veritabanı adlarını içeren ayrı bir dosya, dosya adının önünde @ ile belirtilebilir.
  • user : Kaydın hangi veritabanı kullanıcı adlarıyla eşleştiğini belirtir. “all” değeri, tüm kullanıcılarla eşleştiğini belirtir. Birden çok kullanıcı adı, virgülle ayırarak sağlanabilir. Kullanıcı adlarını içeren ayrı bir dosya, dosya adının önünde @ ile belirtilebilir. Belirli bir veritabanına bağlanmak için, bir kullanıcının yalnızca pg_hba.conf kontrollerini geçmesi değil, aynı zamanda veritabanı için CONNECT ayrıcalığına sahip olması gerekir.
  • address : Kaydın eşleştiği client makine adreslerini belirtir. Bu alan ya bir hostname yada bir IP adresi aralığını içerebilir. IP aralığı belirtilecekse ip adresinden sonra / işareti konularak CIDR maske uzunluğu kullanıp ip aralığı belirtilir. Örn. tek bir ip için 172.20.143.89/32 veya küçük bir ağ için(256) 172.20.143.0/24 veya daha büyük bir ağ için(65536) 10.6.0.0/16 şeklindedir.
  • auth-method : Kullanıcıdan gelen bağlantı isteği bütün krititerlere uyuyor ise en son gerçekleştirilecek kimlik doğrulama adımıdır.
  • trust : Bağlantıya koşulsuz izin verin. Bu yöntem, PostgreSQL veritabanı sunucusuna bağlanabilen herkesin, herhangi bir PostgreSQL kullanıcısı olarak, bir parola veya başka bir kimlik doğrulamasına ihtiyaç duymadan oturum açmasına olanak tanır.
  • reject : Bağlantıyı koşulsuz olarak reddeder. Bu, bir gruptaki belirli bilgisayarları “filtrelemek” için kullanışlıdır, örneğin, bir reddetme satırı belirli bilgisayarın bağlanmasını engelleyebilirken, daha sonraki bir satır, belirli bir ağdaki kalan ana bilgisayarların bağlanmasına izin verir.
  • scram-sha-256 : Kullanıcının şifre doğrulaması bu algoritma ile yapılır.
  • md5 : Kullanıcının şifre doğrulaması bu algoritma ile yapılır.
  • password : Kullanıcının şifre doğrulaması şifrelenmemiş şekilde yapılır. Yani network üzerinde kullanıcının passwordu text halinde iletilir.
  • gss : Kullanıcının kimliğini doğrulamak için GSSAPI kullanır. Bu yalnızca TCP / IP bağlantıları için kullanılabilir.
  • sspi : Kullanıcının kimliğini doğrulamak için SSPI kullanır. Bu yalnızca Windows’ta mevcuttur.
  • ident : Client’deki kimlik sunucusuyla(ident server) iletişime geçerek clientin işletim sistemi kullanıcı adını alır ve istenen veritabanı kullanıcı adıyla eşleşip eşleşmediğini kontrol eder. Kimlik doğrulama yalnızca TCP / IP bağlantılarında kullanılabilir.
  • peer : Clientin işletim sistemi kullanıcı adını işletim sisteminden alır ve istenen veritabanı kullanıcı adıyla eşleşip eşleşmediğini kontrol eder. Bu yalnızca local bağlantılar için kullanılabilir.
  • ldap : LDAP server kullanılarak işlem gerçekleştirilir.
  • radius : Radius server kullanılarak işlem gerçekleştirilir.
  • cert : SSL client sertifikalarını kullanarak kimlik doğrulaması yapar.
  • pam : İşletim sistemi tarafından sağlanan Pluggable Authentication Modules (PAM) hizmetini kullanarak kimlik doğrulama yapar.
  • bsd : İşletim sistemi tarafından sağlanan BSD authentication hizmetini kullanarak kimlik doğrulaması yapar.
  • auth-options : Authentication yöntemi alanından sonra, authentication yöntemi için seçenekleri belirten name=value formunda alan (lar) olabilir. Hangi authentication yöntemleri için hangi seçeneklerin mevcut olduğu hakkında ayrıntılar linkte (https://www.postgresql.org/docs/current/auth-pg-hba-conf.html) verilmiştir.

Yeri gelmişken auth-method ile ilgili birkaç öneriyi paylaşmak istiyorum.

  • auth-method olarak hiçbir zaman password veya trust kullanmayın. Çünkü password metodu parolayı şifrelemeden olduğu gibi taşır, trust metodu ise belirlenen IP’den gelen bağlantıları parola sormadan kabul eder.
  • scram-sha-256 metodu md5’e göre daha güvenli olduğu için scram-sha-256 metodunu kullanmak en doğrusu olacak.
  • Veritabanına yapılan tüm bağlantıları mümkün olduğunda SSL ile şifreleyin. Bu işlem sırasında mutlaka “sslmode=verify-full” olarak kullanmalısınız. Mevcut sertifikaların yönetimi için mutlaka bir CRL(Certificate Revocation List) kullanın. Bu sayede bir sertifikayı iptal etmek istediğinizde bu listeye ekleme yapabilirsiniz. Bu listeyi “postgresql.conf” dosyasında “ssl_crl_file” parametresini değiştirerek belirtebilirsiniz.

pg_hba.conf kayıtları her bağlantı girişimi için sırayla incelendiğinden, kayıtların sırası önemlidir. pg_hba.conf dosyası startt-up’da ve sunucu prosesi tarafından SIGHUP sinyali aldığında okunur. Bu nedenle dosyayı aktif bir sistem de düzenlerseniz dosyayı yeniden okuması için postmaster’a (pg_ctl reload kullanarak(), pg_reload_conf () SQL fonksiyonunu çağırarak veya kill -HUP kullanarak) sinyal vermeniz gerekecektir.

 -bash-4.2$ /usr/pgsql-12/bin/pg_ctl reload -s -D $PGDATA

postgres=#  select pg_reload_conf ();

pg_hba_file_rules sistem viewi, client authentication konfigürasyon dosyası pg_hba.conf’un içeriğinin bir özetini sağlar. Bu view’de dosyadaki her boş olmayan, yorum olmayan satır için, kuralın başarılı bir şekilde uygulanıp uygulanamayacağını belirten ek açıklamalarla birlikte bir satır görünür. Bu view, authentication yapılandırma dosyasında planlanan değişikliklerin çalışıp çalışmayacağını kontrol etmek veya önceki bir arızayı teşhis etmek için yararlı olabilir.

Örnekler;

IP adresi 192.168.93.x olan herhangi client’den herhangi bir kullanıcının(işletim sistemi kullanıcısı) “postgres” veritabanına bağlanmasına izin verir.

host    postgres        all             192.168.93.0/24         ident 

Kullanıcı şifresi doğru girilmişse, 192.168.12.10 bilgisayarından herhangi bir kullanıcının “postgres” veritabanına bağlanmasına izin verir.

host    postgres        all             192.168.12.10/32        scram-sha-256 

Kullanıcı şifresi doğru girilmişse, example.com domainindeki bilgisayarlardan herhangi bir kullanıcının herhangi bir veritabanına bağlanmasına izin verir.

host    all             all            .example.com            md5 

Bütün IP’lerden gelen bütün bağlantılara şifresiz izin veren pg_hba.conf kaydı bu şekilde düzenlenir.

 host    all             all             0.0.0.0/0               trust

Mustafa Bektaş Tepe
İyi Çalışmalar

Loading