For Internal Use Only
Ukrainian language is used for safety reasons.
Постановка задачі: з міркувань безпеки, до Bitcoin-ноди, розташованої на dev.marionette.dev, має забезпечуватись доступ лише з 2х серверів: dev.marionette.dev та demo.marionette.dev.
Task Description: For security reasons, access to the bitcoin-node located on dev.marionette.dev should be restricted to only two servers: dev.marionette.dev and demo.marionette.dev.
Для реалізації використовуються:
Implementation involves:
1. Налаштування мережевого файєрвола на Digital Ocean, де розташовані дроплети dev.marionette.dev та demo.marionette.dev
1. Configuring the network firewall on Digital Ocean, where the droplets dev.marionette.dev and demo.marionette.dev are located.
2. Налаштування docker-compose файла для біткоін-ноди на dev.marionette.dev
Configuring the
docker-compose
file for the Bitcoin-node on dev.marionette.dev.
Примітка: додатково (не стосується bitcoin-ноди): для взаємодії середовища demo.marionette.dev (а саме сервіса BITCOIN-PI на цьому деплойменті) прописується внутрішня IP-адреса dev.marionette.dev в мережі VPC.
Note: Additionally (not related to the Bitcoin node): For interactions with the demo environment (specifically the BITCOIN-PI service on this deployment), the internal IP address of dev.marionette.dev should be configured in the VPC network.
Реалізація
Implementation:
Внутрішня IP-адреса dev.marionette.dev в VPC - 10.116.0.3.
Internal IP address of dev.marionette.dev in VPC - 10.116.0.3.
Внутрішня IP-адреса demo.marionette.dev в VPC - 10.116.0.9.
Internal IP address of demo.marionette.dev in VPC - 10.116.0.9.
Створено наступні вхідні правила файервола, де додано порт 8332 лише для IP 10.116.0.9:
The following firewall inbound rules have been created, allowing port 8332 only for IP 10.116.0.9:
та застосовані до дроплета dev.marionette.dev:
and applied to the dev.marionette.dev droplet:
Для деплоймента bitcoin-ноди на dev.marionette.dev, зроблено мапінг 8332 порта з docker-контейнера bitcoind на порт 8332 хоста. Оскільки docker-compose.yaml, застосований в складі Configurator, змінено темплейт cryptonodes.yaml.t шляхом додавання секції мапінга портів:
For deploying the Bitcoin-node on dev.marionette.dev, port 8332 is mapped from the Docker-containerbitcoind
to port 8332 on the host. Since thedocker-compose.yaml
used in Configurator has been modified from the cryptonodes.yaml.t template by adding a port mapping section:
ports: - "{{rpcport}}:{{rpcport}}"
Після рендерінга на dev.marionette.dev отримано cryptonodes.yaml :
The rendered file on dev.marionette.dev is 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, або вручну:
After rendering cryptonodes.yaml, restarting the Bitcoin
daemon is mandatory. This restart can be done via the CI/CD pipeline configured in gitlab.tunex.io for Configurator or manually.
$ docker-compose restart bitcoind
Перевірка
Verification:
Для того, щоб переконатись, що демон bitcoin-ноди доступний лише на 2-х дроплетах, застосовуємо інструменти bitcoin-cli та curl, а також RPC API для bitcoin-ноди (https://developer.bitcoin.org/reference/rpc/index.html )
To ensure the Bitcoin-node daemon is accessible only from the two droplets, use-bitcoin-cli, curl, and the RPC API for the Bitcoin node (https://developer.bitcoin.org/reference/rpc/index.html )
Для dev.marionette.dev скористаємось bitcoin-cli. Наприклад, перевіримо найвищий блок в ноді:
For dev.marionette.dev , use bitcoin-cli to check the highest block in the node.$ docker-compose exec bitcoind bitcoin-cli getblockcount 2470217
Для demo.marionette.dev скористаємось curl. Як приклад, перевіримо баланс гаманця в ноді:
For demo.marionette.dev , use curl. Foe example, lets check the wallet balance in the node:$ 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)
Replace ****
in the http://*****:*****@10.116.0.3:8332 with the RPC username and password defined in the Bitcoin-node configuration file (bitcoin.conf)
Також для прикладу, що доступ до bitcoin-ноди лише на рівні VPC мережі забезпечений, використаємо curl, щоб перевірити баланс гаманця в ноді, вказавши в запиті зовнішню IP-адресу dev.marionette.dev:
Additionally, to verify that access to the Bitcoin-node is limited to the VPC network, use curl to check the wallet balance in the node by specifying the external IP address of 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. Для будь-якого іншого випадку, візьмено власний ноут або інший сервер та відправимо запит на отримання найвищого блоку в ноді:
For any other case, use your own laptop or another server and send a request to get the highest block in the node.
$ 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-ноди виконана.
If the response is "Failed to connect to 157.230.93.53 port 8332: Connection timed out
" the Bitcoin-node security implementation is successful.
Додатково: забезпечення комунікації BITCOIN-PI на demo.marionette.dev з bitcoin-нодою
Additional: Ensuring BITCOIN-PI Communication on demo.marionette.dev with Bitcoin-Node
З огляду на реалізацію доступу до bitcoin-ноди на dev.marionette.dev з внутрішньої VPC мережі лише по 8332 порту для RPC-комунікації, потрібно в Configurator в файлі global/config.yaml в секції BITCOIN-PI: змінити змінну rpchost :
Given that access to the coin node on dev.marionette.dev from the internal VPC network is restricted to port 8332 for RPC communication, update the Configurator
variable in the global/config.yaml
file under the BITCOIN-PI section in Configurator.
rpchost: 10.116.0.3
Після рендерінга global/config.yam перезапуск демона BITCOIN-PI - обов'язковий. Перезапуск відбувається по CI-CD, налаштованому в gitlab.tunex.io для configurator, або вручну:
After making this change, rendering the global/config.yam
file and restarting the BITCOIN-PI daemon is mandatory. This restart can be done via the CI/CD pipeline configured in gitlab.tunex.io for Configurator or manually.
$ docker-compose restart BITCOIN-PI