27 Temmuz 2015 Pazartesi

VPN Bağlantı Sorunu

      Öncelikle vpn hakkında kısaca bilgi verip sonra karşılaştığım sorunun ne olduğu ve nasıl çözdüğüm hakkında bilgi vermek istiyorum.

VPN
VPN(virtual private network), türkçe karşılığı sanal özel ağdır. Klasik internet üzerinde özel ve güvenli bir bağlantı türüdür. Güvenli olmayan ağlara bağlanırken bağlantıyı şifrelemek ve güvenli hale getirmek için kullanılır. Vpn bağlantısının iki çeşidi vardır.
  1. Uzaktan erişim : Ofis dışında çalışan ya da sık seyahat eden kullanıcıların internet üzerinden özel ağ ile sunucuya bağlanmalarıdır.
  2. Siteden siteye erişim : Farklı ofisler arasında kurulan bağlantıdır. Veri bağlantısı gibi çalışır.
 
VPN bağlantısı yapacak cihaz (VPN Client) üzerinde bir VPN ayarı veya programı bulunur. Bu ayar veya program ile de VPN sunucusuna İnternet üzerinden VPN bağlantısı kurulur. Fakat bu bağlantı özel bir şekilde şifrelendiğinden başkalarının bu tünel içerisinde geçen bilgilerin ne olduğunu anlamaları çok zordur.Vpn hakkında daha fazla bilgi almak istiyorsanız wiki sayfasına bakabilirsiniz.



VPN Bağlantı Sorunu

  Open VPN client kurduk. vpn sunucusuna bağlanma isteği gönderdiğimizde bir tane tünel açıyor. Bir ip adresi de atıyor. Buraya kadar herşey normal. Ancak client sunucunun tüm trafiği vpn üzerinden geçtiği route tablosundan görülüyordu. Bu istediğimiz bir durum değildi ve vpn ağında olmayan bir yerden client makinaya erişemez olmuştuk. Route tablosu hem sorunun tespit etmede hem sorunu çözmede işimize yarayacak.
   Route tablosu İp ağı üzerindeki yönlendirmeleri gösterir. Siz route tablosu üzerinde değişiklik yapabilir. Hangi ip adresinin nerden çıkış yaptığını görebilirsiniz.
route tablosunu görmek için  "route -n"komutunu kullanabilirsiniz:

"ip route show" komutunu da kullanabilirsiniz:


Destination : Hedef ağ
Gateway : Ağ geçidi adresi
Genmask : Hedef ağ için ağ maskesi  255.255.255.255 ,yol için 0.0.0.0 öntanımlıdır.
Genmaskı şöyle bir örnekle açıklayabiliriz: 172.16.8.0 hedefinin 255.255.248.0 ağ maskesi olsun. Bu ağ maskesi, ilk iki sekizlinin tam olarak eşleşmesi, üçüncü sekizlinin ilk beş bitinin eşleşmesi (248=11111000) gerektiğini ve son sekizlinin önemli olmadığını belirtir. 172.16.8.0 adresinin üçüncü sekizlisi (yani 8) ikili biçimde 00001000'dir. İlk 5 biti değiştirmeden (kalın olarak gösterilen maskesiz bölüm), 15'e kadar veya ikili olarak 00001111 değerine kadar çıkabilirsiniz. Bu şekilde, 172.16.8.0 hedefine ve 255.255.248.0 maskesine sahip bir yol, 172.16.8.0 ile 172.16.15.255 arasındaki adreslere gönderilen tüm paketlere uygulanır.

iface: Arabirim, bir sonraki yönlendiriciye erişmek için kullanılacak LAN veya isteğe bağlı arabirimi gösterir. 



Biz route tablosunda belli ip adreslerinin vpn bağlantısını kullanmasını geri kalanının normal makine üzerinden çıkış yapmasını istedik bu yüzden bağlantı sağladığımız dosyaya (/etc/openvpn/infovpn_openvpn_remote_access_l3.ovpn)
aşağıdaki gibi eklemelerde bulunduk:

route vpne_yönlendirmek_istediğiniz_ip(destination)  Genmask
Örneğin : route 172.16.8.0 255.255.248.0  gibi...

Elle route tablosunda ekleme ve route tablosundan silme işlemlerini yapmak içinde aşağıdaki komutları kullanabilirsiniz:

Eklemek için : "sudo /usr/sbin/ip route add destination/32 via gateway"

Silmek için: "sudo /usr/sbin/ip route del destination"

destination daki /32 genmask dizilimini ifade eder. Yani burda /32 olması direk olarak verilen adresin yönlendirilmesi istendiği anlamına gelir genmask'ı 255.255.255.255 dir.
IP için genmask hesaplamalarınızı bu siteden yapabilirsiniz.

23 Temmuz 2015 Perşembe

jenkins'de github ile kullanıcı kimlik kanıtlaması

    Jenkins yapılandırmasında varsayılan olarak oturum açmadan herkes erişim yapabilmektedir. Güvenlik açısından bunu düzeltmek gereklidir.
    Biz kullanıcıları doğrulamak için GitHub OAuth mekanizmasını kullandık.Bunun için 'jenkins'i Yönet'->'Eklentileri Yönet' da GitHub Authentication plugin yüklüyoruz.




Daha sonra 'Jenkins Yönet'->'Configure Global Security' seçiyoruz. "Güvenliği devreye al" seçeneğini işaretleyip orda "Github Authentication Plugin"lı seçiyoruz. Burda "Global Github OAuth" ayarlarını yapmamız gerekecek.


GitHub Web URL : https://github.com/
GitHub API URL: https://api.github.com/
Client ID : Github işlemci kimliği
Client Secret : Github gizli kimlik

Burada Github Apı ve Web aynı şekilde kalacak.
API bir uygulamanın belli işlevlerini  diğer uygulamanın kullanabilmesi için  iletişim kurmasını sağlıyor.



Client ID ve Client Secret'i github'dan elde edeceğiz şöyleki. Github sayfamıza giriyoruz. Sağ üst köşedeki profil resminin üstüne tıklayıp settings 'e giriyoruz.



Applications'ı seçiyoruz ve Authorized application oluşturuyoruz.Bizim için gerekli olanlar :

Application nameUygulama adı

: Uygulamanın ana sayfasının github urlsini giriyoruz.

: Kendinden başka bu uygulamanın potansiyel kullanıcılarının github url'ri

Authorization callback URL : Dönüş yapıcağı Url (http://İp:8080/securityRealm/finishLogin)(jenkins varsayılan olarak 8080 kullandığından ben portu 8080 yazdım siz değiştirdiyseniz ona dikkat edin)

Daha sonra kaydediyoruz ve git bize bir tane client id ve client secret vericek.



Yetkilendirme kısmında Github Commiter Authorization Strategy seçiyoruz ve buradaki ayarları yapıyoruz.

Admin user names : Admin olucak kişilerin github adı.

Participant in Organization : Dahil olunan organizasyon adı

Use Github repository permissions : Github depo izinlerini kullan.

Grant READ permissions to all Authenticated Users : Doğrulanmış kullanıcılara
okuma izni verilmesi.

Grant CREATE Job permissions to all Authenticated Users : Doğrulanmış kullanıcılara İş oluşturma izni.

Grant READ permissions for /github-webhook : /git-webhook okuma izni

Grant READ permissions for /cc.xml : /cc.xml dosyaları için okuma izni

Grant READ permissions for Anonymous Users : Anonim kullanıcılara okuma izni


Bu ayarları yaptıktan sonra kaydedip jenkins'i yeniden başlatıyoruz.


19 Temmuz 2015 Pazar

JENKINS

        Sürekli entegrasyon aracıdır.Kaynak kodlarını alır, sizin istediğiniz süreçten geçirip build eder.

Ben size jenkinsin centos için kurulumu anlatacağım.Siz jenkins'in sayfasından diğer sistemler için kurulumuna bakabilirsiniz.

jenkins kurulumu için minimum sistem gereksinimleri:
2G RAM
2 CPU
Java(1.7)

Kurulum 

yum deposuna jenkins deposunu ekleyelim:
 "sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
--2015-07-06 04:16:06--  http://pkg.jenkins-ci.org/redhat/jenkins.repo (Depoya indirme yapıyoruz.)"

Jenkins anahtarını import ediyoruz.Jenkins dosyasının yeri yani şuanda jenkins-ci.org/redhat deposunu kullanabilirsiniz:  "sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key"

Depodaki Jenkins'i kuruyoruz: "sudo yum install jenkins"



Java kurulumu

wget ile Oracle'dan JDK 7'yi indiriyoruz:
`wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/7u80-b15/jdk-7u80-linux-x64.tar.gz" `

/opt nin altına jdk dizini oluşturuyoruz: "sudo mkdir /opt/jdk"

Arşiv dosyasını buraya açıyoruz: "sudo tar  -zxf  jdk-7u80-linux-x64.tar.gz -C /opt/jdk"

 Java yolunu sürekli source etmemek için /etc/init.d/ dizininin altına java dosyası oluşturuyoruz. Java yolunu belitriyoruz:
"export JAVA_HOME=/opt/jdk/jdk1.7.0_80"
"export PATH=$PATH:$JAVA_HOME/bin"

java -version komutu ile yükleyip yüklemediğimizi kontrol ediyoruz.

 Jenkins Başlatma/Durdurma

Jenkins'i başlatmak için : "sudo service start jenkins"

Jenkins'i sonlandırmak için: "sudo service stop jenkins"

Jenkins yapılandırması


1)Git ve Github eklentileri yükleyin

Jenkins de git kullanabilmek için github eklentilerini (github plugins) yüklememiz gerekiyor.Bunun için Jenkins arayüzünden 'jenkins Yönet(Manage Jenkins)'->'Eklentileri Yönet(Manage plugins)' kısmından 'github plugins' yüklüyoruz

2015-07-14 14:59:36.png



Daha sonra 'jenkins yönet(Manage Jenkins)'->'Sistem konfigurasyonunu değiştir(Configure System)' kısmından 'Git' kısmında git'in yolunu belirtiyoruz ve 'Github Web Hook' kısmında 'Manually manage hook URLs' seçiyoruz.

2.png
3.png






2)Java yolunu belirtme

Jenkins java kullanıyor ve yapılandırma sırasında java'nın yolunu belirtmediğimiz zaman javayı bulamıyor.Ben öyle bir sorunla karşılaştım:)
Bu yüzden 'jenkins Yönet(Manage Jenkins)'->'Sistem konfigurasyonunu değiştir(Configure System)' de JDK kısmında JAVA_HOME'un yolunu belirtmemiz gerekiyor.


10.png




3)Yeni item oluşturma ve yapılandırması



Yeni item tercihini seçiyoruz.Proje ismimizi yazıp biz projeyi maven ile yapılandıracağımız için o seçeneği seçiyoruz.Daha sonra proje ile ilgili yapılandırma yapabileceğimiz bir ekran çıkıyor karşımıza. Oraya Github project kısmına projenizin bulunduğu deponun http://url sini ekliyorsunuz.Biz bu kısımda eski yapılandırmalarımızdan kurtulmak istediğimiz için onunla ilgili ayarları da yaptık.


Daha sonra Kaynak Kodu Yönetimi kısmında Git seçip deponun urls'ini ssh olarak belirtin ve gerekirse branch belirleyin.


Url'yi ssh olarak vermemizin nedeni bir ssh-key tanımlanıp  bu sayede bizden sürekli parola sormasını engellemiş olacağız. Ssh-key'i 'ssh-keygen -t rsa' komutunu çalıştırarak oluşturuyoruz.Credentials kısmında Add deyip SSH seçeneğini seçtikten sonra private-key ayarını yapabilirsiniz.Public-key'i de github ayarlarına ekliyoruz.


12.png



Yapılandırma tetikleyici kısmında 'build when a change is pushed to github' seçeneğini de ekliyoruz böylece github da değişiklik olduğunda projenin buildi alınacak.

8.png


Eger maven ile build almadan önce projenizde ekstra bir pakete ihtiyaç varsa 'pre build step' ile build işleminden önce yapılması gerekenleri yapabilirsiniz:


13.png











17 Temmuz 2015 Cuma

MAVEN

Maven,geliştirilen java projelerinin geliştirme süreçlerini basitleştirmek, standartlaştırmak,belgelendirmek, kütüphane bağımlılıklarını kullanıcı zahmetinden kurtarmak için kullanılan bir araçtır.
Maven ile hemen hemen bütün java projelerinin iskeleti çıkarılabilir. Bu sayede oluşturduğunuz projeyi geliştirme ortamından bağımsız olarak geliştirirsiniz.

Maven ile neler yapılabilir:
  1. Proje yönetimi kolaylaştırılır.
  2. Belirli standartlar belirlenebilir.
  3. Farklı IDE'lere projenizi taşıyabilirsiniz.
  4. Proje temelini başka projelerde kullanabilirsiniz.
Maven ayarları üç levelden oluşur:
  1. Project: En statik yapılandırmadır,Proje uygulanacak bilgiler tanımlanır(pom.xml içinde gerçekleşir).
  2. Install(kurulum): 
  3. User(kullanıcı):Bu ayar özel kullanıcılara hitap eder.
Maven için sistem gereksinimleri:
  1. Maven 3.2 versiyonu için JDK 1.6 or üzeri, Maven 3.0/3.1
    versiyonu için ise JDK 1.5 üzeri olan paketler tercih edilmelidir.
  2. Yaklaşık olarak Maven'in kurulumu için 10mb yeterli olacaktır.
    Buna ek olarak sizin yani yerel Maven depolarınız için Maven sizden bir disk alanı isteyecektir.Aslında tamamen sizin projenizin büyüklüğüne bağlıdır.

Maven kurulumu

Sitesinden maveni indiriyoruz. İstediğimiz bir dizinin altına bu dosyayı çıkarıyoruz.İsterseniz /opt nin altına maven dizini oluşturup tar dosyasını burada açabilirsiniz. opt dizininde üçüncü parti kullanıcı programları bulunur:
  • Dosyayı açacağınız dizine gidin: cd  /opt
  • Maven dizini oluşturun: sudo  mkdir  maven
  • Maven dizinine gidin : cd maven/
  • Dosyayı açın : tar -xzf dosya_adı.tar
  • Maven yolunu belirtiyoruz: "export M2_HOME=/opt/maven/dosya_adi.tar" "export M2=$M2_HOME/bin"                                                                           "export PATH=$M2:$PATH"
Maven yolunu sürekli elle export etmek yerine /etc/profile dosyasına
"export M2_HOME=/opt/maven/dosya_adi.tar"
"export M2=$M2_HOME/bin" eklerseniz. Sürekli export etmek zorunda kalmazsınız.

/etc/profile yi source etmeyi unutmayın :)

JDK kurulumu

Mavenin gereksinimlerinde Jdk ya ihtiyaç olduğunu belirtmiştim.

Ben Oracle jdk indirdiğim için depodan indirme yaptım :
` wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-

 Maven için yaptığım işlemleri Jdk içinde yaptım. 
/opt dizininin altına Jdk dizini oluşturdum: sudo mkdir jdk/
tar dosyasını Jdk dizinine açtım: tar -xzf jdk-7u80-linux-x64.tar.gz
/etc/profile dizinine jdk yolunu ekledim:"export JAVA_HOME=/opt/jdk/jdk1.7.0_80" 
"export PATH=$PATH:$JAVA_HOME/bin"
source /etc/profile ile source ettim.


java'nın kurulu olup olmadığına bakmak için :
java -version komutunu çalıştırıyoruz. Aşağıdaki gibi bir çıktı bekliyoruz:







Eğer sunucu da başka bir java yüklü olsaydı o zaman varsayılan olarak oracle jdk yı ayarlamamız gerekecekti:
-sudo update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.7.0_80/bin/java 100
-sudo update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk1.7.0_80/bin/javac 100 (javac java komutlarını derlemek için komutların bulunduğu dosya)


Maven Hello Word!

Maveni yükledik gereksinimleri de sağladık şimdi bir proje oluşturalım.Aşağıdki komutu kullanarak bir proje oluşturuyoruz:

"mvn archetype:generate -DgroupId=org.sonatype.mavenbook -DartifactId=simple"
groupId proje ekipleri veya grupların tekil kimliğini belirtir. artifactId proje için oluşturulmuş ana yapının tekil adını belirtir.
Bu komut bize simple adlı bir dizin oluşturdu. İçinde pom.xml dosyası ve src dizini vardı.
-pom.xml Proje hakkında esas bilgiler vardır.
-src dizininde ise main ve test kısımları vardır.

mvn install :
      mvn install komutuyla yerel depo içindeki bağımlılıkları çektik ve bize kullanılabilir bir jar dosyası oluşturdu.Projenin build'ini almış olduk.

install ile oluşan target dizini içinde "java -cp simple-1.0-SNAPSHOT.jar org.sonatype.mavenbook.App" komutunu çalıştırarak Hello Word çıktısı aldık. (-cp jar/zip dosyaları veya klasörlerin yollarını classlarda arar)






 mvn clean :
      Önceki yapı tarafından oluşturulan tüm dosyaları silmek için kullanılıyor.
      Proje üstünde komutu denediğimizde mvn install çalıştırıldığında oluşturulan target dizinini kaldırdı.


10 Temmuz 2015 Cuma

SSH

SSH (Secure Shell) güvenli veri iletimini sağlayan bir ağ protokolüdür. Ssh ile ağa bağlı iki bilgisayar arasında veri aktarımı yapılır. Ssh genellikle uzaktaki makinede oturum açmak ve komut çalıştırmak için kullanılır. TCP portları üzerinde taşınır ve x11 bağlantısı sağlar. Standart TCP portu olan 22 SSH bağlantısı için atanmıştır.
Ssh ile;
-Uzak kullanıcı üzerinden kabuğa bağlanmak mümkündür.
-Uzak kullanıcıda tek bir komut çalıştırılabilir.
-Local bilgisayardan uzak bilgisayara dosya kopyalanabilir.
-Port yönlendirme için kullanılabilir.
-Otomatik olarak uzaktan server kontrolü ve yönetimi sağlanabilir.

Ssh çoğunlukla kurulu olarak geliyor. /etc/ssh/sshd-config dosyasından düzenleme yapabilirsiniz.

"ssh kullaniciadi@sunucu"
komutuyla uzak sunucunuza parolanızı doğruladıktan sonra giriş yapabiliyorsunuz. Ssh'ın önemli özelliklerinden biri de RSA ve DSA izin protokolleri aracılığıyla izinlendirme yapabilmesidir. Bir parola teminine gerek kalmadan uzaktaki sistemlere erişim sağlayabiliyoruz.RSA izinlendirmesinde iki tane anahtar oluşturulur,özel ve genel anahtar.Genel anahtar bir mesajı şifrelemek için kullanılıyor,bu şifreyi özel anahtarın sahibi çözebiliyor. RSA anahtar çiftini "ssh-keygen" komutunu çalıştırarak oluşturuyoruz.  Özel anahtarlar "$HOME/.ssh/identity" dosyasında ,genel anahtarlar "$HOME/.ssh/identity.pub" dosyasında saklanır."identity.pub" dosyası uzak makinenin  $HOME/.ssh/authorized_keys dosyasına kopyalanmalıdır. Böylelikle kullanıcı parola girmeden oturum açmaya hak kazanmış olur.  "ssh agent" ssh anahtarınızın parolasının hafızada tutulmasını sağlar. ssh agent ön tanımlı gelen bir ssh aracıdır. "ssh-agent" çalıştırdığınızda kullanacağı ortam değişkenlerini göstermektedir. Komutu "eval `ssh-agent`" ile çağırıyoruz ,değişkenleri kullanabilmek için. /etc/profile dosyasına " #echo 'eval `ssh-agent`' >> /etc/profile" ekliyoruz. ssh-agente özel bir anahtarınız olduğunu ve onu nerde sakladığınızı belirtmeniz gerekiyor. "$ssh-add ~/.ssh/id_dsa" her konsolu açtığımızda ssh-add komutunu çalıştırmanız gerekir.

Bazı ssh komutları:

  • pico : ssh üzerinden text editör ile dosya içeriğini görme ve düzenlemeye yarar.
  • netstat -n : sunucuya bağlanan ipleri gösterir.
  • passwd : Shell hesabınıza girerken kullandığınız parola değiştirmenizi sağlar.
  • vhosts ya da vhost : Sistemde bulunan vhostları(virtual host) listeler.
  • ip addr : root makineden ip öğrenme
  • adduser login & chown gokyuzu /home/  login & passwd pass1, passwd pass2 : rootta hesap açmak.
  • reboot : Sunucuya restart atar.
  • userdel kulanici_adi :Sistemde mevcut kullanıcıları sistemden uzaklaştırır siler.
  • chown  user /dosya: Bir klasör ya da dosyaya başka bir kullanıcı sahipliği vermek için
scp(secure copy (güvenli kopyalama))  komutunu kullanarak , ssh üzerinden dosyaları kopyalayabilirsiniz.
1)local bilgisayardan ,uzak sunucuya klasör kopyalama:
"scp -r /home/path/klasor username@sunucu_ip_adresi:/home/path/"
2)Uzak sunucudan,lokal bilgisayara klasör kopyalama:
"scp -r username@sunucu_ip_adresi:/home/path/ /home/path/klasor"
3)Sadece dosya kopyalama:
"scp -r /home/path/dosya.tar.gz username@sunucu_ip_adresi:/home/path/"

Başarısız bir dosya kopyalamasına rsync komutuyla devam edebilirsiniz:
"rysnc -partial -progress -rsh=ssh $file_source $user@$host:$destination_file local->remote "

wget : dosya indirmek için kullanabilirsiniz.
1) -c parametresi ile kaldığımız yerden indirmeye devam edebiliriz.
"wget -c http/......."
2) -P parametresi ile belirli bir dizine yükleme yapabiliyoruz.
"wget -c http/..... -P  $HOME/dosyalarim"