summary refs log tree commit diff
path: root/docs/administration/manhole.md
diff options
context:
space:
mode:
authorDavid Robertson <davidr@element.io>2022-10-24 14:03:10 +0100
committerDavid Robertson <davidr@element.io>2022-10-24 14:12:58 +0100
commit32e64faffe38d3a1be2994e6fc8cec174ee3ef45 (patch)
tree512f8632aabd180cb2c94ca32537465d2c495af5 /docs/administration/manhole.md
parentMove config pages into config dir (diff)
downloadsynapse-32e64faffe38d3a1be2994e6fc8cec174ee3ef45.tar.xz
Move admin docs to admin section (excluding admin api)
Diffstat (limited to 'docs/administration/manhole.md')
-rw-r--r--docs/administration/manhole.md101
1 files changed, 101 insertions, 0 deletions
diff --git a/docs/administration/manhole.md b/docs/administration/manhole.md
new file mode 100644

index 0000000000..1d04fc244c --- /dev/null +++ b/docs/administration/manhole.md
@@ -0,0 +1,101 @@ +Using the synapse manhole +========================= + +The "manhole" allows server administrators to access a Python shell on a running +Synapse installation. This is a very powerful mechanism for administration and +debugging. + +**_Security Warning_** + +Note that this will give administrative access to synapse to **all users** with +shell access to the server. It should therefore **not** be enabled in +environments where untrusted users have shell access. + +## Configuring the manhole + +To enable it, first add the `manhole` listener configuration in your +`homeserver.yaml`. You can find information on how to do that +in the [configuration manual](../usage/configuration/config_documentation.md#manhole_settings). +The configuration is slightly different if you're using docker. + +#### Docker config + +If you are using Docker, set `bind_addresses` to `['0.0.0.0']` as shown: + +```yaml +listeners: + - port: 9000 + bind_addresses: ['0.0.0.0'] + type: manhole +``` + +When using `docker run` to start the server, you will then need to change the command to the following to include the +`manhole` port forwarding. The `-p 127.0.0.1:9000:9000` below is important: it +ensures that access to the `manhole` is only possible for local users. + +```bash +docker run -d --name synapse \ + --mount type=volume,src=synapse-data,dst=/data \ + -p 8008:8008 \ + -p 127.0.0.1:9000:9000 \ + matrixdotorg/synapse:latest +``` + +#### Native config + +If you are not using docker, set `bind_addresses` to `['::1', '127.0.0.1']` as shown. +The `bind_addresses` in the example below is important: it ensures that access to the +`manhole` is only possible for local users). + +```yaml +listeners: + - port: 9000 + bind_addresses: ['::1', '127.0.0.1'] + type: manhole +``` + +### Security settings + +The following config options are available: + +- `username` - The username for the manhole (defaults to `matrix`) +- `password` - The password for the manhole (defaults to `rabbithole`) +- `ssh_priv_key` - The path to a private SSH key (defaults to a hardcoded value) +- `ssh_pub_key` - The path to a public SSH key (defaults to a hardcoded value) + +For example: + +```yaml +manhole_settings: + username: manhole + password: mypassword + ssh_priv_key: "/home/synapse/manhole_keys/id_rsa" + ssh_pub_key: "/home/synapse/manhole_keys/id_rsa.pub" +``` + + +## Accessing synapse manhole + +Then restart synapse, and point an ssh client at port 9000 on localhost, using +the username and password configured in `homeserver.yaml` - with the default +configuration, this would be: + +```bash +ssh -p9000 matrix@localhost +``` + +Then enter the password when prompted (the default is `rabbithole`). + +This gives a Python REPL in which `hs` gives access to the +`synapse.server.HomeServer` object - which in turn gives access to many other +parts of the process. + +Note that, prior to Synapse 1.41, any call which returns a coroutine will need to be wrapped in `ensureDeferred`. + +As a simple example, retrieving an event from the database: + +```pycon +>>> from twisted.internet import defer +>>> defer.ensureDeferred(hs.get_datastores().main.get_event('$1416420717069yeQaw:matrix.org')) +<Deferred at 0x7ff253fc6998 current result: <FrozenEvent event_id='$1416420717069yeQaw:matrix.org', type='m.room.create', state_key=''>> +```