kamer.dev

Hyperledger Composer ile Uygulama Geliştirme — 3. Erişim Kontrol Dosyası (.acl)

- #blockchain - #hyperledger

Gereklilikler

Serinin önceki yazılarını okuduysanız ekstra bir gerekliliğe ihtiyaç yoktur. Elimden geldiğince yeni başlayan insanlara hitap edecek şekilde açıklamaya çalışıyorum.

1. Giriş

Merhaba. Model dosyasını oluşturmayı ve modelleme dilini öğrendikten sonra sırada erişim kontrol dosyası (access control file, .acl) var. Öncelikli bu dosyaya neden ihtiyaç duyduğumuzu açıklamakta fayda var. Bunun için blokzinciri temellerine dönüp izinli ve izinsiz blokzincirlerin farkını anlamamız lazım. Deniz Özgür’ün Türkçeye kazandırıp Hyperledger’a Giriş adıyla yayınladığı resmi dokümanda bu farka dair şu kelimeler geçiyor:

Çoğu kripto para birimi, herkesin katılabileceği ve kullanmak için tam haklara sahip olduğu izinsiz blok zinciri kullanır. Örneğin herkes Bitcoin veya Ether’ı satın alabilir, çünkü bunlar açık, izinsiz teknolojilerdir.

Öte yandan, işletmeler izinli blok zincirler kullanma eğilimindedir. Bu, bir kişinin blok zincirinde belirli eylemleri gerçekleştirmek için belirli gereksinimleri yerine getirmesi gerektiği anlamına gelir. Bazı izin verilen blok zincirleri, önceden kimliklerini belirtmiş ve onaylatmış kişilere bile erişimi kısıtlayabilirler. Diğerleri herkesin katılmasına izin verir, ancak yalnızca güvenilir kimliklerin blok zincirindeki işlemleri doğrulamasına izin verirler.

Yukarıdaki tanımlar ışığında erişim kontrol dosyası gerekliliğini daha rahat açıklayabiliriz. Örneğin, bir tedarik zincirini Hyperledger ile tasarladığınızı düşünün. Bu zincir üzerinde isteyen herkesin işlem yapabiliyor olması saçma olurdu değil mi? Hatta birçok senaryoda bu zincirin herkes tarafından görülmesi de yanlış bir kullanım şekli olabilir. Dolayısıyla belirli bir kullanıcıya veya kullanıcı grubuna tanımlanmış özel yetkiler olmalı. Erişim kontrol dosyası bize bu yeteneği kazandıran dosyadır. Kendine ait anlaşılması basit bir söz dizimi(syntax) vardır. Yine yazımın giriş kısmını sağlam temellere oturtmak için resmi dokümandaki tanımı irdelemek istiyorum. Resmi dokümanda ACL hakkında aşağıdaki cümle yer alıyor.

By defining ACL rules you can determine which users/roles are permitted to create, read, update or delete elements in a business network’s domain model.

  • by defining ACL rules: .acl dosyasını oluştururken yaptığımız şey bir takım kurallar oluşturmaktır.
  • which users/roles are permitted to create, read, update, or delete elements: Buradaki ifade gayet açık ve net. ACL kurallarının içeriği, kullanıcıların ve kullanıcıların ait olduğu rollerin yapabilecekleri CRUD işlemlerinin(oluşturma, okuma, güncelleme ve silme) kapsamını belirleyecek şekilde olmalı.
  • in a business network’s domain model: Bir önceki yazıyı okuduysanız bu ifade sizin için yabancı bir şey değil. Composer modelleme dili kullanarak oluşturduğumuz modele domain model demiştik. Yani ağ üzerinde tüm kaynakların tanımlandığı model. Oluşturduğumuz kurallar da bu kaynaklar üzerinde olacaktır elbette.

Bu dosya projenin kök dizininde permissions.acl adıyla bulunur. Eğer bu dosyayı oluşturmazsanız tüm yetkiler serbest olur.

2. Sistem Erişim Kuralları Belirlemek

Daha önce bahsettiğim üzere sistem varlıkları org.hyperledger.composer.system.cto adresinde bulunuyor. Sistem Erişim Kurallarına örnek olarak ağ erişimini verebiliriz. system.cto dosyasında aşağıdaki satırlar mevcut:

asset Network identified by networkId {
  o String networkId
  o String runtimeVersion
}

Ağ kuralı belirlemek için ise aşağıdaki satırları yazıyoruz.

rule AgErisimYetkisi {
  description: "Yöneticiler ağ komutlarına erişebilir."
  participant: "org.hyperledgertr.proje.Yonetici"
  operation: ALL
  resource: "org.hyperledger.composer.system.Network"
  action: ALLOW
}

Yukarıdaki kural üzerinden söz dizimini inceleyelim. İlk satırda kuralımızın adını giriyoruz. Description kısmında kuralın açıklamasını giriyoruz. Participant kısmında kuralı uyguladığımız katılımcı ya da katılımcı grubunu seçiyoruz. Operation’da hangi işlemleri uygulayabileceğini seçiyoruz. Resource, participant kısmında seçtiğimiz katılımcının/katılımcı grubunun erişebileceği/erişemeyeceği kaynakları belirttiğimiz kısım. Action’da ise kuralın türünü seçiyoruz. Burada ALLOW diyerek izin vermişiz. DENY seçeneği ile bu erişimi engelleyebilirdik. Eğer ağdaki tüm kaynaklara erişim vermek istersek de org.hyperledger.composer.system.* yazabiliriz. Sisteme ait diğer yetkilere ulaşmak için system.cto dosyasına veya resmi dokümandaki tabloya bakabilirsiniz.

3. Koşullu Erişim Kuralları

Yukarıda sistem erişim kuralları tanımlarken dokümanda “simple ACL rule” olarak geçen basit bir kural tanımlaması yaptık. Diğer bir yöntem ise bu kuralı bazı koşullara dayandırmak. Henüz kendim kullanmadığım için doğrudan dokümanda yer alan örneği paylaşıyorum.

rule SampleConditionalRule {
  description: "Description of the ACL rule"
  participant(m): "org.example.SampleParticipant"
  operation: ALL
  resource(v): "org.example.SampleAsset"
  condition: (v.owner.getIdentifier() == m.getIdentifier())
  action: ALLOW
}

Gördüğünüz üzere bu kuralda katılımcı için m, kaynak için ise v değişkeni seçilmiş ve condition kısmında boolean tipinde değer döndüren birJavaScript koşulu yazılmış. Bu kurala göre SampleAsset adındaki varlıklara yalnızca sahiplerinin erişim yetkisi bulunmakta.

rule SampleConditionalRuleWithTransaction {
  description: "Description of the ACL rule"
  participant(m): "org.example.SampleParticipant"
  operation: READ, CREATE, UPDATE
  resource(v): "org.example.SampleAsset"
  transaction(tx): "org.example.SampleTransaction"
  condition: (v.owner.getIdentifier() == m.getIdentifier())
  action: ALLOW
}

Bu da resource, participant ve transaction içeren örnek bir kural.

4. Kural Alanlarının Ayrıntılı Açıklaması

Operation: Kuralın geçerli olduğu eylemi belirtir. 5 değer alabilir. CREATE, READ, UPDATE, DELETE, ALL. Birden dazla eylem varsa aralarında virgül kullanarak belirtilir.

Participant: İşlemi gerçekleştirecek olan kişi veya kurumu belirtir.

Transaction: Katılımcının belirtilen kural dahilinde gerçekleştirebileceği işlemi ifade eder.

Condition: Boolean değer döndüren bir JavaScript ifadesi alan condition alanı, kuralları şarta bağlamak için kullanılır. JavaScript’te if(...) içine yazılabilecek her şeyi değer olarak alabilir.

Action: İki değer alabilir, ALLOW ve DENY. Kural, bu alana bağlı olarak kapsamını daraltır.

Giriş seviyesinde, Hyperledger Composer.acl dosyasına dair söyleyebileceklerim bundan ibaret. Bu konuyu daha iyi anlamak için örnek .acl dosyalarına göz atmak faydalı olabilir.


Kaynak: Hyperledger Composer Resmi Dokümanı