Вы скажете, что тут и из коробки все отлично и вроде все гениально, вплоть до автогенерации такого пароля для web-сайтов, который даже зрительно не воспринимается с пятой попытки, однако, представим себе, что для нас важно защититься не только от повседневных хакеров, но и от самих разработчиков системы.
Исследования мои этих моментов начались еще с момента выхода OS X Lion 10.7 и я изначально использовал для защиты стороннее программное обеспечение, платное и весьма эффективное, пока не разобрался что к чему и посредством чего это программное обеспечение покрывает такой результат.
Собственно, вот простой скрипт, который глушит управление firewall через внутренние сервисы системы MacOS на базе якорей и отдает управление напрямую пакетному фильтру, который блокирует вообще все входящие подключения:
#
# Ninja PF configuration file( original located on /etc/pf.conf.backup ).
#
# This file contains the main ruleset, which gets automatically loaded
# at startup. PF will not be automatically enabled, however. Instead,
# each component which utilizes PF is responsible for enabling and disabling
# PF via -E and -X as documented in pfctl(8). That will ensure that PF
# is disabled only when the last enable reference is released.
#
# Care must be taken to ensure that the main ruleset does not get flushed,
# as the nested anchors rely on the anchor point defined here. In addition,
# to the anchors loaded by this file, some system services would dynamically
# insert anchors into the main ruleset. These anchors will be added only when
# the system service is used and would removed on termination of the service.
#
# See pf.conf(5) for syntax.
#
# ICMP configure
icmp_types = "{echoreq, echorep, unreach}"
icmp6_types = "{echoreq, unreach, echorep, 133, 134, 135, 136, 137}"
netbios_types = "{137,138,139}"
interfaces = "{en0, en1, en2, en3, en4}"
# Base policy
set fingerprints "/etc/pf.os"
set block-policy drop
set state-policy if-bound
set require-order yes
set optimization aggressive
set ruleset-optimization none
set skip on lo0
scrub in all fragment reassemble no-df min-ttl 64 max-mss 1440
scrub out all random-id
block in log all
pass out quick flags S/SA modulate state
# Antispoofing
antispoof quick for $interfaces inet
antispoof quick for $interfaces inet6
# More secure settings
block in from urpf-failed to any
block in quick on $interfaces from any to 255.255.255.255
block in quick on $interfaces from any to 255.255.255.0
# ICMP policy
block in inet proto icmp all icmp-type $icmp_types keep state
block in inet6 proto icmp6 all icmp6-type $icmp6_types keep state
block in on $interfaces proto {tcp,udp} from any to any port $netbios_types
Не забудьте поставить галку включить firewall в preferences. Чтобы проверить, что PF запущен просто выполните в терминале
sudo pfctl -sa
Здесь кратко собранны паттерны правил управления соединениями и интерфейсами, а сама настройка максимально блокирует входящий трафик. Если у вас совсем паранойя — просто закоментируйте строчку set skip on lo0 и вы избавите систему от работоспособного web-сервера и заблокируете большинству приложений доступ к loop back интерфейсу(петля терминала).
Lo0 обычно полезно блокировать, если вы любите поиграть в пиратские игры с торрентов, которые нередко пропатчены эксполойом или еще какой-то дрянью.
Второе, что делает скрипт, это по согласию пользователя устанавливает повышенные настройки безопасности ядра.
Вот краткий листинг:
# 10.13.4 system ctl configuration
# Kernel IPC overrides
kern.ipc.somaxconn=100
# kernel security level(0, 1 - soft security level or 2 - can't install any software)
kern.securelevel=1
# Speed up TM backups
debug.lowpri_throttle_enabled=0
kern.coredump=0
# Networking settings
net.link.ether.inet.max_age=600
net.inet.ip.redirect=0
net.inet6.ip6.redirect=0
net.inet.ip.sourceroute=0
net.inet.ip.accept_sourceroute=0
net.inet.ip.linklocal.in.allowbadttl=0
net.inet.icmp.bmcastecho=0
net.inet.icmp.icmplim=50
net.inet.icmp.maskrepl=0
net.inet.udp.blackhole=1
net.inet.tcp.blackhole=2
net.inet.tcp.delayed_ack=2
net.inet.tcp.always_keepalive=0
net.inet.tcp.rfc3390=1
net.inet.tcp.rfc1644=1
net.inet.tcp.tso=0
# Incoming and outgoing port ranges
net.inet.tcp.sack_globalmaxholes=2000
net.inet.ip.portrange.first=1024
net.inet.ip.portrange.last=65535
net.inet.ip.portrange.hifirst=1024
net.inet.ip.portrange.hilast=2500
net.inet.ip.check_interface=1
net.inet.tcp.keepidle=50000
net.inet.ip.rtmaxcache=1024
net.inet.tcp.path_mtu_discovery=0
net.inet6.icmp6.rediraccept=0
net.inet.tcp.msl=4500
net.inet6.icmp6.nodeinfo=0
net.inet6.ip6.accept_rtadv=0
net.inet6.ip6.auto_linklocal=1
net.inet6.ip6.only_allow_rfc4193_prefixes=1
net.inet6.icmp6.nd6_onlink_ns_rfc4861=1
Данные параметры ядра ужесточают политику сетевых подключений включая все возможные RFC и блокируя все возможные шумы(эхо, редиректы и так далее), а отдельного внимания стоит параметр kern.securelevel=1, который может оказаться крайне полезным для pen тестера.
kern.securelevel=2 полностью заблокирует возможности установки в систему каких либо пакетов. Вообще наглухо. Но система при этом не потеряет работоспособности.
Я также перевернул порты приложений требующих высокие значения и приземлил их пониже, чтобы трафик было не комфортнее «слушать».
Далее скрипту добавлены опции кастомизации некоторых параметров отображения Finder и небольшие настройки для Safari. Например, стоит отключить AV Foundation и прочие медиа функции так, как одной сплойтерной картинкой с web сайта систему можно хакнуть через аудио и видео стримы.
И вообще, странно, но даже iTunes в MacOS следит, поэтому я предпочитаю полный танк.
Заплатка выложена на GitHub. Для запуска используйте
sudo ./fix.sh
Если у вас есть предложения и поправки — предлагаю поделиться своими соображениями в комментариях.
Автор: крепыш