Kümeleme Algoritmaları — K-Means ile Davranış Gruplandırma
K-Means algoritması veriyi k adet kümeye ayırır. SOC'ta kullanıcı ve cihaz davranışlarını gruplandırarak anormal kümeleri tespit etmek için kullanılır. Temel uygulama: import pandas as pd from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler X = df[['bytes_in','bytes_out','unique_dst_ports','session_count','failed_logins']] kmeans = KMeans(n_clusters=4, init='k-means++', n_init=10, random_state=42) print(df.groupby('cluster')[['bytes_out','unique_dst_ports','failed_logins']].mean())
Giris ve Temel Akis
K-Means algoritması veriyi k adet kümeye ayırır. SOC'ta kullanıcı ve cihaz davranışlarını gruplandırarak anormal kümeleri tespit etmek için kullanılır. Temel uygulama: import pandas as pd from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler X = df[['bytes_in','bytes_out','unique_dst_ports','session_count','failed_logins']] kmeans = KMeans(n_clusters=4, init='k-means++', n_init=10, random_state=42) print(df.groupby('cluster')[['bytes_out','unique_dst_ports','failed_logins']].mean())
Bu bölümün pratik akışı şu sırayla ilerler:
- X = df[['bytes_in','bytes_out','unique_dst_ports','failed_logins']]
- scaler = StandardScaler()
- X_scaled = scaler.fit_transform(X)
- kmeans = KMeans(n_clusters=4, init='k-means++', random_state=42)
- df['cluster'] = kmeans.fit_predict(X_scaled)
- print(df.groupby('cluster')[['bytes_out','failed_logins']].mean())
Temel Kavram Eslesmeleri
K-Means küme sayısını önceden belirlemeyi gerektirir. Elbow yöntemi ve Silhouette skoru optimal k değerini bulmak için kullanılan iki temel tekniktir. Örnek çıktı: k=2: silhouette=0.41 k=3: silhouette=0.58 k=4: silhouette=0.71 ← optimal k=5: silhouette=0.63 k=6: silhouette=0.59 Silhouette skoru 1'e yaklaştıkça kümeler daha iyi ayrışmış demektir.
- Elbow yöntemi: WCSS eğrisindeki dirsek noktası optimal k'yı gösterir
- Silhouette skoru: Küme içi uyum ve kümeler arası ayrışmayı ölçer
- k-means++: Başlangıç centroid seçimini optimize eder
- n_init: Farklı başlangıç noktasıyla tekrar sayısını belirler
Ilk Cekirdek Kavram
Bu bölümde öne çıkan çekirdek kavram inertia_ olarak verilir. Elbow yöntemi WCSS (Within-Cluster Sum of Squares) değerinin k'ya göre değişimini inceler. Eğrinin dirsek yaptığı nokta optimal küme sayısını gösterir: from sklearn.cluster import KMeans import numpy as np wcss = [] for k in range(2, 11): kmeans = KMeans(n_clusters=k, init='k-means++', random_state=42) kmeans.fit(X_scaled) wcss.append(kmeans.inertia_) print('WCSS değerleri:', wcss) diffs = np.diff(wcss) print('Azalma hızı:', diffs) kmeans.inertia_ özelliği modelin WCSS değerini döner.
Arac, Komut veya Inceleme Akisi
SOC'ta kullanıcı davranış kümeleme UEBA'nın temelidir. Her kullanıcı için haftalık davranış profili çıkarılır ve kümeler analiz edilir: import pandas as pd from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler user_profile = df.groupby('username').agg( avg_bytes_out=('bytes_out', 'mean'), avg_session_dur=('duration', 'mean'), unique_hosts=('dst_ip', 'nunique'), off_hours_ratio=('is_off_hours', 'mean'), failed_login_rate=('failed_login', 'mean') ).reset_index()
Bu bölümün pratik akışı şu sırayla ilerler:
- user_profile = df.groupby('username').agg(...).reset_index()
- X = user_profile.drop('username', axis=1)
- X_scaled = StandardScaler().fit_transform(X)
- user_profile['cluster'] = KMeans(n_clusters=5, random_state=42).fit_predict(X_scaled)
- suspicious = user_profile[user_profile['cluster'] == user_profile.groupby('cluster').size().idxmin()]
Kanit ve Bilesen Iliskileri
K-Means kümeleme sonuçlarının SOC bağlamında yorumlanması kritiktir. Her küme farklı bir kullanıcı davranış profilini temsil edebilir. Örnek küme profilleri: - Küme 0: düşük bytes_out, düşük unique_hosts → normal ofis kullanıcısı - Küme 1: yüksek bytes_out, yüksek unique_hosts → geliştirici/admin - Küme 2: yüksek off_hours_ratio, yüksek failed_login → şüpheli - Küme 3: çok yüksek bytes_out, tek dst_ip → veri sızıntısı adayı
- Yüksek off_hours + yüksek failed_login: Brute force veya credential stuffing
- Yüksek bytes_out + tek dst_ip: Veri exfiltration adayı
- Yüksek unique_hosts + normal bytes: Lateral movement veya keşif aktivitesi
- Ani küme değişimi: Hesap ele geçirme veya davranış anomalisi
Ikincil Odak Noktasi
Bu bölümde öne çıkan çekirdek kavram None olarak verilir. Hiyerarşik kümeleme (Agglomerative Clustering) K-Means'e alternatif olarak SOC'ta kullanılır. K sayısı önceden belirlenmek zorunda değildir ve dendrogram ile görselleştirilir: from sklearn.cluster import AgglomerativeClustering from scipy.cluster.hierarchy import dendrogram, linkage import numpy as np linked = linkage(X_scaled, method='ward') model = AgglomerativeClustering(n_clusters=None, distance_threshold=5, linkage='ward') df['cluster'] = model.fit_predict(X_scaled) print(f'Otomatik belirlenen küme sayısı: {model.n_clusters_}') ward metodu küme içi varyansı minimize eder.
Operasyonel Dogrulama ve Raporlama
Splunk MLTK ile K-Means kümeleme ve anomali skorlama doğrudan SPL içinde yapılır: | stats avg(bytes_out) as avg_bytes, avg(duration) as avg_dur, dc(dst_ip) as unique_dst, sum(eval(if(failed_login=1,1,0))) as fail_count by src_ip | fit KMeans avg_bytes avg_dur unique_dst fail_count k=5 INTO user_behavior_model
Bu bölümün pratik akışı şu sırayla ilerler:
- index=network earliest=-7d
- | stats avg(bytes_out) as avg_bytes, dc(dst_ip) as unique_dst by src_ip
- | fit KMeans avg_bytes avg_dur unique_dst fail_count k=5 INTO user_behavior_model
- | eval is_suspicious=if(cluster=4 AND avg_bytes>1000000, 1, 0)
- | where is_suspicious=1
- | table src_ip, avg_bytes, unique_dst, fail_count, cluster
- | sort -avg_bytes
Cikti ve Kullanım Amaci
K-Means algoritmasının SOC ortamında kullanımında karşılaşılan teknik sınırlamalar model tasarımını etkiler. Bu sınırlamaları bilerek alternatif yaklaşımlar geliştirilmelidir. Örnek: K-Means Öklid mesafesi kullandığı için kategorik değişkenleri (protocol, action gibi) doğrudan işleyemez. Bu durumda one-hot encoding veya Gower mesafesi kullanılmalıdır.
- Kategorik değişken desteği yok: One-hot encoding veya Gower mesafesi kullan
- Küre şekli varsayımı: DBSCAN veya GMM ile değiştir
- Aykırı değere duyarlılık: K-Medoids veya önceden outlier temizleme
- K sayısı önceden bilinmeli: Elbow veya Silhouette ile optimal k bul
Son Kavram ve Cikis
Bu bölümde öne çıkan çekirdek kavram score_samples olarak verilir. Gaussian Mixture Model (GMM) K-Means'e göre daha esnek bir kümeleme yöntemidir. Her veri noktasına sert küme ataması yerine olasılık skoru verir ve SOC'ta risk skorlamasında kullanılır: from sklearn.mixture import GaussianMixture import pandas as pd import numpy as np gmm = GaussianMixture(n_components=5, covariance_type='full', random_state=42) gmm.fit(X_scaled) df['cluster'] = gmm.predict(X_scaled) df['anomaly_prob'] = gmm.score_samples(X_scaled) df['anomaly_prob'] = np.exp(df['anomaly_prob']) suspicious = df[df['anomaly_prob'] < df['anomaly_prob'].quantile(0.01)] print(f'En düşük olasılıklı {len(suspicious)} kayıt tespit edildi')
Bu Egitimden Ne Kazanirsiniz?
Bu icerik, Kümeleme Algoritmaları — K-Means ile Davranış Gruplandırma konusunu SOC L3 - İleri Tehdit Avcılığı - Veri Madenciliği ve Modelleme baglaminda parcali degil, butunlu bir ogrenme akisina donusturur. Yalnizca kavramlari ezberlemek yerine surec sirasini, bilesenler arasi iliskiyi ve hangi kanitin neden onemli oldugunu kavramayi hedefler.
Ozet
Bu ders kapsaminda one cikan basliklar: Elbow yöntemi, Silhouette skoru, k-means++, n_init, Yüksek off_hours + yüksek failed_login, Yüksek bytes_out + tek dst_ip, Yüksek unique_hosts + normal bytes, Ani küme değişimi, Kategorik değişken desteği yok, Küre şekli varsayımı. Egitimin mantigi; once temel akis kurmak, sonra eslestirme ve kavram netlestirme yapmak, en sonda ise bulguyu operasyonel bir sonuca baglamaktir.