guides/user/RPC-server.md
0 → 100644
# RPC Server (Dispatcher) | |||
## Version 0.4.2 | |||
* [Simple setup](#simple) | |||
* [High Performance Grid setup](#grid) | |||
* [Security considerations](#security) | |||
* [Help output](#help) | |||
### <a id="simple" href="#simple">Simple setup</a> | |||
Starting a Dispatcher can be as simple as running: `arachni_rpcd` | |||
This will bind on `localhost:7331` by default. | |||
### <a id="grid" href="#grid">High Performance Grid setup</a> | |||
In order to connect the Dispatchers into a grid you'll need to: | |||
* specify an IP address or hostname on which the Dispatcher will be accessible | |||
by the rest of the Grid nodes (i.e. other Dispatchers) | |||
* specify a neighbouring Dispatcher when running a new one | |||
* use different Pipe IDs -- these are used to identify independent bandwidth | |||
lines to the target in order to split the workload in a way that will | |||
aggregate the collective bandwidth | |||
After that they will build their network themselves. | |||
Here's how it's done... | |||
**Firing up the first one:** | |||
arachni_rpcd --pipe-id="Pipe 1" --nickname="My Dispatcher" --address=192.168.0.1 | |||
**Adding more to make a Grid:** | |||
arachni_rpcd --pipe-id="Pipe 2" --nickname="My second Dispatcher" --address=192.168.0.2 --neighbour=192.168.0.1:7331 | |||
**Lather, rinse, repeat:** | |||
arachni_rpcd --pipe-id="Pipe 3" --nickname="My third Dispatcher" --address=192.168.0.3 --neighbour=192.168.0.2:7331 | |||
arachni_rpcd --pipe-id="Pipe 4" --nickname="My forth Dispatcher" --address=192.168.0.4 --neighbour=192.168.0.3:7331 | |||
That sort of setup assumes that each Dispatcher is on a machine with independent | |||
bandwidth lines (to the target website at least). | |||
If you want to, out of curiosity, start a few Dispatchers on localhost you will | |||
need to specify the ports: | |||
arachni_rpcd --pipe-id="Pipe 1" --nickname="My Dispatcher" | |||
arachni_rpcd --pipe-id="Pipe 2" --nickname="My second Dispatcher" --port=1111 --neighbour=localhost:7331 | |||
arachni_rpcd --pipe-id="Pipe 3" --nickname="My third Dispatcher" --port=2222 --neighbour=localhost:1111 | |||
etc. | |||
### <a id="security" href="#security">Security considerations</a> | |||
**This is very important, you should read it thoroughly.** | |||
By default, all connections are performed over encrypted sockets using SSL. | |||
This takes care of encryption but not authN/authZ which is a very important issue | |||
when it comes to the Dispatcher. | |||
The Dispatcher is a dispatch server, and as such, its focus is on maintaining a | |||
pool of running servers, ready to be used at a moment's notice. | |||
A major part of maintaining that pool is replenishing it once a dispatch call has | |||
been performed -- i.e. when a server if pop'ed from the pool, another one must be pushed. | |||
When you take into account that server shutdown is delegated to the client the | |||
security issue becomes crystal clear. | |||
Clients can easily [fork-bomb](http://en.wikipedia.org/wiki/Fork_bomb) the | |||
machine on which a Dispatcher is running. | |||
This makes it crucial to provide Dispatcher access to trusted clients *only*. | |||
Sufficient authN/authZ can be achieved by either: | |||
* Configuring the relevant SSL options for both the clients and dispatch servers. | |||
* Rolling your own network security scheme via a VPN or something similar. | |||
### <a id="help" href="#help">Help output</a> | |||
The help output of the RPC server if fairly straightforward: | |||
``` | |||
Arachni - Web Application Security Scanner Framework v1.0dev | |||
Author: Tasos "Zapotek" Laskos <[email protected]> | |||
(With the support of the community and the Arachni Team.) | |||
Website: http://arachni-scanner.com | |||
Documentation: http://arachni-scanner.com/wiki | |||
Usage: arachni_rpcd [options] | |||
Supported options: | |||
-h | |||
--help output this | |||
--address=<host> specify address to bind to | |||
(Default: localhost) | |||
--port=<num> specify port to listen to | |||
(Default: 7331) | |||
--port-range=<beginning>-<end> | |||
specify port range for the RPC instances | |||
(Make sure to allow for a few hundred ports.) | |||
(Default: 1025-65535) | |||
--reroute-to-logfile reroute all output to a logfile under 'logs/' | |||
--pool-size=<num> how many server workers/processes should be available | |||
at any given moment (Default: 5) | |||
--neighbour=<URL> URL of a neighbouring Dispatcher (used to build a grid) | |||
--weight=<float> weight of the Dispatcher | |||
--pipe-id=<string> bandwidth pipe identification | |||
--nickname=<string> nickname of the Dispatcher | |||
--debug | |||
SSL -------------------------- | |||
(All SSL options will be honored by the dispatched RPC instances as well.) | |||
(Do *not* use encrypted keys!) | |||
--ssl-pkey <file> location of the server SSL private key (.pem) | |||
(Used to verify the server to the clients.) | |||
--ssl-cert <file> location of the server SSL certificate (.pem) | |||
(Used to verify the server to the clients.) | |||
--node-ssl-pkey <file> location of the client SSL private key (.pem) | |||
(Used to verify this node to other servers.) | |||
--node-ssl-cert <file> location of the client SSL certificate (.pem) | |||
(Used to verify this node to other servers.) | |||
--ssl-ca <file> location of the CA certificate (.pem) | |||
``` | |||
If you are interested in providing webappsec scanning services you can write | |||
your own client using the [[RPC API | RPC API]]. |