The gateway, tweed¶
You operate the welland gateway and want to know who can log in to tweed, as which account, with which key, and how its sshd is set. Logging in: Logging in.
tweed is not publicly addressable over IPv4. tweed.welland.mithis.com is
split-horizon DNS (looked up 2026-09-29):
Resolver |
A |
AAAA |
|---|---|---|
public (ns1/ns2.rollernet.us) |
|
|
inside the site |
|
the same two |
Which path reaches tweed’s sshd (checked 2026-09-29, after infra main
4de0b24 was deployed):
From |
Use |
Why |
|---|---|---|
inside the site, or over the wg route |
|
resolves to |
the upstream router |
|
the transit link |
Ansible, from anywhere with IPv6 |
|
the inventory’s |
outside, IPv6 |
|
reaches tweed. |
outside, IPv4 only |
through the upstream router: |
the public A record is the upstream router, not tweed (What a site needs from its upstream network) |
tweed’s own firewall accepts SSH on every interface
(roles/firewall).
Account |
uid |
sudo |
|
Managed by |
|---|---|---|---|---|
|
1000 |
NOPASSWD ( |
exactly the |
|
|
1001 |
NOPASSWD ( |
exactly the keys published at |
|
|
NOPASSWD ( |
the GitHub keys of |
||
|
none (the role deletes any |
|
||
|
0 |
not managed by any role. Password locked (observed 2026-09-27) |
sshd: |
admin runs the site: gunicorn, daphne, uvicorn and the fleet consumer are
User={{ user_name }} (roles/site). Its
~/.ssh/id_rsa keypair is the server-user key that every Pi trusts. It is
generated by fixpi/tasks/userconf.yml (“Generate ssh keys for server user”,
never overwritten) and read from fixpi_server_user_pubkey.
The pi jump account:
Its login shell is
/bin/rbashwithPATHlocked to~/bin, which holds onlysshandssh-keyscan(jump_commands)./etc/ssh/sshd_config.d/50-jump.confdoesMatch User pi→ForceCommand jump-shell(/usr/local/bin/jump-shell), which refuses every command exceptsshandssh-keyscan. It also setsAllowTcpForwarding yes,AllowAgentForwarding no,X11Forwarding noandPermitTunnel no.It has its own keypair,
/home/pi/.ssh/id_ed25519(jump_ssh_key, #140). fixpi authorizes the public half for the Pis’piuser, sossh pi@10.21.S.Pfrom inside the jump shell works without a password.~/.ssh/configaccepts new Pi host keys.
Retired accounts: piroot (the old chroot-shell provisioning login) is
deleted by operators_retired_accounts, together with its sudoers file and
/usr/local/bin/chroot-shell (#149). videoteam is now admin.
sshd¶
sshd_pubkey_only: true in tweed’s host_vars makes
roles/sshd write
/etc/ssh/sshd_config.d/00-pubkey-only.conf (#139):
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
AuthenticationMethods publickey
PermitRootLogin prohibit-password
It sorts first, so it wins over 50-jump.conf and the main file. Before it
writes the file, a lockout guard checks that the account Ansible is
connected as, every operator and the jump account (sshd_pubkey_only_key_users)
each have at least one key that ssh-keygen -l can parse. It does not check
admin or root. If any account it checks has no such key, the converge
fails. The connecting account is found with id -un with become
switched off through the ansible_become variable, because tweed’s host_vars
set ansible_become: true. It is then asserted to equal ansible_user (#162;
before that fix the probe ran as root and the guard checked root’s keys). After
writing, the role checks sshd -t and the effective sshd -T values for
ansible, pi and root.
ps1.fpgas.online runs the same operators, jump and sshd roles. It does
not run automation_user (automation_user_manage is false). Its
sshd_pubkey_only is false, so sshd only makes sure the drop-in is absent,
and its user_name is still videoteam.