Контроль доступа на основе атрибутов в структуре 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? Если да, я хотел бы получить известие от вас.