Страницы

воскресенье, 11 сентября 2005 г.

HOWTO Базовое руководство по настройке безопасности в Linux



Настраиваем Firewall & Nat


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

Начнем с вопросов. - Стоит ли тратить время на защиту компьютера и кому мы нужны? - Безопасен мой компьютер или нет? - Как определить какая программа какой порт использует и с кем соединена? - Как определить какие сервисы запущены и как научиться ими управлять, чтобы случайно не отлючить важный канал? - Как определить попытки установления связи с моим компьютером? - Что делать если мой компьютер подвергается атакам (например от "друзей" по ICQ и т.п. сервисам)?
Начнем с тестов.

Для этого нам понадобятся следующие улитки идущие в поставке Mandrake 10.
1. Вот ответ на первый вопрос.
Срок жизни непропатченного ПК 20 мин.
http://www.securitylab.ru/47228.html Разумеется если используется liveCD без сохранения состояния, то не стоит читать далее. Но даже в этом случае, если в Инете более 20 минут....
Да, а все-таки кому мы нужны? Список этих засранцев Вам могут сообщить в ближайшем сайте отделения милиции. Поддерживайте шефские связи. Гипотетически, если ваш компьютер заражен, он начнет проявлять сетевую активность, которую так или иначе может зафиксировать дядя провайдер. Как потом разбиратся с дядей? Я не представляю как мне объяснить, как разбираться с дядей.
Компьютер даже может быть не заражен, а его ресурс (например почтовый сервер) может быть использован для рассылки писем любви.
2. А заземление у Вас есть? Нет в подавляющем числе случаев. О какой безопасности мы говорим, если даже правила монтирования электроустановок не соблюдаются. Вообщем работа в Инете напоминает хождение очкарика темным вечером по социально неблагополучным районам родного города. Блин везет очкарику, просто удивительно. И вообще, пропишитесь в ближайшем отделении милиции.
3. Определяем какие используются порты и какие программы их используют. Есть такая хорошая команда netstat. Ознакомьтесь man netstat. В кратце - предоставляет информацию о сетевой подсистеме linux, имеет кучу параметров.
Запускаем без параметров, посмотрим установленные интернет и unix domain sockets соединения (CONNECTED).
#netstat

Вывод приблизительно такой:
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 xxxx.xxx.xxxx.xx:32782 YahooBB2200461241:52229 ESTABLISHED
tcp 0 0 xxxx.xxx.xxxx.xx:32785 baym-cs256.msgr.ho:1863 ESTABLISHED
tcp 0 0 xxxx.xxx.xxxx.xx:32867 64.12.24.242:5190 ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 16 [ ] DGRAM 5707 /dev/log
unix 2 [ ] DGRAM 7095 /dev/atmarp
unix 3 [ ] STREAM CONNECTED 217577
/tmp/ksocket-root/klauncher06Wttb.slave-socket
unix 3 [ ] STREAM CONNECTED 217576
unix 3 [ ] STREAM CONNECTED 206359 /tmp/.X11-unix/X0
..... и т.д.
Вообщем-то для простого пользователя как я, малоинформативно. Надо бы улучшить качество статистики.

Сделаем следующие изменения:
1. Будем показывать только активные internet соединения без unix domain сокетов(которые вообще не понятно, как разгребать). Добавим опцию -t.
2. Покажем имена программ, которые установили internet соединения. Опция -p.
3. Покажем расширенную информацию (пользователь и inode). Опция -e Итак:
#netstat -tpe
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 xxxx.xxx.xxxx.xx:32782 YahooBB2200461241:52229 ESTABLISHED root 12844 5134/skype
tcp 0 0 xxxx.xxx.xxxx.xx:32785 baym-cs256.msgr.ho:1863 ESTABLISHED root 13669 5163/kopete
tcp 0 0 xxxx.xxx.xxxx.xx:38020 64.12.24.241:5190 ESTABLISHED root 229024 5114/licq
вот понятно. видно программки которые соединяются. Skype, Kopete, Licq. Эти программки я персонально запускал. Вроде все нормально (я под рутом смотрю). И помните про команду kill [pid].
Теперь посмотрим что имеется из сервисов (опция -l LISTENING), кто
открыл рот(порт) и ждет халявного инета:
# netstat -tlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program
name
tcp 0 0 *:32778 *:* LISTEN 5114/licq
tcp 0 0 *:x11 *:* LISTEN 4639/X
tcp 0 0 *:ipp *:* LISTEN 3324/cupsd
tcp 0 0 *:33116 *:* LISTEN 5134/skype
tcp 0 0 *:7741 *:* LISTEN 4059/lisa
Вот это уже интересно, а в поставке из коробки еще более интересно.
Сразу заинтересовывают X и cupsd(сервер печати) и lisa (Lan Information service). Потенциально не безопасно, зачем они интернет слушают? Да и зачем skype открыл рот? а licq? Все это требует дополнительных исследований. Но для начала поставим цель просто закрыть доступ по этим портам(см. установка защиты).
Есть еще хорошая утилита lsof.
#lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
xinetd 3287 root 6u IPv4 7350 UDP *:919
cupsd 3318 root 0u IPv4 7456 TCP *:ipp (LISTEN)
cupsd 3318 root 2u IPv4 7457 UDP *:ipp
lisa 4091 root 4u IPv4 8554 TCP *:7741 (LISTEN)
lisa 4091 root 5u IPv4 9023 UDP *:7741
X 4857 root 1u IPv4 10136 TCP *:x11 (LISTEN)
licq 5274 root 8u IPv4 11829 TCP *:32780 (LISTEN)
skype 5280 root 7u IPv4 13109 UDP *:32771
skype 5280 root 16u IPv4 18893 TCP *:33116 (LISTEN)
skype 5280 root 17u IPv4 18894 UDP *:33116
skype 5280 root 20u IPv4 19908 TCP
xxxx.xxx.xxxx.xx:32794->48-138.tr.cgocable.ca:21884
(ESTABLISHED)
kopete 5303 root 14u IPv4 14286 TCP
xxxx.xxx.xxxx.xx:32792->205.188.8.126:5190 (ESTABLISHED)
Пока писал вышла хорошая статья на эту тему (см. ссылки)
Как определить проявление интереса к моему компьютеру?
Ок, для начала попытаемся определить сканирование портов нашего компьютера. Кто-то сканирует мы пишем в лог.
Сканирование это посылка запроса на открытие порта, без дальнейших действий. И так по всем 65536 портам.
Фраза "обнаружение сканирования портов" скормлена поисковику.
Быстро попадается статейка, просматриваем:
http://www.linuxfocus.org/Russian/January2003/article274.shtml
Извлекаем имя программы (snort), ищем в пакетах rpm в поставке, если не находим, на сайте и т.д.
Находим в поставке, ставим snort.
Snort - это IDS (Intrusion Detection System) - система обнаружения вторжений. Как раз то что надо.
Смотрим и быстро конфигурируем файл
/etc/snort/snort.conf
Да столько настроек не осилить. Воспользуемся скудным опытом автора вышеприведенной статьи.
Вставляем свой ИП адрес: var HOME_NET xxx.xxx.xxx.xxx
Запускаем
#snort -c /etc/snort/snort.conf
Падает. Не может обработать интерфейс irda0.
Сносим irda0:
#ifconfig irda0 down
Запускаем много всего выводит, но почему то на консоль. Сделаем чтобы работал в бэкграунде (опция -D).
#snort -D -c /etc/snort/snort.conf
Ну а если не сносить другие интерфейсы, пригодится опция -i, указывающая контретный сетевой интерфейс.
#snort -D -i atm0 -c /etc/snort/snort.conf
Так, теперь надо как-то определить, делает ли эта штука то, на что она предназначена. Т.е. определяет ли сканирование портов, а то cat /var/log/snort/alert ничего не показывает.
Можно попробовать самому себя просканировать. Для этого понадобиться сканер nmap. Его однако тоже можно найти в поставке Mandrake 10.
nmap -sS xxx.xxx.xxx.xxx,
Что такое xxx.xxx.xxx.xxx понятно? Это ИП адрес.
Сделаем
#tail -f /var/log/snort/alert
.....
**] [1:1420:2] SNMP trap tcp [**]
[Classification: Attempted Information Leak] [Priority: 2]
08/19-18:27:44.214423 bad.guy.xxx.xxx:36921 -> my.ip.xxx.xxx:162
TCP TTL:62 TOS:0x0 ID:16403 IpLen:20 DgmLen:60 DF
******S* Seq: 0x59DE113B Ack: 0x0 Win: 0x4768 TcpLen: 40
TCP Options (5) => MSS: 9140 SackOK TS: 59265320 0 NOP WS: 7
[Xref =>
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2002-0013][Xref
=> http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2002-0012]
.....
Вообщем-то видно, что кто-то с ип адреса (bad.guy.xxx.xxx) просканировал нас (my.ip.xxx.xxx). Таких блоков может быть достаточно много для одного адреса. Как разбирать этот лог - это отдельный вопрос. Утилитка nslookup поможет определить dns имя ip адреса.
#nslookup bad.guy.xxx.xxx
Разумеется вместо bad.guy.xxx.xxx должны быть цифры.
Имеется конфигурационный файл для сервиса snort стартующего при загрузке.
/etc/sysconfig/snort
Здесь я прописал свой интерфейс atm0 вместо eth0 и all, а можно ppp0 и пр. А также изменил пользователя и группу snort на root.
далее:
# service snortd restart
или через графический режим.
Не дело конечно, сидеть и смотреть в консоле хвосты логов детектора вторжений
Устанавливаем защиту.
Самый тупой способ - установить графический индикатор, который пикает(мигает) каждый раз, когда идет прием-передача по сетевому интерфейсу. Не смейтесь блин. Хороший вариант, особенно если индикатор подсчитывает траффик и показывает иконку в трее, ну как в винде. А когда очень сильно качают, он весь светится от радости. Правда основная нагрузка по обработке трафика ложится на вашу нервную систему, так что спать не удастся.
Что то мне надо придумать ещё, а то злобные хакеры хакнут хаком. Монтируем то серое че надо куда надо.
На языке вертится словечко Firewall. У круто. Стена огня. Огненная стена, в переводе с импортного. Будем жечь жучков и червей (виртуальных, реальные пользу приносят,ну там мертвяков перерабатывают). Лазеры мазеры и да прибудет с нами сила после рекламы налогов.
С чего начать, куда бежать? Ну надо хоть спички купить и керосину. Тут старшие особоумные товарищи поправляют, что нужны кирпичи. Причем тут кирпичи, я хочу спички. Объясняют еще раз. Начинает доходить, что нужна бригада каменьщиков, ну хоть не могильщиков. Кстати, если кирпич, пропитать керосином и поджечь, будет очень долго гореть. В циклопедии по выжыванию прочитал. Ну мы пойдем своим особым путем, будем откладывать с зряплаты на кирпичи, возить на собственном горбу на дачку и там складывать. Вобщем, к 3000 году каждому гражданину по файрволу. Бред - это неотделимая часть повествования, без него как без рюк. Эти команды,команды, кругом одни команды и опции. Достает иногда.
Ядро Linux 2.6.3, 2.6.7 включает в себя мощную подсистему называемую Netfilter. Netfilter обеспечивает функциональность packet filter, Network address translation (NAT) и IP маскарад. Историки найдут нечто подобное и в предыдущих ядрах. Что все это значит? Packet filter - это способ, с помощью которого ядро распоряжается входящими и исходящими пакетами, базируюясь на информации содержащейся в заголовке пакета и управляется правилами. Ну прямо полный аналог почты, пакеты, посылки, адреса и пр. правила обработки почтовой корреспонденции.
Для управления Netfilter существует утилита iptables (см. man iptables).
В Mandrake 10 надо установить пакет iptables-1.2.9-5mdk
Вот сижу пишу, а идет фильм Хакеры наверное что-то есть в этом мистическое.
Выводим список правил для iptables (по умолчанию для таблицы filter, а есть еще nat и mangle)
#iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
пока никаких правил нет.точнее есть - все разрешено. Забавно да, это в нашей то стране и все разрешено.
Ну и для начала, резко закроем все, выполнив 3 команды.
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP
проверим ping
# ping www.google.com
ping: unknown host www.google.com
Ага нету пинга. Отлично, можно идти и докладывать что установлена непробиваемая защита.
посмотрим что у нас в таблице правил.
# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
Ну а теперь вернем все назад (откатим транзакцию):
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT
Проверим, отлично работает.
# ping www.google.com
PING www.google.akadns.net (66.102.9.99) 56(84) bytes of data.
64 bytes from 66.102.9.99: icmp_seq=1 ttl=241 time=84.7 ms
--- www.google.akadns.net ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 84.731/84.731/84.731/0.000 ms

Итак, на данном этапе мы уже умеем резко запрещать доступ и также резко его открывать. Ну эти команды можно поместить в скрипт, скрипт привязать к какой-нибудь кнопке на мультимедиа-клавиатуре. И по нажатию на нее, мы резко отключаемся от инета, это чтобы разъем не выдергивать, целее будет. Можно еще систему самоуничижения подключить, но тут я не консультант, здесь Интернет поможет + базовый курс химии и электроники, ну мы же не ламеры,чтобы в школе учить историю города ЭтотУбогийРоднойГород, вместо нужных вещей. А дальше то что? Что дальше? Извечный русский вопрос?
Дальше надо создавать правила. Чем мы и займемся. Почувствуем себя законодателем, запутаем все нах, чтоб ни один, ни один .... не смог распутать.
Для начала, сделаем полный запрет и попробуем открыть себе доступ к web-страничкам. Представим себя файрволл в виде сыра, в котором мы (гномы или мыши) будем делать дыры. Ну дыра - это дыра, этим все сказано. И если какой котяра, через проделанную дыру полезет, мы тут ничего не сделаем(можно конечно, как в старой игрушке подскакивать к каждой дырке и пытаться поймать). А они полезут, когда стока мышей. А за собой потянут кучу всяких забавных вещей, нужных им в их деятельности (черви, трояны, скрипты, кейлоггеры и пр.).
Используем опцию -A (append) присоединение правила в конец цепочки.
-p - это протокол в данном случае tcp
#iptables -A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
#iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
#iptables -A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
#iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
Порт 443 - это для https (защищенного http), чтобы можно было совершать покупки в Интернет, по кредитным картам.
Ха-Ха,
Наберем адрес в броузере: http://www.google.com/ и ничего не получим, не грузится.
А вот если наберем ip адрес gogla http://66.102.9.99/ то увидим "командную строку Интернета - сервис Google".
Дело в том, что у нас все запрещено, кроме обращения по протоколу http, в том числе и dns-запрос на resolving имени www.google.com в ip 66.102.9.99. Это броузер так работает, вначале dns-запрос, потом закачка.
Теперь желательно открыть порт чтобы DNS запросы проходили. Выясняем порты принадлежащие dns, я в начале тупо набрал grep dns, потом пришлось лезть смотреть глазками.
# cat /etc/services | grep domain
domain 53/tcp # name-domain server
domain 53/udp
Итак 53 порт по протоколам tcp и udp откроем-ка его:
#iptables -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
#iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
#iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
#iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
ну а закрыть его назад, все тоже самое только вместо ACCEPT - REJECT или DROP.
Рекомендуется REJECT, оно вовращает сообщение "connection refused", а DROP не вежливо выкидывает пакеты (что-то типа хакера на почте).
По желанию, не забудем записать наши правила, чтобы при перезапуске они восстановились.
#service iptables save
Сейчас это не рекомендуется делать.
А, надо еще, чтобы пинг работал, чтобы не нервничать.
#iptables -A INPUT --protocol icmp -j ACCEPT
#iptables -A OUTPUT --protocol icmp -j ACCEPT
ping www.google.com Работает.
Да еще,важно - присоединение правил работает динамически. Хюва он.
iptables -flush сносит все добавленные правила.
Теперь надо бы разобраться более подробно с синтаксисом, с опциями. Но для начала набросать общую схемку для понимания.

Анонимайзеры


Ну нихочу я шобы добропорядочные админы писали мой ип в лог. Мало ли зачем он им понадабица. Может они в нем цифры будут переставлять или использовать в своих играх, нехарашо ето.
Анонимайзер, это прокси сервер. Надо найти адрес прокси-сервера и настройть программы на его использование.
гуглаем: "анонимные прокси-серверы".
находим списочек, берем, проверяем. Выделяем среди них более быстродействующий.
Анонимайзеры, после известных событий, зашухались далеко, не все идут на контакт и пр.
Флаг в руки.
VPN,SSH и пр. TOR
Это все сервисы, когда буду настраивать напишу здесь.

Установка защиты


А тут вообще ничего нет

Расшаривание соединения с Интернет


У нас есть локальная сетка и один компьютер с выходом в Инетернет. Задача простая, чтобы и другие компьютеры могли ходит в Интернет. Ну и ладно, пусть ходят нам не жалко. Поможет крепкий орешек NAT.
Итак, есть коробка Linux подсоединенная к Интернет через интерфейс atm0, с присвоенным публичным IP адресом (195.131.xxx.xxx).
Коробка также имеет другой интерфейс bnep0(Bluetooth линк) через который к ней подсоединен компьютер с windows 98se имеющий адрес из безопасного диапазона. На компьютере Win98 для настройки tcp/ip в адаптере сети bluetooth LAN Access Server Driver указан в качестве шлюза ip-адрес Linux коробки. Вообще комп, с несколькими сетевыми картами называется multi-homed.
#ifconfig

atm0 Link encap:UNSPEC HWaddr
00-00-20-F4-FF-BF-1E-00-00-00-00-00-00-00-00-00
inet addr:195.131.xxx.xxx Mask:255.255.255.0
UP RUNNING MTU:9180 Metric:1
RX packets:347 errors:0 dropped:0 overruns:0 frame:0
TX packets:588 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:201659 (196.9 Kb) TX bytes:47936 (46.8 Kb)
bnep0 Link encap:Ethernet HWaddr 00:09:DD:10:00:6E
inet addr:192.168.0.11 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:136 errors:0 dropped:0 overruns:0 frame:0
TX packets:121 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:11358 (11.0 Kb) TX bytes:89899 (87.7 Kb)
lo....
+------------+ +-------------+
| Linux |192.168.0.11 | Windows98 |
Интернет | коробка | | Bluetooth |
<-------------atm0| |bnep0 ------------- bnep0| Network |
| | | Client |
195.131.xxx.xxx | | 192.168.0.10 | |
+------------+ +-------------+

Идея лежащая в основе трансляции адресов проста. На бытовом уровне, вы просто просите свою подружку отослать письмо от ее имени, а ответы она будет пересылать вам. Штирлицы блин.
А в linuxe это тоже понятно:
ip пакет прибывая с компьютера под Windows на интерфейс bnep0 линукс-бокса подвергается обработке в ядре...
Провяеряем наличие подсистемы iptables
Ну для начала сама
iptables -L

теперь

Настраиваем маскарад


Вообщем-то нижеследующие команды я выдрал из руководства по IP MASQ (см. ссылки).
Там еще куча тонкой бодяги, но для наших экспериментов хватит следующего (echo можно не набивать, и вообще пользуйтесь буфером обмена):
Вначале включаем режим форвардинга(перенаправление), т.к. он выключен по умолчанию(echo здесь набивать)
#echo "1" > /proc/sys/net/ipv4/ip_forward
#echo " Clearing any existing rules and setting default policy.."
#iptables -P INPUT ACCEPT
#iptables -F INPUT #iptables -P OUTPUT ACCEPT
#iptables -F OUTPUT #iptables -P FORWARD DROP
#iptables -F FORWARD #iptables -t nat -F
#echo " FWD: Allow all connections OUT and only existing and related
ones IN"
#iptables -A FORWARD -i atm0 -o bnep0 -m state --state
ESTABLISHED,RELATED -j ACCEPT
#iptables -A FORWARD -i bnep0 -o atm0 -j ACCEPT
#iptables -A FORWARD -j LOG
#echo " Enabling SNAT (MASQUERADE) functionality on $EXTIF"
#iptables -t nat -A POSTROUTING -o atm0 -j MASQUERADE
Все. Пинг www.google.com проходит с Windows компьютера.
Дальше, изощрения с правилами, помещение в стартовые скрипты и пр. Фантазируйте.
И помните, некоторые приложения не работают с ИП МАСКАРАДОМ Все можно спать спокойно. Ну, не возмущайтесь, истинные параноики не спят спокойно, но зато выживают только они.

Ссылки


http://www.chkrootkit.org/
Классное руководство по iptables на русском языке: http://gazette.linux.ru.net/rus/articles/index-iptables-tutorial.html Утилита lsofhttp://www.opennet.ru/opennews/art.shtml?num=4260 Маскарад IP
file:/usr/share/doc/HOWTO/HTML/en/IP-Masquerade/index.html

Важная информация
Господа, если Вы не хотите возиться с настройкой оборудования в Linux, то я рекомендую приобрести Mac OS X или Windows Vista.

Be happy.

История изменений

  • 25.03.2012 Перенос на сайт gimmor.blogspot.com
  • 22.12.2006 Изменен дизайн сайта
  • 14.12.2006 Добавлена реклама Google AdSense и кнопка Яндекс.Деньги. Теперь можно поддержать меня материально
  • 11.09.2005 Первая редакция – первый подход к снаряду
    The happy end.
Дмитрий