24 Haziran 2013 Pazartesi

FreeBSD üzerine PostgreSQL Sunucu Kurulumu (SSL Destekli)




PosgreSQL günümüzün en başarılı veritabanlarından biridir. Açık kaynak olması, gelişmiş ve güçlü özellikleri, zengin işletim sistemi desteğiyle kesinlikle kullanılmayı hak eden bir Veritabanı Yönetim Sistemidir. Böyle bir veritabanı ile FreeBSD'nin güvenli ve güçlü yapısı bir araya gelince başarılı bir sunucunun olmazsa olmazları bir bütün olarak karşınızda olacaktır.

Bu yazım da kendi ihtiyaçlarım için FreeBSD sunucumda Jail içerisine kurduğum PostgreSQL Veritabanı Yönetim Sisteminin kurulum aşamalarını adım adım anlatıyorum.


Kurulum Sistemi

OS : FreeBSD 9.1 64bit GENERIC Kernel
Jail Adı : pgdb.deneme.com
PostgreSQL Sürümü : 9.2

Bilgi Düzeyi

FreeBSD dosya dizin yapısı tecrübesi, temel UNIX kullanımı, vi veya ee ile dosya düzenleyebilme, PostgreSQL ile bir iki defa karşılaşmış olmak yeterlidir. 

KURULUM

FreeBSD üzerinde PostgreSQL'i normal bir kurulum üzerine kurabileceğiniz gibi bir Jail içerisine de kurulumunu yapabilirsiniz. Bu yazıda jail içine kurulum ile ilgili de bilgiler verilecektir. Kullanım ihtiyacınıza göre birini seçebilirsiniz.

Kurulum Öncesi Hazırlıklar

PostgreSQL'in FreeBSD üzerine kurulumu birkaç komut ile kısa sürede yapılabilmektedir. Ancak üzerinde dikkat edilmesini gerekli gördüğüm kernel ayarları ile ilgili bir kaç kelime etmek istiyorum.

Her gelişmiş veritabanında olduğu gibi PostgreSQL'in de çalışırken sistemde kullandığı belirli kaynaklar vardır. Bu kaynakların etkin kullanımına bağlı olarak PostgreSQL'de başarımını azami ölçüde gösterecektir. PostgreSQL'i eğer deneme veya öğrenme amaçlı kullanacaksanız öntanımlı kernel parametrelerini değiştirmenize gerek yoktur. Ancak konu kurumsal yani görev-kritik sunucular olduğunda bu kernel parametrelerini mevcut donanıma, bağlantı sayısına ve kullanım yük durumuna uygun olarak değiştirmek gerekmektedir.

Bu parametrelerle ilgili detaylı bilgiyi kaynaklar bölümündeki bağlardan alabilirsiniz.(Bkz 3) Bu yazıda bu konulara değinilmeyecektir.

İPUCU: Kernel parametrelerinin mevcut durmunu veya yaptığınız değişikliklerin durumunu görmek için aşağıdaki komutları kullanabilirsiniz.

# sysctl -a | grep -E "shmall|shmmax|semmni|semmns|semmnu"
kern.ipc.semmnu: 120
kern.ipc.semmns: 240
kern.ipc.semmni: 40
kern.ipc.shmall: 131072
kern.ipc.shmmax: 536870912

veya alternatif olarak

# ipcs -M
shminfo:
shmmax: 536870912 (max shared memory segment size)
shmmin: 1 (min shared memory segment size)
shmmni: 192 (max number of shared memory identifiers)
shmseg: 128 (max shared memory segments per process)
shmall: 131072 (max amount of shared memory in pages)

Gerekli düzenlemeleri yapalım.

/boot/loader.conf dosyası içerisine bazı kernel parametrelerini ekliyoruz.

kern.ipc.semmni=256
kern.ipc.semmns=512
kern.ipc.semmnu=256

/etc/sysctl.conf dosyasına aşağıdaki satırı ekliyoruz.
kern.ipc.shmall=32768
kern.ipc.shmmax=134217728
kern.ipc.shm_use_phys=1 

Veritabanı hizmeti çalıştırılacak sunucularda Sanal Hafıza Yönetiminin performansını olumsuz etkilememesi açısından takas alanı (swap) üzerine paylaşımlı hafıza sayfalarının yazılmasını engellemek için aşağıdaki kernel parametresini de etkinleştiriyoruz.

# sysctl kern.ipc.shm_use_phys=1
kern.ipc.shm_use_phys: 0 -> 1


/etc/sysctl.conf dosyasına aşağıdaki satırı ekliyoruz.

kern.ipc.shm_use_phys=1

Eğer çok sayıda tablonuz ve kullanıcınız var ise veya olacaksa, kern.maxfiles kernel parametre değerini sysctl kullanarak arttırmayı düşünebilirsiniz.

Yerel Dil Ayarları

PostgreSQL Veritabanı Kümesini başlatmak için rc betiğini kullanıyorsanız (/usr/local/etc/rc.d/postgresql) ön tanımlı dil karakter verisi ayarı için UTF-8 kullanılacaktır. Eğer farklı bir dil karakteri ile çalışmak istiyorsanız ya postgresql_initdb_flags ayarını ya da login.conf dosyasında oluşturacağınız dil sınıfını kullanarak bu ayarları kişiselleştirebilirsiniz.

Örneğin /etc/rc.conf dosyası içerisinde postgresql_initdb_flags ile betiğin çalıştığındaki ön tanımlı dil ayarlarını Türkçe yapmak istersek:

postgresql_initdb_flags="--encoding=utf-8 --locale=tr_TR.UTF-8"

olarak yazmamız yeterlidir.  Eğer ki login sınıf yöntemi ile dil ayarlamasını yapmak istersek:

Öncelikel /etc/login.conf dosyası içerisine aşağıdaki satırları ekliyoruz.

postgres:\
              :charset=UTF-8:\
              :lang=tr_TR.UTF-8:\
              :tc=default:

Aşağıdaki komut ile login.conf dosyasında yaptığımız değişiklikleri etkinleştiriyoruz.

# cap_mkdb /etc/login.conf

Son olarak betiğin kullanabilmesi için rc.conf dosyası içerisine aşağıdaki satırı ekliyoruz.

postgresql_class="postgres"

böylece postgresql betiğini kullandığımızda dil ayarları Türkçe olarak ayarlanacaktır.

UYARI: Bu ayarları betiği çalıştırmadan önce yaptığımı belirtmek istiyorum.

İsteseniz bu işlemleri yeni bir veritabanını oluştururken de yapabiliyorsunuz. Yani farklı dil seçeneklerinde veritabanları oluşturup kullanabilirsiniz. Örneğin dil ayarlarını vermeden bir veritabanı oluşturursam PostgreSQL ön tanımlı dil ayarlarına göre veritabanı yerel ayarlarını yapacaktır. Kurulum bölümünde ön tanımlı dil olarak Türkçe ayarlanacak şekilde dosya düzenlemeleri yapılacaktır.

FreeBSD Jail içine Kurulum İçin Yapılması Gerekenler

Eğer FreeBSD Jail içerisinde PostgreSQL server çalıştırmak isterseniz Jail'leri bulunduran konakçı sistem üzerinde aşağıdaki birkaç işlemi yapmanız gerekmektedir. Eğer Jail içerisine kurulum yapmıyorsanız bir sonraki aşamadan devam edebilirsiniz.

/etc/sysctl.conf dosyasına aşağıdaki satırı ekliyoruz.
security.jail.sysvipc_allowed=1

Yaptığınız değişikliğin hemen etkin olması için aşağıdaki komutu verebilirsiniz.

# sysctl security.jail.sysvipc_allowed=1
security.jail.sysvipc_allowed: 0 -> 1

/etc/rc.conf dosyası içine de aşağıdaki satırı ekliyoruz.

jail_sysvipc_allow="YES"

Her ne kadar yukarıda sysctl ile bazı değişiklikleri hemen uygulamış olsakta Kernel salt okunur parametrelerinde yaptığımız değişikliklerin geçerli olması için sistemi bir defaya mahsus yeniden başlatmamız gerekiyor.

# shutdown -r now

PostgreSQL Sunucunun Kurulumu

Sunucu kurulumu için FreeBSD'nin güçlü ports altyapısını kullanarak istediğimiz özelliklerde PostgreSQL kurulumumuzu yapacağız. Bu nedenle lütfen kurulum öncesi ports ağacını mutlaka güncelleyiniz. Artık başlayalım :)

cd /usr/ports/databases/postgresql92-server
make config

yapıp çıkan ekranda ICU=off seçeneğini on yaparak etkinleştiriyoruz. Geri kalanı olduğu gibi bırakıyoruz. Tamam diyerek devam ediyoruz

ICU=on: Use ICU for unicode collation (server)

aşağıdaki komutu vererek kurulumu başlatıyoruz.

make install clean

kurulum sırasında sorulacak tüm yapılandırma seçeneklerini olduğu gibi kabul edip geçebilirsiniz. Sırasıyla tüm alt ve üst bağımlılıkları ile beraber PostgreSQL derlenip sisteme kurulacak.

Kurulum tamamlandıktan sonra ilk işimiz /etc/rc.conf dosyamıza gerekli satırları eklemek.

postgresql_enable="YES"
postgresql_class="postgres"
postgresql_initdb_flags="--encoding=utf-8 --locale=tr_TR.UTF-8"

Bu ayarlarla PostgreSQL sistem açılışında çalışacak; ayrıca dil ayarları da ön tanımlı olarak Türkçe olacaktır.

Tüm ayarlamaları yaptığımıza göre artık PostgreSQL Veritabanı Kümesini oluşturabiliriz. Bunun için aşağıdaki komutu çalıştırıyoruz.

# /usr/local/etc/rc.d/postgresql initdb

Bu veritabanı sistemine ait olan dosyaların sahibi "pgsql" kullanıcısı olacaktır.
Bu kullanıcı aynı zamanda sunucu sürecinin de sahibi olmalıdır.

The database cluster will be initialized with locale "tr_TR.UTF-8".
Öntanımlı metin arama yapılandırması "turkish" olarak ayarlanacak.

/usr/local/pgsql/data dizini yaratılıyor ... tamam
alt dizinler oluşturuluyor ... tamam
ön tanımlı max_connections seçiliyor ... 100
öntanımlı shared_buffers değeri seçiliyor ... 32MB
yapılandırma dosyaları yaratılıyor ... tamam
/usr/local/pgsql/data/base/1 içinde template1 veritabanı yaratılıyor.tamam
pg_authid ilklendiriliyor ... tamam
bağlılıklar ilklendiriliyor ... tamam
sistem viewları yaratılıyor ... tamam
sistem nesnelerinin açıklamaları yükleniyor ... tamam
dönüşümler yükleniyor ...tamam
dönüşümler yükleniyor ... tamam
sözlükler oluşturuluyor ... tamam
gömülü nesnelerdeki izinler ayarlanıyor ... tamam
information schema yaratılıyor ... tamam
PL/pgSQL sunucu tarafı dili yükleniyor ... tamam
template1 veritabanı vakumlanıyor ... tamam
template1 template0'a kopyalanıyor ... tamam
template1, postgres'e kopyalanıyor ... tamam

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

İşlem başarılı. Veritabanı sunucusunu:

    /usr/local/bin/postgres -D /usr/local/pgsql/data
ile ya da
    /usr/local/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
ile başlatabilirsiniz.

böyle bir çıktı alıyorsanız bu zamana kadar ki yaptığınız işlemler başarılı olmuş demektir.

İPUCU: Herhangi bir nedenle oluşturduğunuz veritabanı kümesini kaldırmak ve yeniden oluşturmak isterseniz "/usr/local/pgsql/data" klasörünün içini boşaltın veya klasörü tamamen silin. Yeniden oluşturmak için de

 /usr/local/etc/rc.d/postgresql initdb

komutunu yeniden vermeniz yeterlidir.

Artık sunucumuzu çalıştırabiliriz.

# service postgresql start

Veritabanımızı çalıştırdık. Çalışma durumuna bakalım.

# su - pgsql

komutu ile pgsql kullanıcısına geçiyoruz. Sırasıyla aşağıdaki komutlarla çalışma durumuna bakalım.

$ pg_ctl status -D /usr/local/pgsql/data
pg_ctl: server is running (PID: 5673)
/usr/local/bin/postgres "-D" "/usr/local/pgsql/data"

"server is running" güzel :) Sunucumuz çalışıyor.

$ psql -l

komutu ile mevcut veritabanlarını listeleyelim. Gördüğünüz üzere Türkçe  dil desteğiyle temel veritabanları oluşturulmuş.


Sunucumuz çalıştığına göre bir deneme veritabanı ve kullanıcısı oluşturarak test edelim.

İlk olarak Tükçe dil destekli test veritabanını kullanacak bir Türk kullanıcı oluşturalım.

$ createuser -P turkish_user
Enter password for new role:
Enter it again:

Bir test veritabanı oluşturuyoruz. Veritabanı adı db_turkey, kullanıcısı turkish_user olacak şekilde komutu vererek oluşturdum.

$ createdb db_turkey -O turkish_user



Ekran görüntüsünde de gördüğünüz üzere ön tanımlı olarak ayarladığımız Türkçe dil ayarlarına göre veritabanımız oluştu. Peki bir de Güney Koreli bir arkadaşımız için kendi diline uygun bir veritabanı oluşturup kullanımına sunalım.

$ createuser -P korean_user
Enter password for new role:
Enter it again:

NOT: Eğer Veritabanı Kümeleme Sisteminin ön tanımlı dil kodlamasından farklı bir dilde veritabanı oluşturmaya çalıştığınızda aşağıdakine benzer bir uyarı ile karşılaşabilirsiniz. Bunun çözümü ya aynı dil seçeneklerini kullanacaksınız ya da template0 veritabanı şablonunu kullanacaksınız.

$ createdb -E UTF8 --locale=ko_KR.UTF-8 -O korean_user db_korean
createdb: database creation failed: ERROR:  new collation (ko_KR.UTF-8) is incompatible with the collation of the template database (tr_TR.UTF-8)
HINT:  Use the same collation as in the template database, or use template0 as template.

Biz template0'ı kullanacarak farklı dil destekli veritabanımızı oluşturuyoruz.

$ createdb -E UTF8 --locale=ko_KR.UTF-8 -O korean_user --template=template0 db_korean


Ekran çıktısında da gördüğünüz üzere Kore dili destekli bir başka veritabanını da eklemiş olduk.

PostgreSQL Veritabanı Kümesi ön tanımlı dilinin Türkçe olmadığı bir sunucuda Türkçe dil destekli bir veritabanı oluşturmak istersek

$ createdb -E UTF8 --locale=tr_TR.UTF-8 -O kullanici_adi --template=template0 veritabani_adi

Veritabanına Uzak Bağlantı

Şu anda tüm veritabanlarımıza erişim yerel bağlantı üzerinden (localhost) problemsizce sağlanabilmekte. Ancak gerektiğinde hem yönetim amaçlı hemde diğer sunucuların ve uygulamaların kullanımı için uzaktan erişime izin vermemizi gerektirecek durumlarla karşılaşacağız. Bu bölümde uzaktan erişim ve yetkilendirme nasıl yapılır onlara bir bakalım.

Öncelikle yerel bağlantı harici sunucumuzun IP adresi üzerinden gelen bağlantılara da izin vermemiz gerekiyor. Bunun için /usr/local/pgsq/data/postgresql.conf dosyamızı açıp aşağıdaki satırı düzenliyoruz.

listen_addresses = 'localhost, 190.168.2.233'

veya sunucuda bulunan tüm ağ bağlantıları üzerinden bağlanılabilsin demek istiyorsanız

listen_addresses = '*'

olarak bu satırı düzenlemeniz yeterlidir. 

Jail içerisine kurulum yaptıysanız listen_adress değerini Jail IP adresi yapınız.

Örn:

listen_addresses = '190.168.2.233'

değişikliklerin geçerli olması için PostgreSQL'i yeniden başlatın.

# service postgresql restart


Kimlik Doğrulama ve Yetkilendirme Ayarları

PostgreSQL birden fazla farklı yöntemle erişim izinlerini yönetmenize imkan sağlayacak özelliklerdedir. (LDAP, RADIUS, Kerberos vs.) İhtiyaçlara göre farklı bir yöntem kullanılabilir. Bu çalışmamda yaygın olarak tercih edilen ve kullanılan şifre tabanlı kimlik doğrulamasını sizlere anlatacağım.

Şifre tabanlı kimlik doğrulamasında iki çeşit yöntem kullanılabilir bunlar: md5 ve password . Bu iki yöntem arasındaki fark, basit anlatımla, bağlantı üzerinden gönderilen şifre bilgisi birinde MD5-hashed olarak diğerinde ise düz metin olarak gönderilmektedir. Parolanın düz metin olarak gönderilmesi güvenlik açısından sakıncalı olduğu için md5 yöntemini kullanmanızı öneririm. Ayrıca yazının ilerleyen bölümlerinde anlatacağım SSL ile bağlantı güvenliğinin sağlanmasıyla beraber md5 kullanımı bağlantı güvenliği açısından olukça faydalı olacaktır.

PostgreSQL'in kimlik doğrulama ve bağlantı yetki işlemlerini /usr/local/pgqsl/data/pg_hba.conf dosyası içerisinden yapıyoruz. Bu dosya ile kullanıcının hangi veritabanına bağlanabileceği, erişim metodları gibi güvenliği doğrudan ilgilendiren ayarları kontrol ediyoruz.

Dosya biçimini inceleyecek olursak

# TYPE  DATABASE        USER              ADDRESS                 METHOD
local       all                       all                                                     trust
host        all                       all                   127.0.0.1/32              trust
host        db_turkey           turkish_user   0.0.0.0/0                    md5

yukarıdaki gibi görünümde bir dosya ile karşı karşıyasınız demektir. Detaylıca inceleyelim.

TYPE Alanı

Bu kısım altında bağlantı tipimizi belirtiyoruz. Kullanabileceğimiz tipler:

local UNIX-domain soket yerel bağlantıdan bağlanmak için. Bu seçenek kullanılırsa; sadece UNIX-domain soket üzerinden gelen bağlantılara izin verilir.

host Hem şifresiz hem de SSL şifrelemeli TCP/IP soketlerinden bağlanmaya izin verir.

hostssl Sadece SSL şifrelemeli TCP/IP soketlerinden bağlanmaya izin verir.

hostnossl Sadece şifresiz olarak TCP/IP soketlerinden bağlanmaya izin verir.

Yaygın olarak host kullanılmaktadır. Ancak host kullanılsa bile mutlaka SSL şifrelemeli bağlantı kullanılması güvenlik nedeniyle önemlidir. Yazının ilerleyen bölümlerinde bu konuya değinilecektir.

Örnek bir yapılandırma.

# TYPE      DATABASE        USER              ADDRESS                 METHOD
local           all                       all                                                     trust
host            all                       all                   127.0.0.1/32              trust
hostssl        db_turkey           turkish_user   0.0.0.0/0                    md5
hostnossl    db_korean          korean_user   127.0.0.1/32              md5

DATABASE Alanı

Bu kısım altında hangi veritabanlarına bağlanılacağı, aynılama (replication) gibi işlemler belirtilir. Kullanabileceğimiz tipler:

all Tüm veritabanlarına erişilebileceğini belirten değerdir.

sameuser Kullanıcı adı ile veritabanı adının eşleştiği durumda erişilebileceğini belirten değerdir.

samerole Bir rol'e dahil olan kullanıcının rol adı ile veritabanı adının eşleştiği durumda erişilebileceğini belirten değerdir.

veritabanı adı Erişilmesi istenen bir veritabanı adı burada belirtilir. Belirli sayıda veritabanına erişim için veritabanı adları arasında virgül (,) kullanılarak belirtilebilir.

@dosya adı Veritabanı adlarını içeren ayrı bir dosyayı başında @ işareti ile yazılıp birden fazla veritabanına erişim yetkilerini belirleyebilirsiniz. Veritabanı adlarını satır satır bir dosyanın içine yazın; uzantısız. Bu dosyayı da PostgreSQL Veritabanı Kümesi klasörü (/usr/local/pgsql/data) içine bırakınız. Aşağıdaki örnekte göreceğiniz gibi bu dosyanın başına @ işareti koyarak belirtiniz.

Örnek yapılandırma.

# TYPE  DATABASE                  USER              ADDRESS                 METHOD
local       sameuser                     all                                                     trust
hostssl    db_korean                    korean_user   127.0.0.1/32              md5
host        db_turkey,db_korean   turkish_user   0.0.0.0/0                    md5
host        replication                   pgsql               192.168.2.2/24         md5
local       @veritabanlari            all                    192.168.2.7/32         md5

USER Alanı

Bu kısım altında da veritabanlarını kullanacak olan kullanıcıların belirtildiği yerdir.

all Tüm kullanıcıları belirtir.

+ işareti ile doğrudan veya dolaylı olarak bu kullanıcı rolü ile eşleşen herhangi bir rolü belirtir. Eğer + kullanılmadan rol ismi yazılırsa sadece o rol'e dahil olan kullanıcılar belirtilir.

@dosya adi Kullanıcı adlarını içeren ayrı bir dosyayı başında @ işareti ile yazılıp birden fazla veritabanına erişim yetkilerini belirleyebilirsiniz. Kullanıcı adlarını satır satır bir dosyanın içine yazın; uzantısız. Bu dosyayı da PostgreSQL Veritabanı Kümesi klasörü (/usr/local/pgsql/data) içine bırakınız. Aşağıdaki örnekte göreceğiniz gibi bu dosyanın başına @ işareti koyarak belirtiniz.

# TYPE  DATABASE                  USER              ADDRESS                 METHOD
local       sameuser                     all                                                     trust
hostssl    db_korean                   @kullanicilar  127.0.0.1/32              md5
host        db_turkish                   +admins          0.0.0.0/0                   md5

İsterseniz bunları virgül (,) ile ayırarak birleştirebilirsiniz. Örnek verecek olursak @kullanicilar dosyasında adları yazanlarla beraber admins rolü içindeki kullanıcılar db_turkish veritabanını kullanabilecekler.

# TYPE  DATABASE      USER                             ADDRESS                 METHOD
hostssl    db_turkish       @kullanicilar,+admins  127.0.0.1/32              md5

ADDRESS Alanı

Bu kısımda da erişim izni verilecek olan istemcinin adres kaydının belirtildiği yerdir. Bu alanda alan adı, IP veya IP aralığı, alt ağ maskesi ve bazı anahtar kelimeler kullanılmaktadır.

IP adresi Bu alanda hem IPv4 hem de IPv6 adresleri kullanılabilmektedir. Bu alanla sadece host, hostssl ve hostnossl tipleri kullanılabilmektedir. Örneklerle inceleyecek olursak

0.0.0.0/0 Tüm IPv4 adreslerinden erişimi,

::/0 Tüm IPv6 adreslerinden erişimi,

192.168.2.2/32 sadece bu ip adresli istemcinin erişebileceğini,

192.168.2.0/24 sadece bu ip bloğundaki istemcilerin erişebileceğini,

all ile tüm IP adreslerinden erişilebileceğini,

. bir alan adının kapsamındaki IP adreslerinin çözümlenmesiyle erişilebileceğini

belirtir. Yalnız burada dikkat edilmesi gereken alan adı çözümlemesinin hızlı yapılabilir olmasıdır. Bunun için en az iki adet hızlı önbellek DNS sunucusunun sunucuda kullanılması doğru bir karar olur.

Örnek bir yapılandırma dosyası

# TYPE  DATABASE       USER              ADDRESS                 METHOD
local       all                     all                                                     trust
hostssl    db_korean        @kullanicilar  127.0.0.1/32             md5
host        db_turkish        +admins          0.0.0.0/0                   md5
host        db_deneme       kullanici          .deneme.com            md5
host        db_deneme1     kullanici1        192.168.2.2/32         md5

IP-ADDRESS ve IP-MASK Alanı

İstenirse IP adresi ve Alt Ağ Maskesi ayrı olarakta yazılabilir. Aşağıdaki buna bir örnektir. Sadece host, hostssl ve hostnossl tipleri kullanılabilmektedir.

# TYPE  DATABASE      USER      IP-ADDRESS    IP-MASK             METHOD
hostssl    db_turkish       kullanici  192.168.2.2      255.255.255.0    md5

METHOD Alanı

Bir bağlantının bir kayıtla eşleşmesi sonrası nasıl bir kimlik doğrulaması yönteminin kullanılacağının belirtildiği bölümdür. Yaygın olarak kullanılan seçenekler:

trust Koşulsuz olarak bağlantı sağlar. Bu yöntem ile PostgreSQL veritabanı sunucusuna bağlanmak isteyen herkes bir şifre ya da başka bir kimlik doğrulamasına gerek kalmadan, istedikleri herhangi bir PostgreSQL kullanıcısı olarak oturum açabilir.

reject Koşulsuz olarak bağlantıyı reddeder. Bu seçenek özellikle bir grup içindeki bir istemciyi filtrelemek için uygundur. Önce bloklanmak istenen istemci belirtilir sonrasında izin verilen istemci bloğu belirtilerek erişim yetkilendirmesi yapılır.

md5 İstemci kimlik doğrulaması için bir MD5 şifreli parolayı zorunlu tutar.

password  İstemci kimlik doğrulaması için bir düz metin parolayı zorunlu tutar. Parola ağda şifrelemesiz olarak aktarılacağı için güvenlimeyen bağlantılarda kullanılmaması önerilir.


Diğer METOD seçenekleriyle (ldap, radius, krb5 vs.) ilgili bilgiye PostgreSQL Belgelerinden ulaşabilirsiniz. (Bknz. 1)

Bu bilgileri kurduğumuz sistemimize uyguladığımızda aşağıdakine benzer bir yetkilendirme ile veritabanlarına bağlantı sağladım.

# TYPE  DATABASE        USER              ADDRESS                 METHOD
local       all                      all                                                    trust
# IPv4  bağlantılar için:
host        all                      all                   127.0.0.1/32             trust
host        @veritabanlari  turkish_user   0.0.0.0/0                   md5
hostssl    db_korean         korean_user   190.168.2.8/32         md5

Özetlersek: 1. ve 2. satırda yerel ağ üzerinden tüm kullanıcılarla güvenli bir şekilde tüm veritabanlarına bağlanabiliyorum. 3. satırda veritabanlari dosyası içerisinde belirttiğim veritabanlarına herhangi bir bağlantı üzerinden turkish_user adlı kullanıcı ile ister şifresiz isterse SSL şifrelemeli bağlantı sağlayabiliyorum. 4. satırda ie db_korean veritabanına korean_user ile sadece SSL güvenli bağlantı ile 190.168.2.8 IP'li bir bilgisayardan bağlanabiliyorum. Farklı IP'li bir bilgisayardan bağlanamıyorum.

pg_hba.conf doyasında yaptığımız değişikliklerden sonra PostgreSQL Veritabanı'nı yeniden başlatmayı unutmayınız.

Erişim ayarlarımızı yaptığımıza göre bağlantı testimizi yapalım.

# su - pgsql

komutu ile pgsql kullanıcısına giriyoruz. Ardından veritabanına kullanıcı adımızı, veritabanı adını ve sunucu IP'sini girerek bağlanmayı deniyoruz.

$ psql -U turkish_user -d db_turkey -h 190.168.2.233
Password for user turkish_user:
psql (9.2.4)
Type "help" for help.

db_turkey=>

Bağlantı sorunsuz sağlandıysa yukarıdaki gibi bir görünümle veritabanına bağlantı sağlamış olmanız gerekiyor.

İPUCU: Veritabanı konsolundan çıkmak için \q yazıp giriş (Enter) tuşuna basmanız yeterlidir.

Güvenli Bağlantı İçin SSL Yapılandırması

Daha öncede bahsettiğim gibi güvenlik bizim için çok önemli olduğundan veritabanına gelen bağlantıları şifreli olarak daha güvenli hale getirmek için SSL yapılandırmasını sunucumuza dahil edeceğiz. PostgreSQL güvenli SSL bağlantısını OpenSSL yazılımı desteği ile yapıyor. Bu nedenle ilk olarak sunucumuza OpenSSL paketini kuruyoruz.

# cd /usr/ports/security/openssl
# make install clean

Önümüze gelen standart yapılandırmayı Tamam diyerek kabul edip kurulumu tamamlayalım. Sonraki işlem OpenSSL'in çalışabilmesi için gerek duyduğu yapılandırma dosyasını oluşturmak. OpenSSL kurulumu ile gelen örnek dosyayı kullanarak bu işlemi de tamamlıyoruz.

# cp /usr/local/openssl/openssl.cnf.sample /usr/local/openssl/openssl.cnf

Mevcut ayarlar işimizi görecek düzeyde olduğu için openssl.cnf yapılandırma dosyasında herhangi bir değişiklik yapmıyoruz. Artık güvenlik sertifikamızı oluşturabiliriz.

Güvenlik sertifikamızı PostgreSQL Veritabanı Kümesi ana dizininde konumlandıracağımız için tüm işlemlerimizde bu klasörü hedef olarak kullanıyoruz.

İlk işlemimiz olan sertifika talep bölümünde doldurulması istenen kısımlarda dikkat etmeniz gereken  Common Name (e.g. server FQDN or YOUR name) []: bölümüne sunucunuzun alan adını tam olarak giriniz. (örn: db.deneme.com gibi). Enter PEM pass phrase: kısmına gireceğiniz şifreyi unutmayınız bir yere not ediniz. İşlemlerin en sonunda sorulan A challenge password []: kısmını boş bırakarak işlemi tamamlayınız.
 
# openssl req -new -text -out /usr/local/pgsql/data/server.req
Generating a 1024 bit RSA private key
...........................................++++++
......................++++++
writing new private key to 'privkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:TR
State or Province Name (full name) [Some-State]:Adana
Locality Name (eg, city) []:Seyhan
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Deneme A.Ş.
Organizational Unit Name (eg, section) []:Bilgi Islem
Common Name (e.g. server FQDN or YOUR name) []:pgdb.deneme.com
Email Address []:bilgiislem@deneme.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Sıradaki işlemimizde sertifika talebi oluşturma aşamasında girdiğimiz PEM şifresini kaldırma işlemini yapıyoruz. Eğer bunu kaldırmaz isek her yeniden başlatma işleminde bizde şifre girilmesi istenecektir. Şifreyi aşağıdaki komut ile kaldırıyoruz.

# openssl rsa -in privkey.pem -out server.key
Enter pass phrase for privkey.pem:
writing RSA key

# rm privkey.pem


Dosyamızı taşıyoruz ve dizine gidiyoruz

# mv server.key /usr/local/pgsql/data/
# cd /usr/local/pgsql/data/

Şimdi  aşağıdaki komut ile sertifikamızı oluşturup gerekli dosya yetkilerini yapıyoruz.

# openssl req -x509 -in server.req -text -key server.key -out server.crt

# chmod og-rwx server.key

# chown pgsql:pgsql server.key server.crt server.req

SSL desteğini etkinleştirmek için /usr/local/pgsql/data/postgresql.conf dosyamızın içinden ssl = off satırını on yapıyoruz.

BİLGİLENDİRME: Sertifika oluşturma işlemlerinde server adını kullanarak yaptığımız dikkatinizi çekmiştir. postgresql.conf dosyası içerisinde güvenlik sertifikası ayarları bölümünde ön tanımlı olarak server adı ile herşey hazır olduğu için bu adı kullanmayı seçtik. Eğer başka bir ad ile sertifika oluşturursanız postgresql.conf dosyası içinden ilgili kısımlara bu dosya adlarını girmeniz gereklidir.

Son olarak eğer pg_hba.conf dosyasında sadece SSL üzerinden güvenli bağlantı sağlanmasını istediğimiz bir erişim politikamız var ise onu düzenliyoruz. hostssl ile bağlantının zorunlu olarak SSL üzerinden olmasını sağlıyoruz.

# TYPE  DATABASE        USER              ADDRESS                 METHOD
local       all                      all                                                    trust
# IPv4  bağlantılar için:
host        all                      all                   127.0.0.1/32             trust
hostssl   @veritabanlari  turkish_user   0.0.0.0/0                   md5
host        db_korean         korean_user   190.168.2.8/32         md5

Değişikliklerin geçerli olması için PostgreSQL veritabanımızı yeniden başlatıyoruz.

# service postgresql restart

Test etmek içinbağlandığımızda SSL connection kısmının olması şifreli bağlantı sağladığımızı göstermektedir.

$ su - pgsql

$ psql -U turkish_user -d db_turkey -h 190.168.2.233
Password for user turkish_user:
psql (9.2.4)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

db_turkey=>

Artık istediğimiz gibi veritabanımızı güvenli kullanabiliriz.

PostgreSQL Görsel Yönetim Araçları

Konsoldan komutla veritabanını yönetmek her kullanıcı için tercih edilen bir durum olmayabilir. Bu nedenle veritabanına bağlanıp onu yönetebileceğimiz bazı araçlar kullanmak isteyebiliriz. Bu araçlardan en yaygın olanı pgAdmin III'dür.

pgAdmin III'ü BSD ve Linux dağıtımlarının tamamının paket depolarında bulabilirsiniz. Basitçe kullanımını aşağıdaki görsellerden inceleyebilirsiniz.

Kurulum sonrası ilk çalıştırmada sizi karşılayan ekranı görüyorsunuz.


Yeni bir veritabanı bağlantısı eklemek için elektrik fişi şeklindeki düğmeye basmanız yeterli. Önünüze aşağıdaki gibi bir ekran gelecek.


































Name: Bağlantıya bir isim veriyorsunuz. İstediğinizi verebilirsiniz.
Host: Sunucu IP'si
Port: Bağlantı Portu
Maintenance DB : Birden çok veritabanına yetkili iseniz ilk bağlanılmasını istediğiniz veritabanı adını buraya yazıyorsunuz. Eğer tek veritabanına yetkili iseniz onun adını girebilirsiniz.
Username: Kullanıcı adı
Password: Parolanız

Bu bilgileri girdikten sonra bağlantıda güvenli bağlantıyı kullanmayı zorunlu kılmak için SSL sekmesine tıklıyoruz ve önünüze aşağıdaki gibi bir ekran geliyor.

SSL kısmında require seçeneğini seçerek bağlantının mutlaka SSL üzerinden yapılmasını belirtiyorsunuz. Tamam düğmesine tıkladıktan sonra artık veritabanını kullanabilirsiniz.


Diğer PostgreSQL araçları için aşağıdaki bağa bakabilirsiniz.

http://wiki.postgresql.org/wiki/Community_Guide_to_PostgreSQL_GUI_Tools

Sonuç

Standart özellikler de PostgreSQL veritabanı sunucumuzu kurduk. Güvenlik açısından istenirse çalışma portu değiştirilip veritabanına erişim yapılandırması daha da güçlü bir hale getirilebilir. İlerleyen günlerde yedekleme, bakım ve diğer konularla ilgili deneyimlerimi de inşallah burada paylaşacağım.  Umarım faydalı bir yazı olmuştur.


İyi çalışmalar.

Hasan Alp İNAN



Hiç yorum yok:

Yorum Gönder