First SSH session
From a running gateway with a first identity (getting started) to a first brokered SSH session: prepare one target host, connect, and find the session in the record. The full preparation of a production server is target host preparation; what the gateway lets an operator do there is SSH policy and approval.
First target
A target host is not ready simply because the gateway can reach it. Two things have to be true, and they are two different directions of trust:
- The gateway must recognise the target. Host key checking defaults to
strict, which means the gateway accepts only a host certificate signed by its
own CA — not a bare host key, and not a key it has seen before. Issue one with
isg ca host-cert issue --host <host> --key <file>, over the target's existing host public key; the CA never sees the host's private key. The certificate to copy to the target is the published mirror underpub/hosts/. - The target must recognise the gateway. The target's
sshdhas to trust the ISG CA for user certificates, which is what makes the ten-minute certificate the gateway mints acceptable as a login.isg ca pubkeyprints the CA public key to install for that.
Both require the CA to exist, so run isg ca init first — it is idempotent, and
the SSH and X.509 halves are independent of each other.
A NEW X.509 CA needs the names it may certify, named explicitly:
isg ca init --permitted-dns isg.example.local --permitted-ip 192.168.57.0/24
Those two flags become the CA certificate's nameConstraints, and with neither
of them the command creates nothing at all and says why. The reason is the
admin UI: its serving certificate is signed by this CA, so a browser that
should open it without a warning has to trust the CA — and an unconstrained CA
key could impersonate any website on the machine that imported it. A
--permitted-dns entry permits the domain and its subdomains; --permitted-ip
takes CIDRs (/32 for a single address). --no-name-constraints is the
deliberate way out, and the command states in one line that the CA it created
is unconstrained.
The constraint can only be set on a NEW certificate, so on a gateway whose
X.509 CA already exists the flags change nothing — the output says which
constraints that CA actually carries. isg system check's
x509_ca_name_constraints row reports the same thing at any time.
Neither step is something to improvise: the exact sshd configuration on the
target, the order to apply it in, and how to verify it without locking yourself
out are covered by the target-host preparation guide.
First connect
With the daemon running, the CA initialized and one target prepared:
isg connect <target> --as <user>
--as is required and names the OS user to become on the target. The daemon
tells you who it thinks you are, runs the access gates, challenges you for a
second factor, mints the certificate, dials the target and hands you a prompt.
Every line you type there is one policy decision and one audit entry. exit,
quit or logout ends the session.
Two variants are worth knowing early. --command <command> runs a single
command and exits with that command's own exit code, which is what makes the
gateway scriptable. --change <id> attaches a change-management reference to
the session record.
If mfa.yaml sets mfa_mode: totp, each operator enrols once with isg mfa enroll before their first connect. Enrolment is self-service and goes through
the running daemon, so isg serve has to be up for it.
Two doors, one session. isg connect runs on a broker itself: the daemon identifies the caller from
the unix socket (session.sock), so the operator needs a shell on the broker and membership of the
isg-operators group. Everyone else comes in from their own machine through the gateway login — over
SSH as the isg-login user, with the target as the command (deployment) — and answers
the username, password and MFA prompts. Both doors lead to the same access gates and the same session
record, and both print the session ID when the session opens.
Connect to the gateway by its shared name, not by an address: the brokers' host certificates name the
shared name, so a single @cert-authority line in known_hosts accepts whichever broker currently holds
it.
The session in the record
The session is in the admin view at https://<gateway>:8765/ (Sessions), with its transcript and its
recording, and in audit.log as a line per event. The checks of the installation itself are on
getting started.