Guanya la primera sessió: controlar els inicis de sessió d'OpenVPN abans del desallotjament
Rebutjar un inici de sessió posterior no és el mateix que substituir l'anterior. La decisió s'ha de prendre abans del desallotjament del mateix nom, i la comprovació de la ranura ha de ser atòmica.
Una política que permet una sessió per compte sembla resolta fins que arriba el segon inici de sessió. Hi ha dos desenllaços possibles: el nouvingut substitueix la sessió existent, o la sessió existent conserva la ranura i el nouvingut és refusat. Només el segon és una política de guanya la primera sessió. L'opció de client a què la majoria recorre activa la concurrència i, per tant, no la produeix.
Dos contractes s'amaguen darrere d'un sol paràmetre
Amb la concurrència desactivada, una segona connexió que presenta el mateix nom de certificat pot desplaçar la sessió que ja s'executa. Activar la concurrència permet diverses sessions alhora, que és el contrari d'un límit. Cap dels dos estats no és una política de rebuig, així que la decisió s'ha de prendre en un altre lloc.
Escriviu el contracte abans d'implementar res: qui és refusat, quina evidència identifica la sessió existent i què passa quan una sessió mor sense una desconnexió neta. Una política que ningú no ha formulat així no es pot provar més endavant.
El desallotjament arriba abans del vostre ganxo de connexió
En el camí de codi del servidor 2.6, la configuració inicial d'un client nou elimina les instàncies existents amb el mateix nom quan la concurrència està desactivada. Aquesta eliminació es produeix abans que s'executi la cadena de gestors de connexió. Per tant, un script que detecta el duplicat i retorna un error refusa el nouvingut després que la sessió existent ja hagi estat expulsada, exactament el resultat que la política volia evitar. L'ordre de les crides a la implementació upstream és l'única resposta fiable per a la vostra compilació.
| Stage | Who can still refuse | Effect on the incumbent |
|---|---|---|
| Certificate check | Server trust configuration | None |
| Authentication decision | The authentication controller | None, because establishment has not run |
| Connect handler | A profile script | Already evicted in the same-name case |
| Post-establishment | Status tooling, monitoring | Both sessions already exist or one is gone |
Consultar el fitxer d'estat tampoc no és una porta. Dos intents que arriben alhora poden veure tots dos una ranura buida abans que cap la confirmi, i tots dos continuen.
Mou la decisió a l'autenticació
La interfície de gestió pot assumir la decisió d'autenticació després de verificar el certificat. Amb aquesta disposició, el controlador no és un monitor: rep cada instància de client que es connecta i respon si aquella instància pot continuar. Com que la resposta arriba abans de l'establiment, un rebuig deixa la sessió existent intacta. El mateix canal informa de les desconnexions, i així el controlador sap que una ranura s'ha alliberat legítimament.
Totes les instàncies noves han de passar aquesta porta, incloent-hi les reconnexions i qualsevol camí que es reautentiqui sense cap avís. Una porta a la qual algunes instàncies no arriben mai no protegeix res, i l'oblit resta invisible fins que algú prova la drecera.
Els testimonis poden passar per davant de la porta
Un cop s'ha emès un testimoni, el servidor pot validar-lo internament i ometre l'autenticació externa per a aquesta connexió. La crida de gestió no es produeix mai, així que una comprovació de ranura implementada només allà no veu mai la instància nova. Aquest comportament és una comoditat per als usuaris i un forat per a una política de concurrència. Feu que les connexions autenticades amb testimoni passin una comprovació autoritzada equivalent, o desactiveu el camí del testimoni quan la política exigeixi una decisió en cada connexió.
No ho compenseu acceptant cada testimoni sense condicions. Un testimoni caducat o no vàlid encara ha de fallar, i ha de fallar pel mateix punt de decisió que tota la resta.
Vincleu la reserva a una instància, no a una adreça
L'adreça és una identitat pobra: una reconnexió des del mateix portàtil pot arribar d'una altra adreça, i una credencial copiada pot arribar de la mateixa. Vicleu la reserva a la instància de client que assigna el servidor, perquè una reautenticació de la instància ja admesa es reconegui com a propietària. Un identificador d'instància nou ha d'adquirir la seva pròpia ranura mitjançant la decisió de guanya el primer, fins i tot quan presenta el mateix testimoni.
Allibereu només la reserva de l'intent que ha fallat. Un esdeveniment de desconnexió endarrerit d'un intent anterior no ha de netejar la ranura d'un propietari més nou, i per això l'alliberament nomena la instància i no el compte. Després que el controlador es reiniciï, reconcilieu les sessions vives abans d'admetre ningú, i apliqueu la mateixa regla a cada passarel·la que serveixi el compte.
Decidiu per separat com es recupera una ranura realment obsoleta. L'administrador necessita una manera documentada de netejar-la, i aquest camí no hauria de ser abastable per a un usuari que només clica reconnecta.
Proveu les parelles que importen: dos inicis de sessió gairebé simultanis, una reconnexió després d'un tancament net, una reautenticació de la sessió existent, un nouvingut refusat i un reinici del controlador. En tots els casos la sessió existent ha de romandre utilitzable i el nouvingut ha de ser refusat sense danys col·laterals per a altres comptes.