Messenger Sunucularının Kurulum Dokümanı GİRİŞ Ejabberd erlang[1] dilinde yazılmış ve o dile ait olan mnesia database i kullanan bir yazılımdır. Erlang dili fault tolerant uygulamalarda kullanılmaktadır. Daha çok telekomunikasyon sektöründe kullanılmakla beraber cluster yapıda çalışan sistemler için uygun bir geliştirme ortamıdır. Erlang ile yazılmış olan Ejabberd[2] jabber [3] protokolu uyumlu bir yazılımdır. Jabber protokolu internet üzerinde mesajlaşmak için kullanılan bir protokoldür. Ejabberd in seçilme nedeni fault tolerant bir yapıyı kullanıcıya sunmasıdır. Bu sayede daha iyi ve güvenli bir cluster yapının kurulabileceği düşünülmüştür. Ejabberd in planlanmış ve kurulmuş yapısı aşağıdaki şekildeki gibidir: 10.0.0.2 Ejabberd in kurulumu, yedek ve geri dönme prosedürleri aşağıda adım adım anlatılmıştır. 1
KURULUM 1)Kaynak dosyasının indirilmesi: Ejabberd din binary doyası /home/messenger/ klasörüne indirilir wget http://process-one.net/en/projects/ejabberd/download/1.1.2/ejabberd-1.1.2_1-linuxinstaller.bin 2)Kurulumun yapılması:./ ejabberd-1.1.2_1-linux-installer.bin komutu ile kurulum başlatılır. 3)Kurulum esnasında cevaplanması gereken sorular: Kurulum için sorulan sorular aşağıdaki gibi cevaplanır. a)kurulum dili olarak İngilizce seçilir. b)lisans sözleşmesi kabul edilir. c)yükleme directorysi olarak önerilen /opt/ejabberd-1.1.2 değiştirilmez. d) ejabberd server domain için messenger1.example.com.tr yazılır. e) Administrator user name için önerilen admin değiştirilmez ve admin için bir şifre girilir. f)cluster[y/n] sorusuna yes denilir. g) Cluster node name için ejabberd1@messenger1.example.com.tr yazılır. Bu işlem tüm nodelar için tekrarlanır. Not:Kurulum esnasında admin adlı kullanıcının şifresini istiyor. Ejabberdi ldap kullanarak çalıştıracagımız için ldapta admin uid li bir kullanıcı acılmalı ve ldap ile uyumlu çalışmaya başladıktan sonra web arayüzünü kullanırken ldap ta açılan hesabın şifresi girilmeli. Messenger1.example.com.tr ve messenger2.example.com.tr nin DNS kayıtları oluşturulmalı. 4)Cookie lerin aynı yapılması: Cluster şeklinde çalışan sunucular birbirleriyle iletişimlerini kurmak için kendi cookielerinin clusterdaki diğer sunucuların cookieleriyle aynı olmasını şart koşarlar. Bunun sebebi tamamen güvenliktir. Root kullanıcısının home directorysinde olan.erlang.cookie dosyasının içeriği clusterdaki diğer sunucuyla aynı olması için iki sunucunun cookie dosyaları eşitlenir. Birinin cookie dosyası diğerine kopyalanır. 6)Cluster şeklinde sunucuların yapılandırılması: 2
./erl -name ejabberd1@messenger1.example.com.tr -kernel inetrc '"/opt/ejabberd- 1.1.2/conf/inetrc"' -s ejabberd -ejabberd config '"/opt/ejabberd-1.1.2/conf/ejabberd.cfg"' log_path '"/opt/ejabberd-1.1.2/logs/ejabberd.log"' -sasl sasl_error_logger '{file,"/opt/ejabberd- 1.1.2/logs/sasl.log"}' Komutu messenger1 serverinda calıstırılır. Bu komut sonucunda bin directorysinde bir database oluşturulur. Bu databaseden bir tane sunucu klonlamak için messenger2 sunucusunda aşağıdaki komut çalıştırılır. extra_db_nodes parametresi ile messenger1 işaret edilir../erl -name ejabberd2@messenger2.example.com.tr -s mnesia -mnesia extra_db_nodes "['ejabberd1@messenger1.example.com.tr']" En son çalıştırılan komut ile messenger2 de erlang shell ine düşülür ve mnesia:change_table_copy_type(schema, node(), disc_copies). Komutuyla messenger2 ye bir database oluşturulur. Bu database bilgilerini messenger1 den almaya başlar. Erlang shellinden çıkmak için q(). Komutu verilir ve Linux shelline düşülür. Bu şekilde yapılandırılmış messenger2 bazı tableları kendi üstünde tutsa da birçok tableları remote olarak messenger1 den aldığı için tek başına çalışamaz. Bunu engellemek için messenger2 nin de bu tableları kendi üstünde tutması sağlanmalıdır../erl -name ejabberd2@messenger2.example.com.tr -kernel inetrc '"/opt/ejabberd- 1.1.2/conf/inetrc"' -s ejabberd -ejabberd config '"/opt/ejabberd-1.1.2/conf/ejabberd.cfg"' log_path '"/opt/ejabberd-1.1.2/logs/ejabberd.log"' -sasl sasl_error_logger '{file,"/opt/ejabberd- 1.1.2/logs/sasl.log"}' İle çalıştırıldıktan sonra web arayuzunden database tablolarını messenger1 deki gibi özelliklere çekilir. Yani disc_copy olanları disc_copy gibi yaparak bunu sağlarız. Bu şekilde yapılmazsa remote tablolarda onemli bilgiler kalır ve kullanıcıları authenticate etmez. 7) Ejabberd.cfg de yapılması gereken değişiklikler: a)@messenger ayarlaması ejabberd.cfg de hosts kısmı messenger yapılır. Clientlarda hesaplar girilirken @ kısmından sonra messenger nin eklenmesi gerekmektedir. Jabber protokolunun gereği olan bu ekleme 3
yapılmazsa kullanıcılar sisteme bağlanamaz. b)ldap yapılandırması Ejabberd in ldap ile çalışmasını saglamak için conf dosyasında değişlikliğe gidilmesi gerekmektedir. Kullanıcıların sunucuya ldap üstünden kayıt olabilmesi için {access, register, [{deny, all}]}. Allowu deny yapılmalıdır. Bu sayede ldap üstünde olan kullanıcılar ejabberd i kullanır. Öbür türlü isteyen kendini sunucuya üye yapar. {auth_method, internal}. İptal edip yerine ldap authentication kodları yazılır. İptal edilmesi istenilen satırın başına % işareti konulur. Ldap ayarları aşağıdaki gibi yapılandırılır. {auth_method, ldap}. {ldap_servers, ["ip_of_the_ldap_server"]}. % List of LDAP servers {ldap_uidattr, "uid"}. % LDAP attribute that holds user ID {ldap_base, "dc=example,dc=com,dc=tr"}. % Search base of LDAP directory {ldap_rootdn, "uid=sorgucu,dc=example,dc=com,dc=tr"}. % LDAP manager {ldap_password, "sorgular"}. % Password to LDAP manager {ldap_filter, "(AccountStatus=enabled)"}. Kullanıcıların diğer üyeleri arama yapıp kendi kullanıcı listelerini eklemeleri için vcard yapılandırılması gerekmektedir. Bu yapılandırmaya göre kullanıcılar arama yapabilmektedir. Mod_vcard içinde {mod_vcard_ldap, [{ldap_rootdn, "uid=sorgucu,dc=example,dc=com,dc=tr"}, {ldap_password, "sorgular"}, {ldap_base, " dc=example,dc=com,dc=tr"}, {ldap_filter, "(AccountStatus=enabled)"}, {ldap_uidattr, "uid"}, {ldap_vcard_map, [ % just use user's part of JID as his nickname {"GIVEN", "%s", ["givenname"]}, {"FAMILY", "%s", ["sn"]}, {"FN", "%s, %s", ["givenname","sn"]}, 4
{"EMAIL", "%s", ["mail"]}]}, %% Search form {ldap_search_fields, [{"Absicilno", "uid"}, {"Ad", "givenname"}, {"Soyad", "sn"}, {"E-posta", "mail"}, {"Takmaad", "nickname"}]}, {ldap_search_reported, [{"Ad,Soyad", "FN"}, %{"Takmaad", "NICKNAME"}, {"E-posta Adresi", "EMAIL"}]}]}, Eklemesi yapılıp vcard formatı ayarlanır. 8) TLS (transport layer security) bağlantısını sağlama: Jabber protokoluyle iletişim kuran ejabberd şifreli bağlantı yapılmadan kullanılırsa güvenlik yönünden büyük bir zaafiyet yaratacağı için ejabberd in mutlaka sertifikalı tls bağlantısı üzerinde çalışması gerekmektedir. Bu sayede kullanıcıların özel konuşmaları network içinde clear text olarak dolaşmaz. Şirket kullanıcılarının bu servisi özel konuşmalarında güvenle kullanmaları için kullanıcılara tls bağlantısı sağlanması gerekir. Tls baglantısı için sertfika uretitmek için openssl genrsa 1024 > host.key chmod 400 host.key openssl req -new -x509 -nodes -sha1 -days 365 -key host.key > host.cert İstenilen bilgiler girilir openssl x509 -noout -fingerprint -text < host.cert > host.info cat host.cert host.key > host.pem && rm host.key ile host.pem hazırlanır. scp host.pem root@10.0.0.4:/opt/ejabberd-1.1.2/conf/host.pem bu dosya diğer sunucuya aktarılır. 5
Artık sunucunun ssl baglantısı yapması için ejabberd.conf dosyasından ayarlama yapılmalıdır. Bu ayar iki sunucuda da yapılmalıdır. {5222, ejabberd_c2s, [{access, c2s}, {shaper, c2s_shaper}, starttls, {certfile, "/opt/ejabberd-1.1.2/conf/sertifika/host.pem"}]}, 9) Backup ve Restore durumları: Backup ve restore prosedürü gelecekte onemli olabilecek konulardan biri oldugu için bu yazıya bu konularıda koydum. Tüm sunucuların database ini almaya gerek yoktur yapı itibariyle. Zaten tum databaseler birbirlerini replike ediyor. Bir tanesini almak yeterlidir. İlk olarak backup alınması için seçilen sunucudan web arayuzuile backup alınır. 1.Senaryo: Nodelardan biri çöktü. Çöken node a ejabberd kurulur ve database i masterdan alması için işlem yapılır. Zaten çöken bir sunucunun üstünden alınmış olan backup kurulum süresince geçecek zaman sonucu eskiyecektir. Çalışan masterdan alınması daha uygundur. Bu sayede son model bir database e sahip olur. 2.Senaryo: Master çöktü MAsterin backupı devamlı alınması gerekmektedir. Buna gore mastera backup donulur ve digger nodelardaki databaseler silinip mastera uyumlu hale getirilir. 10) Bakım gibi durumlarda sunucunun durdurulması: Bakım ve bunun gibi işler için sunucunun durdurulması gerekebilir. Hangi node da çalışma yapılacaksa o node da /opt/ejabberd-1.1.2/bin/start ile web arayüzüne bağlanılır ve Nodes seçilir. Running nodes kısmından hangi nodeun üstünden arayüz çalıştırıldıysa o nodeun çalışan ejabberd ı seçilir ve en alttaki menüdeki restart ve stop dan başlatırlır veya durdurulur. 11) Ejabberd ı çalıştırma komutları: İlk verilen çalışma komutlarında erlang shelli açık durumda kalmaktadır. Bunu engellemek için noinput ve detached parametleri eklenmesi gerekir. Erlang için tuning yapılması gerekmektedir. Aşağıdaki değerler export edilir. Çalıştırma komutundan once export ERL_MAX_PORTS=32000 export ERL_MAX_ETS_TABLES=20000 Bu değerler değişkenlere atanır. Daha sonar aşağıdaki komutlar verilir. 6
Messenger1 için:./erl -noinput -detached -name ejabberd1@messenger1.example.com.tr -kernel inetrc '"/opt/ejabberd-1.1.2/conf/inetrc"' -s ejabberd -ejabberd config '"/opt/ejabberd- 1.1.2/conf/ejabberd.cfg"' log_path '"/opt/ejabberd-1.1.2/logs/ejabberd.log"' -sasl sasl_error_logger '{file,"/opt/ejabberd-1.1.2/logs/sasl.log"}' Messenger2 için:./erl -noinput -detached -name ejabberd2@messenger2.example.com.tr -kernel inetrc '"/opt/ejabberd-1.1.2/conf/inetrc"' -s ejabberd -ejabberd config '"/opt/ejabberd- 1.1.2/conf/ejabberd.cfg"' log_path '"/opt/ejabberd-1.1.2/logs/ejabberd.log"' -sasl sasl_error_logger '{file,"/opt/ejabberd-1.1.2/logs/sasl.log"}' 12)Sistem güvenliği, kullanılan portlar: Sistem güvenliği için tüm gereksiz portlar kapatılmıştır. Bu iki sunucunun internete çıkışları da yoktur. Clientların kullandığı port 5222 dir. Sunucular kendi aralarında ise 5269 dan konuşmaktadır. Firewall ın arkasında kaldıklarından bu sunucuların açık portlarına erişim imkanı yoktur. Sadece admin networkünden erişilebilmektedir. Sunucu ve clientlar arasında kriptolu iletişim sağlanmış olup bu sayede mail şifrelerinin ve mesajların network üstünden dinlenmesi engellenmiştir. Referanslar: [1] http://video.google.com/videoplay?docid=-5830318882717959520 [2] http://ejabberd.jabber.ru/ [3] http://www.jabber.org/ 7