23 Haziran 2020 Salı

DOCKER SWARM ÜZERİNDE TRAEFIK CLOUD LOAD-BALANCER İLE WORDPRESS UYGULAMASI DEPLOY ETME (1)

Merhaba. Bu yazı serisinde docker swarm cluster üzerinde (CentOS işletim sistemi kullanılmıştır.)traefik load-balancer kullanarak wordpress uygulaması deploy etmeyi anlatacağız. Bu uygulama için ilk yazıda wordpress uygulamasını docker-swarm üzerinde deploy edilmesinden bahsedeceğiz. Daha sonra traefik load-balancer ile uygulamaya kazandırılan yetenekler anlatılacaktır. Öncelikle kuracağımız mimariyi 3 node üzerinde kurulu olan docker-swarm altyapısını kullanarak oluşturacağız. Aşağıda ilk etap için uygulama bileşenlerinin topolojisi gösterilmiştir. 




Docker swarm clusterı üzerinde wordpress sitesi ayaklandırabilmemiz için temelde iki adet konteynere ihtiyaç duyulmaktadır. Birincisi wordpress uygulamasının çalışacağı wordpress, ikincisi ise veritabanı olarak kullanacağımız mysql konteyneri. Kurulacak olan sistemin kalıcı veri depolama ve nodelardan bir veya birden çoğu kapandığı zaman hizmet vermesini sağlama amacı ile ortak disk ihtiyacı oluşmuş, bu ihtiyaç NFS (Network File System) server aracılığı ile sağlanacaktır. Konteynerlerin ayrıntısına girmeden önce NFS server ve NFS client yapılandırması yapmak gerekecektir. Bunun için aşağıdaki adımlar izlenir.

NFS server hizmeti verecek olan host üzerinde (192.168.1.45, bu mimaride gösterilmeyen bir host üzerinde NFS server çalıştırılmıştır. NFS Server test amaçlı yapılandırılacağından herhangi bir docker swarm nodeunda başlatılabilir.) Öncelike nfs server bileşenleri yüklenir ve nfs server servisleri başlatılır.

~# dnf install nfs-utils
~# systemctl start nfs-server.service
~# systemctl enable nfs-server.service

NFS ile paylaştırılacak alan için bir mount point oluşturulur.

~# mkdir -p /mnt/nfs-share/docker-swarm

NFS server konfigürasyonu için "/etc/export" dosyası açılarak aşağıdaki satır eklenir.

/mnt/nfs-share/docker-swarm 192.168.1.0/24(rw,sync,no_subtree_check,all_squash,anonuid=0,anongid=0)

Yukarıda gösterilen satırda ilk alan hangi dizinin nfs server ile paylaşılacağı, ikinci alan hangi ip bloğundan ve hangi kullanıcı idlerinin hangi izinlerle bu alana erişeceğini belirtmektedir. Örnekte belirtilen ip bloğundaki hostlar için okuma/yazma yetkisi ile kullanıcıdan bağımsız olarak erişim yetkisi verilmiştir. Yapılan değişiklikten sonra exportfs komutu ile belirtilen alan nfs protokolü ile sunulmaya  başlanır. 

~# exportfs

CentOS firewalldan nfs servisi için yetkilendirme yapılır.

~# firewall-cmd --permanent --add-service=nfs

Son olarak mimaride belirtilen hostlarda (centos01, centos02, centos03) aşağıdaki komutlar çalıştırılarak paylaştırılan alan mount edilerek kullanıma başlanır.

~# mount -t nfs 192.168.1.45:/mnt/nfs-share/docker-swarm /mnt/docker-swarm/

mount edilen alanın restart sonrası tekrardan kullanılabilmesi için /etc/fstab dosyasına yazılması gerekmektedir. Aşağıdaki komut ile bu işlem sağlanır.

~# echo "192.168.1.45:/mnt/nfs-share/docker-swarm      /mnt/docker-swarm  nfs     defaults 0 0" >> /etc/fstab

NFS paylaşım alanı oluşturulduktan sonra konteynerlerin üzerinde koşacağı overlay network oluşturulur. Bunun için aşağıdaki komut çalıştırılır. 

~# docker network create -d overlay --subnet 10.0.6.0/24 base-network

Altyapı oluşturulduktan sonra docker-swarm üzerinde konteyner deployment için yaml dosyası oluşturacağız. Bu dosyada konteynerlerimizi servislere bağlı olarak deploy edeceğiz. Deploy planımızda:

- iki adet servis yer alacaktır. Bunlar wordpress ve db servisleri.
- wordpress servisi 3 adet wordpress konteyner oluşturacak ve bunları hostlara dağıtacaktır. 
- wordress servisi wordpress içeriğinin kalıcı olması için wp-content klasörünü nfs share alanına bind edecektir. 
- wordpress servisi TCP 80 portunu dış dünyaya expose edecektir. 
- wordpress servisi base-network üzerinde ayağı kalkacaktır. 
- wordpress servisi veritabanına environment variableları kullanarak bağlanacaktır. 
- wordpress servisi "depends_on" özelliğini kullanarak veritabanı konteynerının keşfedecektir.
- db servisi manager node üzerinde konteyner ayağı kaldıracaktır.
- db servisi kalıcı olabilmesi için "/var/lib/mysql" dizinini nfs share alanına bind edecektir. 
- db servisi konteyerı başlatırken wordpressin bağlanacağı veritabanını oluşturmak için environment variable ları kullanacaktır. 
- wordpress servisi base-network üzerinde ayağı kalkacaktır. 

Yukarıda belirtilen işlemleri aşağıda gösterilen yaml dosyası ile tanımlıyoruz.

wordpress.yml:
--------------------------------------------------------------------------------------------------------------------------

#wordpress application
version: "3.8"
services:
  wordpress:
    image: wordpress:latest
    depends_on:
      - db
    volumes:
      - /mnt/docker-swarm/wordpress/:/var/www/html/wp-content
    deploy:
      mode: global   #konteynerlerin tüm hostlarda oluşmasını sağlar
    ports: 80:80
    environment:
      - WORDPRESS_DB_NAME=wordpress
      - WORDPRESS_DB_USER=test-user
      - WORDPRESS_DB_PASSWORD=test-passwd
      - WORDPRESS_DB_HOST=db:3306
      - WORDPRESS_TABLE_PREFIX=first-site
    networks:
      base-network:

  db:
    image: mysql:5
    deploy:
      placement:
        constraints:
          - "node.role==manager"    # mysql konteynerini swarm manager node üzerinde çalıştırır.
    environment:
      - MYSQL_ROOT_PASSWORD=test-passwd-root
      - MYSQL_ALLOW_EMPTY_PASSWORD=no
      - MYSQL_USER=test-user
      - MYSQL_PASSWORD=test-passwd
      - MYSQL_DATABASE=wordpress
    volumes:
      - /mnt/docker-swarm/mysql:/var/lib/mysql
    networks:
      base-network:
--------------------------------------------------------------------------------------------------------------------------
Yukarıda gösterilen dosya hazırlandıktan sonra aşağıdaki komut ile wordpress uygulaması deploy edilir.

~# docker stack deploy -c wordpress.yml WORDPRESS_APP

Komut çalıştırıldan bir süre sonra wordpress uygulaması ayağı kalkmış olur  ve tarayıcıdan docker hostlarının herhangi birisinin ip adresi ve 80. portu girilerek wordpress kurulum safyasına ulaşılabilir. Siteye tüm hostlardan erişilebilmesi overlay networkü sayesinde gerçekleşmektedir. Örneğin wordpress konteynıru sadece tek bir hostta (192.168.1.101) tanımlanmış olsaydı dahi yine diğer sunucu ip adresleri yazılarak wordpress uygulamasına erişilebilir olurdu. 

Bu makalede docker-swarm üzerinde wordpress uygulamasının nasıl deploy edileceği anlatılmıştır. Bir sonraki  yazıda mimarinin eksiklikleri değerlendirilecek ve sonrasında traefik cloud-native load balancer ile bu eksiklikler tamamlanmaya çalışılacaktır. 


Yararlanılan Kaynaklar:










17 Mayıs 2020 Pazar

Bulut İçin Linux İmajları Oluşturma ve Deploy Etme (2)

Merhaba. Bir önceki makalede "cloud-init" yöntemi ile KVM üzerinde CentOS deployment örneği yapılmıştı. Bu makalede ise Ubuntu 18.04 sürümünün KVM üzerinde aynı metot ile nasıl deploy edildiği anlatılacaktır.

Öncelikle Ubuntu 18.04 cluod imajı https://cloud-images.ubuntu.com/ adresinden download edilir. Ubuntu 18.04 Bionic kurulumu yapacağımızdan indirme linkimiz aşağıdaki gibi olacaktır.

~# wget https://cloud-images.ubuntu.com/bionic/20200507/bionic-server-cloudimg-amd64.img

Diskin boyutunu yeniden belirliyoruz.

~#qemu-img resize bionic-server-cloudimg-amd64.img 30G

Daha sonra bir önceki makalede de bahsettiğimiz user-data, meta-data, network-config dosyalarını konfigüre ediyoruz.

meta-data:
--------------------------------------------------------------------------------------------------------------------------
instance-id: ubuntu01
local-hostname: ubuntu01
--------------------------------------------------------------------------------------------------------------------------
network-config
--------------------------------------------------------------------------------------------------------------------------
version: 2
ethernets:
  eth0:
    dhcp4: false
    addresses:
      - 192.168.1.101/24
    gateway4: 192.168.1.1
    nameservers:
      search: [omer.com, bar.local]
      addresses: [8.8.8.8, 4.4.4.4]
--------------------------------------------------------------------------------------------------------------------------
user-data:
--------------------------------------------------------------------------------------------------------------------------
#cloud-config
password: Parola01
chpasswd: {expire: False}
ssh_pwauth: True
sudo: ["ALL=(ALL) NOPASSWD:ALL"]
timezone: Europe/Istanbul
ssh_authorized_keys:
  - ssh-rsa [ssh public key]
#apt paket yöneticisinin birincil olarak tr.archive.ubuntu adresini kullnamasını istiyoruz.
apt:
  primary:
    - arches: [default]
      uri: http://tr.archive.ubuntu.com/ubuntu/
runcmd:
  - systemctl disable cloud-config.service
  - systemctl disable cloud-final.service
  - systemctl disable cloud-init-local.service
  - systemctl disable cloud-init.service
  - localectl set-keymap trq
--------------------------------------------------------------------------------------------------------------------------
Konfigüre ettiğimiz dosyaları kullanarak işletim sistemini boot edeceğimiz "ubuntu.iso" dosyasını oluşturuyoruz.

~#genisoimage -output ubuntu.iso -volid cidata -joliet -rock user-data meta-data network-config

Son olarak virt-install komutu ile indirmiş olduğumuz qcow2 formatındaki ubuntu OS diskini işletim sistemi diski, oluşturulan "ubuntu.iso" kalıp dosyasını ise bootable media olarak  cdroma bağlayıp sanal makine özellikleri verilerek başlatılır.

~#virt-install --import --name ubuntu01 --memory 2048 --vcpus 2 --disk bionic-server-cloudimg-amd64.img,format=qcow2,bus=virtio --cdrom=ubuntu.iso --network bridge=br0 --graphics vnc  &


İşletim sistemi ayağı kalkarken cloud-init servisler ile istediğimiz şekilde konfigüre edilmiş olacaktır. Kurulum aşamaları log kayıtlarının incelenmesi için https://omerurhan.blogspot.com/2020/05/bulut-icin-linux-imajlar-olusturma-ve.html makalesinde anlatılan servislerin loglarına aşağıdaki komutlar ile ulaşılabilmektedir.

~# journalctl -u cloud-init-local.service
~# journalctl -u cloud-init.service
~# journalctl -u cloud-config.service
~# journalctl -u cloud-final.service


Ayrıca sorun çözme aşamalarında yardımcı olacak olan cloud-init servislerinin ne tür ayar dosyalarını meyadana getirdiğini "/run/cloud-init" dizini altında gözlemleyebilirsiniz.

Son tahlilde cloud-init servislerini kullanarak hemen hemen tüm cloud platformlarında çok kısa sürede istediğiniz konfigürasyonda işletim sistemi ayaklandırabilirisiz. İyi çalışmalar.

Yararlanılan kaynaklar:
[1] https://cloudinit.readthedocs.io/en/latest/



7 Mayıs 2020 Perşembe

Bulut İçin Linux İmajları Oluşturma ve Deploy Etme (1)

Merhaba. Bu yazıda günümüz "cloud-computing" teknolojilerinin de kullandığı yöntem olan cloud-init yöntemi ile linux işletim sistemi deploy etmeyi açıklayacağız. Cloud-init yazılımı ile hemen hemen tüm public cloud platformlarında ve bazı private cloud platformlarında (KVM, OpenStack, LXD, Bare metal installs) çok kısa sürede tüm büyük linux dağıtımları ayağı kaldırılabilmektedir. Peki nasıl?

Öncelikle cloud-init servislerinin çalışma mantığından bahsedeceğiz. Cloud-init servisleri işletim sisteminin boot edilmesi esnasında çalıştırılmaktadır. Böylece kurulumunu yapacağınız işletim sistemini ilk boot esnasında konfigüre etmenizi sağlar. Bu servislerin çalıştırılabilmesi için öncelikle cloud tabanlı işletim sistemi imajlarını kullanıyor olmanız gerekmektedir. Örneğin Ubuntu veya CentOS işletim sistemi kuracaksanız, işletim sistemi imajlarınızı https://cloud-images.ubuntu.com/ - https://cloud.centos.org/centos/ adreslerinden indirmelisiniz. İndirmiş olduğunuz imaj dosyaları içerisinde cloud-init servisleri bulunmaktadır. Cloud-init servisleri çalıştığında çeşitli kaynaklardan verileri okuyarak konfigürsayonları gerçekleştiriler. Örneğin veriler dosyadan okunacak ise yaml formatında üç farklı dosya oluşturulabilir:

    - meta-data        : instance-id,  hostname gibi makineye ait bilgiler
    - user-data         : Kullanıcı adı, parola, ssh public anahtarları, işletim sisteminde kurulması istenen paketler vb. ayarların yapıldığı dosyadır.
    - network-config : Ağ ayarlarının yapıldığı dosyadır. 

Bu aşamada işletim sistemi boot edilirken sırası ile aşağıdaki cloud-init servisleri çalışmaktadır.

1- Generator: Bu hizmet ile boot başlatıldığında systemd boot hedeflerinin içinde cloud-init hedefi yer alıyorsa -varsayılanda yer almaktadır- cloud-init servisi başlatılır. Yalnızca aşağıdaki durumlarda cloud-init servisleri çalıştırılmaz.
    - /etc/cloud/cloud-init.disabled dosyası mevcut ise,
    - kernel komut satırında cloud-init=disabled ifadesi yer alıyor ise.
2- Local: cloud-init-local.service servisi tarafından kontrol edilir. "/" kök dosya sistemi mount edilir edilmez çalışmaya başlamaktadır. Lokal "data-source" kaynaklarını bulur ve data-source kaynaklarını okuyarak ağ konfigürasyonlarını gerçekleştirir. (Data-source  bulunan deploy ortamına bağlı olarak değişmekle birlikte bizim yapacağımız örnekte meta-data ve network-config dosyaları olacaktır.)
3- Network: cloud-init.service servisi tarafından kontrol edilir. Local adımından sonra çalıştırılır. Bu adım çalıştırılmadan önce makine ağ ayarlarını almış ve "interface"ler "up" duruma gelmiştir. Bu aşamada disk_setup ve mounts modulleri çalışarak mount pointler, partitionlar yönetilir veya diskler formatlanır. Ayrıca bootcmd gibi ön yükleme adımları nu aşamada çalıştırılır. 
4- Config: cloud-config.service servisi tarafından kontrol edilir. Network adımından sonra çalıştırılır ve config modullerini çalıştırır. Örneğin password, timezone, runcmd  modüller. Bu aşamada kullanıcı adı, parola, ssh public anahtarları, işletim sisteminde kurulması istenen paketler vb. ayarlar yapılmaktadır.
5- Final: cloud-final.service servisi tarafından kontrol edilir. Son olarak bu adım çalıştırılır. Klasik olarak rc.local altındaki uygulamalar ile aynı zamanda çalışmaktadır. Bu aşama paket yükleme, configration managemet pluginlerinin yüklenmesi, shell scriptlerinin (user-data ile gelen) çalıştırılması gibi işlemlerin yapılma aşamasıdır.


Cloud-init servislerini ve çalışma süreçlerini anlattıktan sonra örnek üzerinden deployment sürecini izleyellim. Örnekte platform olarak KVM private cloud ortamını kullanılacaktır. Kısa sürede linux imajı oluşturup, oluşturulan bu imajı KVM hipervizörü üzerinde deploy edeceğiz. Bu çalışmada linux dağıtımlarından CentOS ve Ubuntu için yapılacak olan işlem adımları ayrı ayrı anlatılacaktır. 

"cloud-init" yöntemi olarak da bilinen bu yöntemde öncelikle temel işletim sistemi imajı resmi sayfasından indirilir. Bu imaj işletim sisteminin yalın ve sade hali ile gelmektedir. CentOS işletim sistemi için https://cloud.centos.org/centos/ adresine girilerek kurulacak işletim sistemi sürümü seçilir (bu çalışmada CentOS 8 sürümünü deploy edeceğiz.) ve listelenen imajlardan "qcow2" uzantılı "GenericCloud" disk seçilir ve indirilir. 

~]# wget https://cloud.centos.org/centos/8/x86_64/images/CentOS-8-GenericCloud-8.1.1911-20200113.3.x86_64.qcow2 

meta-data, user-data, network-script dosyaları yml dosyası formatında oluşturulur. Bu örnekte deploy edeceğimiz işletim sisteminin docker uygulaması ile birlikte statik ip adresi alarak ayağa kalmasını istiyoruz. Bu sebeple aşağıda gösterilen dosyalar hazırlanır.

meta-data:
--------------------------------------------------------------------------------------------------------------------------
# cloud-metadata dosyası

instance-id: centos01

local-hostname: centos01


--------------------------------------------------------------------------------------------------------------------------
network-config:
--------------------------------------------------------------------------------------------------------------------------
version: 2
ethernets:
  eth0:
    dhcp4: false
    addresses:
      - 192.168.1.104/24
    gateway4: 192.168.1.1
    nameservers:
      search: [omer.com, bar.local]
      addresses: [8.8.8.8, 4.4.4.4]
--------------------------------------------------------------------------------------------------------------------------

user-data:
--------------------------------------------------------------------------------------------------------------------------
#cloud-config
password: "sizin parolanız"
chpasswd: {expire: False}
ssh_pwauth: True
sudo: ["ALL=(ALL) NOPASSWD:ALL"]
timezone: Europe/Istanbul
ssh_authorized_keys:
  - ssh-rsa  "public-key"
# runcmd bölümüne  deploy etttiğiniz işletim sistemi ayağa kalktıktan sonra çalıştıracağınız komutları yazabilirsiniz. Zira sunucu boot olduktan ve systemd ile servisler başlatıldıktan sonra bu #bölüm çalıştırılır.
runcmd:
# Kurulum sonrası tüm cloud servisler disable edilerek sunucunun sonraki açılışlarında bu servislerin çalışmasının önüne geçilir.
  - systemctl disable cloud-config.service
  - systemctl disable cloud-final.service
  - systemctl disable cloud-init-local.service
  - systemctl disable cloud-init.service
# keymap seçilir.
  - localectl set-keymap trq
# docker uygulaması için gerekli olan paket kurulumları 
  - yum install -y yum-utils
  - yum install vim-enhanced -y
  - dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
  - dnf install docker-ce --nobest -y
  - dnf install curl -y
# docker-compose kurulumu
  - curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  - systemctl start docker
  - systemctl enable docker
  - usermod -a -G docker centos
  - chmod +x /usr/local/bin/docker-compose
--------------------------------------------------------------------------------------------------------------------------
user-data, meta-data dosyaları oluşturulduktan sonra işletim sisteminin açılışta boot edileceği iso dosyası bu üç dosya kullanılarak oluşturulur. Böylece işletim sistemi ayağı kalkarken "data-source" olarak iso dosyası okuyup konfigürsayonları buradan çekecektir. Bu aşamada "genisoimage" yazılımı kullanılarak bu üç ayar dosyası iso kalıp dosyasının içine aktarılır.

~]# genisoimage -output centos.iso -volid cidata -joliet -rock user-data meta-data network-config 

Yukarıda çalıştırılan komut ile "centos.iso" adında bir imaj kalıp dosyası oluşturulmuş olacaktır. İşletim sistemini KVM üzerinde deploy etmeden önce indirmiş olduğumuz centos GenericCloud diskinin kapsitesini değiştirebilirsiniz. Varsayalında 10G olarak gelen bu diski "qemu-img" yazılımı ile düzenleyebilirsiniz. Bu örnekte disk kapasitesini 30G olarak güncelleyeceğiz. Ayrıca indirdiğimiz disk üzerinde düzenleme yapmadan önce bu diski kopyalayıp değişiklikleri kopyaladığımız disk üzerinde yapacağız.

~]# sudo cp CentOS-8-GenericCloud-8.1.1911-20200113.3.x86_64.qcow2 centos.img
~]# qemu-img resize centos.img  30g

Son olarak KVM üzerinde komut satırı ile sanal makine kurulumu yapmamıızı sağlayan "virt-install" yazılımı ile hazırlamış olduğumuz işletim sistemini aşağıdaki komut ile deploy edeceğiz. 

~]# virt-install --import --name centos --memory 2048 --vcpus 4 --disk centos.img,format=qcow2,bus=virtio --cdrom=centos.iso --network bridge=br0 --graphics vnc  &

Komutun çalışmasını müteakip işletim sistemi KVM üzerinde ayağı kalkacak ve cloud-init servisleri sırası ile çalışarak işletim sisteminin yapılandıracaktır. Bu yöntem ile ön hazırlığını yaparak çok kısa bir süre içerisinde işletim sistemlerini deploy edebilme imkanı kazanmış olacaksınız. Bir sonraki yazıda Ubuntu işletim sisteminin KVM üzerinde "cloud-init" metodu kullanılarak deploy edilmesini inceleyeceğiz.

Yararlanılan kaynaklar:
[1] Linux Bible Ninth Edition
[2] https://cloudinit.readthedocs.io/en/latest/

7 Şubat 2014 Cuma

OSI Referans Modeli ve Güvenlik

Aşağıdaki link ile ulaşılabilen bu dokumanda aşağıda belirtilen konu başlıkları ele alınmıştır. Tüm konular giriş düzeyinde ve basit olarak anlatılmaya çalışılmıştır.

  • OSI referans modeli ve katmanları
  • TCP/IP protokol yığını ve çekirdek protokolleri
  • Ara Bağlantı Cihazları
  • TCP/IP Protokollerinin güvenlik açısından incelenmesi
  • Uygulama katmanı üzerindeki güvenlik sistemlerinin değerlendirilmesi

https://docs.google.com/document/d/1tbOD8R2lpcH_YwGI6gzGdmPfUarwkUh8Dn1L6Gf45PU/pub

Umarım faydalı bir dokuman olmuştur.

1 Ocak 2014 Çarşamba

HPING 2

Hping ile bir cok uygulama gerceklestirilebilmektedir. Bunlardan bir önceki yazıda bahsedilmişti. Bu uygulamaları kısaca özetleyecek olursak
  • Bilgisayar ağlarını keşif, gelişmiş port tarama özellikleri
  • Firewall tespit ve test işlemleri
  • Ağ dinleme modu
  • Dosya transferi 
  • Komut çalıştırma özelliği
  • IDS/IPS sistemlerin keşfi
Bu yazıda bu uygulamalardan bir kısmı gerçekleştirilecektir. İlk  olarak host ve işletim sistemi keşfi gerçekleştirilecektir. icmp protokolü için kullanıalcak olan mesaj tipleri aşağıda belirtildiği gibidir.


Öncelikli olarak IP adresi bilinen hedef sistemin canlı olup olmadığını anlamak için icmp echo request (ping) mesajı gönderilecektir.


Yukarıda gösterildiği gibi gönderilen mesaja karşılık icmp echo reply cevabı alınmıştır. Buda hostun ayakta olduğu anlamına gelmektedir. Şimdi hedef hostun işletim sistemini keşif amaçlı icmp paketleri hazırlalım. ICMP ile işletim sistemi keşfi aktif ve pasif olmak üzere ikiye ayrılmaktadır. Aktif tarama aşağıda gösterilen akış diyagramları üzerinden, pasif tarama ise icmp paketlerinin incelenmesi ile gerçekleştirilmektedir. Bu safhada aktif keşif yöntemini göstereceğiz. Aşağıda gösterilen şekiller linux ve windows sistemler için aktif tarama diyagramını göstermektedir.
                                                        

Şimdi sistemin linux mu yoksa farklı bir işletim sistemi olduğunu anlamak için icmp timestamp mesajı gönderiyoruz. timestamp mesajı hedef sistemin zaman bilgisini timestamp request mesajıyla talep eder. Hedef sistem şayet yanıtlarsa timestamp reply mesajı ile kendi zaman bilgisini gönderir.



Yukarıda gözüktüğü gibi sistem yanıt olarak timestamp reply mesajını göndermiştir. Bu mesaj aşağıda gösterilmektedir.



Zaman bilgisinin paylaşılması farklı zafiyetlere sebep olabilir. CVE-1999-0524' de bu durum anlatılmıştır. Burada bir sonraki adım olan information request mesajını gönderiyor.


Gönderdiğimiz bu mesaja karşılık her hangi bir yanıt alamıyoruz. Bir sonraki adım olan icmp address mask mesajını hazırlayıp gönderiyoruz.


Görüldüğü gibi herhangi bir yanıt alamadık. Böylelikle akış diyagramını tamamlayıp işletim sisteminin linux kernel 2.x.x versiyonuna sahip olduğu bilgisini elde ediyoruz.

Hedef sisteme yönelik keşif çalışmaları port taralamaları ile devam ediyoruz. Burada port taramaları için tarama(-- scan) modunu kullanabiliriz. Bunun yanında manuel olarakta gönderip aldığımız paketlere göre portların açık mı kapalı mı olduğuna karar verebiliriz. İlk olarak tarama modu ile port taraması yapalım.


Yukarıda TCP SYN taraması gerçekleştirilmiştir. Burada hping syn bayrağı set edilmiş tcp paketlerini hedefin 1- 65535 portlarına göndermektedir. Dönen yanıtları kontrol eden hping tcp üçlü el sıkışmanın ikinci fazını oluşturan syn+ack paketini gördüğünde portun açık olduğuna karar verir ve bunu ekrana basar. Kapalı olan diğer tüm portlar için rst+ack cevabı alan hping bu portları kapalı olarak gösterecektir. Yukarıda belirtilen taramaları manuel olarakta yapıp yorumlayabiliriz. Burada hedef sistemin kullanmış olduğu bir firewallu tespit etmek adına manuel tarama daha faydalı olacaktır.
Bunu açıklayacak olursak normal şartlar altında kapalı olan bir port syn paketine yanıt olarak geriye rst+ack mesajını döndürecektir. Fakat firewall ile belirlenen portlar kapatıldığı zaman, kapatılan portlar için geriye herhangi bir yanıt dönmez ve burada hping kullanıcısı hedef sistemin bir firewall tarafından korunduğunu anlar. Örneğin firewalldan yalnızca 21, 53, 80, 110, 143,  portlarına gelen bağlantıların kabul edilmesi geriye kalan diğer tüm bağlantıların kapatılması gibi bir kural koyulduğu zaman hping üzerinden gerçekleştirilen manuel taramada sonuçlar aşağıdaki gibi olacaktır.

   
Burada verilen komut ile 1. porttan başlayarak tüm portlar için syn bayrağı set edilmiş tcp paketi gönderilir. Görüldüğü gibi yalnızca firewalldan izin verilen portlar için syn ve ack bayrakları set edilmiş(flags=SA) paketler gönderilmiştir. Açık olmayan portlar için herhangi bir yanıt gönderilmemiştir. Firewall ile korunmayan bir sistem ise genel olarak açık olmayan portlar için rst+ack ile yanıt vermektedir. Bu durum ise aşağıda gösterilmiştir.



Yukarıdada görüldüğü gibi açık olan 22. port için syn+ack onun dışındaki tüm portlar için  rst+ack dönerilmiştir. Bu noktada görüldüğü gibi firewall yöneticisinin tanımladığı kurallar firewallun tespitini kolaylaştırmakta veya zorlaştırmaktadır. Örneğin kapalı portlar için istekleri rst+ack ile yanıtla gibi bir kural yazıldığında hedef sistemde firewall var mı yok mu anlamak oldukça güçleşmektedir.

Son olarak UDP portlarını kontrol için hping aracının nasıl kullanıldığından bahsedelim. UDP bağlantısız bir protokol olduğu için UDP portlarının açık mı yoksa kapalı mı olduğunu anlamak daha zordur. Bu aşamada hedef UDP portları için gönderilen paketlere karşılık geriye bir icmp port unreachable mesajı geliyorsa bu o portun kapalı olduğu anlamına gelmektedir. Fakat geriye bir udp paketi dönerse veya herhangi bir hata mesajı dönmezse bu o portun açık olduğu anlamına gelmektedir.
Aşağıda bu durum gösterilmiştir.


Yukarıda 123 numaralı port için gönderilen isteğe herhangi bir  hata mesajı dönmemiştir. Bu o portun açık olduğu anlamına gelir. 124 numaralı port ise port ICMP port unreachable hatası döndürerek kapalı olduğu göstermiştir.

Hping ile gerçekleştirebilecek uygulamaların bir kısmı bu yazıda anlatılmaya çalışıldı. Kullanan kişinin kabiliyetine göre hping aracı çok önemli bir bilgi edinme aracına dönüşebilir. Böylelikle hping yazı dizisi tamamlanmış bulunmakta.

Yararlanılan Kaynaklar

[1] http://www.bilgiguvenligi.gov.tr/sizma-testleri/icmp-kesif-reconnaissance-saldirilari-ii.html
[2] http://en.wikipedia.org/wiki/Internet_Control_Message_Protocol





28 Aralık 2013 Cumartesi

HPING 1

Hping, komut satırı tabanlı TCP/IP paketlerini oluşturmaya ve analiz etmeye yarayan, Salvatore Sanfilippo tarafından yayınlanan açık kaynak kodlu bir araçtır. Bu aracı http://www.hping.org/ adresinden indirebilir ve hakkında ayrıntılı bilgi edinebilirsiniz.

Hping aracı, size istediğiniz özelliklerde TCP/IP paketleri üretmeniz konusunda yardımcı olmaktadır. Özel olarak ürettiğiniz bu paketler ile güvenlik denetimlerinde bulunabilirsiniz. Kullanım alanlarını sayacak olursak:
  • Bilgisayar ağlarını keşif, gelişmiş port tarama özellikleri
  • Firewall tespit ve test işlemleri
  • Ağ dinleme modu
  • Dosya transferi 
  • Komut çalıştırma özelliği
  • IDS/IPS sistemlerin keşfi
gibi alanlardir.
Çalışma mekanizmasına bakılacak olursa, hedef sisteme dair elde edilmek istenen bilgi doğrultusunda TCP/IP paketleri oluşturulur ve oluşturulan bu paketler hedef sisteme gönderilir. Hedef sistemin bu pakete göstermiş olduğu reaksiyon analiz edilir ve bu analiz sonucunda hedef sisteme dair bilgi veya bilgiler elde edilmiş olur. Bu mekanizma aşağıda gösterilen örnek ile açıklanmaya çalışılmıştır.

Bu örnekte hedef host olan 192.168.2.250 ip adresine sahip makinenin canlı olup olmadığı bilgisi elde edilmeye çalışılmaktadır. Bu bilginin elde edilebilmesi için bir adet sorgulama mesajına ihtiyaç duymaktayız. Aradığımız bu sorgu mesajı için ICMP protokolü bünyesinde bulunan echo request sorgu mesajını kullanabilir. Hedef sisteme ICMP protokolü ile echo request mesajı atılır  ve sistemin bize vereceği yanıt değerlendirilerek elde edilmeye çalışılan bilgi edinilebilir. Bu noktada hpinge ihtiyaç duyulmaktadır. Aşağıda verilen komut ile bu paket hazırlanır ve gönderilir.


Bu aşamada Komutla ilgili parametreler göz ardı edilmelidir. Önemli olan hazırlanan paket ile karşı sistemden bir reaksiyon almaktır ve bu reaksiyon sonucunda bilgiye ulaşmaktır. Aşağıda hedef sistemin göstermiş olduğu reaksiyon gözükmektedir.


Görüldüğü üzere hedef sistem gönderdiğimiz 4 numaralı pakete karşılık 5 numaralı ICMP echo reply ile cevap vermiştir. Bu mesaj yorumlandığında hedef sistemin canlı olduğu sonucuna ulaşılacaktır. Hping ile alakalı olarak gerçekleştirilebilecek tüm uygulamalar temel olarak yukarıda bahsedilen prensipler çerçevesinde cereyan etmektedir. Kısaca hedef sistem icin paket hazırlanıp gonderilir ve gerceklesecek olan reaksiyon yorumlanır.

Hpingin kullanım şekli ise aşağıda gösterilmiştir.

Kullanımı: hping3 [host] [seçenekler]

Bu kullanımın yanı sıra yalnızca hping3 yazılarak hping aracının komut satırına düşülerek manuel olarak istenilen paketler hazırlanabilir. Bu konuya bir sonraki yazıda değinilecektir.

Hping aracını etkin bir şekilde kullanabilmek için programa gönderilecek olan parametrelere tam olarak hakim olmak gerekmektedir. Aşağıda bu parametreler niteliklerine göre bölümlere ayrılıp anlatılmaktadır.

- h        :   Yardım seçeneklerini görüntüle.
- c        :   Oluşturulup gönderilecek paket sayısı.
- i         :   Aralık, (-uX, X burada mikrosaniye (10–6) cinsinden bir değerdir.)

Yukarıda gösterilen -i parametresini açıklayacak olursak;
hping3  173.194.40.211 -i u100000 denildiği zaman; bir paket hazırlanıp gönderilir ve gönderilecek diğer paket için 100000 µs süresince bekleme yapılır. Ardışık olarak gönderilen paketlerin her biri için bu aralık korunur.

-- flood : Oluşturulabilecek en hızlı şekilde paketleri oluştur ve gönder.
- I          : Paketlerin yönlendirileceği ağ arayüzü

Yukarıdaki anlatılan parametreler aşağıdaki örnek ile gerçeklenmiş ve gösterilmiştir.


Yukarıda verilen komut ile 0.1 saniye aralıklarla 5 adet paket üretilmiştir ve wlan0 arayüzünden iletilmiştir. Aşağıdaki ekran görüntüsünde time sütununa bakıldığında bu durum gözükmektedir.4 numaralı paket referans alınarak time sekmesi altında belirttiğimiz zaman aralıkları ile paket iletildiğini görmekteyiz.


Hping için birçok çalışma modu mevcuttur.

- 0 -- rawip  : Ham ip paketleri oluşturma. (IP+ETHERNET)
- 1 -- icmp    : ICMP paketleri oluşturma. (ICMP + IP + ETHERNET)
- 2 -- udp     : UDP paketleri oluşturma. (UDP + IP + ETHERNET)
- 8 -- scan    : Tarama modu.
- 9 -- listen   : Dinleme modu.

Yapılmak istenen işleme göre tarama modu seçilmelidir. Hping varsayılan olarak TCP modunda çalışmaktaktadır. Aşağıdaki örnekte bu parametreler gösterilmiştir.


Yukarıdaki komut ile hedef için UDP paketleri hazırlanıp gönderilmiştir.


Hping içerisindeki diğer bir bölüm ise IP protokolü için ayrılmıştır. Bu bölümde belirlenen parametrelerin tümü IP başlığı içerisindeki özel alanlardan oluşmaktadır. Bu parametrelerden birkaç tanesi aşağıda gösterilmiştir.

- a                     : Kaynak ip adresini belirle
-- rand-source  : Rastgele kaynak ip belirle.
-- rand-dest      : Rastgele hedef ip belirle.
- t --ttl               : ttl değerini belirle. 
- o --tos             : tos (type of service) alanını belirle.
- y  --dontfrag   : Don't fragment alanını belirle.

Aşağıdaki örnekte bu parametrelerin kullanımı gösterilmektedir.


Yukarıdaki komut ile kaynak adresleri spooflanmış, tt değeri 25 olarak belirlenmiş ve dont fragment bayrağı set edilmiş 4 adet ip paketi hedefe gönderilmiştir. Bu paketler aşağıda gösterilmektedir.


Hping içerisindeki diğer bir bölüm ise ICMP paketlerinin oluşturulduğu bölümdür. Bu bölümde kullanılacak olan parametrelerin bir kısmı aşağıda gösterilmiştir. 

- C  --icmptype : ICMP mesaj tipi (varsayılan echo request)
- K  --icmpcode : ICMP kodu. (Varsayılan 0)
-- icmp-help      : Diğer tüm mesaj tipleri için parametreleri görüntüle.

Sonraki bolum ise TCP/UDP protokollerini hazırlamak için kullanılan parametrelerden oluşmaktadır. Bu bölüm ile istenilen özelliklerde TCP veya UDP segmentleri oluşturulabilmektedir. Aşağıda bu parametrelerin birkaç tanesi gösterilmiştir.

- s  -- baseport     : Kaynak port adresi.
- p  -- destport     : Hedef port adresi.
- F/S/R/P/A/U/X/Y  : TCP bayraklarını set etme özelliği.
- w  -- win             : Windows size alanını set et.
- M                        : Sıra numarasını belirle.
- L                         : Ack numarasını belirle.

Aşağıda gösterilen örnekte yukarıdaki parametreler kullanılarak istenilen özelliklerde TCP paketi oluşturulmuş ve gönderilmiştir.


Bu paketi aşağıda gösterilmektedir.


Son bölümde ise ethernet çerçevesine yönelik genel parametreler tanımlanmıştır.

   - d -- data           : Pakete yerleştirilecek veri boyutu.
- E -- file              : Dosyadan okunacak veri.
- T -- traceroute : Traceroute modu.
- B  -- safe           : Dosya transferi sırasında güvenli protokolleri kullan.

Bu yazıda hpingin ne olduğu, nasıl çalıştığı, parametrelerinin ne işe yaradığı nasıl kullanılacağı anlatılmıştır. Bir sonraki yazıda hping ile gerçekleştirlebilecek uygulamalar anlatılacaktır.