ОС: 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