[Rcon] Login schützen

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Ich möchte euch heute zeigen, wie ihr euren Rcon Login vor unautorisierten Zugriff schützen könnt. Dies ist mein erstes Tutorial, welches ich schreibe, also seid nicht so streng und gebt mir bitte viele Verbesserungsvorschläge und nützliche Kritik. :)


    Erstmal gehen wir zur Funktion, welche ausgeführt wird, wenn sich jemand als Rcon Administrator einloggt oder es versucht. Diese Funktion ist "OnRconLoginAttempt"


    public OnRconLoginAttempt(ip[], password[], success)
    Da sehen wir schonmal die Parameter:
    - ip[] --> Die IP, welche versucht sich als Rcon Administrator einzuloggen oder sich einloggt.
    - password[] --> Das Passwort, welches benutzt wurde, um sich einzuloggen oder es zu versuchen
    - success --> Ob der Login erfolgreich war oder nicht.


    Als erstes wollen wir herausfinden, welcher Spieler versucht hat sich als Rcon Administrator einzuloggen oder sich als dieser eingeloggt hat.
    Da es in dieser Funktion kein "playerid" gibt, müssen wir das leider auf eine andere Art und Weise herausfinden.


    Da sehen wir, dass wir ja die IP des Spielers haben. Deswegen werden wir jetzt alle Spieler nach ihrer IP-Adresse abfragen und diese dann mit der vorhandenen IP vergleichen.
    Das tun wir am besten mit einer Schleife.


    In dieser Schleife erstellen wir einen String mit dem Namen "pip" mit einer Länge von 16.
    Nun wollten wir ja alle IP Adressen der Spieler auf dem Server abfragen und dann mit der IP des Rcon Logins vergleichen.
    Um die IP-Adressen mit der anderen zu vergleichen, speichern wir zunächst immer die IP des Spielers in "pip".
    Danach fragen wir ab, ob die IP des jeweiligen Spielers mit der IP des Logins übereinstimmt.


    public OnRconLoginAttempt(ip[], password[], success)
    {
    for(new i=0; i<MAX_PLAYERS; i++) // Unsere Schleife, welche alle Spieler durchgeht und für jeden Spieler folgendes ausführt.
    {
    new pip[16]; // Hier wird der String "pip" erstellt.
    GetPlayerIp(i, pip, sizeof(pip)); // Hier erhalten wir vom jeweiligen Spieler die IP und speichern diese in den String "pip" ein.
    if(!strcmp(ip, pip, true)) // Abfrage, ob die IP-Adressen übereinstimmen.
    {


    }
    }
    return 1;
    }
    Nun findet das Script letzendlich heraus, welcher Spieler versucht hat sich als Rcon Administrator einzuloggen.
    Da wir wollen, dass der Übeltäter am Ende gebannt wird, wäre es angebracht abzufragen, ob der Täter ein Administrator ist.


    Denn einen Administrator wollen wir ja nicht bannen. Das wäre ja sonst ziemlich doof.
    Deswegen bauen wir noch eine Abfrage ein, ob der Spieler ein Administrator ist und führen dann noch ein Script aus, wenn er keiner ist.
    Die Administratorabfrage müsst ihr an euer Skript anpassen, sonst funktioniert es nicht!


    Aber nun erstmal zur Abfrage.


    public OnRconLoginAttempt(ip[], password[], success)
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    new pip[16];
    GetPlayerIp(i, pip, sizeof(pip));
    if(!strcmp(ip, pip, true))
    {
    if(!SpielerDaten[i][pAdmin]) // Wenn der Spieler KEIN Administrator ist, werden die in den nachfolgenden geschweiften Klammern eingefügten Befehle ausgeführt.
    {

    }
    }
    }
    return 1;
    }


    Jetzt müssen wir nur noch die Befehle einfügen, was mit dem Spieler passieren soll, welcher versucht hat, sich unautorisierten Zugriff zu Administratorrechten zu verschaffen.


    Wir nehmen die Funktion "BanEx". Diese Funktion bannt den Spieler und gibt zugleich noch einen Grund an.
    Natürlich könnt ihr die Bannfunktionen an euer Skript anpassen, was auch sehr angebracht wäre.
    Da ich aber nicht weiß, was für Skripte ihr benutzt, belasse ich es in diesem Tutorial bei einer Standardfunktion.
    Da wir den Spieler dann gebannt haben, muss die Schleife ja nicht weiter durchlaufen. Deswegen setzen wir unter "BanEx" noch ein "return 0;"


    public OnRconLoginAttempt(ip[], password[], success)
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    new pip[16];
    GetPlayerIp(i, pip, sizeof(pip));
    if(!strcmp(ip, pip, true))
    {
    if(!SpielerDaten[i][pAdmin])
    {
    BanEx(i,"Loginversuch als Rcon-Administrator"); // Hier bannen wir den Spieler und geben als Grund "Loginversuch als Rcon-Administrator" an.
    return 0;
    }
    }
    }
    return 1;
    }


    Fertig! Wir haben den Login als Rcon-Admin erfolgreich gegen unautorisierten Zugriff geschützt. :)


    Für Kritik und Verbesserungsvorschläge bin ich jederzeit offen. :)


    Mit freundlichen Grüßen


    Artus

    3 Mal editiert, zuletzt von Artus ()

  • Schönes Tutorial, gut erklärt.


    Eine Anmerkung hätte ich aber noch:


    BanEx(i,"Loginversuch als Rcon-Administrator"); // Hier bannen wir den Spieler und geben als Grund "Loginversuch als Rcon-Administrator" an.
    Kick(playerid); // Spieler wird gekickt.


    Ist doppelt gemoppelt, da BanEx den Spieler bannt, und ihn somit auch aus dem Server entfernt.
    Und eventuell brichst du die Schleife nach dem Ban mit return 1 ab, spart Rechenzeit


    Nur so am Rande.

    Mit freundlichem Gruß
    Weper


  • Ja, dort war ich mir nicht sicher, ob er auch entfernt wird.


    Editiere ich gleich. :) Danke für die Rückmeldung.

  • Mal so kleine Hinweise nebenbei:
    1. Wenn ein Admin und ein User über den selben Router online sind, wird der User gebannt, wenn der Admin sich einloggt; deshalb noch mal ein "IsPlayerAdmin" einfügen ;)
    2. Logins über die RCON-Konsole werden nicht erkannt :S


    Und, da ich nicht mehr up2date bin: gibt GetPlayerIP immer noch ipv4 zurück ?

  • Das schützt aber nur vor versuchen sich Ingame einzuloggen.
    Von außen gibt es auch noch eine möglichkeit sich als RCON Admin einzuloggen.
    Diesen kann man aber nicht wirklich schützen wie Ingame, sondern nur ausschalten, so das niemand mehr dran kommt.


    Dies geht indem man in der server.cfg ein

    Code
    rcon 0

    einträgt.


  • Es bannt jeden, welcher kein Administrator ist und versucht sich einzuloggen oder sich erfolgreich einloggt.
    Dies soll bewirken, dass sich nur Administratoren einloggen können und Spieler immer gebannt werden, egal, ob das passwort richtig oder falsch ist.

  • Es bannt jeden, welcher kein Administrator ist und versucht sich einzuloggen oder sich erfolgreich einloggt.
    Dies soll bewirken, dass sich nur Administratoren einloggen können und Spieler immer gebannt werden, egal, ob das passwort richtig oder falsch ist.

    Aber man muss nicht Ingame sein, um sich als RCON einzuloggen - das ist das, was wir die ganze Zeit sagen wollten ;)

  • Also ich finde die Variante vom Samp Wiki ist vollkommen ausreichend und funktioniert einwandfrei :) Trotzdem danke für deine Mühe !

    Zitat

    [01:24:45] FAILED RCON LOGIN BY IP 127.0.0.1 USING PASSWORD Arsc*****
    [01:24:45] [part] Sunny_Montana has left the server (0:2)
    [01:24:45] RCON (In-Game): Player #0 (Sunny_Montana) failed login.

  • Bans immer mit return 0; beenden ;)


    ocmd:ban(playerid..
    {
    Ban(playerid);
    return 0;
    }


    sag mir mal bitte wie das immer gehen soll das kann hier nicht gehen.. :D


    Super Tutorial kann man als Anfänger immer gut gebrauchen ;)

  • public OnRconLoginAttempt(ip[], password[], success)
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    new pip[16];
    GetPlayerIp(i, pip, sizeof(pip));
    if(!strcmp(ip, pip, true))
    {
    if(!SpielerDaten[i][pAdmin])
    {
    BanEx(i,"Loginversuch als Rcon-Administrator");
    return 0; // <------------------------------ Hier return 0
    }
    }
    }
    return 1;
    } Da meint @lovenlins12: das ;)