Bu makalede7 bölüm
- Teknoloji
- Modbus TCP, S7comm, S7comm-plus, ISO-on-TCP (RFC 1006), DPI, Suricata
- Konu
- Endüstriyel protokollerde işlev kodu bazlı firewall kuralı yazımı
- Seviye
- İleri
- Ön koşullar
- Modbus TCP ve Siemens S7 haberleşmesine aşinalık
- Firewall kural yönetimi deneyimi
Bir PLC’ye TCP 502 veya TCP 102 üzerinden erişim veren kural, o PLC’den veri okumaya da, PLC’nin programını değiştirmeye de aynı anda izin verir. Port açıksa her şey açıktır. Endüstriyel firewall’lardaki derin paket inceleme (DPI), bu ayrımı protokolün içine bakarak yapar. Aşağıda Modbus TCP ve Siemens S7 haberleşmesinde işlev bazlı kural mantığını, örnek kural tablosunu, sahada en çok yanlış yazılan adres dönüşümünü ve kuralları üretimi durdurmadan zorlama moduna almanın sırasını anlatıyoruz.
Port tabanlı kuralların endüstriyel protokollerdeki sınırı
Kurumsal ağda “HTTPS’e izin ver” kuralının arkasında uygulama katmanında başka kontroller vardır. Endüstriyel protokollerde çoğu zaman kimlik doğrulama yoktur. Modbus TCP’de TCP bağlantısını kuran istemci register yazabilir; klasik S7comm’da da (PLC’de koruma seviyesi ayarlanmamışsa) bağlantıyı kuran taraf CPU’yu durdurma komutu gönderebilir. Bu yüzden endüstriyel ağ ve OT altyapısında asıl soru “kim bağlanabilir” değil, “bağlanan ne yapabilir” sorusudur.
Port tabanlı kuralın tipik açığı şu: SCADA sunucusunun okuma yapması için açılan 502 kuralı, o sunucu ele geçirilirse saldırganın setpoint yazmasına da izin verir. DPI ile kural okuma işlev kodlarını serbest bırakır, yazmaları ise belirli register aralıklarına ve belirli kaynaklara bağlar. DPI kuralının nereye konacağı (hücre önü, zon sınırı) ayrı bir karardır; hücre seviyesinde firewall yerleşimi yazısında işleniyor.
Modbus TCP’de function code ve register filtreleme
Modbus TCP çerçevesi 7 baytlık MBAP başlığından (transaction ID, protocol ID = 0, length, unit ID) ve ardından gelen PDU’dan oluşur. PDU’nun ilk baytı function code’dur; okuma ile yazmayı bu kod ayırır:
| Function code | İşlev | Sınıf |
|---|---|---|
| 01 / 02 | Read Coils / Read Discrete Inputs | Okuma |
| 03 / 04 | Read Holding / Input Registers | Okuma |
| 05 / 06 | Write Single Coil / Register | Yazma |
| 15 (0x0F) / 16 (0x10) | Write Multiple Coils / Registers | Yazma |
| 22 (0x16) | Mask Write Register | Yazma |
| 23 (0x17) | Read/Write Multiple Registers | Okuma + yazma |
| 43 (0x2B) / MEI 14 | Read Device Identification | Teşhis |
İşe yarayan bir Modbus DPI politikası üç boyutta filtreler: function code, adres aralığı (başlangıç adresi + adet) ve unit ID. Unit ID, Modbus TCP–RTU gateway arkasındaki seri cihazları ayırt eder; gateway önündeki kurallarda bu alanı atlarsanız tek kural arkadaki bütün slave’leri açar. Konu Modbus RTU’dan Modbus TCP’ye geçiş yazısında ayrıntılı.
Kural yazarken sahada takılınan noktalar:
- FC 23 tek istekte hem okur hem yazar. “Okumaya izin ver” politikası 23’ü kapsamamalı; gerekiyorsa yazma tarafındaki adres aralığı da denetlenir.
- Adres aralığı kontrolü başlangıç adresiyle yetinmez, adet alanını da hesaba katar. 100. register’dan başlayıp 50 register yazan istek, 100–149 aralığının tamamına dokunur.
- Kullanıcı tanımlı ve tanımsız kodlar (65–72, 100–110 aralıkları kullanıcı tanımlıdır) varsayılan olarak reddedilir. Bazı ürünler bu aralıkları üreticiye özgü işlevler için kullanır; envanterde görmediyseniz izin vermeyin.
- Reddetme davranışı: Firewall paketi düşürdüğünde istemci zaman aşımına düşer; bazı ürünler bunun yerine Modbus exception yanıtı (function code + 0x80) üretir. HMI’nin zaman aşımında bağlantıyı yeniden kurma davranışı, alarm ve log gürültüsünü doğrudan belirler. Bir reddedilen yazma, HMI’de art arda gelen “haberleşme hatası” alarmlarına dönüşebilir.
S7comm’da işlev bazlı filtreleme
Klasik S7comm, ISO-on-TCP (RFC 1006) üzerinden TCP 102’de taşınır; COTP katmanının üstünde protokol kimliği 0x32 olan S7 başlığı gelir. Başlıktaki ROSCTR alanı mesaj tipini (Job, Ack_Data, Userdata), parametre bölümündeki işlev kodu ise işlemi belirler:
| S7 işlev kodu | İşlem | Risk |
|---|---|---|
| 0xF0 | Setup Communication | Bağlantı kurulumu, gerekli |
| 0x04 | Read Var | Düşük |
| 0x05 | Write Var | Orta–yüksek (değişken yazma) |
| 0x1A–0x1C | Request Download / Download Block / Download Ended | Yüksek (program yükleme) |
| 0x1D–0x1F | Start Upload / Upload / End Upload | Orta (program okuma) |
| 0x28 | PI Service (ör. CPU başlatma) | Yüksek |
| 0x29 | PLC Stop | Yüksek |
Userdata mesajları (ROSCTR 7) blok listeleme, SZL okuma ve teşhis işlevlerini taşır; mühendislik yazılımı ve teşhis araçları bunları yoğun kullanır. Bunları körlemesine kapatırsanız online teşhis ekranları boş gelir. Politikanın tipik biçimi şöyle: SCADA ve veri toplama sunucularına yalnız Setup Communication, Read Var ve gerekiyorsa sınırlı Write Var; download, PI Service ve PLC Stop yalnız mühendislik istasyonuna ve tercihen yalnız bakım penceresinde.
Veri toplamada hangi erişim yönteminin (PUT/GET, OPC UA, diğerleri) seçildiği DPI kuralını doğrudan belirler; seçenekler S7 PLC’den veri okuma yöntemleri yazısında karşılaştırılıyor.
Örnek kural tablosu: okuma serbest, yazma kısıtlı
Aşağıdaki tablo bir paketleme hattı için örnek politika taslağıdır. Adresler ve aralıklar örnektir; kendi register haritanızdan türetin.
| Kaynak | Hedef | İzin verilen işlev | Kısıt |
|---|---|---|---|
| SCADA sunucusu | Hat PLC’leri (Modbus) | FC 01–04 | Tüm adresler |
| Operatör HMI | Hat PLC’leri (Modbus) | FC 06, 16 | Holding 40100–40199 (setpoint bloğu; protokol adresi 99–198) |
| Veri toplama gateway’i | S7-300/400 PLC | 0xF0, 0x04 | Yalnız okuma |
| Mühendislik istasyonu | S7-300/400 PLC | Tüm işlevler | Bakım penceresinde, loglu |
| Herhangi | Herhangi PLC | Diğer tüm işlevler | Reddet ve logla |
Ticari endüstriyel firewall’ların çoğu bu politikayı grafik arayüzle tanımlar. Açık kaynak tarafta Suricata, Modbus ayrıştırıcısı etkinleştirildiğinde (suricata.yaml’da app-layer.protocols.modbus.enabled: yes) işlev ve erişim tipine göre kural yazdırır. Öğrenme aşamasında izleme amaçlı kullanmak için uygundur:
alert modbus !$SCADA_HMI any -> $HAT_PLC 502 (msg:"Modbus yazma - yetkisiz kaynak"; modbus: access write; sid:1000101; rev:1;)
alert modbus any any -> $HAT_PLC 502 (msg:"Modbus Diagnostics FC08"; modbus: function 8; sid:1000102; rev:1;)
alert modbus $SCADA_HMI any -> $HAT_PLC 502 (msg:"Setpoint blogu altina yazma"; modbus: access write holding, address <99; sid:1000103; rev:1;)
alert modbus $SCADA_HMI any -> $HAT_PLC 502 (msg:"Setpoint blogu ustune yazma"; modbus: access write holding, address >198; sid:1000104; rev:1;)
Değişken adları ($SCADA_HMI, $HAT_PLC) suricata.yaml’daki adres gruplarında tanımlanır. Son iki kuraldaki adres, protokoldeki sıfır tabanlı register adresidir: 4xxxx gösteriminde 40001 protokol adresi 0’a karşılık gelir, yani 40100–40199 bloğu 99–198 aralığıdır. Sahada yanlış kuralın en yaygın nedeni bu bir kaymadır. Ayrıca kuralın yalnız başlangıç adresini mi, yoksa başlangıç + adet ile oluşan aralığın tamamını mı değerlendirdiğini kendi sürümünüzde test trafiğiyle doğrulayın; blok sınırını aşan çoklu yazmalar (FC 16) ancak ikinci durumda yakalanır. Test etmeden güvenmeyin.
Öğrenme modundan zorlama moduna geçiş
DPI kurallarını doğrudan engelleme modunda devreye almak, gözden kaçmış meşru bir işlevin hattı durdurması demektir. Sıra şöyle:
- Pasif gözlem: Firewall’u (veya SPAN üzerinden bir sensörü) yalnız loglayacak şekilde çalıştırın. Süre en az bir tam üretim döngüsünü kapsamalı: vardiya değişimi, reçete geçişi, haftalık temizlik, ay sonu raporu.
- Envanter çıkarma: Her kaynak–hedef çifti için görülen function code ve adres aralıklarını tabloya dökün. Beklenmeyen her yazmayı süreç mühendisiyle tek tek konuşun.
- Politika taslağı: Gözlenen trafiği “gerekli”, “gereksiz”, “açıklanamayan” diye ayırın. İzin listesine yalnız “gerekli” olanlar girer.
- Uyarı modu: Politikayı uygulayın ama ihlalleri yalnız loglayın. Birkaç hafta boyunca beklenmeyen ihlal kalmayana kadar bu modda kalın.
- Kademeli zorlama: Önce en riskli işlevleri (PLC Stop, download, kullanıcı tanımlı kodlar) engelleyin; yazma kısıtlarını hücre hücre devreye alın.
- Geri dönüş: Her adımda politikayı tek işlemle uyarı moduna döndürme yöntemini ve bunu yapmaya yetkili kişiyi önceden yazın. Gece vardiyasında kimi arayacağınız belli olsun.
Pasif izleme ve anomali tespitinin güvenlik operasyonu tarafı OT saldırı tespiti ve protokol anomali izleme rehberinde.
Gecikme, yanlış blok ve bakım etkileri
Gecikme: DPI, paketin uygulama katmanında yeniden birleştirilip incelenmesini gerektirir. Modbus/S7 sorgu–yanıt trafiği için ek gecikme genellikle tolere edilir; ama yük altındaki gecikmeyi üreticinin veri sayfasından okumayın, kendi trafik profilinizle ölçün. PROFINET RT gibi Layer 2 çevrimsel trafiği DPI firewall’dan geçirmek zaten tasarım hatasıdır. O trafik hücrede kalır.
Yanlış blok: Sahada en sık gördüğümüz üç neden var: firmware güncellemesinden sonra HMI’nin farklı bir function code kullanmaya başlaması (ör. tek tek yazma yerine FC 16), yalnız ayda bir çalışan reçete indirmenin gözlemde hiç görülmemesi ve TCP segmentlerine bölünmüş isteklerin ayrıştırılamaması. Arıza anında ilk bakılacak yer firewall’un deny logudur, PLC değil. Her firmware veya HMI projesi değişikliği DPI politikası için bir değişiklik talebi doğurmalıdır.
Bakım: Mühendislik istasyonuna tam yetki veren kuralı kalıcı açık bırakmak, DPI’nın en değerli kısmını iptal eder. Bu kuralı zaman tabanlı yapın ya da bakım öncesi onaylı bir değişiklikle açın. Kural tabanını PLC programı ve register haritasıyla birlikte sürümlü saklayın.
Modbus’ın resmi tanımları için Modbus Organization spesifikasyon sayfası, Suricata kural sözdizimi için Suricata Modbus anahtar kelimesi dokümanı birincil kaynaktır. Register haritası çıkarma ve politika tasarımında nasıl çalıştığımızı OT siber güvenlik ve segmentasyon ile PLC haberleşmesi ve entegrasyonu sayfalarımızda bulabilirsiniz.
Sık sorulan sorular
Endüstriyel DPI firewall yerine normal NGFW kullanılabilir mi?
Kullanılabilir, ama önce bakılacak şey şu: NGFW Modbus ve S7’yi yalnız tanıyor mu, yoksa function code, adres aralığı ve unit ID düzeyinde kural yazdırıyor mu? Bazı kurumsal NGFW’ler endüstriyel imza paketleriyle bu ayrıntıyı sunar; bazıları yalnız uygulama tanıma yapar.
Modbus’ta yazmayı tamamen kapatırsam ne olur?
HMI’den girilen setpoint, reçete ve komut butonları çalışmaz; hepsi Modbus yazma işlevleriyle taşınır. Doğru yaklaşım yazmayı kapatmak değil, yalnız HMI ve SCADA gibi yetkili kaynaklara ve yalnız tanımlı register aralıklarına izin vermektir.
S7-1500 PLC’lerde DPI ne kadar etkili?
TIA Portal ile kullanılan S7comm-plus bütünlük korumalı olduğu için birçok firewall bu trafikte klasik S7comm kadar ayrıntılı işlev filtrelemesi yapamaz. Bu serilerde DPI’ya ek olarak PLC’nin kendi erişim koruma seviyeleri, kapalı tutulan PUT/GET ve tek bir yetkili istasyona sınırlanmış mühendislik erişimi birlikte uygulanır.
Öğrenme modunda ne kadar süre kalmak gerekir?
Sabit bir süre yok. Gözlem süresi üretimdeki tüm periyodik işleri kapsamalı: vardiya değişimleri, reçete geçişleri, haftalık bakım ve ay sonu işlemleri. Ayda bir çalışan bir işlev gözlemde görülmezse, zorlama modunda yanlış blok olarak karşınıza çıkar.
- Teknoloji
- Modbus TCP, S7comm, S7comm-plus, ISO-on-TCP (RFC 1006), DPI, Suricata
- Konu
- Endüstriyel protokollerde işlev kodu bazlı firewall kuralı yazımı
- Seviye
- İleri
- Ön koşullar
- Modbus TCP ve Siemens S7 haberleşmesine aşinalık
- Firewall kural yönetimi deneyimi
OT Güvenliği ve Segmentasyon