Советы по Slackware Linux 2

Советы по Slackware Linux

Сегодня мы продолжаем рассматривать советы по Slackware Linux, которые были собраны Джеком С. Лэем и призваны помочь вам в работе. Итак, слово снова предоставляется Джеку С. Лэю.

Firewall
Firewall очень важен для всех, кто имеет доступ к Интернету. Firewall предотвращает большинство случайных и злонамеренных попыток подвергнуть риску вашу систему. Помните, что компьютеры взламывали задолго до распространения высокоскоростных соединений, следовательно, если вы подключаетесь к Интернету через модем и телефонную линию, вам также необходим firewall.
Slackware ищет исполняемый скрипт "rc.firewall" в директории /etc/rc.d/ и, если находит его, посылает ему команду "start" из /etc/rc.d/rc.inet2. Разумеется, этот скрипт может выполнять любые функции, но в основном он используется для обеспечения безопасности интерфейса, который инициализируется скриптом rc.inet1.
Firewall уникален для каждой системы и каждого из сервисов, которые она предоставляет. Соответственно, не все firewall-скрипты работают для любой ситуации. Для изолированного компьютера с выключенными сервисами, имеющего модемный доступ к Интернету, ниже приведен простой скрипт firewall, который должен вызываться из /etc/ppp/ip-up.

#!/bin/bash
# Удаляем все предыдущие правила
iptables -F
# Блокируем все попытки установить связь из Интернета
iptables -A INPUT -i ppp0 -p tcp --syn -j DROP
Ниже приведен довольно простой NAT (или маскарадный) набор правил firewall. Он может быть использован как для модемного соединения (вызван из /etc/ppp/ip-up) или как /etc/rc.d/rc.firewall.
Вы можете прописать ваш интерфейс (IFACE) и IP-адрес (IFACEIP) явным образом или использовать нижеприведенный скрипт со скриптами в /usr/local/sbin: getppp0, geteth0, and geteth1.

Начало простого NAT firewall скрипта
#!/bin/bash
# приведите в соответствие с вашим устройством доступа к Интернету
#IFACE="eth1"
case $IFACE in
ppp0)
IFACEIP='getppp0'
;;
eth0)
IFACEIP='geteth0'
;;
eth1)
IFACEIP='geteth1'
;;
esac
# Удаляем все предыдущие правила
iptables -F; iptables -t nat -F; iptables -t mangle -F
# Изменяем адреса пакетов на интернет-адрес
iptables -t nat -A POSTROUTING -o $IFACE -j SNAT --to $IFACEIP
# Принимать пакеты с установленными соединениями или связанными с ними
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Принимать все новые соединения помимо интернет-интерфейса
iptables -A INPUT -m state --state NEW -i ! $IFACE -j ACCEPT
# Если они не приняты вышеуказанными правилами, отключить их
iptables -P INPUT DROP
# Не пересылать пакеты, присланные из Интернета, в Интернет
iptables -A FORWARD -i $IFACE -o $IFACE -j REJECT
конец скрипта

Однако я параноик, и я вставил следующую строчку (которая вызывает мой firewall.init-скрипт) в /etc/rc.d/rc.M прямо перед тем, как вызывается скрипт rc.inet1, включающий соединение через кабельный модем. Измените скрипт соответствующим образом.

./etc/rc.d/firewall.init
#!/bin/bash
/usr/sbin/iptables -F; /usr/sbin/iptables -t nat -F; /usr/sbin/iptables -t mangle -F
# Замените 1.2.3.4 на ваш IP-адрес
/usr/sbin/iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4
/usr/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/usr/sbin/iptables -A INPUT -m state --state NEW -i ! eth0 -j ACCEPT
/usr/sbin/iptables -P INPUT DROP
/usr/sbin/iptables -A FORWARD -i eth0 -o eth0 -j REJECT
Дабы проверить ваш firewall, используйте Gibson Research Corporation's ShieldsUP! или детально просканируйте вашу систему с помощью сканера портов (желательно с другого компьютера вне вашей сети или изолированного компьютера), такого, как nmap.

Мониторинг безопасности
Итак, можно считать, что ваша система вполне безопасна. Теперь вам необходимо использовать устройства мониторинга безопасности вашей системы, дабы быть уверенным, что она остается безопасной. Разумеется, вы всегда должны обновлять Slackware из директории /patches c вашего любимого ftp Slackware.
Также все используемые вами программы должны регулярно обновляться, если в них обнаруживаются изъяны безопасности. Подписавшись на рассылку Slackware-Security, вы будете в курсе. Рассылка оповестит тревожными сигналами о программном обеспечении, входящем в дистрибутив Slackware.

Рекомендуемые программы:
• aide — база данных, следящая за изменениями в файлах;
• checkrootkit — Rootkit файловый сканер;
• grsecurity — патчи к ядру, укрепляющие безопасность (включая Buffer Overflow);
• icmpinfo — интерпретирует сообщения ICMP (находится в оригинальном пакете Slackware n/tcpip);
• iplog — TCP/IP логгер трафика;
• logsentry (logcheck) — сканирует системные логи с целью выявления нарушения безопасности;
• mynetwatchman — сообщения и ответ на вторжения;
• portsentry — обнаружение вторжения по сети в реальном времени (IDS);
• snort — обнаружение вторжения по сети в реальном времени (IDS);
• sXid — suid/sgid-мониторинг.

Примочки
Включаем IDS для динамических IP-адресов
Psionic PortSentry 1.1 and 2.0b1 Beta не определяет локальный интерфейс автоматически, и я написал следующую процедуру:
Из /etc/rc.d/rc.inet2 сразу после вызова rc.firewall вставьте следующие строки:
# Включаем опции безопасности
# Конфигурируем portsentry с текущим IP-адресом eth0
#echo "Starting PortSentry"
/usr/local/psionic/portsentry2/doports
# Запускаем Portsentry
/usr/local/psionic/portsentry2/portsentry

Начало скрипта
/usr/local/psionic/portsentry2/doports
#!/bin/bash
# Автор Jack S. Lai
cp /usr/local/psionic/portsentry2/top/usr/local/psionic/portsentry2/portsentry.conf
echo 'INTERFACE_ADDRESS="'' geteth0''"'> > /usr/local/psionic/portsentry2/portsentry.conf
cat /usr/local/psionic/portsentry2/bottom > > /usr/local/ psionic/portsentry2/portsentry.conf
cp /usr/local/psionic/portsentry2/ignore /usr/local/psio nic/portsentry2/portsentry. ignore
echo "# Current local Inter-net address:" > > /usr/local/ psionic/portsentry2/portsentry.ignore
echo 'geteth0' > > /usr/local/ psionic/portsentry2/portsentry.ignore
echo "" > > /usr/local/psionic/portsentry2/portsentry.ignore
Конец скрипта

Примечание: /usr/local/ psionic/portsentry2/top содержит первые 24 строчки файла portsentry.conf и bottom содержит остаток файла. Ignore — игнорируемые адреса (см. portsentry.ignore).
Из /etc/rc.d/rc.inet2 сразу после вызова rc.firewall (или в вашей секции Опций безопасности) вставьте следующие строки:
/etc/snort/dosnort
/usr/local/bin/snort -q -c /etc/snort/snort.conf -D &

Начало скрипта
/etc/snort/dosnort
#!/bin/bash
# Автор Jack S. Lai
cp /etc/snort/snort.top /etc/ snort/snort.conf
echo 'var HOME_NET '' geteth0'> > /etc/snort/snort.conf
cat /etc/snort/snort.bottom > > /etc/snort/snort.conf

Конец скрипта
Примечание: /etc/snort/ snort.top содержит все до, но не включая строку, определяющую переменную HOME_NET из snort.conf, и snort.bottom содержит все строки после нее.

Пишем скрипты для IP-адресов
getppp0
/usr/local/sbin/getppp0:
#!/bin/bash
ifconfig ppp0 | awk '/inet/ { print $2 }' | awk -F ":" '{ print $2 }'
geteth0
/usr/local/sbin/geteth0:
#!/bin/bash
/sbin/ifconfig eth0 | awk '/ inet/ { print $2 }' | awk -F ":" '{ print $2 }'
geteth1
/usr/local/sbin/geteth1:
#!/bin/bash
/sbin/ifconfig eth1 | awk '/ inet/ { print $2 }' | awk -F ":" '{ print $2 }'

Синхронизируем время на вашем компьютере
Зачем нам точное время? Затем, что, расследуя или сообщая о проблеме безопасности, наши логи должны совпадать с логами нашего провайдера.
Создаем /etc/cron.daily/time-check (проверяем и обновляем время, например, с AOL.com).
#!/bin/sh
/usr/sbin/ntpdate 205.188. 185.33 /sbin/hwclock --systohc

Windows-разделы
Этот вариант fstab разрешает ВСЕМ ПОЛНЫЙ ДОСТУП к Windows-разделам. Не делайте этого, если полностью не доверяете вашей системе или если она не изолирована.
/etc/fstab
/dev/hda1 /win98 vfat uid=500,gid=500,umask=000,exec,dev,suid,rw 1 0

Конфигурируем Xfree86
Прежде чем приступить к конфигурированию Xfree86, вы должны знать частоту развертки монитора, тип мыши и видеокарты.
Выполните xf86config, чтобы создать /etc/X11/XF86Config.
Теперь отредактируем файл /etc/X11/XF86Config.
Для использования ТВ раскомментируйте строку 57 glx.
Данные изменения улучшат качество шрифтов в программах типа Netscape:
• строка 82 перемещаем .../ fonts/100dpi/ в начало списка
• строка 83 перемещаем .../ fonts/100dpi/:unscaled в начало списка, вторая сверху

Изменяем параметры мыши (обычной мышки с колесиком):
Option "Protocol" "IMPS/2"
Option "Device" "/dev/mouse"
Option "ZAxisMapping" "4 5"

Переключаемся из Xfree86 в консоль и обратно
После выполнения команды "startx" из загрузочного уровня 3 для загрузки сессии X-Windows вы можете в любой момент вернуться в консоль командой <Ctrl> <Alt> <Fx>, где Fx — клавиши F1-F5. Та консоль, с которой вы выполнили "startx", будет заблокирована, однако другие будут доступны. Для возвращения в Xfree86 нажмите <Alt> <F7>, это номер /etc/inittab agetty respawn +1. Например, у меня настроены 11 виртуальных терминалов:
(Файл /etc/inittab)
<…>
c1:1235:respawn:/sbin/agetty 38400 tty1 linux
c2:1235:respawn:/sbin/agetty 38400 tty2 linux
c3:1235:respawn:/sbin/agetty 38400 tty3 linux
c4:1235:respawn:/sbin/agetty 38400 tty4 linux
c5:1235:respawn:/sbin/agetty 38400 tty5 linux
c6:1235:respawn:/sbin/agetty 38400 tty6 linux
c7:1235:respawn:/sbin/agetty 38400 tty7 linux
c8:1235:respawn:/sbin/agetty 38400 tty8 linux
c9:1235:respawn:/sbin/agetty 38400 tty9 linux
c10:1235:respawn:/sbin/agetty 38400 tty10 linux
c11:12345:respawn:/sbin/agetty 38400 tty11 linux
<…>

Я нажимаю <Alt> <F12> для возвращения в сеанс X-Windows. Не забудьте изменить /etc/securetty и /etc/porttime соответственно!

Ежедневная проверка безопасности системы
Мы будем выполнять проверку ежедневно задачами cron. Для этого выполните следующие команды:
mkdir /etc/cron.security
mcedit /etc/cron.security/ security
Начало скрипта
/etc/cron.security/security
#!/bin/bash
/usr/local/etc/logcheck.sh
/usr/bin/sxid
/usr/local/sbin/ckr | mail -s "Chkrootkit report from Oahu" jlai@kauai
/usr/local/bin/aide -C | mail -s "AIDE report from Oahu" jlai@kauai
Конец скрипта
chmod +x /etc/cron.security/security
cd /var/spool/cron/crontabs
crontab -e root
Теперь добавьте что-нибудь подобное следующей строчке:
# Для выполнения задачи безопасности cron ежедневно в 3:05 (перед logrotate):
05 3 * * * /usr/bin/run-parts /etc/cron.security 1> /dev/null

Chkrootkit
У меня пакет chkrootkit находится в /home/secure/chkrootkit. Директория /home у меня на отдельном разделе, что облегчает установку бета-версий Slackware без потери личных файлов. /home/secure — директория, доступная только root'у. Для подготовки скрипта я выполнил следующие шаги после чистой установки и до того, как подключил систему к сети(!):
cd /home/secure/chkrootkit
md5sum ../md5.sum
./chkrootkit > ~/chbase
Затем я создал /usr/local/sbin/ ckr:
#!/bin/bash
cd /home/secure/chkrootkit
echo "Checking..."
md5sum * > /root/ckr.sum
diff /home/secure/md5.sum/ root/ ckr.sum
./chkrootkit > /root/now
diff chbase /root/now
echo "Done."

Теперь, когда я выполняю команду "chk", md5sums из директории chkrootkit проверяются против основной системы, затем запускается chkrootkit и сравнивается с первоначальной загрузкой (внося корректировку вручную по мере необходимости). Различия высылаются мне по почте. Также проводится проверка подлинности новых пакетов.

Интегрируем MyNetWatchMan/ Snort
Мой mynetwatchman perl agent включает в себя iptables, portsentry и snort для IDS, и мой /etc/mnwclient.rc выглядит следующим образом:
login <my login>
password <my password>
interface eth0
log /var/log/messages,/var/ log/ snort/alert.csv
chain attackalert, IPT, TCP
quiet

Файлы для примеров snort и mnwclient неверны, добавьте следующее в snort.conf (или snort.bottom):
output alert_csv: /var/log/ snort/ alert.csv proto,timestamp,src,srcport,dst,dstport,icmptype,icmpcode
А вот и rc.mnwclient-скрипт:
#!/bin/bash
# Автор Jack S. Lai — Submitted to MyNetWatchman.com
# Этот скрипт запускает, останавливает или выдает статус клиента MyNetWatchman для Slackware.
#
runcmd="/usr/sbin/mnwclient &"
success=0
noroot=1
badargs=65
noconfig=66
nomnw=67
if [ "$UID" != "$success" ]; then
echo "You must be root to use this program."
exit $noroot
fi
if [ -z "$1" ]; then
echo "Usage: 'basename $0' start, stop, status"
exit $badargs
fi
if [ ! -f /etc/mnwclient.rc ]; then
echo "Cannot run MyNetWatch man client. Missing /etc/mnwcli- ent.rc"
echo " This file needs to be set with your login/password, interface,"
echo " and alert name from /var/log/messages..."
exit $noconfig
fi
if [ -x /usr/sbin/mnwclient ]; then
mypid=$(pidof -x mnwclient)
if [ "$1" = "start" ]; then
if [ $mypid ]; then
echo "MyNetWatchman client is already running!"
else
/usr/sbin/mnwclient &
echo "MyNetWatchman client running..."
exit $success
fi
fi
if [ "$1" = "stop" ]; then
if [ $mypid ]; then
kill -TERM $mypid
echo "MyNetWatchman client stopped."
exit $success
else
echo "Can't stop. MyNetWatch man client not running!"
fi
fi
if [ "$1" = "status" ]; then
if [ $mypid ]; then
echo "MyNetWatchman running. Process = $mypid"
else
echo "MyNetWatchman is not running."
fi
exit $success
fi
else
echo "/usr/sbin/mnwclient is not executable! Aborting..."
exit $nomnw
fi

Продолжение следует
По материалам Джека С. Лэя

Подготовил X-Stranger
Текст распространяется на условиях GPL



Компьютерная газета. Статья была опубликована в номере 19 за 2003 год в рубрике soft :: linux

©1997-2024 Компьютерная газета