Назад | Перейти на главную страницу

Блокировать ICMP timestamp и timestamp response с помощью firewalld

ОС: CentOS 7.0

По результатам сканирования безопасности было предложено заблокировать ICMP-сообщения с меткой времени и ответные сообщения с меткой времени с помощью брандмауэра (CVE-1999-0524). Я использовал firewalld, чтобы настроить базовую фильтрацию IP-адресов для SSH, а также разрешить HTTPS, но на этом я остановился.

Единственное, о чем я мог думать, было firewall-cmd --add-icmp-block, но я не могу найти icmptype это похоже на ответ с отметкой времени или отметкой времени.

Доступные типы (firewall-cmd --get-icmptypes) являются следующими: destination-unreachable echo-reply echo-request parameter-problem redirect router-advertisement router-solicitation source-quench time-exceeded.

Как заблокировать запросы отметки времени ICMP с помощью firewalld?

firewalld поставляется со стандартным набором предопределенных типов ICMP, которые вы можете использовать прямо из коробки:

# firewall-cmd --get-icmptypes
destination-unreachable echo-reply echo-request parameter-problem redirect router-advertisement router-solicitation source-quench time-exceeded timestamp-reply timestamp-request

Парсер (/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.py) не ограничивается этими типами и позволяет расширять:

Во-первых, согласно man iptables-extensions(8), раздел icmp:

icmp (для IPv4) Это расширение может использоваться, если указан --protocol icmp. Он предоставляет следующие возможности:

  [!] --icmp-type {type[/code]|typename}
          This allows specification of the ICMP type, which can be a numeric ICMP type, type/code pair, or one of the ICMP type names shown by the command
           iptables -p icmp -h

icmp6 (для IPv6) Это расширение можно использовать, если --protocol ipv6-icmp' or--protocol icmpv6 'указан. Он предоставляет следующие возможности:

  [!] --icmpv6-type type[/code]|typename
          This allows specification of the ICMPv6 type, which can be a numeric ICMPv6 type, type and code, or one of the ICMPv6 type names shown by the command
           ip6tables -p ipv6-icmp -h

Два типа, на которые вы ссылаетесь, относятся к IPv4, поэтому вы должны использовать следующее, чтобы найти подходящие имена, распознаваемые iptables:

# iptables -p icmp -h | grep timestamp
timestamp-request
timestamp-reply

Теперь, если вы проверите содержимое firewalld пакет, вы найдете, где хранятся предопределенные типы ICMP:

# rpm -ql firewalld | grep icmptype
/etc/firewalld/icmptypes
/usr/lib/firewalld/icmptypes/destination-unreachable.xml
/usr/lib/firewalld/icmptypes/echo-reply.xml
/usr/lib/firewalld/icmptypes/echo-request.xml
/usr/lib/firewalld/icmptypes/parameter-problem.xml
/usr/lib/firewalld/icmptypes/redirect.xml
/usr/lib/firewalld/icmptypes/router-advertisement.xml
/usr/lib/firewalld/icmptypes/router-solicitation.xml
/usr/lib/firewalld/icmptypes/source-quench.xml
/usr/lib/firewalld/icmptypes/time-exceeded.xml
/usr/lib/firewalld/xmlschema/icmptype.xsd
/usr/share/man/man5/firewalld.icmptype.5.gz

Если вы проверите парсер, упомянутый выше, вы увидите, что он использует имя файла XML как тип ICMP при разговоре с iptables, поэтому вам нужно написать два новых файла для типов ICMP, которые вы хотите использовать, используя типы ICMP, указанные выше. Типы ICMP, созданные пользователем, должны храниться в /etc/firewalld/icmptypes.

# cat timestamp-request.xml
<?xml version="1.0" encoding="utf-8"?>
<icmptype>
  <short>Timestamp Request</short>
  <description>This message is used for time synchronization.</description>
  <destination ipv4="yes"/>
  <destination ipv6="no"/>
</icmptype>
# cat timestamp-reply.xml
<?xml version="1.0" encoding="utf-8"?>
<icmptype>
  <short>Timestamp Reply</short>
  <description>This message is used to reply to a timestamp message.</description>
  <destination ipv4="yes"/>
  <destination ipv6="no"/>
</icmptype>

В итоге вы получите:

# ll -Z /etc/firewalld/icmptypes
-rw-r--r--. root root system_u:object_r:firewalld_etc_rw_t:s0 timestamp-reply.xml
-rw-r--r--. root root system_u:object_r:firewalld_etc_rw_t:s0 timestamp-request.xml

Проверьте их с помощью предоставленного XSD:

# xmllint --schema /usr/lib/firewalld/xmlschema/icmptype.xsd timestamp-request.xml
timestamp-request.xml validates

# xmllint --noout --schema /usr/lib/firewalld/xmlschema/icmptype.xsd timestamp-reply.xml
timestamp-reply.xml validates

Перезагрузите брандмауэр:

# firewall-cmd --reload

И наконец добавьте их:

# firewall-cmd --add-icmp-block=timestamp-request
# firewall-cmd --add-icmp-block=timestamp-reply

# firewall-cmd --list-icmp-blocks
timestamp-reply timestamp-request

Вы можете проверить, что они были добавлены, посмотрев на iptables правила напрямую:

iptables -nvL | grep icmp
0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
0     0 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
0     0 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 13 reject-with icmp-host-prohibited
0     0 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 14 reject-with icmp-host-prohibited
0     0 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 13 reject-with icmp-host-prohibited
0     0 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 14 reject-with icmp-host-prohibited

Типы 13 и 14 - это недавно добавленные Типы ICMP.

Для справки вы можете прочитать firewalld.icmptypes(5) справочная страница.

Эти типы ICMP были включены вверх по течению.

Может быть, это тоже может быть полезно, даже если это не делается с помощью firewalld:

echo "net.ipv4.tcp_timestamps = 0" >> /etc/sysctl.conf
sysctl -p