Защита стека TCP/IP от SYN атак

ОГЛАВЛЕНИЕ

Большинство людей знает, насколько может быть проблематична защита от SYN-атак. Обычно используются несколько более или менее эффективных методов. Почти в каждом случае, основным решением является правильная фильтрация пакетов. В дополнение к созданию пакетных фильтров, администратором может быть выполнена модификация TCP/IP стека данной операционной системы. Данный метод - настройка TCP/IP стека в различных операционных системах, и будет описан ниже.

В то время как невозможно полностью предотвратить SYN атаки, настройка TCP/IP стека помогает уменьшить влияние этого вида атак, при этом все еще разрешая легальный клиентский трафик через сервер. Необходимо отметить, что некоторые SYN атаки не всегда пытаются "положить" серверы, вместо этого они пытаются потребить всю пропускную способность вашего Internet канала.

Что может сделать администратор, когда его серверы подвергаются классической (не использующей заполнения пропускной способности интернет-канала), SYN атаке? Одним из наиболее важных шагов является включение встроенных в операционную систему механизмов защиты, таких как SYN cookies или SynAttackProtect. Дополнительно, в некоторых случаях, необходима настройка параметров TCP/IP стека. Изменение заданных по умолчанию значений стековых переменных, является уже другим уровнем защиты и помогает нам лучше защитить наши хосты. В этой статье мы сконцентрируем наше внимание на:

  • Увеличении очереди полуоткрытых соединений (в состоянии SYN RECEIVED).
  • Уменьшении, в очереди, периода времени хранения незавершенных подключений в состоянии SYN RECEIVED.

Этот метод выполняется с помощью уменьшения времени первой повторной передачи пакета или уменьшения (вплоть до полного отключения) количества повторных передач пакета. Процесс повторной передачи пакета выполняется сервером, до получения от клиента ACK пакета. Пакет с флагом ACK завершает процесс установления соединения между сервером и клиентом.

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

Также необходимо помнить, что модификация переменных, изменит режим работы стека TCP/IP. Так, после модификации, мы должны удостовериться, что сервер может должным образом связываться с другими хостами. Например, отключение повторных передач пакета в некоторых системах низкой пропускной способностью, может привести к отказу в работе при легальных запросах. В этой статье можно найти описание TCP/IP переменных для следующих операционных систем: Microsoft Windows 2000, RedHat Linux 7.3, Sun Solaris 8 и HP-UX 11.00.


Определения: SYN атака и SYN спуфинг

SYN атака -это один из типов DDoS атак. Мы можем говорить, что хост жертвы подвергся SYN атаке, в случае, когда злоумышленник пытается создать огромное количество подключений в состоянии SYN RECEIVED до тех пор, пока не переполнится очередь соединений. Состояние SYN RECEIVED создается, когда хост жертвы получает запрос на подключение (пакет с набором флага SYN) и распределяет для этого некоторые ресурсы памяти. При SYN атаке создается такое количество полуоткрытых подключений, что система переполняется и больше не может обрабатывать поступающие запросы.

Для увеличения эффективности SYN атаки, злоумышленник использует фиктивные IP адреса в SYN пакетах. В этом случае хост жертвы не может быстро закончить процесс инициализации, потому что исходный IP адрес может быть недостижим. Эта злонамеренная операция называется SYN спуфингом.

Мы должны знать, что процесс создания полного подключения занимает некоторое время. Первоначально, после получения запроса на подключение (пакет с набором флага SYN), хост жертвы помещает это полуоткрытое соединений в очередь и посылает первый ответ (пакет с флагами SYN и ACK). Если жертва не получает ответ от удаленного хоста, то она повторно передает SYN+ACK пакеты, до тех пор, пока не наступит тайм-аут, а затем удаляет это полуоткрытое соединение из очереди. В некоторых операционных системах этот процесс, для каждого отдельного SYN запроса, может занимать приблизительно 3 минуты! В этом документе Вы узнаете, как можно изменить эту закономерность. Другой, не менее важной информацией, которой Вы должны владеть является то, что операционная система может обрабатывать только определенное количество полуоткрытых подключений в очереди. Это количество управляется размером очереди соединений. Например, заданный по умолчанию размер очереди в RedHat 7.3 - 256, а в Windows 2000 Professional - 100. Когда размер очереди достигнет этого размера, система больше не будет принимать поступающие запросы.


Обнаружение SYN атак

Обнаружить SYN атаку очень легко. Команда netstat показывает нам количество подключений находящихся в полуоткрытом состоянии. Полуоткрытое состояние описано как SYN_RECEIVED в Windows и как SYN_RECV в Unix системах.

# netstat -n -p TCP tcp 0 0 10.100.0.200:21 237.177.154.8:25882 SYN_RECV - tcp 0 0 10.100.0.200:21 236.15.133.204:2577 SYN_RECV - tcp 0 0 10.100.0.200:21 127.160.6.129:51748 SYN_RECV - tcp 0 0 10.100.0.200:21 230.220.13.25:47393 SYN_RECV - tcp 0 0 10.100.0.200:21 227.200.204.182:60427 SYN_RECV - tcp 0 0 10.100.0.200:21 232.115.18.38:278 SYN_RECV - tcp 0 0 10.100.0.200:21 229.116.95.96:5122 SYN_RECV - tcp 0 0 10.100.0.200:21 236.219.139.207:49162 SYN_RECV - tcp 0 0 10.100.0.200:21 238.100.72.228:37899 SYN_RECV - ...

Мы можем также подсчитать количество полуоткрытых подключений находящихся в очереди в настоящее время. В приведенном ниже примере, 769 подключений (для TELNET) находящихся в состоянии SYN RECEIVED сохраняются в очереди задач.

* netstat-n-p TCP | grep SYN_RECV | grep:23 | wc-l

769

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

В этом примере мы пронаблюдаем за значением параметра TcpHalfOpenDrop на системе Sun Solaris.

* netstat-s-P tcp | grep tcpHalfOpenDrop

 tcpHalfOpenDrop = 473

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

Очередь соединений

Очередь соединений - большая структура памяти, используемая для обработки поступающих пакетов с набором флага SYN до момента установления соединения между клиентом и сервером. Операционная система распределяет часть системной памяти для каждого поступающего соединения. Мы знаем, что каждый tcp порт может обрабатывать только определенное количество поступающих запросов. Очередь соединений управляет количеством полуоткрытых подключений, способных одновременно обрабатываться операционной системой. Когда количество поступающих соединений достигнет максимального уровня, все последующие запросы будут отклонены операционной системой.

Как упомянуто выше, обнаружение большого количества соединений в состоянии SYN RECEIVED скорее всего означает, что хост подвергся SYN атаке. Кроме того, исходные IP адреса, этих пакетов могут быть фиктивными. Для ограничения эффективности SYN атак мы должны включить некоторые встроенные защитные механизмы. Иногда мы также можем использовать методы типа увеличения размера очереди соединений и уменьшения времени хранения незавершенных соединений в распределяемой памяти (в очереди соединений).


Механизмы защиты ОС Windows, Linux, Solaris, HP-UX

Операционная система: Windows 2000

Наиболее важным параметром в Windows 2000 и в Windows Server 2003 является параметр SynAttackProtect. Включение этого параметра позволяет операционной системе более эффективно обрабатывать поступающие соединения. Защита может быть установлена, путем добавления значения SynAttackProtect, типа DWORD, в следующий ключ системного реестра:

HKLMSYSTEMCurrentControlSetServicesTcpipParameters

В случае обнаружения SYN атаки, параметр SynAttackProtect изменяет режим работы стека TCP/IP, что позволяет операционной системе обрабатывать большее количество SYN запросов. Принцип работы заключается в отключении некоторые опций сокета, добавлении дополнительных задержек к показаниям соединения и изменении тайм-аута для запросов.

Когда значение SynAttackProtect равно 1, количество повторных передач уменьшено, а маршрутизация содержимого кеша отсрочена до создания соединения. Рекомендуемое значение SynAttackProtect - 2, при котором дополнительно задерживается признак соединения с Windows Socket до установления связи сервера с клиентом. В ходе нападения, лучшая производительность в обработке соединений достигается с помощью отключения нескольких параметров (эти параметры обычно используются системой в течение процесса создания новых соединений). Параметр TCPINITIALRTT, определяющий время первой перепередачи, больше не будет использоваться.

Как мы можем увидеть, включение параметра SynAttackProtect не изменяет режим работы стека TCP/IP до и при SYN атаке. Но даже при включенном параметре SynAttackProtect, операционная система может обрабатывать легальные поступающие соединения.

Операционная система автоматически включает защиту от SYN атак, когда обнаруживает превышение значений следующих трех параметров: TcpMaxHalfOpen, TcpMaxHalfOpenRetried и TcpMaxPortsExhausted.

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

Элемент системного реестра TcpMaxHalfOpen определяет максимальное количество состояний SYN RECEIVED, которые могут быть одновременно обработаны, прежде чем сработает SYN защита. Рекомендуемое значение этого параметра - 100 для Windows 2000 Server и 500 для Windows 2000 Advanced Server.

TcpMaxHalfOpenRetried определяет максимальное количество полуоткрытых подключений, для которых операционная система выполнила по крайней мере одну повторную передачу, прежде, чем сработает SYN защита. Рекомендуемое значение - 80 для Windows 2000 Server, и 400 для Advanced Server.

Элемент системного реестра TcpMaxPortsExhausted определяет число отклоненных SYN запросов, после которого сработает защита от SYN атак. Рекомендованное значение - 5.

Операционная система: Linux RedHat

В RedHat, как и в других Linux системах, осуществлен механизм SYN cookies, который включается следующим способом:

* ECHO 1 >/proc/sys/net/ipv4/tcp_syncookies

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

Защита SYN cookies особенно полезна, в случае, когда система подверглась SYN атаке, а исходные IP адреса пакетов - фиктивные (SYN спуфинг). Этот механизм позволяет структурировать пакеты с набором флагов SYN и ACK, которые имеют специально обработанный "начальный номер последовательности" (ISN), называемый cookie. Значение cookie это не псевдослучайное число, сгенерированное системой, а результат действия хеш-функции. Это значение генерируется хеш-функцией в зависимости от следующей информации: IP-адрес источника, порт источника, IP адрес получателя, порт получателя плюс некоторые секретные значения. В ходе SYN атаки, когда заполняется очередь соединений, система вместо отклонения запроса, генерирует ответ, посылая клиенту пакет с cookie. Когда сервер получает пакет с набором флажка ACK (последняя стадия процесса установления соединения с клиентом), тогда он проверяет значение cookie. Если это значение правильно, то сервер создает подключение, даже в случае если нет никакого соответствующего элемента в очереди соединений. В этом случае мы знаем, что это легальное соединение, и что исходный IP адрес не фиктивный. Важно обратить внимание на то, что механизм работы SYN cookie, вообще не использует очередь соединений, так что теперь мы не должны изменять её размер. Более подробную информацию об использовании SYN cookies можно найти здесь.

Также необходимо обратить внимание на то, что механизм SYN cookies работает только когда опция CONFIG_SYNCOOKIES установлена в ходе компиляции ядра системы.

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


Увеличение размера очереди соединений

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

Увеличение размера очереди задач требует, чтобы система резервировала дополнительные ресурсы памяти для входящих соединений. Если в системе отсутствует достаточное количество свободной памяти для этой операции, то пострадает производительность системы. Также мы должны удостовериться, что сетевые приложения (Apache, IIS и т.д.) смогут принимать большее количество подключений.

Операционная система: Windows 2000

Кроме описанных выше переменных TcpMaxHalfOpen и TcpMaxHalfOpenRetried, в Windows 2000 количество полуоткрытых подключений может быть установлено через динамическую очередь соединений. Конфигурирование этой очереди выполняется через драйвер AFD.SYS. Этот драйвер используется для поддержки Windows Socket приложений (FTP, Telnet и т.д.). Для увеличения количества полуоткрытых соединений, AFD.SYS поддерживает четыре элемента системного реестра. Все эти значения расположены в следующем ключе системного реестра:

HKLMSystemCurrentControlSetServices AFDParameters

Значение системного реестра EnableDynamicBacklog - глобальный переключатель, включающий или выключающий динамическую очередь соединений. Значение 1 - включает динамическую очередь.

MinimumDynamicBacklog - управляет минимальным количеством свободных соединений, разрешенных на каждом отдельном TCP порте. Если количество свободных соединений снижается ниже этого значения, то дополнительные свободные соединения будут созданы автоматически. Рекомендованное значение 20.

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

Последний параметр DynamicBacklogGrowthDelta управляет количеством свободных соединений, создаваемых в случае необходимости. Рекомендуемое значение: 10.

Ниже расположена таблица, показывающая рекомендуемые значения для драйвера AFD.SYS:

Значение подключа реестра

Формат

Значение

EnableDynamicBacklog

DWORD

1

MinimumDynamicBacklog

DWORD

20

MaximumDynamicBacklog

DWORD

20000

DynamicBacklogGrowthDelta

DWORD

10

Операционная система: Linux

Переменная Tcp_max_syn_backlog определяет количество полуоткрытых подключений сохраняемых в очереди соединений. Например, 256 - общее количество полуоткрытых подключений, размещенных в памяти Linux RedHat 7.3. Переменные TCP/IP стека могут быть сконфигурированы с помощью команды sysctl или стандартными командами Unix. Ниже показан пример изменения заданного по умолчанию размера очереди соединений с помощью команды sysctl:

 # sysctl -w net.ipv4.tcp_max_syn_backlog="2048"

Операционная система: Sun Solaris

В операционной системе Sun Solaris есть два параметра, управляющие максимальным количеством подключений. Первый параметр управляет общим количеством полных подключений. Второй параметр tcp_conn_req_max_q0, определяет при каком количестве полуоткрытых соединений, поступающие запросы не будут отклонены системой. Заданное по умолчанию значение этого параметра в ОС Sun Solaris 8 равно 1024. Мы можем изменять это значение при помощи команды ndd.

# ndd -set /dev/tcp tcp_conn_req_max_q0 2048

Операционная система: HP-UX

В операционной системе HP-UX, ответственной за управление максимальным количеством полуоткрытых соединений в состоянии SYN RECEIVED, является переменная TCP/IP стека tcp_SYN_rcvd_max. По умолчанию, в ОС HP-UX 11.00, значение этой переменной равно 500. Изменение этого значения, как и в ОС Sun Solaris, происходит с помощью команды ndd.

# ndd -set /dev/tcp tcp_syn_rcvd_max 2048


Уменьшение полного времени обработки запроса на соединение

Поскольку мы знаем, что SYN атака/спуфинг это просто ряд SYN пакетов, главным образом с фиктивными IP адресами. В прошлом разделе мы увеличили размер очереди соединений. Теперь, когда наши системы могут обрабатывать большее количество SYN запросов, мы должны уменьшить полное время хранения полуоткрытых соединений в очереди. Когда сервер получает запрос, он немедленно посылает пакет с набором флагов SYN и ACK, помещает это полуоткрытое соединение в очередь, а затем ожидает от клиента пакет с флагом ACK. Если сервер не получает ответа от клиента, то он еще несколько раз передает ответный пакет (с флагами SYN и ACK), (количество ответов зависит от установок операционной системы), давая клиенту возможность для пересылки ACK пакета. Ясно, что в случае фиктивности исходного IP адреса клиента, ACK пакет никогда не прибудет. После нескольких минут ожидания сервер удаляет это полуоткрытое соединение. Мы можем ускорить процесс удаления соединений в состоянии в SYN RECEIVED из очереди соединений, изменяя время первой перепередачи и общего количества перепередач.

Другая методика защиты от SYN атак заключается в отключении некоторые параметров TCP, которые всегда активны в течение процесса установления связи сервера с клиентом. Некоторые из этих параметров автоматически выключаются механизмами, описанными в первом разделе (SynAttackProtect и Syncookies).

Теперь мы рассмотрим переменные стека TCP/IP, которые позволяют уменьшить время хранения полуоткрытых соединений в очереди задач.

Операционная система: Windows 2000

В Windows 2000, время для первой перепередачи, по умолчанию, равно 3 секундам (3000 миллисекундам) и может быть изменено с помощью значения элемента системного реестра TcpInitialRtt (для каждого интерфейса). Например, для уменьшения времени первой перепередачи до 2 секунд, мы должны установить значение TcpInitialRtt равным 2000 миллисекундам (в десятичном формате). Количество перепередач (пакетов с флагами SYN и ACK) управляется параметром системного реестра TcpMaxConnectResponseRetransmissions, который добавляется к ключу HKLMSYSTEMCurrentControlSetServicesTcpipParameters.

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

Значение

Время перепередачи

Полное время хранения полуоткрытых соединений в очереди

1

на 3-ей секунде

9 секунд

2

на 3-ей и 9-ой секундах

21 секунда

3

на 3-ей, 9-ой и 21 секундах

45 секунд

Мы можем установить это значение системного реестра в 0, после чего Windows вообще повторно не передает пакеты. В этом случае, система посылает только один ответ и удаляет полуоткрытое соединение через 3 секунды. Эта установка игнорируется, когда ее значение равно или больше 2, и когда включен механизм SynAttackProtect.

Операционная система: Linux RedHat

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

Значение

Время перепередачи

Полное время хранения полуоткрытых соединений в очереди

1

на 3-ей секунде

9 секунд

2

на 3-ей и 9-ой секундах

21 секунда

3

на 3-ей, 9-ой и 21 секундах

45 секунд

Операционная система: Sun Solaris

В этой операционной системе невозможно отключить перепередачи пакетов, непосредственно используя команду ndd. Кроме того, в ОС Sun Solaris есть параметры, которые являются неконфигурируемыми и которые управляют количеством перепередач (как минимум 3) и полным временем перепередачи пакетов (как минимум 3 минуты). Более детальную информацию об этих параметрах можно найти здесь.

Операционная система: HP-UX

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

Значение

Время перепередачи

Полное время хранения полуоткрытых соединений в очереди

1000

-

1 секунда

5000

На 2-ой секунде

5 секунд

10000

на 2-ой и 5-ой секундах

10 секунд

60000

на 2-ой, 5-ой, 11 и 47-ой секундах

1 минута

Мы можем изменить время первой перепередачи, изменив значение tcp_rexmit_interval_initial. Интервалы последующих перепередач управляются двумя параметрами: tcp_rexmit_interval и tcp_rexmit_interval_min. Эти три переменной такие же, как и в ОС Sun Solaris.

Выводы

Методы укрепления защиты стека TCP/IP, представленные в этой статье, делают серверы более стойкими к SYN-атакам - одним из видов DDoS атак. Модификация заданных по умолчанию параметров настроек  стека TCP/IP также рекомендуется в течение процесса защиты операционной системы.