Replies: 6 comments 4 replies
Before anyone spends time on the questions at the bottom — @RealDeuce, @xbit44, could you check the two FTN columns in the table? They are reconstructed from #117 rather than measured, and the post's conclusion rests on them. If joining over FTN really is one config line for a board already on a network, a league server saves existing members nothing and the idea only matters for boards with no address.
Corrections are worth more than agreement here — if the table is wrong, so is what it concludes. |
@RealDeuce, @xbit44 — the table has been reworked and the row that matters most is the one I am least sure of, so it is worth asking before anyone answers the questions at the bottom. The FTN columns are reconstructed from #117 rather than measured. The one-time rows I am reasonably confident in. The recurring row is inference: reading "for every game the board joins, I need to update the game with the new board and publish that to the rest of the games in the league" as meaning that when board eleven arrives, the other ten each have work to do.
If the recurring cost is near zero in practice, the case in the post gets much weaker, which is worth knowing now rather than after someone builds something. |
|
BRE and FE both rely on an FTN address in order to tell boards apart. I'll use BRNODES.DAT to mean both that and FENODES.DAT, since it's tiresome to type out both each time. The entry in BRNODES.DAT is keyed by the FTN address, linked to the entry in BBS.CFG to work out which one you are. In terms of what other boards need to do, the only other board that needs to change anything is the co-ordinator, who adds you to the BRNODES.DAT. The game then takes care of distributing that out (if using FTN mailer), or one must move the file themself (if using Filebox). nova-hub takes care of it in the filebox style. This is a mirror of sorts of the FTN nodelist. The co-ord will update the nodelist, and press the button that sends it out to all. Until then, receiving boards may know your address but they won't be able to resolve the address without the updated nodelist. For first-time setup, that's right, that is it. On an FTN transit network, the packets will arrive all in one place. Either the mailer will move them around, or you just point your game at that inbound folder and it'll pick out the files it wants and leave the rest. |
|
Fundamentally, what an IBBS games strictly requires:
Pretty much everything else is game defined or exists for the traceability. While preventing cheating in an open source IBBS game is a fools errand, ensuring the league coordinator can reliably determine what node is cheating and cut them out of the game is the basis of any enforcement plan. In traditional FTNs, this is provided by the FTN infrastructure and so many logs. With public keys and signed packets, it can look a lot different. The public key itself is the ID... or there's a game-specific 1:1 mapping of ID to public key. The signature clearly defines the source of the packet so a detected cheater can be looked up by public key and removed from the game without needing to search through logs. It no longer matters how the files move, but having the coordinator host a simple service that allows POST/GET style semantics with public key auth and route everything through that is what I would reach for if I was designing something from scratch. I would want to make it a generic service where the POST/GET would include metadata indicating a game ID of some sort. |
The recurring-cost row was wrong, and it was the row the post's conclusion rested on. Correcting it here rather than editing the post, so the reasoning stays readable.
So when a board joins an established league, existing members do nothing. The corrected rows:
That removes the argument the post was built on. A league server saves existing members nothing, because there was nothing recurring to save, and the Coordinator's row gains an account to provision. What survives is the one-off cost for a board with no FTN address — and @RealDeuce puts a limit on that too: the LC's side is trivial because they know how to do it, while "getting a BBS configured can take multiple tries and active support from the LC". That is work in the mailer, which a change to IB cannot remove. What the thread did settleIdentity. @RealDeuce: "The public key itself is the ID... or there's a game-specific 1:1 mapping of ID to public key. The signature clearly defines the source of the packet so a detected cheater can be looked up by public key and removed from the game without needing to search through logs." @lime-red closes the other end — the FTN address was never a durable identity to begin with: "It doesn't matter if the address is fake, as long as can be matched up." Distribution. It needs no new mechanism. IB already broadcasts a Coordinator roster signed with the key every board records once by hand ( Together those answer the two questions the post listed as blocking, which makes the signing half — #118 — buildable now, without settling the transport at all. Still open
On a coordinator-hosted service@RealDeuce would reach for one — POST/GET with public-key auth, generic, with a game ID in the metadata. Worth recording that it is framed as designing from scratch, and as generic infrastructure rather than something a single game ships. IB would be a client of such a thing if it existed, which is a decision that can wait until it does. Nothing in the signing work depends on it either way. |
The "if" in the original title is now a "does", so I have retitled the thread. Packet signing shipped — #118 is closed — and that resolves the question this discussion was pivoting around. Everything below is what actually landed, so the remaining questions can be asked against a real thing rather than a proposal. What shippedEvery board signs every packet with an ed25519 key of its own, and a receiving board verifies it before applying anything. Two mechanisms with deliberately different trust roots:
The chain closes: a sysop records one key out of band, and every board key after that arrives inside something already verified. That is worth spelling out because the original post rejected IB's own candidate scheme on exactly this point — "a board joining mid-season then has nothing to verify its first roster against." It doesn't, if the roster is expected to verify itself. The out-of-band Coordinator key is the fix, and it costs a sysop one paste at join time. Two related changes landed alongside it. A packet now carries the roster's node number for each end and the key is matched on that rather than on the board's name, so two boards cannot collide on a name and a rename does not break verification. And a reset advances a generation marker, so a packet left over from a cleared game is discarded rather than applied to the new one. What this does and does not buy@RealDeuce's point in #117 was that signing makes the transport untrusted by construction, and that is now the case: the mover cannot forge, so FTN, a server, scp and a shared mount are all equally acceptable and the choice becomes purely about work. What it does not do, and cannot:
What is still worth answeringThe cost table in the original post is unchanged — signing does not move any of those rows. So the questions that matter are the ones only sysops can answer:
"Use the thing that already exists" remains a fine answer — and it is now a cheaper one, because keeping the plain file drop no longer costs any security. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Discussion #117 asked how leagues move packets today. The answers moved the question on, so this is a separate thread for what it became: if Immortal Barons signed its own packets, what should carry them, and would any of that be less work than what sysops run now.
What #117 settled
.MSGnetmail carrying the packet as a file attach, the other with BinkIT over a mostly-star topology. Neither has ever used game-level routing.The pivot
IB trusts whatever moved the file, and that is what makes the transport load-bearing. Sign the packets and the mover is untrusted by construction. FTN, a server, scp and a shared mount all become acceptable, and the choice stops being about security and becomes about work.
@RealDeuce put the consequence directly in #117:
Read straight, that says IB needs no new transport at all. Keep the file drop, sign the packets, and every sysop goes on moving files the way they already do. Nothing to host, no
.MSGwriter, no network code in the game, and a board's identity stops depending on being on somebody's network.Four things need filling in before it can be built:
If a league wants a server anyway
It would be a mailbox: take a packet from a board that can prove it is that board, hold it until the addressee collects it, stop boards touching each other's. It never opens a packet or knows the rules.
Signing takes the weight off the first job, so what is left is authenticated file storage with per-board access control. Existing servers are already that:
ALLOW_SFTP, "Allow logins via BSD SFTP". Callers authenticate as BBS users, and a user's~/.ssh/authorized_keysmaps to theirsshkeysfile, so key auth works with no unix account. What it exposes is the filebase rather than a filesystem, which means the drop area would be a file directory and the per-board isolation would be that directory's access requirements — something a sysop already knows how to set up. Two things I have not checked: whether a directory can be restricted so each board sees only its own inbox, and what the filebase does to a file on the way through.Mystic is not a candidate for the server side: as of 1.12 A48 it has no SFTP, and SSH there is a terminal type only. Its server list is Telnet, RLOGIN, SSH, BINKP, FTP, NNTP, POP3, SMTP and HTTP, so FTP or BINKP would be the way in if a Mystic board hosted. As a member board it needs nothing special either way.
A member board needs only a client either way, and for the sftp options that is one every OS already ships.
What a league then costs to run. The FTN columns are reconstructed from #117's answer about joining a league — a DNS CNAME, the netmail passwords, then updating the game with the new board and publishing it — so corrections are more useful than agreement.
The rows are split by how often the work comes back, because that is where the options differ. Joining is paid once; everything under it is paid again each time the league grows.
.MSGwriterIf those columns are right, first-time setup is close to even for a board already on a network — one config line either way. The large one-off saving belongs to a board that is not on one: days of human process against an account and a password.
The recurring rows are the ones that decide it. A league that grows to ten boards pays the FTN rows nine more times, across every member, while the server rows stay with the Coordinator. That is the part a snapshot of one board joining hides, and it is the part that matters for making IB easier to run than the original rather than merely as easy.
A server's costs are plain. Somebody hosts it, and it is a single point of failure. The Coordinator provisions an account per board. A hostile or compromised host can withhold traffic, and signing does not fix that.
If IB talked to a server itself
The table above assumes the sysop's sync job moves the files and IB never touches the network. The alternative is IB doing it — which is what @lime-red suggested in #117, that IB could absorb what nova-client does. Its method, read from that client and the published API, is small enough to sketch:
POST /auth/tokenwith client credentials; the reply is a bearer token, good for a day, carried on everything after.GET /leagues/{id}/packets?unread=true— the server lists what is waiting, knowing who you are from the token.GETeach one into the inbound directory.PUTeach outbound packet asapplication/octet-stream, then delete or file the local copy.The detail worth copying rather than the shape: a filename from the server becomes a path on your disk, so it is reduced to a basename, rejected if that differs from what arrived, and then required to match a known pattern. That check happens twice.
In Go this is
net/httpandencoding/jsonwith no dependencies. IB would define its own endpoints — there is no existing league to be compatible with — so the numeric board index and filename convention nova-hub uses are not inherited, and identity stays inside the packet.The cost is the credential and the client. IB would listen on nothing, so the exposure is narrow: keep the secret safe, and treat every response as coming from a host that might be compromised.
Questions
An answer that ends in "use the thing that already exists" is a fine answer.
All reactions