sshportal/README.md

273 lines
8.2 KiB
Markdown
Raw Normal View History

2017-11-13 18:11:41 +08:00
# sshportal
Jump host/Jump server without the jump, a.k.a Transparent SSH bastion
```
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
DMZ │
┌────────┐ │ ┌────────┐
│ homer │───▶╔═════════════════╗───▶│ host1 │ │
└────────┘ ║ ║ └────────┘
┌────────┐ ║ ║ ┌────────┐ │
│ bart │───▶║ sshportal ║───▶│ host2 │
└────────┘ ║ ║ └────────┘ │
┌────────┐ ║ ║ ┌────────┐
│ lisa │───▶╚═════════════════╝───▶│ host3 │ │
└────────┘ │ └────────┘
┌────────┐ ┌────────┐ │
│ ... │ │ │ ... │
└────────┘ └────────┘ │
└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
```
## Features
* Host management
* User management
* User Group management
* Host Group management
* Host Key management
* User Key management
* ACL management
* Connect to host using key or password
2017-11-13 18:18:19 +08:00
* Admin commands can be run directly or in an interactive shell
2017-11-24 02:06:30 +08:00
* User Roles
2017-11-13 18:11:41 +08:00
## Usage
Start the server
```console
$ sshportal
2017/11/13 10:58:35 Admin user created, use the user 'invite:BpLnfgDsc2WD8F2q' to associate a public key with this account
2017/11/13 10:58:35 SSH Server accepting connections on :2222
```
Link your SSH key with the admin account
```console
$ ssh localhost -p 2222 -l invite:BpLnfgDsc2WD8F2q
Welcome Administrator!
Your key is now associated with the user "admin@sshportal".
Shared connection to localhost closed.
$
```
Drop an interactive administrator shell
```console
ssh localhost -p 2222 -l admin
__________ _____ __ __
/ __/ __/ // / _ \___ ____/ /____ _/ /
_\ \_\ \/ _ / ___/ _ \/ __/ __/ _ '/ /
/___/___/_//_/_/ \___/_/ \__/\_,_/_/
config>
```
Create your first host
```console
config> host create bart@foo.example.org
1
config>
```
List hosts
```console
config> host ls
ID | NAME | URL | KEY | PASS | GROUPS | COMMENT
+----+------+-------------------------+---------+------+--------+---------+
1 | foo | bart@foo.example.org:22 | default | | 1 |
Total: 1 hosts.
config>
```
Get the default key in authorized_keys format
```console
config> key inspect default
[...]
"PubKey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvUP/8FedyIe+a+RWU4KvJ1+iZwtWmY9czJubLwN4RcjKHQMzLqWC7pKZHAABCZjLJjVD/3Zb53jZwbh7mysAkocundMpvUL5+Yb4a8lDiflXkdXT9fZCx+ibJBk4jRnKLGIneSzVtFEerEwQKKnKQoCgPkZwCDaL/jHhDlOmAvxqAJrjiy42HXwppX2UuF8zujs6OKHRYJ/Q1vo0caa6/o1eoyXE9OrOwIk+IcAN3YIQi/B1BOlZOQBzHIZz83AFlD2TcPhyYcbxPyKGih84Zr3rQaaP1WiaiPqxzp3s5OhTLthc5XtCSLzmRSLvgC2eFdNhBDB5KLtO2khBkz5ID",
[...]
config>
```
Add this key to the server
```console
$ ssh bart@foo.example.org
> umask 077; mkdir -p .ssh; echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvUP/8FedyIe+a+RWU4KvJ1+iZwtWmY9czJubLwN4RcjKHQMzLqWC7pKZHAABCZjLJjVD/3Zb53jZwbh7mysAkocundMpvUL5+Yb4a8lDiflXkdXT9fZCx+ibJBk4jRnKLGIneSzVtFEerEwQKKnKQoCgPkZwCDaL/jHhDlOmAvxqAJrjiy42HXwppX2UuF8zujs6OKHRYJ/Q1vo0caa6/o1eoyXE9OrOwIk+IcAN3YIQi/B1BOlZOQBzHIZz83AFlD2TcPhyYcbxPyKGih84Zr3rQaaP1WiaiPqxzp3s5OhTLthc5XtCSLzmRSLvgC2eFdNhBDB5KLtO2khBkz5ID >> .ssh/authorized_keys
```
Profit
```console
ssh localhost -p 2222 -l foo
bart@foo>
```
2017-11-13 18:18:19 +08:00
Invite friends
```console
config> user invite bob@example.com
User 2 created.
To associate this account with a key, use the following SSH user: 'invite-NfHK5a84jjJkwzDk'.
config>
```
2017-11-13 19:21:26 +08:00
## CLI
sshportal embeds a configuration CLI.
By default, the configuration user is `admin`, (can be changed using `--config-user=<value>` when starting the server.
Each commands can be run directly by using this syntax: `ssh admin@portal.example.org <command> [args]`:
```
ssh admin@portal.example.org host inspect toto
```
You can enter in interactive mode using this syntax: `ssh admin@portal.example.org`
### Synopsis
```sh
# acl management
acl help
2017-11-23 17:35:51 +08:00
acl create [-h] [--hostgroup=HOSTGROUP...] [--usergroup=USERGROUP...] [--pattern=<value>] [--comment=<value>] [--action=<value>] [--weight=value]
acl inspect [-h] ACL...
2017-11-13 19:21:26 +08:00
acl ls [-h]
2017-11-23 17:35:51 +08:00
acl rm [-h] ACL...
2017-11-23 19:01:17 +08:00
acl update [-h] [--comment=<value>] [--action=<value>] [--weight=<value>] [--assign-hostgroup=HOSTGROUP...] [--unassign-hostgroup=HOSTGROUP...] [--assign-usergroup=USERGROUP...] [--unassign-usergroup=USERGROUP...] ACL...
2017-11-13 19:21:26 +08:00
2017-11-14 03:22:45 +08:00
# config management
config help
config backup [-h] [--indent]
2017-11-14 06:57:52 +08:00
config restore [-h] [--confirm]
2017-11-14 03:22:45 +08:00
2017-11-13 19:21:26 +08:00
# host management
host help
2017-11-23 17:35:51 +08:00
host create [-h] [--name=<value>] [--password=<value>] [--fingerprint=<value>] [--comment=<value>] [--key=KEY] [--group=HOSTGROUP...] <username>[:<password>]@<host>[:<port>]
host inspect [-h] HOST...
2017-11-13 19:21:26 +08:00
host ls [-h]
2017-11-23 17:35:51 +08:00
host rm [-h] HOST...
2017-11-23 19:01:17 +08:00
host update [-h] [--name=<value>] [--comment=<value>] [--fingerprint=<value>] [--key=KEY] [--assign-group=HOSTGROUP...] [--unassign-group=HOSTGROUP...] HOST...
2017-11-13 19:21:26 +08:00
# hostgroup management
hostgroup help
hostgroup create [-h] [--name=<value>] [--comment=<value>]
2017-11-23 17:35:51 +08:00
hostgroup inspect [-h] HOSTGROUP...
2017-11-13 19:21:26 +08:00
hostgroup ls [-h]
2017-11-23 17:35:51 +08:00
hostgroup rm [-h] HOSTGROUP...
2017-11-13 19:21:26 +08:00
# key management
key help
key create [-h] [--name=<value>] [--type=<value>] [--length=<value>] [--comment=<value>]
2017-11-23 17:35:51 +08:00
key inspect [-h] KEY...
2017-11-13 19:21:26 +08:00
key ls [-h]
2017-11-23 17:35:51 +08:00
key rm [-h] KEY...
2017-11-13 19:21:26 +08:00
# user management
user help
2017-11-23 17:35:51 +08:00
user invite [-h] [--name=<value>] [--comment=<value>] [--group=USERGROUP...] <email>
user inspect [-h] USER...
2017-11-13 19:21:26 +08:00
user ls [-h]
2017-11-23 17:35:51 +08:00
user rm [-h] USER...
2017-11-23 18:36:24 +08:00
user update [-h] [--name=<value>] [--email=<value>] [--set-admin] [--unset-admin] [--assign-group=USERGROUP...] [--unassign-group=USERGROUP...] USER...
2017-11-13 19:21:26 +08:00
# usergroup management
usergroup help
hostgroup create [-h] [--name=<value>] [--comment=<value>]
2017-11-23 17:35:51 +08:00
usergroup inspect [-h] USERGROUP...
2017-11-13 19:21:26 +08:00
usergroup ls [-h]
2017-11-23 17:35:51 +08:00
usergroup rm [-h] USERGROUP...
2017-11-13 19:21:26 +08:00
# other
2017-11-14 03:08:12 +08:00
exit [-h]
2017-11-13 19:21:26 +08:00
help, h
info [-h]
version [-h]
```
2017-11-14 07:27:12 +08:00
## Docker
2017-11-13 18:11:41 +08:00
2017-11-14 17:12:25 +08:00
Docker is the recommended way to run sshportal.
2017-11-14 07:27:12 +08:00
An [automated build is setup on the Docker Hub](https://hub.docker.com/r/moul/sshportal/tags/).
```console
# Start a server in background
# mount `pwd` to persist the sqlite database file
2017-11-24 02:04:00 +08:00
docker run -p 2222:2222 -d --name=sshportal -v "$(pwd):$(pwd)" -w "$(pwd)" moul/sshportal:v1.3.0
2017-11-14 17:12:25 +08:00
# check logs (mandatory on first run to get the administrator invite token)
docker logs -f sshportal
```
The easier way to upgrade sshportal is to do the following:
```sh
2017-11-24 02:04:00 +08:00
# we consider you were using the version v1.2.0 and you want to use the new version v1.3.0
2017-11-14 17:12:25 +08:00
# stop and rename the last working container + backup the database
docker stop sshportal
docker rename sshportal sshportal_old
cp sshportal.db sshportal.db.bkp
# run the new version
2017-11-24 02:04:00 +08:00
docker run -p 2222:2222 -d --name=sshportal -v "$(pwd):$(pwd)" -w "$(pwd)" moul/sshportal:v1.3.0
2017-11-14 17:12:25 +08:00
# check the logs for migration or cross-version incompabitility errors
docker logs -f sshportal
```
Now you can test ssh-ing to sshportal to check if everything looks OK.
In case of problem, you can rollback to the latest working version with the latest working backup, using:
```sh
docker stop sshportal
docker rm sshportal
cp sshportal.db.bkp sshportal.db
docker rename sshportal_old sshportal
docker start sshportal
docker logs -f sshportal
2017-11-14 07:27:12 +08:00
```
## Manual Install
Get the latest version using GO.
2017-11-13 18:11:41 +08:00
```sh
go get -u github.com/moul/sshportal
```
2017-11-14 07:21:19 +08:00
## Backup / Restore
sshportal embeds built-in backup/restore methods which basically import/export JSON objects:
```sh
# Backup
2017-11-20 18:12:58 +08:00
ssh admin@sshportal config backup > sshportal.bkp
2017-11-14 07:21:19 +08:00
# Restore
2017-11-20 18:12:58 +08:00
ssh admin@sshportal config restore < sshportal.bkp
2017-11-14 07:21:19 +08:00
```
This method is particularly useful as it should be resistant against future DB schema changes (expected during development phase).
I suggest you to be careful during this development phase, and use an additional backup method, for example:
```sh
# sqlite dump
sqlite3 sshportal.db .dump > sshportal.sql.bkp
# or just the immortal cp
cp sshportal.db sshportal.db.bkp
```