Vai al contenuto
ShadowMC

Configurazione

ShadowLogin

Registrazione, password, sessioni, dispositivo fidato, verifica in due passaggi, antibot.

Premium v1.0.4

Dove sono i file

plugins/ShadowLogin/

Il plugin li crea al primo avvio e li aggiorna da solo alle nuove versioni, senza toccare le tue modifiche.

Applicare le modifiche

/shadowlogin reload

Rilegge i file senza riavviare il server.

Cosa c’è dentro

4 file · 117 impostazioni

Da dove partire: config.yml

Impostazioni

I file che decidono come si comporta il plugin. Si parte da qui.

config.yml

Impostazioni generali
111 impostazioni
plugins/ShadowLogin/config.yml
Note del file

Ogni valore qui contiene già il numero giusto per un server normale: puoi mettere il jar e non aprire mai questo file. Quando hai davvero bisogno di cambiare qualcosa, il commento sopra ogni chiave dice COSA fa e, cosa ancora più importante, PERCHÉ è impostata così.

Un valore sbagliato non blocca mai il plugin: al suo posto si usa il predefinito e la console stampa il percorso e cosa ci si aspettava.

Con un aggiornamento i tuoi file vengono portati automaticamente alla nuova versione: ogni valore che hai cambiato viene riportato, le nuove opzioni arrivano con i loro commenti, i file vecchi vengono tenuti in backup/<date>/, e se qualcosa richiede la tua attenzione troverai PORTING-<version>.txt nella cartella del plugin.

Le durate si scrivono in testo semplice: 500ms, 20t (tick), 30s, 5m, 2h30m, 7d. Un numero da solo indica i secondi.

Questo file è in inglese apposta - chiavi, sezioni e commenti - così che un server in qualunque parte del mondo legga la stessa configurazione. Solo ciò che vede un giocatore viene tradotto, e quello sta in lang/.

config-version6

Licenza

ShadowLogin è un plugin Premium: non esiste un'edizione gratuita. Senza una licenza valida all'avvio NON gira - niente database, niente login, nient'altro che i comandi della licenza qui sotto - e lo dice in console. Attiva la licenza, poi riavvia il server.

Continua a leggere

Finché non gira, un server che non verifica da sé i giocatori (offline mode, senza un proxy in online mode che gli inoltri le connessioni) RIFIUTA OGNI CONNESSIONE: senza il suo plugin di login chiunque potrebbe entrare con qualsiasi nome, compreso quello di un operatore. In online mode, o dietro un proxy in online mode, i giocatori entrano normalmente.

Una licenza che smette di valere mentre il server è acceso non ferma mai il plugin a metà sessione: chiuderebbe fuori tutti o farebbe entrare tutti. La sessione va avanti, e la console dice che ShadowLogin non partirà al prossimo riavvio.

Normalmente qui non tocchi nulla: una chiave si attiva in gioco con

/shadowlogin license claim <purchase-code>
/shadowlogin license activate <key>

e viene scritta in license.yml, che sta fuori da questo file apposta: una config si manda al supporto, una licenza no.

license4 chiavi

LA CHIAVE VIVE IN license.yml (stessa cartella di questo file), oppure nel file centrale plugins/ShadowControl/licenses.yml per tutta la suite. La 'key' qui sotto è solo un ripiego per i sistemi di deploy che generano config.yml: lasciala vuota.

La chiave NON sta qui: sta in license.yml, in questa cartella, creato al primo avvio (oppure in plugins/ShadowControl/licenses.yml per tutta la suite). Solo se preferisci tenerla qui invece che in license.yml. Funzionano anche la variabile d'ambiente SHADOWLOGIN_LICENSE e la proprietà di sistema -Dshadowlogin.license=... .

grace-days7

Giorni di tolleranza, con funzionamento normale, prima che la licenza smetta di valere quando un abbonamento scade o quando l'indirizzo del server non corrisponde alla licenza. Un rinnovo è quasi sempre già stato avviato, e un indirizzo che smette di corrispondere è molto più spesso un NAT che un ladro.

server-ip""

L'indirizzo con cui è conosciuto questo server, se lo sai. Dietro un proxy la macchina non vede mai il proprio dominio, e questa riga è l'unico modo per dirglielo senza chiamare nessuno.

resolve-public-iptrue

Una chiamata all'avvio al servizio licenze (activation-url + /ip) per scoprire l'indirizzo pubblico di questo server: dietro NAT è l'unico modo per riconoscerlo. Solo con una licenza installata: un server senza chiave non chiede niente a nessuno. false = non chiedere mai.

activation-url'https://shadow-licences.riccardobotins.workers.dev'

Servizio di attivazione. Questo è l'indirizzo BASE: il plugin aggiunge da solo /claim e /check. Vuoto significa verifica completamente offline.

Sicurezza

La parte che non si cambia alla leggera. I valori predefiniti vanno bene per il novanta per cento dei server; ogni volta che ne abbassi uno stai scambiando sicurezza con comodità, e il commento ti dice quanto costa.

security7 chiavi
security.hash2 chiavi
cost12

Il fattore di costo di BCrypt. Ogni +1 RADDOPPIA il tempo necessario.

Continua a leggere
10 -> circa 60 ms      un po' scarso nel 2026
12 -> circa 250 ms     il valore consigliato
14 -> circa 1 secondo  per pochi giocatori e molta preoccupazione

Il tempo lo paga chi fa login (una volta) e chi attacca (per ogni singolo tentativo, moltiplicato per milioni). È tutto qui il motivo per cui qui non si usa SHA-256: è veloce, e "veloce" è esattamente il regalo che non vuoi fare a chi ruba un database.

ATTENZIONE su un server con centinaia di connessioni al minuto: l'hashing gira fuori dal thread di gioco, quindi non ti costa mai tick, ma occupa un thread per tutto il tempo che dura. Sopra 13, su un server molto trafficato, misura.

rehash-on-logintrue

Quando alzi il costo qui sopra, gli account esistenti hanno ancora il vecchio hash. Con questa opzione ogni password viene ricalcolata al nuovo costo al prossimo login del suo proprietario: nessuno deve fare niente, e in pochi giorni tutto il database è aggiornato.

Non funziona mai al contrario: se abbassi il costo, gli hash più robusti restano come sono.

security.password5 chiavi
min-length6

Lunghezza minima. Sei è il compromesso onesto per un server Minecraft: sotto viene indovinata, sopra la gente la scrive su un post-it o ne riusa una di un altro sito.

max-length64

Il massimo NON è severità: BCrypt guarda solo i primi 72 byte, quindi oltre quel punto i caratteri smettono di contare. Il plugin lo dice invece di lasciartelo scoprire il giorno in cui cambi la fine di una frase molto lunga e quella vecchia funziona ancora.

require-letter-and-digitfalse

Richiede una lettera E una cifra. Disattivato di default, e non è una svista: le regole complicate producono password peggiori ("Marco1", "Password1") e non fermano nessuno. Se lo attivi, sappi cosa hai comprato.

forbid-name-as-passwordtrue

Vieta una password identica al nome del giocatore. Questa sì, perché è la prima cosa che prova chiunque.

forbidden
[password, 123456, 12345678, qwerty, minecraft, abc123, 111111, letmein, iloveyou]+6

Password che non si possono usare. Sono le prime voci di qualsiasi dizionario: bloccarle non costa nulla ed elimina metà dei furti di account su un server Minecraft.

Aggiungi il nome del tuo server: è sempre nella lista di un attaccante.

security.attempts7 chiavi
max5

Quanti tentativi prima di essere espulsi. Cinque è generoso per chi ha davvero sbagliato a digitare e stretto per chi tira a indovinare.

window"10m"

Dopo quanto tempo un errore viene dimenticato. Chi ha sbagliato una volta il mese scorso non dovrebbe portarselo dietro.

backoff-base"5s"

L'attesa dopo il primo errore, che poi RADDOPPIA a ogni errore successivo: 5s, 10s, 20s, 40s... fino al tetto qui sotto.

Continua a leggere

Questa è la difesa che conta davvero. Un limite fisso di cinque tentativi si aggira aspettando il reset; un'attesa che raddoppia porta un dizionario da tre tentativi al secondo a tre all'ora, cioè un attacco che non finisce mai.

I tentativi si contano per INDIRIZZO e per NOME, entrambi. Contare solo il nome lascia passare chi prova "123456" su mille nomi diversi; contare solo l'indirizzo lascia passare una botnet su un solo account.

backoff-max"10m"
lock-after10

Dopo quanti errori l'account viene bloccato del tutto, e per quanto tempo.

lock-duration"30m"
kick-on-maxtrue

Se espellere chi ha esaurito i tentativi. Attivo: chi sta indovinando password deve riconnettersi ogni volta, e riconnettersi passa per i limiti dell'antibot.

security
login-timeout"60s"

Quanto tempo c'è per fare login prima di essere espulsi. Serve soprattutto contro chi apre connessioni e le lascia lì a occupare uno slot.

reminder-every"5s"

Ogni quanto ricordare a chi aspetta cosa deve fare. Cinque secondi bastano per farsi notare senza diventare fastidiosi.

clear-chat-after-authtrue

Dopo il login, spinge fuori dallo schermo ciò che è stato scritto.

ONESTAMENTE: nessun plugin può cancellare la cronologia locale del client - la freccia su riporterà comunque il comando scritto, ed è un limite del gioco, non una svista. Questo toglie subito la riga dalla vista, così non resta lì mentre qualcuno guarda lo schermo.

Se la cosa ti preoccupa davvero, la risposta è login.input: GUI: con il tastierino a schermo la password non passa mai per la chat.

clear-chat-lines30

Account ufficiali (Mojang / Microsoft)

La funzione per cui esiste questo plugin. Leggi almeno i primi due paragrafi prima di cambiare qualcosa qui sotto.

Continua a leggere

LA DOMANDA GIUSTA. Non è "questo nome appartiene a un account comprato?" - questo non dice nulla su chi sta bussando adesso, e far entrare senza password chiunque scriva un nome ufficiale significherebbe consegnare ogni account comprato del server. La domanda giusta è: "questa sessione è GIÀ stata autenticata da Mojang?"

A cui si può rispondere con i fatti, senza toccare un solo pacchetto:

1. il server è in online-mode -> sì, l'ha fatto il server;
2. l'UUID della sessione è quello vero di Mojang per quel nome -> allora arriva
   da monte, cioè dal proxy che ha autenticato la persona,
   perché un client non può sceglierselo da solo.

IL CASO 2 DIPENDE DA COME È CONFIGURATO IL TUO NETWORK. Se l'inoltro dell'identità dal proxy non è protetto (porta del server aperta al mondo, o il vecchio forwarding di BungeeCord senza un segreto condiviso), chiunque può connettersi direttamente e dichiarare l'UUID che vuole. Non è un difetto di questo plugin e nessun plugin può ripararlo dall'interno: è un server che si può aggirare. Imposta trust-proxy-authentication: false se non sei sicuro del tuo network.

premium9 chiavi
enabledtrue

Disattiva tutto il capitolo: nessuna chiamata a Mojang, password per tutti.

modeAUTO
AUTO = una sessione già autenticata entra senza password.
OFF  = nessuno salta la password, ma la protezione dei nomi resta attiva.
Continua a leggere

Con AUTO questo vale PER SEMPRE e non ha scadenza: un account ufficiale viene riverificato da Mojang a ogni singola connessione, quindi non c'è nulla da ricordare e nulla che possa scadere. Quei giocatori non vedono mai più la schermata di login - né dopo un riavvio, né dopo un mese, né da un nuovo computer. Funziona finché è vera una di queste due condizioni:

- il server è in online-mode, oppure
- il server sta dietro un proxy con il forwarding configurato, e
  trust-proxy-authentication qui sotto è attivo.

Su un semplice server in offline-mode senza un proxy davanti non c'è modo di verificare nessuno, e tutti scrivono una password. Non è un limite di questo plugin: è ciò che significa offline-mode.

trust-proxy-authenticationtrue

Se fidarsi dell'UUID che arriva da un proxy. Leggi il paragrafo sopra: se lo lasci attivo, assicurati che il tuo server sia raggiungibile SOLO attraverso il proxy. Si applica solo quando questo server ha davvero il proxy forwarding attivo (paper-global.yml proxies.velocity.enabled, oppure spigot.yml settings.bungeecord) e quel proxy è dichiarato in online-mode (proxies.velocity.online-mode / proxies.bungee-cord.online-mode). Senza forwarding nessun UUID arriva da un proxy, e nessuno viene considerato affidabile.

force-passwordfalse

Chiede la password anche a chi Mojang ha già autenticato. Per chi vuole due barriere invece di una: è meno comodo ed è più sicuro, ed è una scelta legittima per un server con rank costosi.

protect-namestrue

Impedisce che il nome di un account reale venga registrato da una sessione non autenticata.

Questa è la protezione più importante di tutto il capitolo. Senza di essa chiunque può connettersi con il nome di un giocatore ufficiale prima che il proprietario arrivi, registrarlo con una password sua, e da quel momento è quel giocatore: è il furto più comune sui server misti.

lookup-timeout"3s"

Quanto aspettare la risposta di Mojang. Tre secondi sono generosi: l'attesa cade nel mezzo di una connessione, e un secondo in più lo sente chi sta entrando.

cache-hours72

Per quante ore ricordare una risposta. Un nome comprato resta comprato; un nome libero comprato oggi viene scoperto al massimo entro tre giorni. Alzarlo riduce le chiamate, abbassarlo le aumenta.

on-lookup-failureCACHE_THEN_PASSWORD

Cosa fare quando Mojang non risponde (succede: hanno avuto interruzioni durate ore). In nessun caso qualcuno viene bloccato all'ingresso.

CACHE_THEN_PASSWORD = usa l'ultima risposta nota, altrimenti chiede la
                      password (consigliato)
PASSWORD            = chiede semplicemente la password
api-url"https://api.mojang.com/users/profiles/minecraft/"

L'indirizzo del servizio. Cambialo solo se usi un mirror.

Identità - leggi questo capitolo per intero

Su un server che accetta anche account non ufficiali, LO STESSO NOME PUÒ ARRIVARE CON DUE UUID DIVERSI. Chi ha comprato il gioco porta con sé l'UUID di Mojang; chi non l'ha fatto ne riceve uno calcolato dal nome, e i due non coincidono mai.

Continua a leggere

Minecraft tiene inventario, progressi, posizione e tutto il resto PER UUID. Sbagliare questa impostazione significa dare l'inventario di un giocatore a un altro. Non è un caso da manuale: è esattamente quello che succede a chi un giorno mette un proxy davanti al proprio server.

UUID (predefinito)

Un account per UUID. Il "Marco" ufficiale e il "Marco" non ufficiale sono
due account separati, con due password e due inventari - che è
anche quello che farà comunque il server, così il plugin non racconta
una storia diversa da quella vera. Da solo non basta: è
premium.protect-names che impedisce al secondo dei due di nascere.

NAME

Un account per nome, come AuthMe e come quasi ogni server esistente.
L'UUID visto alla registrazione viene comunque salvato, e se un giorno ne arriva
un altro con lo stesso nome, si applica on-uuid-mismatch qui sotto.

Se stai importando da AuthMe, NAME è quello che ti aspetti. Se stai partendo da zero, lascia UUID.

identity3 chiavi
modeUUID

Una persona, un'identità - leggi qui se il tuo server è misto

identity
unify-uuid"OFF"

IL PROBLEMA, con l'esempio che succede davvero. Marco entra con il gioco originale, riceve l'UUID di Mojang e costruisce un'isola. Il giorno dopo entra da un client non ufficiale con lo stesso nome: quell'UUID è diverso, quindi per il server è UN'ALTRA PERSONA. Nuova isola, inventario vuoto, niente soldi. Marco non capisce, e ha ragione a non capire: è sempre Marco.

Continua a leggere

La cosa importante da capire è che questo non è un problema di login. L'isola, l'inventario, i soldi e i permessi sono gestiti da ALTRI plugin, e ognuno di loro si basa sull'UUID. Quindi non basta che questo plugin tenga in ordine casa propria - tutto il server deve vedere un solo UUID. È questo che fa questa impostazione, ed è l'unico punto in cui ShadowLogin cambia qualcosa che non è suo.

OFF      = non cambia nulla (predefinito). Ufficiale e non ufficiale restano due
           persone diverse, con due account, due isole e due
           inventari - che è anche quello che farebbe il server
           da solo. Giusto per un server in cui i due non si mescolano mai.
OFFLINE  = tutti ricevono l'UUID calcolato dal nome, compresi i
           giocatori ufficiali. CONSIGLIATO su un server misto, e il
           motivo è che non dipende da nessuno: quell'UUID si
           ricava dal nome con un calcolo, sempre lo stesso,
           senza chiedere niente a nessun servizio. Un UUID che cambia
           perché Mojang è stato giù cinque minuti è un'isola persa.
PREMIUM  = tutti ricevono il vero UUID di Mojang, quando il nome ne ha uno.
           Per i server che hanno già dati creati in online-mode
           e non vogliono perderli. Costa una dipendenza: se
           Mojang non risponde per un nome mai visto prima, il
           plugin NON tira a indovinare - rifiuta la connessione con
           "riprova tra un minuto". Far entrare qualcuno con
           l'UUID sbagliato non è un fastidio come riscrivere una
           password: è finire sull'isola di nessuno e costruirci
           sopra.

ATTENZIONE se il server ha già dei dati. Attivarla significa che le persone ricevono un nuovo UUID, e tutto ciò che è salvato sotto quello vecchio resta dov'è e smette di essere raggiungibile. Su un server nuovo non c'è nulla di cui preoccuparsi. La console lo segnala a chiare lettere all'avvio.

E UNA COSA CHE VA DI PARI PASSO: con gli UUID unificati, un account nato da un login ufficiale non ha ancora una password, e senza password non c'è modo di entrare da un client non ufficiale. È voluto - è ciò che impedisce a un estraneo di reclamare il nome. Il proprietario entra con il gioco originale una volta e imposta una password con /changepassword; da lì in poi entrambi i client aprono lo stesso account, con la stessa isola. Il plugin glielo dice da solo la prima volta.

Tra virgolette apposta. In YAML, OFF e ON non sono parole: sono booleani. Il plugin capisce comunque entrambe le scritture - ritraduce un booleano nella parola che hai scritto - ma le virgolette dicono cosa intendevi, e mantengono il file leggibile da qualsiasi altra cosa lo analizzi.

on-uuid-mismatchDENY

Cosa fare quando il nome è giusto ma l'UUID no.

DENY         = rifiuta la connessione e lo scrive in console
               (consigliato: è esattamente il caso pericoloso)
ASK_PASSWORD = lascia provare con la password, senza nessuna scorciatoia
               (utile mentre stai cambiando la configurazione del network e
               sai cosa stai facendo)
ALLOW        = adotta il nuovo UUID come quello dell'account
               (solo per una migrazione, e solo per il tempo necessario)

Sessione

Chi si riconnette dallo stesso indirizzo entro N minuti non riscrive la password. Questa è la funzione che decide se il tuo plugin di login è amato o odiato: senza, chiunque abbia una connessione ballerina scrive la password dieci volte a sera.

session3 chiavi
enabledtrue
duration"30m"

Quanto dura. Mezz'ora copre una disconnessione, un riavvio del server e un salto tra server in un network; diverse ore iniziano a essere una vera finestra per chi si siede al computer di un'altra persona.

require-same-iptrue

Lega la sessione all'indirizzo. Lascialo attivo: senza, una sessione sarebbe valida da qualunque parte del mondo, e a quel punto la password servirebbe esattamente una volta, per sempre.

Continua a leggere

ATTENZIONE - ed è il vero limite di qualsiasi sessione legata all'indirizzo: se due persone condividono lo stesso indirizzo pubblico (la stessa casa, la stessa scuola, o una rete mobile, dove migliaia di utenti escono da un solo indirizzo) allora dentro la finestra della sessione una può entrare con il nome dell'altra senza scrivere nulla.

Non è un difetto di questo plugin: è ciò che significa "stesso indirizzo". Se il tuo server ha molti giocatori su reti mobili, la difesa è accorciare la durata qui sopra (cinque minuti coprono ancora una disconnessione) o disattivare del tutto le sessioni con enabled: false.

Dispositivo attendibile ("ricordami") [Premium]

PER CHI È. Non per i giocatori con un account Minecraft ufficiale: loro non scrivono mai una password, perché Mojang dice chi sono a ogni singola connessione, per sempre. Offrire loro un token aggiungerebbe una chiave in più che si può rubare, per una porta che è già aperta senza chiave - quindi il plugin non glielo offre proprio.

Continua a leggere

Questo è per gli ALTRI giocatori, quelli senza un account ufficiale. Per loro una password è l'unica prova che esiste, e scriverla ogni sera è il motivo per cui la gente va a giocare altrove. Con questo, la scrivono una volta su un computer e poi non più per una settimana.

COME FUNZIONA, in una riga: dopo un login con password il server consegna al client 32 byte casuali (un "token") e tiene nel database solo la sua impronta SHA-256. Alla connessione successiva il client lo presenta, l'impronta corrisponde, e non viene chiesta nessuna password.

PERCHÉ NON È UNA FALLA - ed è la parte che vale la pena leggere:

1. Il token viene SOSTITUITO a ogni utilizzo. Ogni login ne emette uno nuovo e

quello vecchio smette di aprire qualsiasi cosa. La fiducia si rinnova a ogni uso, quindi
la settimana conta dall'ultima volta che sei entrato, non dalla prima.

2. Quello vecchio viene RICORDATO per un momento (vedi rotation-grace). Se

ricompare dopo quel momento, allora ne esistono due copie al
mondo - e la seconda non l'ha fatta il proprietario. È un
furto, e il plugin lo tratta come tale: la fiducia viene revocata su OGNI
dispositivo di quell'account in un colpo solo, così il ladro perde anche l'accesso
che aveva già, e il proprietario se ne accorge subito perché la
password viene richiesta di nuovo.

3. Solo una password ne emette uno. Non una sessione ripresa, non un login

ufficiale, non un ingresso forzato dallo staff. Chi si siede al computer
di un'altra persona mentre è collegata non si porta via nulla.

4. La fiducia muore quando cambia qualcosa: password cambiata, password reimpostata

dallo staff, codice di recupero emesso, /logout, account eliminato.

5. Il token non è mai nel database, solo la sua impronta. Un dump del

database non fa entrare nessuno, esattamente come con le password.

6. Non è la password: non può cambiarla, non può leggerla, e non

salta l'autenticazione a due fattori.

È lo stesso schema che i sistemi seri usano per i refresh token. Non rende impossibile rubare un token da un computer su cui hai messo le mani - niente lo rende impossibile - ma fa sì che quel furto valga esattamente un login, e che sia impossibile nasconderlo.

COSA NON PUÒ FARE IL TOKEN, E COSA SI FA A RIGUARDO. Minecraft tiene i cookie nella MEMORIA del gioco, non su disco: chiudi il gioco e il token sparisce. Su alcune configurazioni non arriva nemmeno - un proxy vecchio, un client che non risponde in tempo, un server con accepts-transfers disattivato. Il risultato pratico di affidarsi solo al token è un "ricordami" che non ricorda quasi mai, il che è peggio che non averlo: la gente lo clicca e si ritrova comunque la schermata della password.

Per questo un dispositivo ricordato è ancorato a una seconda cosa che sopravvive a tutto questo: l'INDIRIZZO da cui è stato attivato. Vedi "anchor" qui sotto. È una prova più debole - chi condivide il tuo indirizzo, nella stessa casa o dietro lo stesso operatore, sembra esattamente te - ed è una scelta che fai consapevolmente. Ma è una prova che c'è sempre, mentre l'altra spesso no.

Le due convivono: quando il token arriva vince lui, ed è meglio così. Quando non arriva, ci pensa l'indirizzo, e la funzione continua a fare ciò che il giocatore si aspetta.

SE HAI UN PROXY (Velocity, BungeeCord, Waterfall): il cookie appartiene alla connessione tra il client e l'indirizzo a cui si è connesso, cioè il proxy. Quindi ogni server dietro lo stesso proxy vede lo stesso cookie.

- Database condiviso (MySQL/MariaDB): il caso migliore. Rendi attendibile un dispositivo una volta
  e vale su tutto il network.
- Database separati: il token di un server non corrisponde a nessuna riga sull'altro
  e viene ignorato. Nessuno si intrufola, nessuno resta chiuso fuori.
- Vuoi che i server non vedano nemmeno il cookie l'uno dell'altro? Dai a ognuno un
  cookie-name diverso qui sotto.
trusted-device10 chiavi
enabledtrue
automaticfalse

Automatico, o su richiesta.

false = dopo il login compare un pulsante [ RICORDAMI ] e il giocatore
        decide (consigliato: la fiducia si concede, non si impone)
true  = un token viene emesso da solo a ogni login con password
duration"7d"

Quanto vale un token, contato dall'ultima volta che è stato usato - così un giocatore che torna ogni sera non incontra mai la schermata di login, e un computer che qualcuno ha smesso di usare smette di essere attendibile una settimana dopo.

anchorADDRESS

A cosa è ancorato un dispositivo ricordato quando il client non restituisce il token. È l'impostazione che decide se la funzione funziona davvero sul tuo server.

Continua a leggere
ADDRESS = prima il token; se non arriva, viene accettato al suo posto l'indirizzo da cui
          il dispositivo è stato attivato. CONSIGLIATO, e il
          predefinito: sopravvive alla chiusura del gioco e al riavvio del
          server, che è ciò che un giocatore intende con "ricordami".
          Il prezzo: chiunque condivida quell'indirizzo è indistinguibile
          dal proprietario finché dura la fiducia. Su una connessione
          di casa è la famiglia; dietro un operatore mobile possono essere
          migliaia di persone. Accorcia "duration" se questo ti preoccupa.
COOKIE  = il token e nient'altro. Più sicuro, e molto più fragile:
          chiudere il gioco significa riscrivere la password, e su alcune
          configurazioni significa scriverla ogni singola volta.

Se vuoi che la strada del token funzioni il più spesso possibile, imposta accepts-transfers=true in server.properties: i cookie appartengono alla stessa famiglia di pacchetti, e alcuni client senza di esso non rispondono.

rotation-grace"2m"

Per quanto tempo il token appena sostituito viene ancora accettato.

Continua a leggere

Esiste per un caso reale: la connessione cade tra il momento in cui il server sostituisce il token e il momento in cui il client riceve quello nuovo. Dentro questa finestra quello vecchio funziona ancora; fuori, presentarlo significa che ne esistono due copie, e la seconda non l'ha fatta il proprietario.

Tienila breve. Ogni secondo qui è un secondo in cui una copia rubata verrebbe ancora accettata come un onesto nuovo tentativo.

require-same-ipfalse

Lega un dispositivo ricordato all'indirizzo da cui è stato emesso.

Disattivato di default, e apposta: tutto il senso di questa funzione è NON dipendere dall'indirizzo, che cambia da solo (dati mobili, un riavvio del router) ed è condiviso da tutti nella stessa casa. Attivalo solo se i tuoi giocatori hanno indirizzi stabili e vuoi una seconda serratura.

max-per-account3

Quanti computer diversi può ricordare un account. Il più vecchio esce quando arriva il numero N+1.

skips-two-factorfalse

Se un dispositivo attendibile salta anche l'autenticazione a due fattori.

Lascialo false: il token dimostra che il computer è quello solito, non che davanti c'è la persona giusta. Sono due domande diverse, e chi ha attivato un secondo fattore le ha chieste entrambe.

read-timeout"1500ms"

Quanto aspettare la risposta del client DURANTE la connessione. Questa è la strada veloce, e mentre aspetta tiene occupato un thread di rete, quindi resta breve apposta.

Continua a leggere

Non è l'unica strada: se non arriva nessuna risposta in tempo, il plugin chiede di nuovo una volta che il giocatore è nel mondo, dove non si blocca nulla e non c'è fretta. Quella seconda richiesta è ciò che fa funzionare "ricordami" su client lenti, proxy vecchi e versioni che non conoscono i cookie - non devi configurare nulla per averla.

Autenticazione a due fattori

Opzionale, e attivata da chi la vuole, sul proprio account. È per i pochi account che valgono qualcosa: staff, chi ha comprato rank, chi ha una base piena di roba. Imporla a tutti la fa disattivare dai giocatori nel modo più semplice che c'è: andando a giocare da un'altra parte.

two-factor4 chiavi
enabledtrue
issuer"ShadowLogin"

Il nome mostrato nell'app di autenticazione. Metti qui il nome del tuo server: chi ha venti voci nella propria app deve capire quale sei tu.

window1

Quanti codici accettare prima e dopo quello attuale (uno = un minuto e mezzo in totale). Serve per gli orologi non sincronizzati. Alzarlo moltiplica i codici validi in ogni istante: se ti serve più di 1, il problema è l'orologio del server.

backup-codes8

Quanti codici di backup consegnare. Servono per il giorno in cui si rompe il telefono: senza, quel giorno l'account è perso.

Recupero

recovery2 chiavi
recovery.question1 chiave
enabledtrue

La domanda di sicurezza, impostata dal giocatore.

recovery.staff-code2 chiavi
length8

Il codice che un operatore genera con /shadowlogin resetpassword. Questa è la strada onesta: un amministratore riconosce la persona e le consegna un token temporaneo, invece di entrare nell'account al posto suo.

valid-for"15m"

Limbo - dove si sta prima di aver fatto login

Un cielo vuoto e un messaggio. Chi non ha scritto la password non vede nulla e non fa nulla: niente chat, nessun comando oltre a quelli di login, nessun movimento oltre un raggio, niente inventario, nessuna posizione reale. Tutto ciò che gli lasci vedere è un'informazione regalata a chi sta cercando di entrare nell'account di un altro.

limbo8 chiavi
enabledtrue
use-spawntrue

Usa lo spawn del mondo del giocatore, alzato all'altezza qui sotto. Disattivalo per usare la posizione fissa in location.

limbo.location6 chiavi
world""
x0.5
y320

Trecentoventi blocchi: sopra le nuvole non c'è niente da guardare, e da lassù non si capisce nemmeno in che parte della mappa ci si trova.

z0.5
yaw0
pitch0
limbo
radius3

Di quanti blocchi ci si può muovere. Non zero: bloccare del tutto il movimento fa fare al client il "rubber-band" e lo schermo trema. Tre blocchi permettono a client e server di restare d'accordo.

hide-playerstrue

Nasconde chi aspetta a tutti gli altri, e tutti gli altri a lui. Così la schermata di login non si può usare per spiare chi è online.

blindnesstrue

Cecità: il cielo vuoto di cui sopra.

hide-inventorytrue

Mette da parte l'inventario e lo restituisce dopo il login.

Lo snapshot viene scritto nel database PRIMA di svuotare qualsiasi cosa, e se quella scrittura fallisce l'inventario non viene toccato affatto. Così un crash improvviso del server non costa nulla a nessuno: al primo login dopo il riavvio tutto torna dov'era.

freeze-hungertrue

Niente fame durante l'attesa.

Antibot

Un attacco bot non prova password: apre connessioni. Trecento client finti al secondo, ognuno con un nome inventato, ognuno che occupa uno slot e una riga nel database. Il server non crolla per il carico di gioco: crolla perché ogni connessione costa una lettura e una scrittura.

antibot7 chiavi
enabledtrue
max-connections-per-ip3

Quante connessioni simultanee da un indirizzo. Tre fanno passare una famiglia con tre fratelli e fermano una botnet su un singolo indirizzo.

SE SEI DIETRO UN PROXY SENZA INOLTRO DELL'INDIRIZZO REALE, questo numero vale per TUTTO IL SERVER INSIEME: leggi il capitolo "proxy" qui sotto. Il plugin se ne accorge da solo e te lo dice in console.

max-registrations-per-ip2

Quante registrazioni da un indirizzo dentro la finestra. Questo è il limite che conta di più: creare account è l'unica cosa che un bot può fare che RESTA dopo che se n'è andato.

registrations-window"24h"
antibot.join-rate2 chiavi
connections8

Sopra questo numero di connessioni dentro la finestra, il plugin capisce che sta succedendo qualcosa. Otto in cinque secondi sono molte più di quante ne veda un server normale, anche pieno.

window"5s"
antibot.adaptive3 chiavi
enabledtrue

La modalità rigorosa si attiva da sola sopra la soglia qui sopra, e per qualche minuto entra solo chi ha già un account.

Continua a leggere

Questa è la difesa che vale più di tutte le altre messe insieme, perché un'ondata di bot è fatta al cento per cento di nomi mai visti prima - e i tuoi giocatori non si accorgono nemmeno che sta succedendo.

Si attiva da sola perché un attacco arriva alle quattro del mattino, e un interruttore da azionare a mano viene azionato venti minuti dopo.

(Fa parte dell'edizione Premium. Le soglie fisse qui sopra valgono per tutti, con o senza licenza.)

duration"5m"
block-registrationstrue

Durante la modalità rigorosa, blocca anche le nuove registrazioni.

antibot
name-pattern"^[A-Za-z0-9_]{3,16}$"

La forma che deve avere un nome. Il predefinito è esattamente ciò che Minecraft consente: da 3 a 16 lettere, cifre e underscore.

ATTENZIONE se hai giocatori Bedrock tramite Geyser: i loro nomi hanno un prefisso (di solito un punto) e sono più lunghi. In quel caso usa:

"^[.A-Za-z0-9_ ]{3,20}$"

Proxy - leggi qui se hai un BungeeCord o un Velocity davanti

Dietro un proxy, l'indirizzo che vede il server è quello del PROXY, non quello del giocatore. Senza forwarding configurato, tutti i tuoi giocatori sembrano connessi dallo stesso indirizzo, e quindi:

- i limiti per indirizzo dell'antibot bloccano i giocatori veri;
- le sessioni per indirizzo diventano un'unica sessione per tutti.
Continua a leggere

La soluzione NON è in questo file: è nel proxy.

Velocity   -> modern forwarding, più paper-global.yml con
              proxies.velocity.enabled: true e il segreto giusto
BungeeCord -> ip_forward: true, e il server raggiungibile SOLO dal
              proxy (firewall!), perché quel forwarding non è
              autenticato

Il plugin controlla da solo se arrivano molti nomi diversi da un solo indirizzo e, in quel caso, te lo dice in console una volta.

proxy1 chiave
use-forwarded-addresstrue

Usa l'indirizzo dichiarato dal proxy (quello reale del giocatore). Impostalo a false solo se NON ti fidi del tuo forwarding: in quel caso tutti sembreranno arrivare dallo stesso indirizzo. Con il forwarding attivo e questa opzione a false il plugin lo sa, e disattiva tutto ciò che si basa sull'indirizzo: i limiti per indirizzo (varrebbero per tutto il server), le sessioni legate all'indirizzo e i dispositivi ricordati per indirizzo (farebbero entrare chiunque scriva il nome).

Come si accede

login3 chiavi
inputBOTH
CHAT = solo /login e /register
GUI  = solo il tastierino a schermo
BOTH = entrambi, e sceglie il giocatore
Continua a leggere

Il tastierino esiste perché un comando scritto in chat è leggibile da chiunque guardi lo schermo, e un plugin non può cancellare la cronologia del client. Con la GUI clicchi e compaiono dei puntini.

Un PIN è più debole di una password lunga e non ha senso fingere il contrario: sei cifre sono un milione di combinazioni. Regge perché i tentativi vengono contati e rallentati - al decimo errore l'account viene congelato per mezz'ora, e un milione di tentativi a quel ritmo sono secoli.

login.gui3 chiavi
open-on-joinfalse

Apre da solo il tastierino all'ingresso. Disattivato di default: chi è abituato a scrivere /login si ritroverebbe una finestra in faccia.

pin-length6

Quante cifre ha il PIN. Non scendere sotto sei.

click-delay"120ms"

Attesa minima tra due clic, contro i bot che cliccano.

login
hide-join-message-until-logintrue

Non annunciare "Marco è entrato" prima che Marco abbia scritto la password: chi è entrato è qualcuno che ha scritto il nome Marco. Il messaggio viene inviato dopo il login, e se il login non avviene non viene inviato affatto.

Salvataggio dati

storage5 chiavi
table-prefix"sl_"

Il prefisso delle tabelle. Cambialo se due server condividono un database ma NON devono condividere gli account.

storage.mysql7 chiavi
enabledfalse

Un MySQL o MariaDB esterno. Offre una cosa sola, e vale la pena solo per quella: in un network, una registrazione fatta su un server vale su tutti gli altri.

(Fa parte dell'edizione Premium. Senza licenza il plugin resta sul database locale, con tutti i suoi dati, e lo dice in console.)

host"127.0.0.1"
port3306
database"shadowlogin"
username"root"
password""
parameters"useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&characterEncoding=utf8"
storage
fallback-to-localtrue

Se MySQL non risponde, parte sul database locale invece di non partire. Attivo: un plugin di login che non parte è un server chiuso.

storage.h21 chiave
auto-serverfalse

Permette a un altro processo di aprire lo stesso file H2. Utile solo se sai perché ti serve.

storage.pool5 chiavi
maximum-pool-size10
minimum-idle2
connection-timeout-ms10000
idle-timeout-ms600000
max-lifetime-ms1800000

Messaggi

messages3 chiavi
default-locale"en_US"

La lingua predefinita. I file stanno in lang/: il plugin include en_US e it_IT, e viene caricato anche un file che aggiungi lì.

follow-client-localetrue

Segue la lingua che ogni giocatore ha impostato nel proprio client.

auto-updatetrue

Porta i file di lingua alla nuova versione quando il plugin viene aggiornato: arrivano i testi nuovi, i testi che hai cambiato restano tuoi, e il file precedente viene tenuto in backup/<date>/. Con false i file in lang/ non vengono mai riscritti, e un testo che vi manca viene letto dalla copia dentro il jar.

compatibility1 chiave
section-color-codestrue

Accetta il carattere di sezione oltre a & nei codici colore.

Integrazioni

(tutte opzionali, tutte disattivate da sole se manca l'altro pezzo)

integrations4 chiavi
refuse-other-login-pluginstrue

Non parte se è installato un altro plugin di login.

Due plugin che gestiscono l'ingresso non si sommano: si intralciano a vicenda, e il risultato non è "più sicuro" ma INDEFINITO. Lascialo attivo.

integrations.shadowcontrol2 chiavi
reportstrue

Le registrazioni sospette e i tentativi ripetuti diventano una segnalazione nel pannello. Nessuna password e nessun segreto finisce mai lì dentro: solo cosa è successo e a chi.

report-seconds60
integrations.shadowessentials1 chiave
spawn-after-logintrue

Teletrasporta allo spawn dopo il login, e non prima: prima vorrebbe dire mostrare lo spawn a qualcuno che non ha ancora dimostrato di essere chi dice di essere.

integrations.shadowpermissions1 chiave
hold-until-logintrue

I permessi vengono ricalcolati dopo il login. Prima non se ne applica nessuno, e non perché li togliamo: perché non c'è nulla che potrebbe usarli.

Diagnostica

logging2 chiavi
console-attemptstrue

Scrive in console ogni password sbagliata (nome e indirizzo, mai la password). Utile per accorgersi di un attacco mirato.

log-sqlfalse

Scrive ogni istruzione SQL. Solo per capire un problema: è lento e riempie il log.

metrics1 chiave
enabledtrue

bStats (https://bStats.org): quanti server usano questo plugin e su quale versione sono. Cosa viene inviato, ogni 30 minuti: un id casuale del server (serverUuid, non derivato da nulla), la versione del plugin, le versioni di Minecraft/Paper e di Java, il sistema operativo e il numero di core, la modalità online, quanti giocatori sono online (solo un numero) e il livello di licenza (free/premium/creator). Nessun dato dei giocatori di alcun tipo: niente nomi, niente UUID, niente indirizzi, niente password. Non viene inviato nulla mentre il plugin attende una licenza.

Continua a leggere

false disattiva solo questo plugin. enabled: false in plugins/bStats/config.yml disattiva tutti i plugin bStats in un colpo.

Lingue

I testi che il plugin mostra ai giocatori, un file per lingua.

lang/

Testi e messaggi
2 file
plugins/ShadowLogin/lang/
Note del file

Questo file contiene il TESTO. Tutto il resto del plugin - chiavi, sezioni, commenti, comandi - è in inglese apposta, così che un server in qualunque parte del mondo legga la stessa configurazione. Solo ciò che vede un giocatore viene tradotto, ed è qui che si trova.

Tutti i messaggi che il plugin mostra ai giocatori, un file per lingua. Le chiavi non sono elencate una per una: qui ci sono i file, quanti testi contengono e i segnaposto che usano.

FileLinguaTesti
lang/en_US.yml riferimento English 303
lang/it_IT.yml Italiano 303

Segnaposto più usati

Il plugin li sostituisce con il valore giusto: vanno lasciati scritti così.

  • <prefix>
  • <label>
  • <name>
  • <value>
  • <count>
  • <time>
  • <mode>
  • <max>
  • <ip>
  • <duration>
  • <file>
  • <date>
  • <reason>
  • <min>

Gruppi di messaggi

  • prefix 1
  • common 13
  • command 4
  • login 34
  • register 5
  • password 13
  • device 19
  • twofactor 23
  • recovery 7
  • limbo 4
  • antibot 5
  • gui 14
  • admin 117
  • license 38
  • locked 6

Tutta la documentazione