Skip to main content

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

pg_ctl: command not found

Hi, If you can not reach pg_ctl command in bash also you are sure this command exists in your server, check $PATH. -bash-4.2$ echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin So, the directory of pg_ctl is not seem in PATH. Input directory of pg_ctl and check it then run it.

PostgreSQL Foreign Data Wrappers

Hi all, I would like to mention about generating Foreign Data Wrappers(FDW) on PostgreSQL 9.6. FDW is used for remote access to tables from external data storage. If needed to use remote table in a query, you can use FDW tables. For instance you can get a table from remote database, but there is a condition. The condition is that user should have proper privileges on FDW table. There is two extension for FDW on PostgreSQL. First one is used for accessing PostgreSQL database to PostgreSQL database, called postgres_fdw . Second one is used for accessing PostgreSQL database to different databases (SQL Server, Sysbase) called tds_fdw .  Foreign Data Wrappers feature lets you to cross-query between remote database tables. Postgres_fdw and tds_fdw has different structure. Tds_fdw usign Tabular Data Stream application layer protocol to transfer data between database server and client. Generating Tds_fdw and Postgres_fdw is similar. I share an example for generating FDW between two Po

PostgreSQL High Availability - Patroni 2

Patroni kurulumuyla ilgili oldukça fazla kaynak bulunmakta fakat kurulum ve yönetimini beraber barındıran kaynağa denk gelmedim. Bu yazıda hem Patroni kurulumu hem de kurulum sonrası yönetimiyle alakalı detaylara ulaşabilirsiniz. PostgreSQL cluster'larının yönetimi için kullanılan Patroni ile ilgili temel bilgilerin yer aldığı Autofailover üzerine hazırladığım yazı serisine aşağıdaki linklerden erişebilirsiniz. PostgreSQL ve Autofailover PostgreSQL'de Autofailover ve Patroni 1 (Giriş) PostgreSQL'de Autofailover ve Patroni 2 (Kurulum, Konfigürasyon ve Yönetim) PostgreSQL'de Autofailover ve Patroni 3 (Mevcut PostgreSQL Cluster'inin Patroni'ye Geçirilmesi) Patroni, PostgreSQL veritabanlarının kurulumundan ve konfigürasyonundan sorumludur. Yani Patroni'yi kurduğumuz sunucular aynı zamanda Patroni ile kurulmuş PostgreSQL'leri barındıracak. Üç node'lu PostgreSQL ve üç node'lu ETCD cluster'larını oluşturacağım. Kuruluma önce üç no