RE:NODE

Zabezpečení10 min čtení

Discord boti pro správce herních serverů

Jaké integrace s Discordem herní servery opravdu používají, jak botovi dát přístup ke konzoli, aniž bys Discordu předal RCON, a malý admin bot se slash příkazy.

1 čtenář

Discord bot, který umí spouštět příkazy na tvém herním serveru, je vzdálená konzole, jejíž heslo zní „má správnou roli na Discordu“. Může to být naprosto dobrý návrh - staff na Discordu stejně žije a vyhodit grifera z telefonu je opravdu užitečné - ale jen když bot spouští krátký seznam povolených příkazů místo čehokoli, co mu někdo napíše, u každého příkazu kontroluje role, má nejmenší Discord oprávnění, se kterými ještě funguje, loguje každé použití a drží token i heslo k RCON mimo dosah. Pro jednosměrný provoz, jako jsou stavy a upozornění, je webhook jednodušší a bezpečnější než jakýkoli bot.

Tento článek probírá integrace, které herní servery běžně používají, rizika specifická pro admin boty, správné nastavení oprávnění na obou stranách a malého bezpečného admin bota, kterého si můžeš provozovat sám. Jednosměrné stavové zprávy jsou v článku Discord webhooky pro stav serveru a hostování botů jakéhokoli druhu v článku hostování Discord bota 24/7.

Webhook, integrace, nebo vlastní bot#

Vyber nejméně mocný nástroj, který práci zvládne.

PotřebaNástrojUmí měnit server?
Stavy, upozornění, oznámení o připojeníWebhookNe
Chatový most mezi hrou a DiscordemIntegrace na straně hryJen chat
Konzole v kanálu na DiscorduIntegrace na straně hryAno, úplně vše
Žádosti o whitelist, kicky, pár příkazůAdmin bot se seznamem povolených příkazůJen to, co povolíš
Moderace samotného DiscorduDiscord AutoMod, moderační botNe, jen Discord

Webhook umí jen přispívat zprávy. Nedrží žádné přihlašovací údaje k herní server, takže nejhorší, co uniklá URL webhooku způsobí, je spam v jednom kanálu. Proto je to správná volba pro všechno jednosměrné: stavové embedy, upozornění na pád, oznámení o restartu, oznámení o banech.

Bot je dlouho běžící program připojený k Discordu pomocí tokenu a může dělat všechno, co dovolí jeho kód a oprávnění. Ve chvíli, kdy umí mluvit s konzolí herního serveru, záleží na jeho zabezpečení stejně jako na heslu k RCON.

Integrace, které herní servery běžně používají#

Většina oblíbených her má dobře prošlapanou integraci a použít ji je obvykle lepší než psát vlastní.

  • Minecraft - DiscordSRV. Plugin na serveru, který propojuje herní chat s kanálem na Discordu, páruje účty Discordu a Minecraftu, synchronizuje role a umí zrcadlit konzoli do kanálu, kde se zprávy spouštějí jako příkazy. Právě nad touto poslední funkcí se vyplatí dobře přemýšlet. Nastavení popisuje DiscordSRV pro Minecraft.
  • FiveM - txAdmin. txAdmin obsahuje Discord bota, který umí zveřejnit trvalý embed se stavem serveru a vyřizovat žádosti o whitelist, takže si hráči mohou o přístup říct na Discordu a staff je schvaluje v txAdminu. Samotný txAdmin popisuje FiveM server a txAdmin a přístup podle rolí oprávnění a whitelist FiveM přes Discord.
  • Hry na enginu Source a CS2. Pluginy pro SourceMod a CounterStrikeSharp běžně posílají reporty, bany a chat na Discord přes webhooky; samotné admin akce zůstávají ve hře.
  • Rust, DayZ, Arma a další hry s RCON. Admin nástroje a služby RCON se k serveru připojují přes RCON a často mají vlastní funkce pro Discord: kill feedy, oznámení o banech, seznamy hráčů. Drží tvé heslo k RCON, takže si zaslouží stejnou pozornost jako bot, kterého napíšeš sám.
  • Obecné stavové boty. Boty, které se dotazují veřejného stavového portu serveru a zobrazují počet hráčů online. Nepotřebují nic tajného, protože ta informace je veřejná. Co čtou, vysvětluje query porty a A2S.

Proč je konzolový bot RCON s jiným zámkem#

Představ si, co útočník potřebuje, aby spustil příkazy na tvém serveru jednotlivými cestami.

TCP portvia RCON or pluginKonzole paneluúčet + dvě ověřeníKlient RCONjedno sdílené hesloDiscord botrole na DiscorduKonzole serveru
Tři zámky na stejné konzoli

Konzole panelu je chráněná tvým účtem a dvoufázovým ověřením. RCON je chráněný jedním heslem. Konzolový bot je chráněný rolí na Discordu - což znamená, že je chráněný každým účtem na Discordu, který tu roli má, bezpečností každého z těch účtů a každým, kdo na tvém Discordu může role přidělovat. Napadený účet někoho ze staffu, moderátor, který si přidělí roli, kterou mít neměl, nebo bot s oprávněním „Administrator“, který převezme někdo cizí - to všechno vede ke konzoli tvého serveru.

Konkrétní rizika:

  • Eskalace rolí uvnitř Discordu. Kdokoli s oprávněním „Manage Roles“ si může přidělit libovolnou roli pod svou nejvyšší rolí. Pokud je role s přístupem ke konzoli v seznamu nízko, dostane se k ní víc lidí, než si myslíš.
  • Zrcadlené konzolové kanály. Kanál, kde se každá zpráva spouští jako příkaz konzole a který může role číst i zapisovat, je nejnebezpečnější dostupná konfigurace. Navíc ukazuje výstup konzole, který v Minecraftu obsahuje při každém připojení IP adresy hráčů.
  • Krádež tokenu bota. Token ve veřejném repozitáři, vloženém konfiguračním souboru nebo napadeném hostingu dá zloději bota se všemi jeho oprávněními na tvém Discordu a se vším, co umí udělat s tvým serverem. Discord resetuje tokeny, které najde ve veřejných repozitářích na GitHubu, což dost říká o tom, jak často se to děje.
  • Nekontrolovaný vstup. Bot, který do konzole předá jakýkoli text od uživatele, umožňuje řetězení příkazů a spouštění libovolných příkazů, i když jsi chtěl povolit jen kick.

Oprávnění správně, na obou stranách#

Na straně Discordu:

  1. Dej botovi vlastní roli jen s oprávněními, která používá. Stavový nebo admin bot obvykle potřebuje vidět pár kanálů, posílat zprávy a vkládat odkazy (embed links). Vynech Administrator, Manage Server, Manage Roles a Manage Webhooks, pokud některou z nich nepotřebuje konkrétní funkce.
  2. Roli staffu, která bota ovládá, dej v seznamu rolí vysoko a omez, kdo má Manage Roles, aby si ji nikdo nemohl přidělit sám.
  3. Používej přepsání oprávnění v kanálech, aby admin příkazy bota šly použít jen ve staffovém kanálu.
  4. Vyžaduj dvoufázové ověření pro moderaci v nastavení bezpečnosti serveru na Discordu, které způsobí, že Discord bude vyžadovat 2FA na účtech s moderátorskými oprávněními.
  5. Používej slash příkazy s výchozími oprávněními, aby byl příkaz skrytý lidem bez správného oprávnění na Discordu, dokud to záměrně nezměníš.

Na straně hry:

  1. Dej botovi vlastní heslo k RCON, pokud to hra umožňuje, nebo aspoň heslo, které nepoužívá staff, a změň ho, kdykoli bot přejde do jiných rukou.
  2. V botovi používej seznam povolených příkazů, ne seznam zakázaných. list, kick, whitelist add jsou v pořádku. Cokoli, co vkládá volný text do konzole - obvyklou výjimkou je say - potřebuje kontrolu vstupu.
  3. U her s systémem oprávnění spouštěj bota jako omezenou identitu. Pluginy pro Minecraft jako DiscordSRV umí v konfiguraci omezit konzolové příkazy z Discordu na seznam povolených; použij ho místo otevřeného přístupu ke konzoli.
  4. Loguj každý příkaz, který bot spustí, spolu s uživatelem Discordu, který o něj požádal, do kanálu, který staff může číst, ale ne upravovat.

RCON bezpečně rozebírá stranu RCON podrobněji, včetně toho, které hry ho vůbec dovolují omezit.

Malý admin bot, kterému můžeš věřit#

Pokud z Discordu potřebuješ hrstku admin příkazů a tvoje hra má standardní RCON ve stylu Source (Minecraft, Rust v legacy režimu, hry na Source, mnoho dalších), stačí bot takto velký a snadno se zkontroluje. Používá discord.py 2.x a balíček rcon z PyPI.

bot.py
import osimport discordfrom discord import app_commandsfrom rcon.source import rconGUILD = discord.Object(id=int(os.environ["GUILD_ID"]))LOG_CHANNEL = int(os.environ["LOG_CHANNEL_ID"])STAFF_ROLE = "Server Staff"ALLOWED = {"list", "kick", "whitelist"}client = discord.Client(intents=discord.Intents.default())tree = app_commands.CommandTree(client)async def run(*args: str) -> str:    return await rcon(*args, host=os.environ["RCON_HOST"],                      port=int(os.environ["RCON_PORT"]),                      passwd=os.environ["RCON_PASSWORD"])@tree.command(name="server", description="Run an allowed server command", guild=GUILD)@app_commands.default_permissions(kick_members=True)@app_commands.checks.has_role(STAFF_ROLE)async def server(interaction: discord.Interaction, command: str):    parts = command.split()    if not parts or parts[0] not in ALLOWED:        await interaction.response.send_message("Not allowed.", ephemeral=True)        return    await interaction.response.defer(ephemeral=True)    result = await run(*parts)    await interaction.followup.send(f"```\n{result[:1800]}\n```", ephemeral=True)    log = client.get_channel(LOG_CHANNEL)    if log:        await log.send(f"{interaction.user} ran `{command}`")@tree.errorasync def on_error(interaction: discord.Interaction, error):    if isinstance(error, app_commands.MissingRole):        await interaction.response.send_message("Staff only.", ephemeral=True)@client.eventasync def on_ready():    await tree.sync(guild=GUILD)client.run(os.environ["DISCORD_TOKEN"])

Čím je dost bezpečný:

  • Jen slash příkazy. Nikdy nečte běžné zprávy, takže nepotřebuje privilegovaný intent pro obsah zpráv a nikdo ho nemůže spustit psaním do kanálu.
  • Dvě kontroly. default_permissions skryje příkaz členům bez Kick Members a has_role odmítne každého bez role staffu, i kdyby admin serveru změnil viditelnost příkazu.
  • Seznam povolených příkazů podle prvního slova. Spustit se dá jen list, kick a whitelist. Další příkazy přidávej po jednom a záměrně.
  • Argumenty předávané zvlášť. Příkaz se rozdělí na slova a pošle jako samostatné argumenty, místo aby se vložil do konzole jako jeden řetězec.
  • Každé použití zalogované do kanálu spolu s osobou, která ho spustila.
  • Žádná tajemství v kódu. Token, heslo k RCON i ID pocházejí z proměnných prostředí.

Až zjistíš, které příkazy staff skutečně používá, rozšiřuj bota raději o vyhrazené příkazy - /kick player reason s typovanými parametry - než o rostoucí seznam povoleného volného textu.

Posílání logů na Discord bez úniků#

Logy na Discordu jsou pohodlné a zároveň problém pro soukromí, protože kanály na Discordu se snadno čtou a snadno se z nich dělají screenshoty.

  • Posílej události, ne surovou konzoli. „Steve dostal ban od Anny: x-ray“ je užitečné. Surové zrcadlo konzole obsahuje IP adresy, chyby pluginů a cokoli dalšího, co server vypisuje.
  • Staffové logy drž ve staffových kanálech a zkontroluj jejich oprávnění. Logový kanál omylem viditelný pro @everyone je častý způsob, jak se adresy hráčů dostanou na veřejnost.
  • Respektuj rate limity. Discord omezuje, jak rychle může bot nebo webhook přispívat; řádky logu shlukuj do jedné zprávy každých pár sekund místo jedné zprávy na řádek. Zacházení s chybou 429 popisuje článek o webhookech.
  • Nepovažuj Discord za archiv logů. Skutečné logy zůstávají na serveru s dobou uchování - logy, které stojí za to uchovávat to rozebírá a soukromí na herním serveru a data hráčů vysvětluje, proč na tom záleží.

Hosting bota a jeho token#

Bot musí běžet pořád, takže by neměl běžet na něčím herním PC. Stačí malý tarif pro hosting aplikací: bot jako ten výše používá výrazně méně paměti, než nabízí nejmenší tarif. Na RE:NODE začínají řady Python a Node.js na 1 GB, proměnné prostředí pro token a hesla patří na záložku Startup a Git deploy umí při startu stáhnout kód bota ze soukromého repozitáře na GitHubu - krok za krokem to ukazuje průvodce hostováním bota v discord.py a tarify jsou na stránce hostingu aplikací.

S tokenem zacházej jako s heslem:

  • Nikdy ho nekomituj. Drž ho v proměnné prostředí a každý lokální soubor .env přidej do .gitignore. Postup popisuje proměnné prostředí a secrets.
  • Při úniku ho okamžitě resetuj ve vývojářském portálu Discordu. Starý token přestane fungovat hned.
  • Omez, kdo vidí hosting bota. Kdokoli s přístupem k souborům nebo nastavení serveru bota si může přečíst jeho token. Subuserům v panelu lze dát přístup ke konzoli bez přístupu k nastavení a souborům.
  • Věz, kdo aplikaci vlastní. Bot patřící osobnímu účtu jednoho člena staffu odejde spolu s ním. Vývojářské týmy Discordu umožňují spravovat aplikaci více lidem bez sdílení účtu.

Když se něco pokazí#

Pokud bot začne dělat věci, o které nikdo nežádal, nebo máš podezření, že unikl jeho token nebo heslo k RCON:

  1. Resetuj token bota ve vývojářském portálu.
  2. Změň heslo k RCON na herním serveru a aktualizuj proměnnou prostředí bota.
  3. Zkontroluj audit log Discordu kvůli změnám rolí a oprávnění a logovací kanál bota kvůli příkazům, které nepoznáváš.
  4. Zkontroluj herní server kvůli admin záznamům, banům, změnám whitelistu nebo souborům, které jsi nevytvořil. Celý postup prací najdeš v článku co dělat, když ti hacknou server.

FAQ#

Je konzolový kanál v DiscordSRV bezpečný?

Je tak bezpečný, jako jsou oprávnění kanálu a účty, které do něj mohou psát. Omez ho na pár důvěryhodných členů staffu, vyžaduj na Discordu dvoufázové ověření pro moderátory a v konfiguraci omez, jaké příkazy se z Discordu dají spouštět. Většině komunit lépe poslouží konzole v panelu.

Má bot používat RCON, nebo herní plugin?

Plugin se může integrovat těsněji a často má jemnější oprávnění; RCON funguje s jakoukoli hrou, která ho podporuje, a drží bota odděleně od serveru. Pro malého admin bota je RCON se seznamem povolených příkazů jednodušší na kontrolu.

Může bot běžet na stejném tarifu jako herní server?

Spouštěj ho zvlášť. Bot na vlastním malém tarifu aplikace běží dál, když se herní server restartuje nebo spadne, což je přesně chvíle, kdy chceš stavy a upozornění, a token bota zůstane mimo dosah lidí s přístupem k souborům herního serveru.

Potřebuju intent pro obsah zpráv?

Pro slash příkazy ne. Je to privilegovaný intent potřebný ke čtení textu běžných zpráv. Bot, který používá jen slash příkazy, ho nepotřebuje a je bezpečnější, když ho nemá.

Jaká oprávnění potřebuje stavový bot?

Vidět kanál, posílat zprávy a vkládat odkazy a číst historii zpráv, pokud upravuje vlastní zprávu. Nepotřebuje nic, co se dotýká rolí, členů nebo nastavení serveru.


Komentáře

Zcela anonymně: žádný účet, žádný e-mail, žádné cookie. Ukládáme jen jméno, které napíšeš, text a čas - nic dalšího. Počet odkazů je omezený a značkování se nevykresluje.

0/2000