Veri Bilimi ile Saldırı Tespiti

Bu yazımda sunuculara brute force attack ve sql injection gibi yöntemler ile sızmaya çalışan kullanıcıları tespit etmek için kullandığım yöntemi sizinle paylaşacağım.

Bu yöntem sayesinde sunucu güvenliğini arttırıp aylık olarak bana atanmış bandwidth’ten tasaruf edebiliyorum. En önemlisi ise sunucunun sürekli ataklara cevap vermesini engelleyip gerçek isteklere cevap verme süresini arttırıyorum.

Öncelikle bu saldırıları anlamak için Python ile sunucunun log dosyalarını okuyup veritabanına kaydeden bir script hazırladım. Bu script sayesinde logları istediğim şekilde parse edip anlamlı hale getirebiliyorum.

Veritabanına kaydettiğim logları Metabase uygulamasını kullanarak görselleştiriyorum.

Aşağıdaki görselde sunucuya gelen isteklerin sayısını görebilirsiniz. Bu görsel 15 günlük trafiği göstermektedir.

tüm trafik

Bu görselde tüm trafik gösterilmektedir. Görüldüğü üzere gece 12-01 arasında anormal bir artış görünmektedir. Tabi bu trafiğik normal olabilir. Anormal istekler trafiğin yüksek olduğu saatlerde olacak diye bir şey söz konusu değil. Günün o saatinde trafiği arttıracak reklam verilmiş olabilir. Anormal istekleri çektiğimizde bunu anlayacağız.

Anormal istekleri görüntülediğimizde aşağıdaki gibi bir grafik çıkmaktadır. Bu grafik sunucuya yapılan isteği ve bu isteğin sunucu tarafında bir karşılığı olmadığını göstermektedir.

anormal trafik

Gördüğünüz gibi 20:11 sularında toplamda anormal 700 istek gönderilmiş. Bu iki grafiği birleştirdiğimizde farklı zamanlarda atak yapıldığı sonucuna varabiliriz. (Her renk farklı günü göstermektedir) Atak yapılan zamanları aşağıdaki gibi işaretleye biliriz.

anormal sayılabilecek değerler

Bu da demek oluyor ki saldırı zamanı her gün bir önceki güne göre 1 er saat ileriye atılıyor.

Anormal isteklerli kullanıcı bazında görselleştirdiğimiz zaman aşağıdaki gibi bir grafik çıkmaktadır.

kullanıcı bazında anormal trafik

Gördüğünüz gibi ortalama 4 günde bir farklı iplerden ve 1 er saat öteleyerek sunucuya anormal istekler yapılıyor. Bir ip’yi ele aldığımızda yapılan istekler aşağıdaki gibidir. Bu konudaki çıkarımlarımız tutarlı olmuş oldu 🙂

anormal istekler

Ataklardan korunmak için kullandığım yöntemleri başka bir blog yazımda ele alacağım.

Bu tür analizleri firmalarda yapmaktayım. Eğer sizin de bu tür analizlere ihtiyacınız varsa (kesinlikle vardır 🙂 ) benimle iletişime geçebilirsiniz.

[Resolved]: Uncaught Error: Call to undefined function oci_connect()

Php ile oracle veritabanlarına bağlanmaya balıştığınızda aşağıdaki gibi bir hata alıyorsanız çözümü bu yazıda bulabilirsiniz.

<?php
$dbconn = pg_connect("host=localhost port=5432 dbname=testdb user=testusr password=12345");
Fatal error: Call to undefined function oci_connect() in /var/www/html/index.php on line 3

İlk olarak oracle download sayfasından ihtiyacınız olan client sürümünü indirebilirsiniz. Basic ve sdk paketini mutlaka indirmelisiniz. Diğer paketleri ihtiyacınız doğrultusunda indirebilirsiniz. Ben aşağıdaki tüm paketleri indirdim.

instantclient-basic-linux.x64-19.3.0.0.0dbru.zip
instantclient-sqlplus-linux.x64-19.3.0.0.0dbru.zip
instantclient-tools-linux.x64-19.3.0.0.0dbru.zip
instantclient-sdk-linux.x64-19.3.0.0.0dbru.zip
instantclient-jdbc-linux.x64-19.3.0.0.0dbru.zip
instantclient-odbc-linux.x64-19.3.0.0.0dbru.zip

İndirdiğiniz tüm paketleri /opt/oracle dizini altına çıkartın.

# mkdir /opt/oracle
# unzip instantclient-basic-linux.x64-19.3.0.0.0dbru.zip -d /opt/oracle/
# unzip instantclient-sqlplus-linux.x64-19.3.0.0.0dbru.zip -d /opt/oracle/
# unzip instantclient-tools-linux.x64-19.3.0.0.0dbru.zip -d /opt/oracle/
# unzip instantclient-sdk-linux.x64-19.3.0.0.0dbru.zip -d /opt/oracle/
# unzip instantclient-jdbc-linux.x64-19.3.0.0.0dbru.zip -d /opt/oracle/
# unzip instantclient-odbc-linux.x64-19.3.0.0.0dbru.zip -d /opt/oracle/
# ls /opt/oracle
instantclient_19_3
# mv instantclient_19_3 instantclient

Dizin yapısı yukarıdaki gibi olacaktır.

Eğer httpd kullanıyorsanız aşağıdaki dosyaların en altına ilgili komutları kopyalayın.

# cat /etc/sysconfig/httpd
LD_LIBRARY_PATH=/opt/oracle/instantclient
PATH=/opt/oracle/instantclient:$PATH
ORACLE_HOME=/opt/oracle/instantclient 
# cat /etc/bashrc
export LD_LIBRARY_PATH=/opt/oracle/instantclient
export PATH=/bin:/opt/oracle/instantclient:$PATH
export ORACLE_HOME=/opt/oracle/instantclien

Bu ayarlamaları yaptıktan sonra oci8 modülü kurulması gerekmektedir. Bu modülü pecl veya remi repository’i tanıtarak yum install şeklinde kurabilirsiniz. pecl ile aşağıdaki şekilde kurabilirsiniz.

# pecl download oci8
# tar -zxf oci8-1.4.10.tgz
# cd oci8-1.4.10

phpize ile paketi kurulum için hazırlamak gerekiyor. phpize kurulu değilse yum install phpize şeklinde kurabilirsiniz.

# phpize
# ./configure -with-oci8=shared,instantclient,/opt/oracle/instantclient
veya
# ./configure -with-oci8=shared,$ORACLE_HOME

Son aşama olarak paket kurulumunu aşağıdaki gibi gerçekleştirebilirsiniz.

# make install