Ciscoman's notes (Записки цыщика c дипломом)

I'm Cisco Champion Community member for 2017!

I'm Cisco Champion Community member for 2017!
"Cisco Champions are passionate about Cisco and happy to share our knowledge, experience, and feedback."

понедельник, 9 февраля 2009 г.

Настраиваем неприступный маршрутизатор. Часть 1.

Статья была опубликована в журнале IT-Спец за март 2008 г.

Хотелось бы сразу сказать, что данная статья не претендует на какую-либо уникальность и новизну. Я лишь еще раз повторю то, что говорили уже много раз, однако постараюсь привнести в это сказанное некую изюминку. Проще говоря статья повествует о том, как защищает свои маршрутизаторы автор. Статья рассчитана на человека, который знаком с операционной системой IOS маршрутизаторов Cisco и имеет базовые представления о принципах коммутации, маршрутизации и сетевых протоколах. В основном я буду рассматривать IOS версии 12.4 с функционалом advansed IP services, однако с большой долей вероятности все нижесказанное может быть применено к более старым операционным системам.

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

И так, план действий защиты таков:
1.Настройка аутентификации и паролей
2.Ограничение доступа к маршрутизатору
3.Отключение лишних служб и включение дополнительных
4.Настройка SNMP
5.Настройка журналирования


1.Операционная система Cisco IOS во многом очень схожа с большинством операцион6ных систем семейства UNIX. Как и в *nix-системах все основные операции по настройке и работе с маршрутизатором происходят посредством взаимодействия с командной оболочкой (CLI). Доступ к командной оболочке можно получить через удаленный терминал (vty), консольный порт (con), либо через модем на порту aux. Чаще всего весь процесс взаимодействия с маршрутизатором происходит через удаленный терминал. Консольный порт применяется лишь в экстренных случаях или в случае острой паранойи. Если маршрутизатор установлен на чужой территории, например вы арендуете место в шкафу, то можно отключить консоль и аuх порты, чтобы предотвратить физический доступ к маршрутизатору. Однако вам тогда будет сложнее самим зайти на него в случае потери удаленного управления. Модем часто применяется как резервный канал доступа к маршрутизатору, но в последнее время его применяют все реже. Существуют два основных режима, в котором можно работать с командной оболочкой: непривилегированный режим (EXEC level) и привилегированный режим (privileged EXEC level). Привилегированный режим позволяет изменять настройки маршрутизатора в режиме конфигурации. По большому счету это очень напоминает непривилегированного пользователя и root. Примерно как обычный пользователь *nix системы использует команду su для авторизации исполнения команд с правами root, в IOS используется команда enable. Всего в IOS доступны 15 уровней приоритетов. Привилегированный режим обычно имеет уровень приоритета 15, в то время как обычный пользователь в непривилегированном режиме имеет уровень 1. Кроме того администратор может задать определенный набор команд, доступный для пользователя в соответствии с его режимом приоритета, например так:

!
enable secret level 4 5 $1$6Dr/$vVMNdSKUfSkF.o9IMasrt1
!
privilege exec level 4 traceroute
privilege exec level 4 ping
privilege exec level 4 clear
privilege exec level 4 show configuration
!

Пароли в конфигурации маршрутизатора могут быть нескольких типов:
- обычные открытые (plain-text) пароли
- type 7 пароли
- type 5 пароли
По-умолчанию в конфигурации маршрутизатора пароли хранятся в открытом тексте и любой, кто имеет доступ к привилегированному режиму командной оболочки или к самому файлу конфигурации может увидеть их просматривая show running-config или show startup-config. Избежать этого можно с помощью кодирования паролей командой

service password-encryption

После применения этой команды все plain-text пароли в конфигурации заменяются на так называемые type 7 пароли, которые представляют из себя набор цифр и заглавных букв от A до F. Хотя формально эти пароли и зашифрованы, назвать шифрованием такой метод сложно так как основан он на применении XOR-подобной функции с ключом

dsfd;kfoA,.iyewrkldJKDHSUBsgvca69834ncxv9873254k;f g87

Существует множество утилит для расшифровки type 7 паролей, множество из которых доступно на packetstormsecurity.org и ему подобных сайтах. С таким же успехом пароль может быть раскодирован на самом маршрутизаторе с помощью нехитрой последовательности действий. Для начала включим режим шифрования plain-text паролей и добавим некого тестового пользователя с паролем «passw0rd»:

Router(config)#service password-encryption
Router(config)#username test password passw0rd
Теперь выполним команду show и выведем нашу строку:
Router(config)#do show run | include username
username test password 7 044B0A151C361C5C0D
Затем создадим цепочку ключей и введем type-7 пароль как ключевую строку для него:
Router(config)#key chain decrypt
Router(config-keychain)#key 0
Router(config-keychain-key)#key-string 7 044B0A151C361C5C0D
А теперь с помощью show выведем расшифрованную строку:
Router(config-keychain-key)#do show key chain decrypt
Key-chain decrypt:
****key 1 -- text "passw0rd"
********accept lifetime (always valid) - (always valid) [valid now]
********send lifetime (always valid) - (always valid) [valid now]
Как видим, безопасность type 7 паролей оставляет желать лучшего. Выхода может быть два — один из них оригинальный и нестандартный, другой — соответственно полная его противоположность. В качестве последнего можно использовать type 5 (или так называемые secret) пароли, которые переставляют из себя md5-хеши. Как известно, при достаточной длине пароля взломщик встретится с трудно решаемой вычислительной задачей, чего, в принципе, должно быть достаточно для защиты. Примером type 5 может служить пароль на режим enable:
enable secret 5 $1$3ORt$Pf.hrk2RehgDs3w7L5ER/0

Брать в рассмотрение первый способ рекомендую только в крайнем случае (например, выраженное проявление паранойи). Заключается он в модификации бинарного образа операционной системы маршрутизатора и изменении вышеупомянутого ключа шифрования. Не вдаваясь в подробности, скажу лишь что образ IOS представляет собой запакованный в слегка модифицированный zip-архив бинарный ELF-файл, который очень похож на ядро Linux и других подобных операционных систем. Строка шифрования представлена в нем в открытом виде и для ее модификации можно воспользоваться любым шестнадцатеричным редактором. Единственную проблему может представлять специальное поле контрольной суммы образа, которое необходимо будет переписать после изменения ключа и перепаковки образа. Как для распаковки, так и для корректной упаковки с подсчетом контрольной суммы можно использовать утилиту ciscopack от создателей книги «Hacking Exposed Cisco Networks». Скачать ее можно здесь: http://www.hackingciscoexposed.com/t...scopack.tar.gz.
Пример использования:

usage: ./ciscopack.pl [--unpack=imagename ]

Options:
--upack Upack cisco IOS image
--pack Pack new imagename
--head Head (Self extractor) to pack
--body Body (IOS body) to pack
--readheader Read the file header
--help This message

Естественно, проводить эксперименты рекомендуется не на используемом в активном сетевом взаимодействии маршрутизаторе, так как последствия неправильной модификации могут быть катастрофическими. В своих исследованиях я использовал эмулятор dynamips для запуска образов операционной системы IOS платформы 3725 (c3725-adventerprisek9-mz.124-18.bin) и шестнадцатеричный редактор biew для модификации образа IOS.

ciscopack.pl --unpack c3725-adventerprisek9-mz.124-18.bin --head c3725-adventerprisek9-mz.124-18.bin.head
ciscopack.pl, , V 0.1
Unpacking image: c3725-adventerprisek9-mz.124-18.bin
Written 7078 byte to c3725-adventerprisek9-mz.124-18.bin.head
Magic is found, reading the archive info
Compressed size:81980888 byte. Compressed size:39184467 byte
Compressed checksum: 0xb1dff6e0 Uncompressed checksum: 0x26adfdf2
Written Kb38267 to c3725-adventerprisek9-mz.124-18.bin.zip
uzip c3725-adventerprisek9-mz.124-18.bin.zip
Archive: c3725-adventerprisek9-mz.124-18.bin.zip
inflating: C3725-AD.BIN
All done!

Полученный распакованный образ я модифицировал в шестнадцатеричном редакторе biew, заменив строку:

dsfd;kfoA,.iyewrkldJKDHSUBsgvca69834ncxv9873254k;f g87

на строку:

shados.oA,.iyewrkldJKDHSUBsgvca69834ncxv9873254k;f g87

После этого проведем тест. Загружаем модифицированный образ в эмулятор:

dynamips -P 3725 C3725-AD.bin


После загрузки, отменяем вход в режим начальной конфигурации, включим сервис шифрования паролей и создадим пользователя с паролем «notracable»:

Router(config)#service password-encryption
Router(config)#username shados password notcracable
Теперь выполним команду show и выведем нашу строку:
Router(config)#do show run | include username
username test password 7 04011C120c334d4d0218071B17


Полученную строку попытаемся расшифровать в хорошо известной утилите Cain&Able (www.oxid.it). Результат можно видеть на скриншоте. Как видим, исходный пароль и расшифрованный отличают — трюк сработал. Образ, загруженный в эмулятор оттестирован и готов к использованию на реальном маршрутизаторе после переупаковки:

./ciscopack.pl --pack c3725-adventerprisek9-mz.124-18.bin --head c3725-adventerprisek9-mz.124-18.bin.head —body С3725-AD.bin

Пожалуй, на этом с собственно паролями закончим и перейдем к авторизации. Естественно, для настройки авторизации будем использовать наиболее современные методы, такие как модульный фреймворк AAA (Authentication, Authorization, Accounting). Для настройки этого сервиса требуется выполнить всего несколько простых действий:

1.Включить использование AAA посредством команды глобальной конфигурации
aaa new-model
2. Если принято решение использовать внешний сервер безопасности, следует на стоить параметры работы его протокола (например, RADIUS, TACACS+, Kerberos)
3.Определить списки методов аутентификации
4.Применить созданный список для конкретного интерфейса или линии
5.Если требуется — настроить авторизацию и аккаунтинг.


В качестве примера настроим аутентификацию посредством TACACS+. Если по TACACS+ аутентифицироваться не удастся — переходим к локальной аутентификации:

Router(config)#aaa new-model
Router(config)#aaa authentication login default group tacacs+ local-case
Router(config)#aaa authentication enable default group tacacs+ enable
Router(config)#aaa authorization commands 15 default group tacacs+ local
Router(config)#aaa accounting exec default stop-only group tacacs+
Router(config)#aaa accounting commands 15 default stop-only group tacacs+
Router(config)#aaa accounting network default stop-only group tacacs+
Router(config)#tacacs-server host 172.16.1.100
Router(config)#tacacs-server key cisco


Так, например, если аутентифицироваться для удаленного входа в exec режим через TACACS+ сервер не удастся (сервер недоступен), мы попытаемся аутентифицироваться в локальной базе пользователей:

username secret

Логично, что для большей защищенности стоит использовать символы разных регистров — это значительно усложнит жизнь переборщикам паролей.
Помимо всего прочего хорошей идеей будет изменить стандартное приглашение ввода имени пользователя и пароля. Пусть, допустим, оно будет сходно приглашению Linux:

Router(config)#aaa authentication password-prompt "password: "
Router(config)#aaa authentication username-prompt "login as: "

Такой трюк как минимум запутает взломщика, привыкшего видеть стандартное приглашение маршрутизатора.

2. Перейдем ко второму пункту наших действий — ограничение удаленного доступа. Конечно, чаще всего на маршрутизатор оператору или сетевому администратору придется получать доступ через удаленный терминал. Отсюда следует простая мысль, что этот же путь попытается проследовать взломщик (лицо, осуществляющее несанкционированное вторжение; пожалуй, здесь я сделаю небольшое лирическое отступление и позволю себе заметить, что намеренно не ассоциирую взломщика с хакером по известным этическим причинам и соображениям). Общая схема такова — доступ к консоли ограничиваем таймаутом в 15 минут, доступ через порт AUX отключаем полностью, доступ к виртуальному терминалу ограничиваем стандартным списком доступа, в качестве транспорта используем протокол ssh и также ограничиваем сессию таймаутом в 15 минут. Стандартный список доступа разрешает доступ только с двух доверенных машин, все остальные запросы фильтруются. Будем использовать протокол SSH версии 2 ввиду его большей безопасности, ограничим таймаутом и включим его журналирование. Ниже привожу вырезку из конфигурации устройства:

!
ip ssh time-out 15
ip ssh logging events
ip ssh version 2
!
!
access-list 100 permit 172.16.1.100
access-list 100 permit 172.17.1.200
access-list 100 deny any
!
line con 0
exec-timeout 15 0
line aux 0
exec-timeout 0 0
no exec
transport input none
line vty 0 4
access-class 100 in
exec-timeout 15 0
transport input ssh
!

Позволю себе напомнить читателю, что для того, чтобы использовать протокол SSH необходимо задать домен маршрутизатора и имя хоста, а затем сгенерировать RSA ключи достаточной длинны (автор всегда выбирает максимально доступную длину, в частности 2048):

Router(config)#ip domain name something.ru
Router(config)#crypto key generate rsa

Интересен один момент — в фильтрации удаленного доступа тоже есть место для трюка. В документации по операционной системе IOS 12.4 нет упоминания о том, что помимо стандартных списков доступа можно использовать еще и именованные. Грех этим не воспользоваться в своих целях. Хорошим примером применения этого функционала можно считать разрешение доступа по протоколу telnet из внутренней сети технических специалистов, а доступ с внешних адресов разрешить по протоколу ssh. Кроме этого, именованные списки доступа позволяют вести журналирование запросов. Ниже приведу пример, из которого станет все понятно:

!
ip access-list extended TerminalAccess
permit tcp 172.16.1.0 0.0.0.255 any eq telnet log
permit tcp any any eq 22 log
deny tcp any any log
!
line vty 0 4
access-class TerminalAccess in
transport input telnet ssh

Завершающим аккордом второго этапа будет настройка задержки между повторными вводами учетныйх данных:

Router(config)#login delay 5
Router(config)#login block-for 60 attempts 3 within 30

Первой командой мы устанавливаем задержку между повторными вводами равной пяти секундам. Второй командой устанавливаем блокировку на 60 секунд в случае трех неудачных попыток ввода имени пользователя/пароля в течение 30 секунд.

3. Третий этап наших действий по защите состоит в отключении всех ненужных и небезопасных служб маршрутизатора. На мой взгляд этот этап является наиболее простым и наименее творческим.
Командой глобальной конфигурации отключаем использование протокола CDP (Cisco Discovery Protocol). Это защитит наш маршрутизатор от раскрытия критичных данных о платформе, версии и т.п.

Router(config)#no cdp running

Проверим, отключены ли простые службы, аналогичные службам inetd типа chargen:

Router(config)#no service tcp-small-servers
Router(config)#no service udp-small-servers

Включим службы keep-alive, чтобы защититься от возможного перехвата, например, сессии telnet:

Router(config)#service tcp-keepalives-in
Router(config)#service tcp-keepalives-out

Отключим доспуп к маршрутизатору по протоколам http и https, так как все основные задачи по конфигурированию маршрутизатора будем выполнять через командную оболочку:

Router(config)#no ip http server
Router(config)#no ip http secure-server

Если не планируется использовать протокол динамического присвоения IP-адресов, отключим его:

Router(config)#no service dhcp

Маршрутизацию от источника, резолвинг DNS-имен, finger и тому подобные службы, необходимость которых сомнительна, либо если служба является потенциально небезопасной также отключаем:

Router(config)#no ip source-route
Router(config)#no ip finger
Router(config)#no ip bootp server
Router(config)#no ip domain-lookup

Скорее всего для журналирования потребуется использовать централизованную синхронизацию времени с NTP- сервером (Network Time Protocol)*. Выставляем правильную временную зону, соответствующую нашему расположению, назначаем ключ аутентификации для сервера и, собственно, указываем сам сервер:

Router(config)#clock timezone GMT 3
Router(config)#ntp authenticate
Router(config)#ntp authentication-key 1 md5 <ключ>
Router(config)#ntp server 172.16.1.100

Завершающей частью этого пункта включим автоматическую проверку целостности образа операционной системы IOS, который может быть как поврежден во время передачи, так и модифицирован злонамеренно с целью внедрения рукткита:

Router(config)#file verify auto

Пример работы службы контроля целостности:

Verifying file integrity of flash:c2600-ipbasek9-mz.124-17.bin............................................ .................................................. ............................Done!
Embedded Hash MD5 : 5DB1422925E26D7AEAB3DB9AF919AF83
Computed Hash MD5 : 5DB1422925E26D7AEAB3DB9AF919AF83
CCO Hash MD5 : EB9561C52A02E1DECD8490ED2935B5E9

Signature Verified
Verified flash:c2600-ipbasek9-mz.124-17.bin

4. Атаки на SNMP, пожалуй, являются одними из опаснейших, поэтому защите SNMP-агента маршрутизатора следует уделить пристальное внимание. Основной вектор атак на SNMP в случае маршрутизатора Cisco под управлением операционной системы IOS является получение конфигурации через CISCO-CONFIG-COPY-MIB. Атака может быть успешно проведена только в случае наличия строки community, доступной на запись. Маршрутизаторы Cisco под управлением IOS 12.4 поддерживают 3 основных модели SNMP — v1, v2c и v3. Соответственно каждая из моделей обеспечивает свой уровень защищенности, однако выбор ее зависит, в основном, от используемой системы мониторинга, а точнее от ее совместимости с используемой моделью безопасности. Естественно, для наибольшей безопасности рекомендуется использовать наиболее совершенную модель SNMPv3, отличающуюся наличием аутентификации по MD5 и SHA-ключам, 56-ти битным шифрованием данных по алгоритму DES, а также разграничением политик доступа пользователей по группам. Приведу пример настройки:

Router(config)#snmp-server group netadmins v3 priv
Router(config)#snmp-server user operator netadmins v3 auth md5 AuthPassw0rd priv des56 EncryptionPassw0rd

Первой командой мы создаем группу «netadmins» и указываем, что каждый пакет необходимо аутентифицировать и шифровать. Следует заметить, что одна из самых распространенных систем мониторинга Cacti умеет работать только с группами, опция которых установлена в auth. Второй командой мы создаем пользователя «operator», входящего в группу «netadmins», и указываем что аутентифицироваться он будет по md5-паролю, а шифрование данных будет происходить по протоколу DES. Для проверки работоспособности воспользуемся утилитой snmpwalk, где 172.16.1.1 — ip-адрес маршрутизатора:

snmpwalk -v 3 -u operator -A AuthPassw0rd -x DES -X EncryptionPassw0rd -l AuthPriv 172.16.1.1

Для большей защищенности можно определить список доступа, ограничивающий доступ к внешним серверам tftp, ftp, sftp и т.д.:

!
access-list 100 permit 172.16.1.100
access-list 100 permit 172.17.1.200
access-list 100 deny any
!
snmp-server file-transfer access-group 100

На этом, пожалуй, настройку протокола SNMP закончим и перейдем к настройке журналирования.

Для начала определим, в каком формате будут записываться временные отметки в журнале. По умолчанию маршрутизатор заносит в журнал записи с временной отметкой uptime. Чтобы изменить это поведение на стандартный формат date/time, необходимо выполнить следующую настройку:

Router(config)#service timestamps debug datetime localtime
Router(config)#service timestamps log datetime localtime

Затем определим размер буфера для журнала и уровень важности событий (severity), которые будут заноситься в журнал и отключим вывод системных сообщений на консоль, чтобы не перегружать маршрутизатор:

Router(config)#logging buffered 8128 debugging
Router(config)#no logging console

Затем укажем в конфигурации, что нам требуется заносить в журнал события в случае если аутентификации пользователя была успешной или произошла ошибка ввода логина/пароля:

Router(config)#login on-failure log
Router(config)#login on-success log

Изменение уровня привелегий пользователя также будем журналирвать:

Router(config)#logging userinfo

Пример вывода сообщений журнала:
Router>enable
Password:
*Mar 1 10:41:18: %SYS-5-PRIV_AUTH_PASS: Privilege level set to 15 by admin on console
Router#disable
*Mar 1 10:41:19: %SYS-5-PRIV_AUTH_PASS: Privilege level set to 1 by admin on console


Неоспоримый интерес для выяснения причин возможных проблем в случае ошибочной настройки представляет ведение истории команд режима конфигурации:

!
archive
log config
logging enable
notify syslog
hidekeys
!

Пример вывода сообщений журнала:

*Mar 1 10:41:24: %PARSER-5-CFGLOG_LOGGEDCMD: User:admin logged command:!exec: enable
*Mar 1 10:44:32: %PARSER-5-CFGLOG_LOGGEDCMD: User:admin logged command:arp 172.16.1.110 abcd.1234.8765 arpa

И последним шагом настройки укажем syslog-сервер, на который будем отправлять сообщения. В качестве транспортного протокола для наибольшей надежности соединения и гарантии доставки сообщений будем использовать TCP. Естественно, syslog-сервер должен поддерживать работу по протоколу TCP. Примером может служить syslog-ng:

Router(config)#logging host 172.16.1.155 transport tcp port 514

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

Ссылки:

Cisco IOS Security Configuration Guide (www.cisco.com)
Configuring Secure Shell on Routers and Switches Running Cisco IOS (www.cisco.com)
Network Management System: Best Practices: White Paper (www.cisco.com)
Cisco IOS hints and tricks (ioshints.blogspot.com)
Cisco IOS from an Attacker's Point of View (www.hakin9.org)
Building Bastion Routers Using Cisco IOS (Phrack Magazine #55)
Укрощение дикой киски, или сливаем пароли чемоданами (журнал Xakep #109)

Комментариев нет:

Отправить комментарий

Постоянные читатели

Поиск по этому блогу