Контроль доступа на основе атрибутов в структуре Hyperledger

Выполняя некоторую работу с POC, мы путаемся между Ethereum и Hyperledger Fabric. В соответствии с нашим требованием мы используем ткань Hyperledger. Причины, по которым мы выбрали ткань Hyperledger:

  • Это блокчейн с частным разрешением.
  • Производительность, масштабируемость и уровень доверия хороши для Fabric.
  • Структура Hyperledger имеет модульную архитектуру с поддержкой подключаемых компонентов.
  • Частный канал, который помогает нам хранить личные данные между двумя организациями.

С какой проблемой мы столкнулись?

Когда мы регистрируем пользователя на сервере Fabric-ca, мы назначаем ему разные роли (клиент, партнер и администратор). В configtx.yaml мы указали правило доступа пользователей. Ниже приведен фрагмент кода из configtx.yaml.

Policies:
  Readers:
     Type: Signature
     Rule: “OR(‘Org1MSP.admin’, ‘Org1MSP.peer’, rg1MSP.client’)”
  Writers:
     Type: Signature
     Rule: “OR(‘Org1MSP.admin’, ‘Org1MSP.client’)”
  Admins:
     Type: Signature
     Rule: “OR(‘Org1MSP.admin’)”

Когда мы развернули сеть и зарегистрировали пользователя с разными ролями, мы обнаружили, что эти роли не работают так, как мы ожидали. Мы запросили запрос в сообществе Hyperledger Fabric, и член сообщества предложил нам использовать контроль доступа на основе атрибутов. Возникает вопрос: что такое контроль доступа на основе атрибутов?

Контроль доступа на основе атрибутов:

В системе управления доступом на основе атрибутов для определения доступа используются атрибуты любого типа, такие как атрибуты пользователя и атрибуты ресурсов. Эти атрибуты сравниваются с определенными статическими значениями или даже с другими атрибутами, что превращает его в управление доступом на основе отношений. Атрибуты представлены парами «ключ-значение», такими как «Роль = Супервизор», которые можно использовать для ограничения доступа к определенной функции системы. В этом случае доступ к этой функции или системе может быть предоставлен только пользователям с назначением супервизора или выше.

Реализация:

Мы использовали узел SDK фабрики для связи с узлом фабрики Hyperledger и чейнкодом. Мы использовали node.js для написания чейнкодов.

Код на стороне сервера (узел):

Перед выполнением любых транзакций в сети Hyperledger нам необходимо зарегистрироваться, а затем зарегистрировать пользователя. Чтобы узнать больше о функции регистрация, обратитесь к документации Hyperledger Node SDK. Ниже приведен фрагмент кода для регистрации пользователя:

fabric_ca_client.register({ enrollmentID: username, affiliation: ‘org1.department1’, role: ‘client’, attrs: [{ name: ‘firstName’, value: ‘Mathan_sir’, ecert: true }] }, admin_user);

Мы добавили attrs: [{name: ‘firstName’, value: ‘Mathan_sir’, ecert: true}] как дополнительную часть в функции регистрации. Здесь вы можете указать ключ-значение для нового атрибута. Это может быть что угодно.

После успешной регистрации пользователя нам необходимо зарегистрировать указанного выше пользователя. Чтобы узнать больше о функции enroll, обратитесь к документации Hyperledger Node SDK. Ниже приведен фрагмент кода для регистрации пользователя:

fabric_ca_client.enroll({ enrollmentID: username, enrollmentSecret: secret, attr_reqs: [{ name: “firstName”, optional: false }]});

Мы добавили attr_reqs: [{name: «firstName», необязательно: false}] как дополнительную часть в функцию регистрации. Помните, что при регистрации вы должны указать ту же пару ключ-значение, которую вы использовали при регистрации пользователя.

Код цепочки:

Теперь мы можем использовать указанные выше атрибуты определения в цепном коде, чтобы обеспечить доступ к определенным функциям цепного кода. Просто добавьте код ниже в свой цепной код, и все готово.

Импортировать библиотеку:

const ClientIdentity = require(‘fabric-shim’).ClientIdentity;

Добавьте приведенный ниже код в функцию, в которой вы хотите ограничить доступ для пользователя:

let cid = new ClientIdentity(stub);
if (cid.assertAttributeValue(‘firstName’, ‘Mathan_sir’)) {
  throw new Error(‘Not a valid user’);
}

Я надеюсь, что приведенная выше статья поможет вам реализовать доступ на уровне пользователя в Hyperledger Fabric. Вы можете обобщить приведенный выше код для разных типов пользователей. Есть ли другой способ реализовать доступ на уровне пользователя в Hyperledger Fabric? Если да, я хотел бы получить известие от вас.