GOOSE Protokolü Analizi

İngilizcesi Generic Object-Oriented Substation Event (GOOSE) olan Genel Nesneye Dayalı Trafo Merkezi Olayı (GOOSE) protokolü, IEC 61850 cihazları arasında elektrikli ekipmanların korunması gibi zaman açısından kritik olayların mesaj transferini uygular. GOOSE protokolü (Generic Object Oriented Substation Event)  yayıncı/abone(publisher/subscriber) tipi iletişim olarak tanımlanır. Bu protokol, Ethernet üzerinden bir Trafo Merkezindeki IED’ler ( IED – Akıllı Elektronik Cihaz ) arasında bilgi alışverişi için kullanılır.

IEC 61850 standardı iki grup iletişim hizmeti tanımlar: istemci-sunucu(server-client) modeli ve eşler arası(peer-to-peer) model. Eşler arası model, IED’ler arasında hızlı ve güvenilir iletişim gibi zaman açısından kritik faaliyetlerle ilişkili Genel Trafo Merkezi Etkinliği (Generic Substation Event (GSE)) hizmetleri için kullanılır. GSE servisleriyle ilişkili mesajlardan biri, LAN üzerinden yayın veya çok noktaya yayın mesajlarına izin veren GOOSE mesajlarıdır.

GOOSE protokolü olaya dayalı bir protokoldür. GOOSE iletişimi kavramı, yayıncının periyodik olarak mesaj göndermesi ve bir olay meydana geldiğinde (örn. bara kapalı…) yeni veriler içeren bir seri mesaj gönderir. Protokol, yayıncı / abone tabanlı olduğundan, gönderilen mesajın abone tarafından doğru bir şekilde alındığına dair bir onay yoktur, bu nedenle mesaj bombardımanında mesaj kaybı olasılığını en aza indirir.

GOOSE kritik mesajlarını 4ms gibi kısa bir zamanda göndermektedir. Bu zamanı network düğümleri, network toolojisi etkileyebilir. Bunun için enerji sektöründe yedekli ağ yapıları (PRP veya HSR) kullanılmaktadır.

PRP(Parallel Redundancy Protocol): Paralel Yedeklilik Protokolü Lan A ve Lan B gibi iki ayrı ağ üzerinden paket kopyalama yöntemiyle ağı yedeklemede kullanılır.

HSR(High-availability Seamless Redundancy): Yüksek Elverişli Sorunsuz Yedeklilik IT ağ topolojilerinde çokça kullanılan halka ağ yapısıyla yedeklilik sağlar.

Bu iki ağ topolojisi hakkında ayrıca bir yazıda bahsedeceğim.

Tüm mesajlar bir başlık altında yayınlanır. Abone, sistemden tüm mesajları alır, ancak sadece abone olunan konu içinde gönderilen mesajları filtreler ve ayrıştırır.

GOOSE protokolü yayıncı / abone tabanlı olduğundan, iletişim yalnızca yerel ağda (LAN) mümkündür.

GOOSE Mesaj Çerçevesi

GOOSE OSI modelinde 3.katmanında veri bağlantı katmanında yer alır. Ancak bazı durumlarda VLAN gibi kapsül(Encapsulation) protokoller araya girebilmektedir.

GOOSE Ethertype adresi 0x88b8’dir.

Uygulama katmanında, GOOSE mesajları ASN.1 gösterimi kullanılarak tanımlanır. GOOSE PDU aşağıdaki yapıya sahiptir.

ASN.1:Telekomünikasyon ve bilgisayar ağlarında, Abstract Syntax Notation One verilerin nasıl gösterildiği, kodlandığı, yollandığı, alındığı ve okunduğunu anlatmaya yarayan standart ama genişletilebilir bir dildir.

GOOSE APDU içerisinde bulunan öğelerin tanımlamaları:

  • GoCBRef – GOOSE kontrol bloğu başvurusu, GOOSE Control örneğinin benzersiz bir yol adıdır.  (GoCB)LLN0 içinde blok, biçim LDName / LLN0.GoCBName şeklindedir.  GEDeviceF650 / LLN0 $ GO $ gcb01 burada LD adı GEDeviceF650, LN sınıfı LLN0’dır (Mantıksal Düğüm
    Sıfır), işlevsel kısıtlama GO (GOOSE Control) ve GoCB örneği gcb01’dir.
  • Time Allowed to Live – SterNum özelliğinin artırıldığı zaman. Mesajın bir sonraki tekrarının ne kadar bekleyeceğini belirtir.
  • DatSet -İletilecek olan veri kümesinin referansları, üye değerleridir.  GEDeviceF650 / LLN0 $ GOOSE1. DataSet üyeleri benzersiz şekilde numaralandırılacaktır. Bu sayı, belirli bir üyenin MemberOffset’i olarak adlandırılır.  DataSet’in her üyesi benzersiz bir numaraya ve bir MemberReference’a sahiptir (fonksiyonel kısıtlama verileri FCD veya DataAttribute FCDA).
  • GoID- GOOSE ID, kullanıcının GOOSE için bir kimlik atamasına izin veren özelliktir. “F650_GOOSE1”
  • T(timestamp)- StNum özelliğinin artırıldığı zaman.
  • StNum(Status Number)- Her GOOSE mesajı gönderildiğinde ve DataSet tarafından belirtilen DataSet içinde bir değerde değişiklik tespit edildiğinde  artan bir sayaçtır. Başlangıç değeri 1 dir, 0 değeri ayrılmıştır.
  • SqNum- Raporların geçerli sıra numarasıdır. Bir GOOSE mesajı gönderildiğinde her seferinde bir artacaktır. StNum değişikliğini takiben SqNum sayacı 0 değerine ayarlanmalıdır. GoEna’nın TRUE’ya iletimi üzerine SqNum için başlangıç değeri 1’dir. Bu sayı TCP’de sıra numarasına benzerlik gösterir.
  • Simulation(test)- Mesaj bir simülasyon tarafından yayınlanmıştır ve geçen değerler gerçek değildir. GOOSE abonesi, simüle edilen değeri bildirir ve alıcı IED ayarlarına bağlı olarak gerçek mesaj yerine uygulamasına set eder.
  • ConfRev- Veri kümesinin bir üyesinn silinmesini, üyelerin yeniden sıralanmasını veya DataSet referasının değiştirilmesi gibi yapılandırma revizyonlarını içerir.
  • NdsCom – Mesajda bazı devreye almaların gerekli olduğunu belirtir (atama  gerekir). Eğer True ise , GoCB daha fazla yapılandırma gerektirir.
  • NumDatSetEntries – DataSet (veri kümesi) girdi sayısını gösterir. 
  • allData – GOOSE kontrol bloğunda  MMS NamedVariableList’in kullanıcı tanımlı bilgilerinin liste sayısını belirtir.

ÖNEMLİ!!!

  • timeAllowedtoLive ne kadar büyükse abonelerin iletişim hatası alma ihtimali o kadar büyüktür.
  • StNum ve SqNum izinsiz girişi (şifrelemesiz siber güvenlik) tespit etmek için kullanılabilir.

GOOSE yapısına örnek vermek gerekirse, gerçek bir SCADA trafiğinden dinlenen pcap dosyası json çıktısını gösterelim.

Pcap dosyası Wireshark, NetworkMiner, Winpcap gibi analiz yazılımlarının iletişim ağlarını dinleyerek kaydettiği dosya biçimidir. Json çıktısı almak için Wireshark’ın komut satırında kullanılan paket ayrıştırma yazılımıdır.

***Bu pcap dosyasına githup hesabında ICS_Pcaps deposundan ulaşabilirsiniz.

Tshark dan çıktı almak için örnek komut satırı;
$sudo tshark -r GOOSE.pcap -T json -w goose.json
"goose": {
"goose.appid": "0x00000001",
"goose.length": "144",
"goose.reserve1": "0x00000000",
"goose.reserve2": "0x00000000",
"goose.goosePdu_element": {
"goose.gocbRef": "GEDeviceF650/LLN0$GO$gcb01",
"goose.timeAllowedtoLive": "1000",
"goose.datSet": "GEDeviceF650/LLN0$GOOSE1",
"goose.goID": "F650_GOOSE1",
"goose.t": "Jan 2, 2000 02:47:29.927595853 UTC",
"goose.stNum": "1",
"goose.sqNum": "3",
"goose.test": "0",
"goose.confRev": "1",
"goose.ndsCom": "0",
"goose.numDatSetEntries": "8",
"goose.allData": "8",
"goose.allData_tree": { 
"goose.Data": "3",
"goose.Data_tree": {
"goose.boolean": "0"
},

GOOSE yapısı içerisinde geçen öğelerin veri tipleri;

Öğe AdıVeri TipiASN.1 ASN.1 Uzunluğu
goCBRefVisible String0x80variable
timeAllowedToLiveint32u0x815
datSetVisible String0x82variable
goIDVisible String0x83variable
TUTC Time0x848
stNumint32u0x855
sqNumint32u0x865
simulationBoolen0x871
confRevint32u0x885
ndsComBoolen0x891
numDatSetEntriesint32u0x8a5
allDataVeri Dizisi0xabvariable

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir