[LinuxFocus-icon]
Ev  |  Eri�imd�zeni  |  ��indekiler  |  Arama

Duyumlar | Belgelikler | Ba�lant�lar | LF Nedir
Bu makalenin farkl� dillerde bulundu�u adresler: English  Castellano  Deutsch  Francais  Nederlands  Russian  Turkce  

convert to palmConvert to GutenPalm
or to PalmDoc

[Photo of the Author]
taraf�ndan Chianglin Ng
<chglin(at)singnet.com.sg>

Yazar hakk�nda:
Ben G�neydo�u Asya'da �okuluslu modern bir �lke olan Singapur'da ya��yorum.Son iki y�ld�r Linux kullan�yorum.RedHat 6.2 ile ba�lad�m ve �u an evimde RedHat 8.0 kullan�yorum.Aras�ra Debian kullan�yorum.

T�rk�e'ye �eviri:
�zcan G�ng�r <ozcangungor(at)netscape.net>

��erik:

 

Accessing PostgreSQL through JDBC via a Java SSL tunnel

[Illustration]

�zet:

Bu makale, JDBC'nin RedHat 8.0'da PostgreSQL'e ba�lanmas� i�in nas�l ayarlanaca��n� ve bu veritaban�na g�venli ba�lanmak i�in SUN'�n Java G�venli Soket Eki'ni kullanarak nas�l SSL t�neli olu�turulaca��n� anlat�r.

_________________ _________________ _________________

 

Tan�t�m

Postgres ve JDBC hakk�nda bir�eyler ��renirken, bir veritaban�na JDBC ile g�venli nas�l ba�lan�l�r sorunuyla kar��la�t�m.JDBC ba�lant�s� �ifrelenmemi�tir ve a� sniffer bilgileri kolayca al�r.Bunu �nlemenin bir�ok yolu vard�r.Postgres kullanma klavuzunda postgresin SSL deste�i ile derlenmesini veya SSH t�neli kullan�lmas�n� s�yler.

Bu y�ntemlerin kullan�lmas� yerine, Java'n�n kendisini kullanmak isterim.Sun'�n Java JDK 1.4.1 versiyonu java g�venli soket ekini i�erir.Bununla kendi SSL ba�lant�m�z� yapabiliriz.JDK, bir de a��k/gizli anahtar olu�turabilmek i�in keytool, dijital sertifikalama ve anahtar depolamay� i�ermektedir.Bu ara�larla, verilern g�venli ge�i�ini sa�layacak java tabanl� bir proxy yazmak m�mk�nd�r.

 

RedHat 8.0'da JDBC i�in PostgreSQL Ayarlar�

Burada anlat�lanlar sadece RedHat i�indir ama genel fikir di�er da��t�mlara da uygulanabilir.E�er hen�z yapmad�ysan�z, �nce PostgreSQL'i ve gerekli JDBC s�s�c�lerini y�klemeliyiz.RedHat 8'de, rpm'i veya paket y�netim GUI'sini kullanabilirsiniz.Ayr�ca Sun'�n JDK 1.4.1'i de indirip y�klemelisiniz.JDK, US'in ihra� kanunlar� y�z�nden baz� �ifreleme k�s�tlamar�yla gelmektedir.Tam �ifreleme deste�i i�in JCE (Java �ifreleme Eki)'yi indirmelisiniz.Daha fazla bilgi i�in Sun'in Java sayfas�na bak�n�z.

Ben JDK 1.4.1'i kurdum ve JAA_HOME �evresel de�i�kenini JDK dizinini g�sterecek �ekilde de�i�tirdim.Bir de PATH de�i�kenini JDK �al��t�r�labilir dosyalar�n� da i�erecek �ekilde ayarlad�m.A�a��da .bash_profile dosyama ekledi�im sat�rla bulunmkatd�r:

JAVA_HOME = /opt/j2sdk1.4.1_01
PATH = /opt/j2sdk1.4.1_01/bin:$PATH
export JAVA_HOME PATH

SUN JDK ile gelen s�n�rl� �ifreleme politikas� dosyalar�n� s�n�rs�z JCE dosyalar� ile de�i�tirdim.Java'n�n Postgres'e ula�acak JDBC s�r�c�lerini bulabilmesi i�in, postgre-jdbc s�r�c�lerini Java ekleri dizinine (/opt/j2sdk1.4.1_01/jre/lib/ext) kopyalad�m.RedHat 8'de postgres-jdbc s�r�c�leri /usr/share/pgsql dizinindedir.

E�er ilk defa Postgres y�kl�yorsan�z, �nce bir veritaban� ve kullan�c� hesab� olu�turmal�s�n�z.su komutu ile root kulanc� olun ve postgres servisini ba�lat�n.Daha sonra su ile postgres y�ntici kullan�c�s� olun.

su root
password:******
[root#localhost]#/etc/init.d/postgresql start
[root#localhost]# Starting postgresql service: [ OK ]
[root#localhost]# su postgres
[bash]$

Create a new postgres account and database.

[bash]$:createuser
Enter name of user to add: chianglin
Shall the new user be allowed to create databases? (y/n) y
Shall the new user be allowed to create more new users? (y/n) y
CREATE USER
[bash]$createdb chianglin
CREATE DATABASE

Ben kendi Linux kullan�c�lar�ma uyan bir postgres y�netici kullan�c�s� ve ayn� isimde bir veritaban� olu�turdum.Varsay�lan olarak, psql ara�lar�n� kulland���n�zda, veritaban�na ba�lan�rken Linux o an hangi kullan�c� iseniz o kullan�c�y� kullan�r.Veritaban� ve kullan�c� y�netimi i�in klavuz sayfalar�na (man pages) bak�n.Yeni kullan�c�ya �ifre vermek i�in psql'i �al��t�r�n ve ALTER USER komutunu �al��t�r�n.Normal kullan�c� olarak login olun ve psql'i �al��t�r�n.A�a��daki komutu yaz�n:

ALTER USER chianglin WITH PASSWORD 'test1234' ;

TCP/IP ba�lant�s�na izin vermek i�in postgresql.conf dosyas�n� a��n ve tcpip_socket se�ene�ini true yap�n.RedHat 8'de, bu dosya /var/lib/pgsql/data altnda bulunuz.root kullan�c� olun ve a�a��daki de�i�ikli�i yap�n:

tcpip_socket=true

Son ad�m pg_hba.conf dosyas�n� d�zenlemektir.Bu dosya Postgres'e ba�lanabilecek makinalar� g�sterir.Ben kendi loopback adresimi ve �ifre yetilendirmesini ekledim.Bu dosyay� de�i�tirebilmek i�in root olmal�s�n�z:

host sameuser 127.0.0.1 255.255.255.255 password

Postgres'i yeniden ba�lat�n.

 

Java SSL T�neli Tasar�m�

Bir �nceki ad�mdan sonra, Postgres'e g�venli olmayan local JDBC ba�lant�s� kurabiliriz.Postrgres'e uzaktan g�venli ba�lanabilmek i�in �e�itli veri ge�i�i gereklidir.

A�a�idaki diagram, bu veri ge�i�inin nas�l �al��aca��n� g�sterir:

Figure one showing how the Java proxies should work

JDBC uygulamas� �nce bir istemci proxy'ye ba�lan�r ve bu proxy verileri SSL arac�l���yla uzaktaki sunucu proxy^ye g�nderir.Sunucu proxy basit�e verileri Postgres'e y�nlendirir ve sonu�lar� SSL arac�l��� ile istemci proxy'ye g�nderir.�stemci proxy de bu sonu�lar� JDBC'ye ge�irir.JDBC uygulamas�ndan t�m i�lem �effaft�r.

Diagramdan da anla��laca�� gibi, sunucu taraf�nda, sunucuya g�venli ba�lant�yla gelen verilerin al�nmas� ve as�l yerel sunucuya g�nderilmesi gerekir.Tersi de do�rudur,as�l yerel sunucudan gelen verileri g�venli ba�lant� ile di�er tarafa g�ndermesi gerekir.Ayn� durum istemci taraf�nda da ge�erlidir.Bu i�i i�in thread'ler kullan�l�r.A�a��daki diagram bunu g�sterir:

Diagram showing how the 4 relaying threads work  

Anahtar Depolar�, Anahtarlar ve Sertifikalar Olu�turma

Bir SSL ba�lant�s� genellikle sunucu yetkilendirmesi gerektirir.�stemci yetkilendirmesi iste�e ba�l�d�r.Bu durumda, ben hem sunucu hem de istemci yetkilendimesini �neriyorum.Bunun anlam�, hem istemci i�in hem de sunucu i�in sertifikalar ve anahtarlar olu�turaca��m.Bunu JDK ile gelen keytool sayesinde yapabiliyorum.Hem sunucuda hem istemcide anahtar depolar�m olacak.Birinci depo makinan�n gizli anahtar�n�, ikincisi ise makinan�n g�venece�i sertifikay� tutar.

A�a��daki komut sunucu i�in bir anahtar deposunun, bir gizli anahtar�n ve bir kendi-imzal� (self-signed) sertifikan�n olu�turur:

keytool -genkey -alias serverprivate -keystore servestore -keyalg rsa -keysize 2048

Enter keystore password: storepass1
What is your first and last name?
[Unknown]: ServerMachine
What is the name of your organizational unit?
[Unknown]: ServerOrg
What is the name of your organization?
[Unknown]: ServerOrg
What is the name of your City or Locality?
[Unknown]: Singapore
What is the name of your State or Province?
[Unknown]: Singapore
What is the two-letter country code for this unit?
[Unknown]: SG
Is CN=ServerMachine, OU=ServerOrg, O=ServerOrg, L=Singapore, ST=Singapore, C= [no]: yes
Enter key password for <serverprivate>
(RETURN if same as keystore password): prikeypass0 </serverprivate>

��frelerin iki defa istendi�ine dikkat edin.�lki anahtar depo i�in, ikincisi gizlia anahtar i�indir.Bunlar� yapt�ktan sonra Sunucu sertifikas�n� (bu istemci i�in sunucu yetkilendirmesinde kullan�lacak) bir dosyaya yazd�rmal�y�z.

keytool -export -alias serverprivate -keystore -rfc servestore -file server.cer

Yukar�daki komut, sunucunun kendi-imzal� a��k sertifikas�n� server.cer dosyas�na yazar.�stemci taraf�nda, bu dosyay�, istemcini g�vendi�i a��k sertifkalar� tutan bir anahtar deposuna koymal�y�z.

keytool -import -alias trustservercert -file server.cer -keystore clienttruststore

Yukar�daki komut, sunucunun a��k sertifikas�n� clienttruststore ad� verilen bir anahtar deposuna koyar.E�er bu depo hen�z olu�turulmam��sa, bu depo olu�turulur ve bu depo i�in bir �ifre girilmesi istenir.

�u durumda, sisteminiz sunucu yetkilendirmesi i�in bir SSL ba�lant�s� kurabilir.Ben ayr�ca istemci i�in de yetkilendirme istedi�im i�in, istemci i�in de yeni istemci anahtar deposunda a��k/gizli anahtar olu�turmal�, i�temci sertifikas�n� bir dosyaya yazd�rmal� ve bu dosyay� yeni sunucu anahtar deposuna koymal�y�m.

Bu i�lemler sonunda, sunucuda iki anahtar deposu olmal�.Biri gizli anahtar di�eri sertifikalar� tutar.Bu istemci i�in de ge�erlidir.

�leride verece�im �rnek kodu �al��t�rmak i�in, belirli bir makinada oluturdu�unuz her iki anahtar deposu i�in de ayn� �ifreyi vermelisiniz.Bunun anlam� sunucudaki iki anahtar deposunun da ayn� �ifreye sahip olmas� gerekir.Bu istemcideki ahatar depolar� i�in de ge�erlidir.

keytool hakk�nda daha �ok bilgi i�in Sun'�n dok�manlar�naSun'n dokmanlarna bakn. bak�n.

 

S�n�flar�n Uygulamas�

Benim s�nflar�m, Java G�venli Soket ekinin kullan�m olacakt�r.Sun JSSE referan says�nda mevcuttur.Bir SSL ba�lat�s� i�in, JSSE'de bulunan SSLContext nesnesinin �rne�ini(instance) almaya gereksinim vard�r.�stedi�iniz ayarlarla ba�latt���n�z SSLContext nesnesinden bir SecuredSocketFactory s�n�f� elde edersiniz.SocketFactory ile bir SSL soketi olu�turabilirsiniz.

Benim uygulamamda, SSL t�neli olu�turacak bir istemci ve bir sunucu proxy'si olacakt�r.Her ikisi de SSL ba�lant�s� kullanaca��ndan, SSLConnection s�n�f�na benzeyecektir(interitance).Bu s�n�f, hem sunucu hem istemci proxi'sinde kullan�lacak olan SSL Context nesnesinin ba�lang�� ayarlarndan sorumludur.Son olarak, Veri ge�i�ini yapacak olan ba�ka bir thread'e gereksinimimiz vard�r.Toplam 4 s�n�f.A�a��da SSLConnection s�n�f�n�n bir par�as� vard�r:

 /* initKeyStore metodu, gizli anahtar� ve g�venilir sertifikalar� tutan anahtar depolar�n� y�kler*/

public void initKeyStores(String key , String trust , char[] storepass)
{
      // mykey, kendi sertifikam� ve gizli anahtar�m� tutar; mytrust, g�venilir b�t� sertifikalr� tutar.
 try {
      //Sun JKS anahtar depolar�n�n �rne�ini a
l      mykey = KeyStore.getInstance("JKS" , "SUN");
     mytrust = KeyStore.getInstance("JKS", "SUN");

    //Anahtar depolar�n� y�kl
    mykey.load(new FileInputStream(key) ,storepass); mytrust.load(new FileInputStream(trust) ,storepass );
    }
 catch(Exception e) {
    System.err.println(e.getMessage());
    System.exit(1);
    }
}

/* initSSLContext method, SSLContext olu�turur ve onu SSL protokol� ve anahtar depolar�ndan al�nan verilerle ba�lat�r.*
/ public void initSSLContext(char[] storepass , char[] keypass) {
    try{
    //Sun JSSE'den SSLContext'i al
   ctx = SSLContext.getInstance("TLSv1" , "SunJSSE") ;
   //Anahtar depolar�n� ba�la
   initKeyStores(key , trust , storepass) ;

    //Anahtar ve g�venilirlik depolar�ndaki serfikalarla ilgilenmesi i�in ahatar ve g�venilirlik y�netici fabrikalar�n� olu�tu
r     TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509" ,
    "SunJSSE");
    tmf.init(mytrust);

    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509" ,
    "SunJSSE");
    kmf.init(mykey , keypass);

    //SSLContext'i anahtar depolar�nda al�n verilerler ba�la
t     ctx.init(kmf.getKeyManagers() , tmf.getTrustManagers() ,null) ;
    }
    catch(Exception e) {
    System.err.println(e.getMessage());
    System.exit(1);
    }

}

init SSLContext metodu, Sun JSSE'den bir SSLContext olu�turur.Bu olu�turma s�ras�nda, kullan�lacak SSL protokol�n� belirtebilirsiniz.Bu durumda, ben TLS(Transport Layer Security-Ula�t�rma Katman� G�venli�i) s�r�m 1'i se�iyorum.SSLContext �rne�i bir kere elde edildi�inde, anahtar deposundaki verilerle ba�lat�l�r.

A�a��daki kod par�as�, Postgres ile ayn� makina �zerinde �al��an SSLRelayServer s�n�f�na aittir.Bu, istemciden SSL arac�l��� ile gelen b�t�n verileri Postgres'e ge�irir veya tam tersini yapar.

SSLRalyServer s�n�f�


/* initSSLServerSocket, SSLContext'in �st s�n�f olan SSLConnection arac�l��� ile SSLContext'i al�r.Daha sonra bu, SSLServerSocket olu�umak i�in kullan�lacak olan SSLServerSocketFactory olu�turur.*
/ public void initSSLServerSocket(int localport) {
      try{
           //get the ssl socket factory
           SSLServerSocketFactory ssf = (getMySSLContext()).getServerSocketFactory();

            //create the ssl socket
           ss = ssf.createServerSocket(localport);
           ((SSLServerSocket)ss).setNeedClientAuth(true);
      }
   catch(Exception e) {
      System.err.println(e.getMessage());
      System.exit(1);
    }
 }

// SSLServerSocket ile dinleye ba�la ve gelecek istemci ba�lant�lar�n� bekl
e public void startListen(int localport , int destport) {

    System.out.println("SSLRelay server started at " + (new Date()) + "  " +
                     "listening on port " + localport + "  " +  "relaying to port " + destport );

 while(true) {
      try {
         SSLSocket incoming = (SSLSocket) ss.accept();
         incoming.setSoTimeout(10*60*1000); // set 10 minutes time out
         System.out.println((new Date() ) + " connection from " + incoming );
         createHandlers(incoming, destport); // create 2 new threads to handle the incoming connection
       }
    catch(IOException e ) {
        System.err.println(e);
        }
    }
}

RelayApp s�n�f�, yani istemci proxy'si, SSLRelayServer'a benzer.SSLConnection'�n alt s�n�f�d�r ve as�l veri ge�i�ini sa�lamak i�in 2 thread kullan�r.Aralr�ndaki fark �udur:RelayApp, gelen ba�lant�lar� dinlemek i�in SSLServerSocket yerine daha �ok uzak makinala ba�lanmak i�in SSLSocket olu�turur.Gereksinim duydu�umuz son s�n�f, as�l veri ge�i�ini yapacak olan thread'dir.Bas�t olarak, gelen verileri ekrana yazd�racakt�r.

Anlat�lan d�rt s�n�f�n tam kodu bburada (example285-0.1.tar.gz). bulabilirsiniz.

 

Proxy'leri �al��t�rma ve Test Etme

�stemci �zerinde, SSLConnectin.java,RelayIntoOut.java ve RelayApp.java dosyalar�na gerekesinim vard�r.Sunucu taraf�nda, SSLRelayServer.java, RelayIntoOut.java ve SSLConnection.java dosyalar�na gereksinim vard�r.Bunlar�n hepsini ayn� dizin i�ine koyun.�stemci proxy'sini derlemek i�in a�a��daki komutu �al��t�r�n:

javac RelayApp.java

Sunucu proxy'si i�in ise �u komutu �al��t�r�n:

javac SSLRelayServer.java

Postgres'in �al��t��� sunucuda, SSLRelayServer'i alt� komut parametresi ile �al��t�r�z:

1. Daha �nce keytool ile olu�turdu�unuz gizli anahtar� tutan anahtar deposunun tam yolu
2. Sunucunun g�venilir istemci sertifikalar�n� tutan sunucu anahtar depolar�n�n tam yolu
3. Ahatar depolar�n�n �ifreleri
4. Sunucunuzun gizli anahtar�n�n �ifresi
5. Sunucunun dinleme yapaca�� port numaras�
6. Verilerin y�nlendirilece�i port numaras� ( as�l sunucunun port numaras�, bu durumda postgres varsay�lan olarak 5432 nolu porttan dinleme yapar)
java SSLRelayServer servestore trustclientcert storepass1 prikeypass0 2001 5432

Sunucu proxy'sini �al��t�rd�ktan sonra istemci proxy'sini �al��t�rabiliriz.�stemci proxy'si yedi parametre al�r.Yedinci arg�man ba�lan�lacak olan sunucunun makina ismi ya da IP adresidir:

1. �stemcinin gizli anahtar�n� tutan anahtar deposunun tam yolu
2. G�venilir sunucular�n sertifikalar�n� tutan istemci anahtar deposunun tam yolu
3. Anahtar deposunun �ifresi
4. �stemci gizli anahtar�n�n �ifresi
5. Sunucunun makina ismi veya IP adresi
6. Veri ge�i�i yapacak olan sunucunun port numaras�
7. Veri ge�i�inin yap�lmas�n� istedi�iniz uygulaman�n port numaras� ( bu durumda postrgesdir.5432 nolu port)
java RelayApp clientstore trustservercert clistorepass1 cliprikeypass0 localhost 2001 5432

SSL t�neli olu�turulduktan sonra, JDBC uygulamas�n� �al��t�rabilir ve Postgres'e normal yoldan ba�lanabilirsiniz.B�t�n veri ge�i�i i�lemleri JDBC uygulamas� a��s�ndan �effaft�r.Bu makale zaten uzun olu�undan JDBC uygulamas�n�n �rnek kodlar�n� veremeyece�im.Postgres kullan�m klavuzu ve Sun dok�manlar� bir�ok JDBC �rne�i vermektedir.

E�er test s�ras�nda her�eyi ayn� makina �zerinde �al��t�rmak istiyorsan�z, yapabilirsiniz.Bun yapman�n iki yolu vars�r:Ya Postgres'in dinleme yapt��� port de�i�tirirsiniz ya da RelayApp'nin veri ge�i�i yapt��� portu de�i�tirisiniz.ikici yolun nas�l kullan�laca��n� g�sterece�im:�nce RelayApp'yi durdurun, sadece crtl-c'ye bas�n.Ayn� �eklide SSLRelayServer'i de durdurabilirsiz.

A�a��daki komutla RelayApp'i �al��t�r�n.Tek de�i�iklik son paratmede.Art�k 2002'dir.

java RelayApp clientstore trustservercert clistorepass1 cliprikeypass0 localhost 2001 2002

Test i�in kullan�lacak en iyi uygulama psql'in kendisidir.Tm psql trafi�ini, t�nelimiz arac�l���yla postrges'e ge�irece�iz.Test i�in psql'i �al��t�mak i�in a�a��daki komutu �al��t�r�n:

psql -h localhost -p 2002

Bu komut, psql ba�lant�s�n� RelayApp'mizin dinledi�i yerel port 2002'ye y�nlendirir.Postgres �ifrenizi girdikten sonra, her zamanki yolla SQL komutlar�n� �al��t�rmaya ba�layabilirsiniz ve �u an veri ge�i�i yapan SSL ba�lant�s�n� test edebilirsiniz.

 

G�venlik �zerine Bir Not

E�er makinan�z� ba�kalar�yla payla��yorsan�z, �ifrenizi bir komut sat�r�nda a��k vermeniz uygun olmaz.��nk� e�er biri ps -auxww komutu �al��t�r�rsa komutlar� t�m parametreliyle g�rebilir.en iyi yol �ifrenizi �ifreli(encrypted) olarak ba�ka bir dosyada bulundurmak ve java uygulaman�z�n �ifrenizi bu dosyadan okumas�n� sa�lamakt�r.Ba�ka bir yol da Java Swing'i kullanarak �ifrenizin bir pencere i�erisinde sorulmas�d�r.

 

Sonu�

Postgres taraf�ndan kullan�labilen bir SSL t�nelinin Sun JSSE kullanarak olu�turlmas� kolayd�r.Asl�nda, her g�venli ba�lant�ya gereksinim duyan uygulama bu t�neli kullanabilir.Ba�lant�n�z� �ifrelemenin bir�ok yolu vard�r.Sadecen sevdi�iniz edit�r program�n� a��n ve kodlamaya ba�lay�n.�yi e�lenceler!

 

Yararl� Linkler

 

Bu yaz� i�in g�r�� bildiriminde bulunabilirsiniz

Her yaz� kendi g�r�� bildirim sayfas�na sahiptir. Bu sayfaya yorumlar�n�z� yazabilir ve di�er okuyucular�n yorumlar�na bakabilirsiniz.
 talkback page 

G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r
© Chianglin Ng , FDL
LinuxFocus.org
�eviri bilgisi:
en --> -- : Chianglin Ng <chglin(at)singnet.com.sg>
en --> tr: �zcan G�ng�r <ozcangungor(at)netscape.net>

2003-03-28, generated by lfparser version 2.35