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
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

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

 

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

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

 

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

 

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

Edited by Chudik
  • Like 1

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

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×