Jump to content
V3ct0r

Обеспечение безопасности игрового сервера

Recommended Posts

Обеспечение безопасности игрового сервера

Автор: @Duduf

 

В данном гайде мы рассмотрим основные проблемы, связанные с обеспечением безопасности нашего игрового сервера.

Основными проблемами в работе игровых серверов являются:

  1. Несанкционированный доступ к учетной записи администратора ОС сервера
  2. SQL-инъекции через клиент игры
  3. SQL-инъекции через веб-обвязки игрового сервера


Гайд состоит из следующих разделов:

  1. Выбор операционной системы для игрового сервера и базовые настройки его безопасности
  2. Обеспечение базовой безопасности SQL-сервера
  3. Защита баз данных SQL-сервера от SQL-инъекций
  4. Установка и базовые настройки веб-сервера
  5. Защита веб-обвязок от SQL-инъекций

 

 

1. Выбор операционной системы для игрового сервера и базовые настройки его безопасности

В первую очередь, следует понимать, что игровой сервер должен являться отдельной машиной, предназначенной только для обеспечения работы этого самого игрового сервера. В качестве операционной системы необходимо использовать только серверные - Windows Server 2003, Windows Server 2008, никаких XP, Вист и семерок - эти системы априори не предназначены для функционирования в качестве серверов.

Высшим пилотажем, в плане обеспечения безопасности, было бы разнесение служб игрового сервера по разным серверам - ПО игры, SQL-сервер, Веб-сервер, но в данном случае мы рассмотрим установку и настройку всего этого добра на одной машине.

 

Почему именно серверная ОС

В первую очередь, это повышенная отказоустойчивость, отсутствие ресурсоемких и небезопасных приложений, загружаемых "по умолчанию", полноценное логирование действий пользователей, полноценный трейс ошибок при крахе приложений, более полная, по сравнению с домашними ОС, защита системных файлов и директорий, а также более высокая производительность приложений.

К базовым настройкам безопасности ОС относятся:

  • Отключение учетной записи Администратор
  • Установка антивируса с автоматическим обновлением
  • Автоматическое обновление ОС
  • Настройка удаленного доступа по протоколу RDP
  • Установка межсетевого экрана (Брандмауэр, Файрволл)


Автоматическое обновление ОС

Настраивайте автоматическое обновление таким образом, чтобы обновления скачивались, но не устанавливались. Заведите привычку раз в неделю устанавливать эти самые обновления и после их установки перезагружать машину.

Remote Desktop

Сколь бы не велико было желание подключить монитор и клавиатуру к серверу, делайте это только в случае сбоя в работе RDP, т.е. если вы не можете подключиться к серверу удаленно.

Для включения Remote Desktop откройте Панель управления > Система, выберите вкладку Удаленные сеансы и установите флажок Разрешить удаленное подключение к этому компьютеру. По умолчанию удаленное соединение разрешено только локальным администраторам. Учетную запись Администратор мы отключили, т.о. у нас остается только один локальный администратор.

Теперь настроим сам сервер RDP

Откройте Панель управления > Администрирование > Настройка служб терминалов. В дереве консоли выберите пункт Подключения. В области сведений щелкните правой кнопкой мыши подключение, которое нужно изменить, и выберите команду Свойства. На вкладке Общие, в разделе Уровень безопасности, выберите метод обеспечения безопасности Высокий.

Рекомендую также ознакомиться со следующими ссылками по обеспечению безопасности RDP:
http://technet.microsoft.com/ru-ru/library/cc781085(WS.10).aspx
http://www.winblog.ru/win2003/1147766806-15021001.html

Межсетевой экран

Самый простой маршрутизатор, установленный между интернетом и вашим сервером во сто крат эффективнее и производительней любых программных файрволлов. Настройте маршрутизацию портов в своем роутере - 80 (для веб-сервера), 1973 (Gate Server), 3389 (RDP) и 1433 (SQL-сервер). Все пакеты от клиента приходят на порт GateServe'ra, поэтому нет необходимости открывать порты других служб игрового сервера.

Ограничьте доступ по IP-адресам для порта 3389 (RDP) и 1433 (SQL-сервер). Желательно, чтобы доступ к этим портам был только из локальной сети. Если вы планируете администрировать сервер удаленно из Интернета и имеете статичный IP-адрес, то можете открыть порты 3389 и 1433 и для него.

Добавьте перечисленные порты (80, 1973, 3389, 1433) в исключения в Брандмауэре Windows. В исключениях должны быть именно порты, а не приложения. Ничего другого в исключениях быть не должно.

Если в вашем роутере есть возможность автоматической защиты от ARP и других атак, включите их.

Если у вас нет роутера или аппаратного Файрволла, то ограничения на порты и службы необходимо установить в Брандмауэре Windows.

Итогом наших мероприятий стало то, что даже если злоумышленник получит информацию о логине/пароле к SQL-серверу, воспользоваться им он не сможет, поскольку мы закрыли возможность удаленного подключения к игровому серверу с "неизвестных" машин.

Работа игровых подсерверов

Не запускайте игровые сервера из-под пользователя, обладающего административными правами. Создайте отдельного пользователя в группе Users (Пользователи), прав этой группы достаточно для работы игрового сервера. В противном случае, если злоумышленник получит доступ в игре к команде &lua, то он автоматически получит доступ к пользователю-администратору сервера, со всеми вытекающими.

 

 

2. Настройка SQL-сервера

Итак, вы установили SQL-сервер, используя соответствующие гайды и присоединили базы данных игры.

Запускаем SQL Server Management Studio. При авторизации выбираем проверку подлинности Windows.

b1094fb31f7067c3bc38bec3ddc6e238.png

 

В обозревателе объектов открываем вкладку Безопасность > Имена входа, заходим в свойства пользователя sa и отключаем эту учетную запись.

d76a53d80d1a0dd033ea1acd550490f1.png

 

Для чего мы его отключаем?

 

Пользователь sa по умолчанию имеет права суперпользователя на вашем SQL-сервере. Также права суперпользователя вы можете получить авторизовавшись на Windows-сервере под учетной записью администратора и авторизовавшись в SQL-сервере используя проверку подлинности Windows.

 

Отключением пользователя sa мы оставляем единственную возможность авторизации в качестве суперпользователя - через Windows-аутентификацию. Теперь у вас не будет соблазна настраивать работу приложений из под пользователя sa (особенно с пустым паролем)

 

Для работы игрового сервера и веб-сервера мы создадим отдельных пользователей, которые будут иметь ограниченные права.

 

Вычищаем из БД дефолтные данные

 

Многие сборки серверов поставляются с базами, в которых уже существуют всякие разные нехорошие записи. К таковым относятся пользователи и схемы самой БД, а также список аккаунтов с ГМ-правами. В данной ситуации лучше использовать базы, поставляемые со сборкой Base Server 2.0, там присутствует только один аккаунт с логином admin и паролем admin. Не забываем поменять хотя бы пароль...

 

Добавляем отдельных пользователей для игрового сервера

 

Нам необходимо создать трех пользователей для баз AccountServer и GameDB с ограниченным набором прав - одного для работы GameServer, второго для работы AccountServer, третьего для веб-обвязки.

 

Откройте папку Безопасность > Имена входа и выберите в контекстном меню Создать имя входа.

5e165727172f2490bbf7ba08da4373bc.png

 

Создайте пользователя для работы игрового сервера (в моем случае это Gamemaster)

6d9457c3d5df161102709dafad90c78f.png

 

 

Перейдите на страницу Роли сервера и выберите только public

71532c8604c9a9b0c2d3a8a8a0cfef32.png

 

Перейдите на страницу Сопоставление пользователей и определите базы данных GameDB с правами db_datawriter, public. Схема по умолчанию - dbo. Данные права определяют, что пользователь может осуществлять выборку (SELECT), изменение (UPDATE), вставку (INSERT) и удаление (DELETE) записей в таблицах базы GameDB.

322d61261e9d1f8d57fbb507d2ecb9e0.png

 

Создайте пользователя под которым будет работать AccountServer (в моем случае это Accountmaster) по аналогии с пользователем Gamemaster. Задайте права на базу AccountServer как db_datawriter, public, на базу GameDB прав давать не надо.

 

Создайте пользователя под которым будет работать веб-обвязка (в моем случае это Webmaster) по аналогии с пользователем Gamemaster. Задайте права на базу AccountServer как db_datawriter, public, а на базу GameDB как db_datareader, public.

 

Не ставьте ни в коем случае прав db_owner или db_securityadmin, а также любую другую роль кроме public, эти права дадут доступ пользователю к системным функциям Базы данных, в т.ч. к ее остановке и уничтожению.

 

 

3. Защита объектов базы данных от несанкционированных изменений

 

В первую очередь, следует понимать, что SQL-инъекции возможны в том случае если приложения, работающие с SQL-сервером в должной мере не обрабатывают приходящие от пользователей переменные. В случае если в качестве приложения выступает php-скрипт с открытым кодом, мы можем самостоятельно добавить обработку пользовательских переменных. В случае если в качестве приложения выступает скомпилированное приложение (в нашем случае GateServer, GameServer, GroupServer и AccountServer), возможности по модификации кода у нас отсутствуют.

 

При таком раскладе нам остается контролировать данные другими средствами. Первое - это различные фильтры (FilterServer и др.) и модификации GateServer, второе - защита объектов базы средствами SQL-сервера. Ставим необходимые фильтры. Объекты базы защищаем следующим образом:

 

Заходим в свойства пользователя Gamemaster в базе GameDB

a21d748712e07265de6bdad207caa26d.png

 

Переходим на страницу Защищаемые объекты и жмем кнопку Найти. Выбираем Определенные объекты и жмем ОК

7e3bebf98f5369d691025f1c73733513.png

 

1584a587e8564dc34f212401ca29fed4.png

 

Нажимаем Типы объектов, выбираем Таблицы, жмем ОК. Затем Обзор и выбираем таблицу account и жмем ОК

71f0e3bfdbc71613a082401c581fbcdf.png

 

14839d2206930ea7833f3a60e53297b6.png

 

и еще раз ОК. Загрузится таблица прав. Напротив Изменение и Удаление отмечаем Запретить.

e4e52759967038873f5f0b97a602d423.png

 

Выберите разрешение Обновление, чтобы активировать кнопку Разрешения на доступ к столбцу. Жмем ее. В открывшемся окне отмечаем Запретить напротив столбца gm

d8fa84a198fbb112f5e19d43ddf4ed0a.png

 

Ту же самую процедуру проделываем и для пользователя Webmaster

 

Все, теперь гм-права можно выставить только из под учетной записи администратора, пользователи, из под которых работает веб-обвязка и игровой сервер этих прав не имеют.

 

По аналогии вы можете запрещать доступ на изменение к столбцам и в других таблицах. Например, в character было бы неплохо запретить изменение столбца act_id.

 

Теперь со спокойной душой можно защищать менее значимые объекты базы посредством триггеров и мониторинга базы игроков. Сами триггеры я писать не буду, опишу, что можно защищать:

  1. Стат-пойнты. Триггер должен при вставке/изменении записи проверять не выходит ли сумма статов за допустимые значения.
  2. Количество HP/SP
  3. Наличие невведенных/редких предметов в инвентарях игроков
  4. Наличие у игроков фей и экипировки со статами, выходящими за допустимыми значениями

 

 

4. Веб-сервер

 

На форуме, как я заметил, существует любовь к различного рода NoName-сборкам Apache + PHP + MySQL + еще хрен знает чего (это я про всякие ксампы и денверы). Наличие доверия к ним крайне сомнительно ввиду, хотябы отсутствия документации к ним, особенно, это касается выставленных параметров "по умолчанию". Грамотным решением была бы установка всех компонент отдельно, скачанных и обновляемых с сайтов ПРОИЗВОДИТЕЛЕЙ (apache.org, php.net, mysql.com) либо использование промышленных сборок типа Zend.Server.

 

Если вы устанавливаете MySQL, не забудьте задать пароль для root-пользователя (по умолчанию он пустой) и создать второго администратора. Не следует запускать приложения из-под пользователя root.

 

Прежде чем устанавливать FTP-сервер, сто раз подумайте, нужен ли он вам, возможно, достаточно открыть доступ к нужным папкам в локальной сети. FTP - сам по себе крайне небезопасный протокол. Если установка FTP-сервера необходима, используйте лучше реализацию SFTP под Windows http://www.coreftp.com/server/ (в качестве клиента используйте WinSCP).

 

 

5. Веб-обвязки

 

Ну, что тут говорить, большинство представленных на форуме веб-обвязок представляют собой "жалкое зрелище, душераздирающее зрелище":

  • Принудительное подавление вывода ошибок без должной их обработки (error_reporting(0), ini_set('display_errors',0), волшебный символ @ и пр.)
  • Использование "псевдоконструкторов" классов, которые с версии php 5.3.3 уже не поддерживаются
  • Использование библиотеки ereg, которая не модернизировалась с 4-й версии PHP и в 6-й версии будет вырезана
  • Использование морально устаревшей библиотеки mssql

 

Но это еще цветочки по сравнению с отсутствием типизации данных и недолжной обработкой входящих переменных (что может привести к SQL-инъекциям и XSS-атакам).

 

Я не буду вдаваться в экскурс, как писать безопасные приложения, рекомендую использовать только проверенные скрипты, не пихать на рабочий сайт "новинки" пока не появятся отзывы об их использовании и аудите, каким бы шикарным не был их функционал. При появлении новых версий, обязательно обновляйте их.

 

Примеры инъекций в существующих обвязках

 

Рассмотрю один пример уязвимостей в веб-обвязке (регистрации), но, увы, некоторые другие регистрации и обвязки, представленные на этом сайте, имеют уязвимости.

 

Итак, рега

 

Уязвимый код

Строка 21

if ((eregi("[^a-z0-9_-]", $login)) || (eregi("[^a-z0-9_-]", $pass)) ) {

eregi - устаревшее расширение, имеющее нульбайтовую уязвимость

 

Строки 36-37

$email = $_POST['email'];
do_query("INSERT INTO account_login (name,password,originalPassword,email) VALUES ('$login','$encr_pass','$pass', '$email')","AccountServer");

Переменная email не обрабатывается никак вообще

  • Like 1

Share this post


Link to post
Share on other sites

А по настройке фаервола будут добавления?


Делай добро и бросай его в воду

Share this post


Link to post
Share on other sites
20 часов назад, V3ct0r сказал:

с правами db_datawriter

Я пытался так делать, но если не выставить еще и db_datareader, то сервер не запустится. К тому же, в первоначальной версии этого гайда, еще на мд, был описан способ, как из GroupServer убрать код, отвечающий за создание триггеров в базе, так вот те манипуляции тоже необходимо проделать, иначе ничего не заработает, я проверял это буквально вчера. Правда это был sql2012, а файлы от 2.4, но я не думаю, что в разных версиях это так сильно отличается.

Share this post


Link to post
Share on other sites

Собственно продолжая тему безопасности. Меня интересует,(как и описано в шапке) взлом через клиент игры game.exe, 
И что страшного в GroupServer и AccountServer? ведь можно триггеры и хранимую процедуру написать в SQL
V3ct0r, давайте обсудим с вами, хочется уяснить моменты :)
Спасибо всем, за конструктивную дискуссию.

Edited by pirate
Дополнение

Share this post


Link to post
Share on other sites
В 06.09.2016 в 23:53, pirate сказал:

Собственно продолжая тему безопасности. Меня интересует,(как и описано в шапке) взлом через клиент игры game.exe, 
И что страшного в GroupServer и AccountServer? ведь можно триггеры и хранимую процедуру написать в SQL
V3ct0r, давайте обсудим с вами, хочется уяснить моменты :)
Спасибо всем, за конструктивную дискуссию.

 

Да, в гайде этот момент и еще несколько дыр не были рассмотрены. Обсуждать тут особо нечего, все уже давно разобрано и исправлено. Можете поднять архивы на MD

 

Если в кратце, то:

AccountServer.exe

Когда клиент подключается к серверу, то первым делом отправляет логин пакет, который содержит: логин, пароль, MAC-адрес клиента, версию клиента. AccountServer.exe не проверяет MAC-адрес и пишет его в базу данных как есть. Таким образом, злоумышленник может записать вместо MAC-адреса SQL-инъекцию и провести атаку на сервер.

 

GroupServer.exe:

Проблема по сути такая же. Клиент в первый раз зашел на аккаунт и ему предлагается создать секретный код. Пакет создания секретного кода состоит из одного поля (насколько я помню) - строки секретного кода в MD5 в верхнем регистре. Это поле тоже никак не проверяется. Если быть точнее, то проверяется только его длина - 32 символа. В итоге вместо секретного кода, "хакер" может записать SQL-инъекцию, и она пройдет. Аналогично с пакетом смены секретного кода.

 

От этих уязвимостей давно есть защита: различные "фильтр-серверы", которые устанавливаются между GateServer.exe и GroupServer.exe/AccountSerever.exe и проверяют эти пакеты на SQL-инъекции. Либо можно пропатчить данные .exe и добавить в них проверку этих уязвимых полей. Так же есть исходники, так что это теперь вообще не проблема.

 

  • Like 1

Share this post


Link to post
Share on other sites

Так же мы здесь обсуждали уязвимости (Англоязычный раздел)

 

  • Like 1

Share this post


Link to post
Share on other sites

Не полный гайд, по настройке sql.

 

Во-первых, у вас ничего не запуститься. Если вы поставите права только db_datawriter. Т.к. доступа для чтения БД не будет ;)

Нужно ставить и db_datareader

 

Во-вторых, после выполненных выше действий. Запуститься все, кроме GroupServer. Почему? Потому GroupServer при запуске, создает триггер в БД. А при завершении, удаляет его. И т.к. у нас нет прав на григгеры, он просто закроется через несколько секунд. Что бы дать доступ ему на создание/удаление триггера, нужно выдать db_ddladmin на БД gamedb.

 

Остальные пункты, не разбирал.

Edited by Chudik
  • Like 1

gigabar.png.c3c21d2a586d5395019e41be9510900b.png

По всем вопросам, обращайтесь [email protected]

Share this post


Link to post
Share on other sites

Решил немного сказать и за другие пункты. FTP и RDP можете закрыть фаерволлом (брандмауэр Windows). Т.е. разрешить подключение, только со своего ip-адреса или своей сети. И не боятся.

Если же вдруг, у вас ip динамический и сетей у провайдера много (например, Ростелеком).

Подключите двухфакторную авторизацию. Например, отлично с этим справляется DUO Security (бесплатно).

Тогда не подтвердив подключение на телефоне, на сервер зайти будет невозможно.

 

Это самые надежные способы на данный момент.

 

Web сервера не ставьте на хост с игрой, это самая глупая идея!

Лучше найдите и купите хостинг с поддержкой mssql в php. Слава богу, сейчас хостинги недорогие.

Edited by Chudik
  • Like 1

gigabar.png.c3c21d2a586d5395019e41be9510900b.png

По всем вопросам, обращайтесь [email protected]

Share this post


Link to post
Share on other sites

Схема db_datawriter действительно не включает в себя права db_datareader, поэтому вместе с db_datawriter надо добавлять также схему db_datareader. Для создания триггера не обязательно давать права DDL на всю базу, достаточно дать права на изменение таблицы character (т.к. триггер создается именно на ней)

 

7d2c7128d31cd26199f85e70d82d67d5.png

Edited by Duduf
  • Like 1

Share this post


Link to post
Share on other sites
5 hours ago, Totoka said:

@Faller ^

 

 

I did not understand anything at all lmao

I'll give it a try when I get to my PC, let's hope Google translate will help hahahahaha

btw, thanks for remembering me =)

  • Like 1

Share this post


Link to post
Share on other sites
В 11.07.2016 в 00:03, V3ct0r сказал:

Создайте пользователя под которым будет работать веб-обвязка (в моем случае это Webmaster) по аналогии с пользователем Gamemaster. Задайте права на базу AccountServer как db_datawriter, public, а на базу GameDB как db_datareader, public.

В этом месте нужно получается ставить права одинаковые?

Если судить по вышеизложенным комментам?

AccountServer как db_datawriter, public, db_datareader, а на базу GameDB как db_datareader, public, db_datawriter.

Share this post


Link to post
Share on other sites
1 час назад, Спейсио сказал:

В этом месте нужно получается ставить права одинаковые?

Если судить по вышеизложенным комментам?

AccountServer как db_datawriter, public, db_datareader, а на базу GameDB как db_datareader, public, db_datawriter.

 

Для создания аккаунтов из веб-обвязки права нужны на запись на базу AccountServer, т.е. public, db_datawriter, db_datareader.

Если веб-обвязка не предусматривает манипуляций с игровыми аккаунтами и персонажами (баны через сайт, переименования, запись в инвентари и пр.), то на GameDB нужно только public и db_datareader, если требуется запись, то дополнительно нужно еще db_datawriter

Edited by Duduf
  • Like 1

Share this post


Link to post
Share on other sites
4 минуты назад, Duduf сказал:

 

Для создания аккаунтов из веб-обвязки права нужны на запись на базу AccountServer, т.е. public, db_data_writer, db_data_reader.

Если веб-обвязка не предусматривает манипуляций с игровыми аккаунтами и персонажами (баны через сайт, переименования, запись в инвентари и пр.), то на GameDB нужно только public и db_datareader, если требуется запись, то дополнительно нужно еще db_datawriter

Спасибо за ответ.

Share this post


Link to post
Share on other sites
В 16.10.2016 в 14:59, Chudik сказал:

Не полный гайд, по настройке sql.

 

Во-первых, у вас ничего не запуститься. Если вы поставите права только db_datawriter. Т.к. доступа для чтения БД не будет ;)

Нужно ставить и db_datareader

 

Во-вторых, после выполненных выше действий. Запуститься все, кроме GroupServer. Почему? Потому GroupServer при запуске, создает триггер в БД. А при завершении, удаляет его. И т.к. у нас нет прав на григгеры, он просто закроется через несколько секунд. Что бы дать доступ ему на создание/удаление триггера, нужно выдать db_ddladmin на БД gamedb.

 

Остальные пункты, не разбирал.

Делал полностью по гайду сверху. Группсервер писал иероглифы какие-то в табло свое, а если сразу же запускать гейм сервера, вылезают ошибки  что-то там с character. Добавил db_ddladmin, db_datareader и запустилось

Share this post


Link to post
Share on other sites
On 11/12/2019 at 6:09 PM, Graf said:

Обновить бы скриншоты..

Привет, @Graf!

Восстановил изображения, спасибо!

  • Thanks 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...