ccc3a70344d6beb6eba5b9e13efcda721f244f7c service hardening: add more restrictions (nixbitcoin) 3fbfa986354054493a0770f25cd3792b83031edd service hardening: replace obtuse SystemCallFilter with @system-service (nixbitcoin) e34d1c884ed6a26ffbab523087ad57f59688b9c8 service hardening: Add PrivateUsers (nixbitcoin) 1c75543f2f6683f72c550d09bb81418be124c73e clightning: add user and group options (nixbitcoin) 5f3f36245150ad0cb79c2ed3858d13839c7037dd lnd: add strict hardening (Erik Arvstedt) a040e5285432452af613b4b72a65e852e63c31b6 All modules: ProtectSystem = strict (nixbitcoin) adc71b892e07ee71cece4205068d8fedbc1e4612 Remove PermissionStartOnly where possible and replace with bitcoinrpc (nixbitcoin) 91b6b2c370f5a5c4ff711b345447decb7c5e3333 All modules with preStart: Use systemd.tmpfiles.rules (nixbitcoin) 423ebf862b2cf0731ee7602fe8a26697e06fbdb4 lnd: only enable bitcoind zmqpub if lnd.enable (nixbitcoin) 81a1c3f9088f57ae9125fa6e32a04240cafb9dd3 service hardening: Add CapabilityBoundingSets (nixbitcoin) 3cd61506e021df2df3f1a170724c6f11f0d54a88 webindex & onion-chef: Run non-network-facing services in PrivateNetwork (nixbitcoin) 7c70dd43acb1fdb75d43d0bcef570e3daffeb1e4 All modules: Give service config precedence over defaultHardening (nixbitcoin) Pull request description: ACKs for top commit: erikarvstedt: ACK ccc3a70344d6beb6eba5b9e13efcda721f244f7c jonasnick: ACK ccc3a70344d6beb6eba5b9e13efcda721f244f7c very nice Tree-SHA512: 069f74b11b46b17fd180e9da5328a3b9952aa90100b5077251d1e56a4d64f03ba64587adf153ddc6cf42f750c13a168f9f0fe43bc379bcd4a9f6709e635e512a
nix-bitcoin
Nix packages and nixos modules for easily installing Bitcoin nodes and higher layer protocols with an emphasis on security. This is a work in progress - don't expect it to be bug-free, secure or stable.
The default configuration sets up a Bitcoin Core node and c-lightning. The user can enable spark-wallet in configuration.nix
to make c-lightning accessible with a smartphone using spark-wallet.
A simple webpage shows the lightning nodeid and links to nanopos letting the user receive donations.
It also includes elements-daemon.
Outbound peer-to-peer traffic is forced through Tor, and listening services are bound to onion addresses.
A demo installation is running at http://6tr4dg3f2oa7slotdjp4syvnzzcry2lqqlcvqkfxdavxo6jsuxwqpxad.onion. The following screen cast shows a fresh deployment of a nix-bitcoin node.
The goal is to make it easy to deploy a reasonably secure Bitcoin node with a usable wallet. It should allow managing bitcoin (the currency) effectively and providing public infrastructure. It should be a reproducible and extensible platform for applications building on Bitcoin.
Example
The easiest way to try out nix-bitcoin is to use one of the provided examples.
git clone https://github.com/fort-nix/nix-bitcoin
cd examples/
nix-shell
The following example scripts set up a nix-bitcoin node according to examples/configuration.nix
and then
shut down immediately. They leave no traces (outside of /nix/store
) on the host system.
-
./deploy-container.sh
creates a NixOS container.
This is the fastest way to set up a node.
Requires: NixOS -
./deploy-qemu-vm.sh
creates a QEMU VM.
Requires: Nix -
./deploy-nixops.sh
creates a VirtualBox VM via NixOps.
NixOps can be used to deploy to various other backends like cloud providers.
Requires: Nix, VirtualBox
Available modules
By default the configuration.nix
provides:
- bitcoind with outbound connections through Tor and inbound connections through a hidden service. By default loaded with banlist of spy nodes.
- clightning with outbound connections through Tor, not listening
- includes "nodeinfo" script which prints basic info about the node
- adds non-root user "operator" which has access to bitcoin-cli and lightning-cli
In configuration.nix
the user can enable:
- a clightning hidden service
- liquid
- lightning charge
- nanopos
- an index page using nginx to display node information and link to nanopos
- spark-wallet
- electrs
- recurring-donations, a module to repeatedly send lightning payments to recipients specified in the configuration.
- bitcoin-core-hwi.
- You no longer need extra software to connect your hardware wallet to Bitcoin Core. Use Bitcoin Core's own Hardware Wallet Interface with one
configuration.nix
setting.
- You no longer need extra software to connect your hardware wallet to Bitcoin Core. Use Bitcoin Core's own Hardware Wallet Interface with one
The data directories of the services can be found in /var/lib
on the deployed machines.
Installation
See install.md for a detailed tutorial.
Security
- Simplicity: Only services you select in
configuration.nix
and their dependencies are installed, packages and dependencies are pinned, most packages are built from the nixos stable channel, with a few exceptions that are built from the nixpkgs unstable channel, builds happen in a sandboxed environment, code is continiously reviewed and refined. - Integrity: Nix package manager, NixOS and packages can be built from source to reduce reliance on binary caches, nix-bitcoin merge commits are signed, all commits are approved by multiple nix-bitcoin developers, upstream packages are cryptographically verified where possible, we use this software ourselves.
- Principle of Least Privilege: Services operate with least privileges; they each have their own user and are restricted further with systemd options, there's a non-root user operator to interact with the various services.
- Defense-in-depth: nix-bitcoin is built with a hardened kernel by default, services are confined through discretionary access control, Linux namespaces, and seccomp-bpf with continuous improvements.
Note that nix-bitcoin is still experimental. Also, by design if the machine you're deploying from is insecure, there is nothing nix-bitcoin can do to protect itself.
Hardware requirements
- Disk space: 300 GB (235GB for Bitcoin blockchain + some room)
- Bitcoin Core pruning is not supported at the moment because it's not supported by c-lightning. It's possible to use pruning but you need to know what you're doing.
- RAM: 2GB of memory. ECC memory is better. Additionally, it's recommended to use DDR4 memory with targeted row refresh (TRR) enabled (https://rambleed.com/).
Tested hardware includes pcengine's apu2c4, GB-BACE-3150, GB-BACE-3160. Some hardware (including Intel NUCs) may not be compatible with the hardened kernel turned on by default (see https://github.com/fort-nix/nix-bitcoin/issues/39#issuecomment-517366093 for a workaround).
Usage
For usage instructions, such as how to connect to spark-wallet, electrs and the ssh Tor Hidden Service, see usage.md.
Troubleshooting
If you are having problems with nix-bitcoin check the FAQ or submit an issue.
There's also a #nix-bitcoin
IRC channel on freenode.
We are always happy to help.