PostgreSQL'de Parolası Encrypt Edilmemiş Kullanıcılar için Authentication Düzenlemesi

Merhaba,

PostgreSQL'de authentication ayarlarını pg_hba.conf dosyası içinde yapıyoruz. Pg_hba.conf dosyasına ait detaylı bilgiye buradan ulaşabilirsiniz. Pg_hba.conf içinde authentication method olarak password kullanılmışsa bunun anlamı kullanıcı parolası network üzerinden plaintext olarak aktarıldığıdır. Eğer böyle bir durumda authentication method değiştirmek istenirse izlenecek adım;
  1. Belirli bir kullanıcı için authentication method password kullanılmış ise o kullanıcının parolasının encrypt olup olmadığından pg_authid tablosuna bakılarak emin olunmalı.
  2. Eğer kullanıcı parolası encrypt edilmemişse(pg_authid tablosunda rolpassword alanına bakılmalı) o kullanıcı için ALTER ROLE .. WITH ENCRYPTED PASSWORD 'kullanıcı_parolası'; denilmeli.
  3. Kullanıcı parolası encrypted olarak saklandığına göre pg_hba.conf dosyasında password yerine 9.6 ve öncesi için en azından md5 yazılmalı. 10 ve sonrası için md5 veya scram-sha-256 kullanılabilir. (scram-sha-256, md5'ten daha güçlüdür. 64 milyon değerden sonra tekrar etmeye başlar ancak)
  4. Diğer durumda yani kullanıcının parolası encrypt edilmiş olarak saklanıyorsa pg_hba.conf dosyasında md5 olarak güncelleyebiliriz.
Kullanıcı oluşturduğumuzda eğer PostgreSQL 9.6 ve öncesi içinse kullanıcı parolalarını unencrypted oluşturabiliyoruz. Bunun anlamı kullanıcı parolasına pg_authid tablosu kullanılarak doğrudan erişilebilir. Güvenlik açısından doğru yöntem değil.

PostgreSQL 9.6 ve öncesi için UNENCRYPTED parolaya sahip kullanıcı oluşturalım.

[usagi] # CREATE ROLE turan WITH LOGIN UNENCRYPTED PASSWORD '123';
CREATE ROLE


Pg_authid tablosu kullanıcılara ait database üzerindeki rol bilgilerini barındırır.  

Küçük bir not, bu tablo herkesin erişimi olan bir tablo değildir. Pg_roles tablosu herkesin erişimine açık olarak kullanılabilir. Bu tablo üzerindeki parolalar maskelenmiştir.

Bu tablo içinde Turan kullanıcısının parolasının nasıl saklandığına bakalım.

[usagi] # SELECT ROLNAME, ROLPASSWORD FROM PG_AUTHID;
      rolname      |             rolpassword            
-------------------+-------------------------------------
 turan             | 123
(4 rows)


Tablo içinde Turan kullanıcısına ait parola plaintext olarak saklanıyor. Eğer parolası plaintext olarak saklanan kullanıcılara sahipseniz kullanıcının güncel parolasını aşağıdaki gibi encrypt edebilirsiniz.

[usagi] # ALTER ROLE turan WITH ENCRYPTED PASSWORD '123';
ALTER ROLE


Kullanıcının parolası pg_authid tablosunda encrypted olarak saklanacaktır. 

[usagi] # SELECT ROLNAME, ROLPASSWORD FROM PG_AUTHID;
      rolname      |             rolpassword            
-------------------+-------------------------------------
 turan             | md53cd9c423a29b95ce52290872ee682612


PostgreSQL 10 ve sonrasında kullanıcıyı oluştururken daha önceki versiyonlar için kullandığımız UNENCRYPTED ifadesi tamamen kaldırılmıştır. CREATE ROLE ile ancak ENCRYPTED ifadesi kullanılabilir. Kullanılmasa da parolayı encrypt edecektir.

[moon] # create role turan with login password '123';
CREATE ROLE


[moon] # SELECT ROLNAME, ROLPASSWORD FROM PG_AUTHID;
 rolname |             rolpassword            
---------+-------------------------------------
 turan   | md53cd9c423a29b95ce52290872ee682612
(1 row)


Tüm bu adımlardan sonra pg_hba.conf içinde kullanılmış password ifadesi yerine md5 veya yukarıda belirttiğim gibi scram-sha-256 authentication-method u kullanabilirsiniz. 

Sevgiler,

Comments

Popular posts from this blog

PostgreSQL Foreign Data Wrappers

PostgreSQL High Availability - Patroni 2

pg_ctl: command not found