Постановка задачі: з міркувань безпеки, до bitcoin-ноди, розташованої на dev.marionette.dev, має забезпечуватись доступ лише з 2х серверів: dev.marionette.dev та demo.marionette.dev.
Для реалізації використовуються:
1. Налаштування мережевого файєрвола на Digital Ocean, де розташовані дроплети dev.marionette.dev та demo.marionette.dev
2. Налаштування docker-compose файла для біткоін-ноди на dev.marionette.dev
Примітка: додатково (не стосується bitcoin-ноди): для взаємодії середовища demo.marionette.dev (а саме сервіса BITCOIN-PI на цьому деплойменті) прописується внутрішня IP-адреса dev.marionette.dev в мережі VPC.
Реалізація
Внутрішня IP-адреса dev.marionette.dev в VPC - 10.116.0.3.
Внутрішня IP-адреса demo.marionette.dev в VPC - 10.116.0.9.
Створено наступні вхідні правила файервола, де додано порт 8332 лише для IP 10.116.0.9:
та застосовані до дроплета dev.marionette.dev:
Для деплоймента bitcoin-ноди на dev.marionette.dev, зроблено мапінг 8332 порта з docker-контейнера bitcoind на порт 8332 хоста. Оскільки docker-compose.yaml, застосований в складі Configurator, змінено темплейт cryptonodes.yaml.t шляхом додавання секції мапінга портів:
ports: - "{{rpcport}}:{{rpcport}}"
Після рендерінга на dev.marionette.dev отримано cryptonodes.yaml :
version: "3.7" services: blockchainRegistry: image: gitlab.tunex.io:5050/marionette-develop/backend:latest restart: always command: ./node_modules/.bin/moleculer-runner hostname: "blockchainRegistry" env_file: - ../config/database.env environment: SERVICES: services/blockchainRegistry LOGLEVEL: info bitcoind: image: gitlab.tunex.io:5050/marionette-stack/public/bitcoind24v restart: always user: root command: bitcoind ports: - "8332:8332" environment: HOSTNAME: bitcoind volumes: - ../data/bitcoin/.bitcoin:/bitcoin/.bitcoin - ../config/bitcointest.conf:/bitcoin/.bitcoin/bitcoin.conf
Після рендерінга cryptonodes.yaml перезапуск демона bitcoind - обов'язковий. Перезапуск відбувається по CI-CD, налаштованому в gitlab.tunex.io для Configurator, або вручну:
$ docker-compose restart bitcoind
Перевірка
Для того, щоб переконатись, що демон bitcoin-ноди доступний лише на 2-х дроплетах, застосовуємо інструменти bitcoin-cli та curl, а також RPC API для bitcoin-ноди (https://developer.bitcoin.org/reference/rpc/index.html )
Для dev.marionette.dev скористаємось bitcoin-cli. Наприклад, перевіримо найвищий блок в ноді:
$ docker-compose exec bitcoind bitcoin-cli getblockcount 2470217
Для demo.marionette.dev скористаємось curl. Як приклад, перевіримо баланс гаманця в ноді:
$ curl --data-binary '{"jsonrpc":"1.0","method":"getbalance","params":[]}' -H 'content-type: text/plain;' http://*****:*****@10.116.0.3:8332 {"result":0.21380328,"error":null,"id":null}
де замість **** в http://*****:*****@10.116.0.3:8332 вказується ім'я та пароль rpc-користувача, визначеного в конфігураційному файлі bitcoin-ноди (як правило, це bitcoin.conf)
Також для прикладу, що доступ до bitcoin-ноди лише на рівні VPC мережі забезпечений, використаємо curl, щоб перевірити баланс гаманця в ноді, вказавши в запиті зовнішню IP-адресу dev.marionette.dev:
$ curl --data-binary '{"jsonrpc":"1.0","method":"getbalance","params":[]}' -H 'content-type: text/plain;' http://****:*****@157.230.93.53:8332 curl: (28) Failed to connect to 157.230.93.53 port 8332: Connection timed out
3. Для будь-якого іншого випадку, візьмено власний ноут або інший сервер та відправимо запит на отримання найвищого блоку в ноді:
$ curl --data-binary '{"jsonrpc":"1.0","method":"getblockcount","params":[]}' -H 'content-type: text/plain;' http://****:*****@dev.marionette.dev:8332 curl: (28) Failed to connect to 157.230.93.53 port 8332: Connection timed out
Оскільки відповідь: "Failed to connect to 157.230.93.53 port 8332: Connection timed out
", то реалізація безпеки bitcoin-ноди виконана.
Додатково: забезпечення комунікації BITCOIN-PI на demo.marionette.dev з bitcoin-нодою
З огляду на реалізацію доступу до bitcoin-ноди на dev.marionette.dev з внутрішньої VPC мережі лише по 8332 порту для RPC-комунікації, потрібно в Configurator в файлі global/config.yaml в секції BITCOIN-PI: змінити змінну rpchost :
rpchost: 10.116.0.3
Після рендерінга global/config.yam перезапуск демона BITCOIN-PI - обов'язковий. Перезапуск відбувається по CI-CD, налаштованому в gitlab.tunex.io для configurator, або вручну:
$ docker-compose restart BITCOIN-PI