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

GentooSecurity

Введение: В этой статье вы узнаете, как повысить безопасность системы, в частности - как обезопасить свой компьютер во время работы во всемирной сети и как защититься даже от тех немногих вирусов, которые изредка поражают линукс-машины. Особенно те, которые плохо защищены.
Примечание: Советую читать мануалы к каждой отдельной программе перед ее запуском, а так же о ключах, которые я буду использовать, хотя я сам постараюсь о них рассказать. Все примеры показываются на Gentoo Linux, но так же применимы к другим операционным системам семейства linux.

Общие вопросы безопасности.

Пользователи.

Начнем с нелишнего напоминания: никогда не работайте в системе под root'ом. Это очень опасно и может привести к печальным последствиям, так как root (суперпользователь) обладает неограниченными правами и может делать с системой все, что пожелает. А иногда и то, чего и не желал, но было уже поздно... Следует создать одного обычного пользователя, от имени которого вы будете работать с системой. Назовем его user:
# useradd user -m -G users,wheel, audio -s /bin/bash
Этой командой мы создали пользователя с именем user, добавили его в группы users, audio, wheel и сделали ему оболочку bash, которая запускается по умолчанию.
Далее нужно дать пароль этому пользователю. Делается это так:
# passwd user
После этого система вас попросит ввести и подтвердить пароль. Теперь выйдите из системы и войдите от имени user. В дальнейшем, как и положено, для получения прав суперпользователя будем пользоваться командой su.

Редактируем файл /etc/securetty.

В этом файле находится список терминалов, по которым root может зайти в систему.
Пример файла /etc/securetty:

Рекомендуется удалить все строки, кроме vc/1(на других linux'ах следует оставить tty1), что даст возможность суперпользователю входить только с первой виртуальной консоли.

Делаем безопасную загрузку системы.

Файл /etc/inittab очень важен для всей системы. Полностью его мы разбирать не будем: нас интересует только одна его часть. Чтобы прикрыть доступ к однопользовательскому режиму (это режим суперпользователя, который используется для восстановления системы и который можно выбрать в загрузчике при запуске системы – и которым может воспользоваться непрошенный гость), нужно отредактировать файл /etc/inittab, добавив в него следующую строку:
~~:s:wait:/sbin/login
После этого, при загрузке в однопользовательском режиме, система не будет запускать оболочку (командный интерпретатор) до ввода пароля суперпользователя.

Перейдем к повышению безопасности двух наиболее популярных загрузчиков: LILO и GRUB. Сначала рассмотрим загрузчик LILO. Его конфигурационный файл находится в директории /etc, а конфиг называется lilo.conf. Вот пример незащищенного файла:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
lba32
default=linux

image=/boot/bzImage
label=linux
read-only
root=/dev/hdax


Давайте сделаем так, чтобы загрузка нашего linux'а была возможна только после ввода пароля. Для этого отредактируем файл /etc/lilo.conf
....

image=/boot/bzImage
password=ваш_пароль
label=linux
read-only

Теперь не забудьте ввести команду lilo в консоли для применения введенных изменений.
Все это хорошо, но злоумышленник может спокойно посмотреть файл /etc/lilo.conf, и кто ему помешает? Как кто - конечно же, мы с вами! С помощью известных команд chmod и chown изменим права для этого файла.
# chown root:root /etc/lilo.conf
# chmod 600 /etc/lilo.conf

В этом случае только суперпользователь сможет прочитать данный файл.
Далее создадим безопасную конфигурацию загрузчика GRUB. Нужный файл этого загрузчика находится в директории /boot/grub/grub.conf. Вот пример обычного конфигурационного файла:

boot=/dev/hdax
default=0
timeout=10
splashimage=(hd0,1)/grub/splash.xpm.gz
title Gentoo Linux (2.4.25)
root (hd0,1)
kernel /boot/kernel-2.4.25-gentoo-r1 ro root=/dev/hday video=vesa:1024x768@85, ywrap, mtrr, vga=0x317 splash=silent
initrd /boot/initrd-2.4.25-gentoo-r1


Загрузчик grub позволяет с помощью команды cat просматривать содержимое файла.
grub> cat /etc/passwd
grub> cat /etc/shadow

Думаю, вы понимаете, почему и насколько опасна эта возможность. Для защиты нужно установить пароль на grub. Делается это так:
# grub
grub> md5crypt
password: ********
Encrypted: $1$F19AIA2P$OQWK8KVD.4suSfTPfqxWt0
grub> quit

Мы получили зашифрованный пароль. Теперь добавим его в /boot/grub/grub.conf
boot=/dev/hda2
default=0
timeout=10
password --md5 $1$F19AIA2P$OQWK8KVD.4suSfTPfqxWt0
splashimage=(hd0,1)/grub/splash.xpm.gz

....
Вышеописанную операцию можно применять для скрытия раздела жесткого диска.
title Gentoo Linux (2.4.25)
password --md5 $1$F19AIA2P$OQWK8KVD.4suSfTPfqxWt0
(hd0,1)

Совет: Если у вас директория /boot находится на другом разделе, то подправьте /etc/fstab, чтоб раздел с /boot не монтировался автоматически при загрузке.

Отключение перезагрузки при нажатии


Действие, которое происходит при нажатии клавиш <Ctrl+Alt+Del>, указано в файле /etc/inittab. В этом файле будут содержаться строчки, наподобие вот таких:
# What to do at the "Three Finger Salute".
ca:12345:ctrlaltdel:/sbin/shutdown -r now
При нажатии <Ctrl+Alt+Del> система немедленно начнет перезагрузку компьютера. Чтобы деактивировать эту функцию, нужно всего лишь поставить значок комментирования "#" :
# What to do at the "Three Finger Salute".
#ca:12345:ctrlaltdel:/sbin/shutdown -r now

После редактирования следует перезапустить процесс init.
# kill -HUP 1
Либо нажать <Ctrl+Alt+Del> - в последний раз. :)

Создание паролей.

Пароли - это "ключи" от компьютера, поэтому они должны быть надежно спрятаны. Проверьте, правильно ли расставлены права на файлы /etc/passwd и /etc/shadow. Если есть сомнения, сделайте следующее:
#chmod 644 /etc/passwd
#chmod 600 /etc/shadow

В первом случае мы установили права на запись для root'а и чтение для всех, во втором - только на запись и чтение для root'а. В файле /etc/passwd хранится информация об учетных записях пользователей. Во втором - зашифрованные пароли пользователей, поэтому и нужно выполнить вышеуказанные команды.

Теперь давайте попробуем создать легко запоминающийся и одновременно сложный пароль. Для этого возьмем, например, словосочетание "cool admin". Создадим пароль в три этапа:
1. Добавим символы. Например из cool admin сделаем c00l_adm1n;
2. Поменяем регистр символов. Например из c00l_adm1n сделаем C00l_Adm!n;
3. Изменим порядок символов на противоположный. Например из C00l_Adm!n сделаем l00C_Adm!n.
Такой пароль подобрать гораздо сложнее, и продержаться он может довольно долго.
На заметку: меняйте пароли примерно раз в 4 месяца, если это домашний компьютер, а если сервер, то раз в один месяц.
Внимание!!! Не используйте приведенные тут пароли, так как после выхода этой статьи они могут быть занесены в словари взломщиков.

Защита и анализ файлов системных журналов.

Все операционные системы из семейства UNIX имеют один из самых простых, но очень полезных методов регистрации событий в системе. Все процессы и действия пользователей записываются в файлы системных журналов, которые обычно находятся в каталоге /var/log/.
Эти файлы тоже следует защитить. Давайте сделаем root'а владельцем этих файлов, а их чтение разрешим только членам группы log (можно брать любое название). Для остальных доступ закроем.
# addgroup log
# cd /var/log
# chgrp -R log .
# find . -type d | xargs chmod 750
# fing . -type f | xargs chmod 640
# chmod 750

Очень важно предоставить право записи в каталоге /var/log/ только root'у. Чтобы проверить, так ли это, нужно сделать следующее:
# ls -ld /var/log
drwxr-xr-x 6 root root 1016 Окт 6 20:02 /var/log

Также нужно защититься от случайного использования следующих команд:
# vi /var/log/messages
# cat /dev/null > /var/log/messages
# rm /var/log/messages

Сделать это можно с помощью команды chattr:
# chattr +a /var/log/messages
После этого попробуйте выполнить одну из вышеупомянутых команд. Каков результат? :)
Примечание: команда chattr доступна лишь на файловых системах ext2 и ext3.
Следует внимательно просматривать файлы системного журнала, чтобы вовремя заметить неладное и принять меры. Конечно же, вручную просматривать весьма неудобно, поэтому я посоветую несколько программ для просмотра файлов системного журнала.
LogSentry (http://www.psionic.com/products/logsentry.html)
LogSentry - это программа, которая вызывается с помощью демона cron и которая проводит анализ системного журнала, используя простые выражения egrep. Она также может отправлять отчеты по электронной почте администратору или другому пользователю.
Swatch (http://www.oit.ucsb.edu/~eta/swatch/)
Программа Swatch (Simple Watchdog) может работать в двух режимах: просматривать файл целиком или же по мере добавления в него записей. Написана программа на языке perl. Действия для Swatch задаются в файле конфигурации.
Взломав систему, опытный хакер постарается добавить свои записи в системный журнал с помощью команды logger.
# logger -p kern.allert "authentication failure; logname=user123 uid=510 euid=0 tty= ruser= rhost= user=root"
Теперь, когда вы будете просматривать файл журнала, вы подумаете, что пользователь user123 хочет получить права root. Когда обнаружится, что ваша система взломана, естественно, первым делом вы обвините в этом user123, а хакер скроется безнаказанным. Удаление команды logger не поможет, т.к. хакер сможет внести свои записи с помощью скриптов на C или Perl.


Профилактика атак. Подготовка системы к выходу в сеть (Internet).

Обычно, когда хакеры намереваются взломать какой-то компьютер, перед этим они собирают о нем сведения. Для этого они часто используют программы сканирования (например nmap, netcat). Чтобы не дать им этого сделать, вначале следует отключить все ненужные службы. Чтобы увидеть все службы, которые запускаются при старте системы, сделайте следующее:

Примечание: программа rc-update есть только в Gentoo linux, пользователям других дистрибутивов следует найти похожие средства в своей системе.
Как видите, у меня нет ни одного лишнего запущенного демона - только то, что нужно для нормальной и безопасной работы в интернете из дома. Если вы увидите, что у вас запущен, например, демон sshd, то его следует отключить. Вот так:
# rc-update del sshd default
Теперь нам надо просканировать собственный компьютер – да-да! - так мы узнаем, какие порты открыты, а какие нет(лучше сканировать с другого компьютера, если таковой имеется). Сделать это можно с помощью программы nmap (если она установлена, а если нет, то выполните emerge nmap, или же установите ее средствами своего дистрибутива). Перед использованием этой программы (как и любой другой) я рекомендую прочитать мануал к ней. Можно также использовать "морду" к nmap'у - nmapfe
Весьма удобная и комфортная вещь, все параметры сканирования можно выставить несколькими нажатиями мыши, но для того, чтобы были доступны все опции сканирования, она должна запускаться из-под root'а.
# nmap -vv -sS -sR -P0 -O 127.0.0.1
Вы получите список портов - по идее, если вы не настраивали межсетевой экран (фаерволл), то там все порты должны быть открытыми. Вы получите примерно следующий результат, только у вас будет куда больше открытых портов, чем у меня. :)

Давайте настроим фаерволл так, чтобы у вас было примерно то же. Первое, что нужно сделать - это установить iptables. Так производится установка в gentoo linux:
# emerge iptables
После установки следует написать правила для нашего фаерволла. Делаем все по очереди:

Очищаем все правила.
# iptables -F
Устанавливаем политику по-умолчанию для цепочек INPUT и FORWARD.
# iptables -P INPUT DROP
# iptables -P FORWARD DROP

Разрешаем некоторые виды icmp запросов, для нормальной работы в сети.
# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 5 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT

Разрешаем поступать к нам только пакетам, которые имеют состояние STATE и ESTABLISHED
# iptables -A INPUT -s 0/0 -m state --state RELATED,ESTABLISHED -j ACCEPT
Разрешаем пакетам входит по цепочке INPUT с интерфейса lo(локальный интерфейс).
# iptables -A INPUT -i lo -j ACCEPT
Говорим iptables'у, что бы он вел лог всех входящих пакетов.
# iptables -A INPUT -J LOG
На этом конфигурация фаервола еще не завершена. Теперь запустим фаерволл:
# /etc/init.d/iptables start
Итак, мы настроили наш фаерволл на политику запрета всего, что явно не разрешено. Теперь вам нужно проанализировать логи, и на основе их написать еще несколько несложных правил для разрешения того, что вам нужно. Например, разрешение ssh-соединения к вашему компьютеру будет выглядеть так:
# iptables -A INPUT -s 0/0 -d your_ip --dport ssh -p tcp -j ACCEPT
Для написания правил к iptables вам придется почитать и изучить мануал.
Чтобы X-сервер не прослушивал порты, следует запускать его с опцией -nolisten tcp.
# startx -- -nolisten tcp
А если вы пользуетесь xdm, то вам надо подправить файл /etc/X11/xdm/Xservers
# vim /etc/X11/xdm/Xservers
Далее найдите строчку :0 local /usr/X11R6/bin/X и поменяйете ее на:
:0 local /usr/X11R6/bin/X -nolisten tcp
Теперь nmap покажет примерно такой же результат, как и у меня. Далее нужно сохранить правила, которые вы только что создали. Выполним:
# /etc/init.d/iptables save
и поместим созданные правила в автозагрузку:
# rc-update add iptables boot
Все, можно вздохнуть с некоторым облегчением. :)
Далее я предлагаю установить программу (а точнее, детектор сканирования) под названием portsentry.
# emerge portsentry
После установки следует немного изменить два файла. Первый находится в /etc/conf.d/portsentry.
В нем задаются режимы сканирования. Там будет 6 разных режимов. На них мы подробно останавливаться не будем, но я советую выбрать режимы улучшеного обнаружения скрытого сканирования atcp/audp. Теперь подправим конфигурационый файл программы:
# cp /etc/portsentry/portsentry.conf.sample /etc/portsentry/portsentry.conf
Файл хорошо комментирован, так что, думаю, проблем с настройкой не возникнет, ну если и возникнут, то вот мой конфиг.

Последнюю строчку можете подправить по своему вкусу, а можете оставить, если религия позволяет. :)
Теперь давайте запустим portsentry.
# /etc/init.d/portsentry start
Если будет ругаться, значит вы где-то ошиблись с конфигами. Если команда завершилась без ошибок, то можно добавить детектор в автозагрузку:
# rc-update add portsentry boot

Примечание:по умолчанию, portsentry может устанавливаться в /usr/local/psionic/portsentry/

Если же вам понадобится proxy-сервер, то нужно установить и настроить squid. Можно работать за целой цепочкой из прокси – в этом вам поможет утилитка proxychains. Ну, а чтобы серфить по нету под щитом прокси, достаточно указать в настройках своего броузера прокси сервер и все.
Также для повышения образованности советую сходить вот сюда: Gentoo Security Handbook. Но есть одно условие: нужно знать английский. :)