Установка Gentoo
Загружаемся с CD-ROM, для установки через удаленную консоль конфигурируем сеть, устанавливаем пароль рута и запускаем sshd
passwd root ; /etc/init.d/sshd start
Теперь можно удаленно подключиться по ssh и продолжить установку. Подключаемся, размечаем жесткий диск по следующей схеме:
1 /boot 128 мб 2 swap 1024 мб 3 / все оставшееся место
Для надежности мы сделаем программный RAID-1, сначала он будет состоять только из одного диска, моем случае это /dev/sda
fdisk /dev/sda << end-of-text n p 1+128M n p 2+1024M n p 3a 1 t 1 fd t 2 fd t 3 fd w end-of-text
Устанавливаем дату/время (4 августа 2008 года, 09:41) и сразу выставляем аппаратные часы по системному времени
date 080409412008 && hwclock --systohc
Форматируем и монтируем разделы (не забываем заменить /dev/sd* и x86 в случае необходимости), скачиваем установочные файлы и распаковываем их
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sda1 missing && mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/sda2 missing && mdadm --create /dev/md3 --level=1 --raid-devices=2 /dev/sda3 missing && mkfs.ext3 /dev/md1 && mkswap /dev/md2 && mkfs.ext3 /dev/md3 && mount /dev/md3 /mnt/gentoo && mkdir /mnt/gentoo/boot && mount /dev/md1 /mnt/gentoo/boot && cd /mnt/gentoo && wget http://mirror.yandex.ru/gentoo-distfiles/releases/x86/current-stage3/stage3-i686-20100413.tar.bz2 && tar xvjpf stage3-*.tar.bz2 && wget http://mirror.yandex.ru/gentoo-distfiles/snapshots/portage-latest.tar.bz2 && tar xvjf /mnt/gentoo/portage-latest.tar.bz2 -C /mnt/gentoo/usr
Смотрим что у нас за процессор и находим соответствующие флаги компилятора, которые находим на http://en.gentoo-wiki.com/wiki/Safe_Cflags:
cat /proc/cpuinfo
В моем случае процессор Intel Core Solo/Duo, Pentium Dual-Core T20xx/T21xx:
vendor_id : GenuineIntel cpu family : 6 model : 22
Создаем соответствующий /mnt/gentoo/etc/make.conf
cat > /mnt/gentoo/etc/make.conf << end-of-text
# These settings were set by the catalyst build script that automatically
# built this stage.
# Please consult /etc/make.conf.example for a more detailed example.
LINGUAS="ru en"
CHOST='i686-pc-linux-gnu'
CFLAGS="-march=prescott -O2 -pipe -fomit-frame-pointer"
CXXFLAGS="\${CFLAGS}"
MAKEOPTS="-j2"
GENTOO_MIRRORS="http://mirror.yandex.ru/gentoo-distfiles"
USE="bash-completion syslog threads logrotate nls -midi -xorg -gpm -ipv6"
end-of-text
Редактируем файлы конфигурации сети под Ваши нужды:
nano -w /mnt/gentoo/etc/conf.d/hostname && nano -w /mnt/gentoo/etc/conf.d/net && nano -w /mnt/gentoo/etc/resolv.conf
В моем случае они такие:
/mnt/gentoo/etc/conf.d/hostname:
HOSTNAME="devel"
/mnt/gentoo/etc/conf.d/net:
dns_domain="spnet.ru" dns_search="spnet.ru" dns_servers="89.222.212.129" config_eth0=( "10.70.128.223/22" ) routes_eth0=( "default via 10.70.128.1" )
/mnt/gentoo/etc/resolv.conf:
search spnet.ru nameserver 89.222.212.129
Монтируем файловые системы и делаем chroot
mount -t proc none /mnt/gentoo/proc && mount -o bind /dev /mnt/gentoo/dev && chroot /mnt/gentoo /bin/bash
Обновляем переменные среды и изменяем приглашение интерпритатора, чтобы помнить что мы в chroot. Синхронизируем дерево портеджей, настраиваем локали и системное время
cat > /etc/env.d/02locale << end-of-text LANG="ru_RU.UTF-8" LC_ALL="" end-of-text cat /usr/share/i18n/SUPPORTED | grep -E 'ru_RU|en_US' >> /etc/locale.gen && locale-gen
Редактируем настройки системного времени: выставляем Московскую временную зону и включаем синхронизацию аппаратных часов по текущему времени
sed -i -e 's#^#TIMEZONE=".*"#TIMEZONE="Europe/Moscow"#g' -e 's#^CLOCK_SYSTOHC="no"#CLOCK_SYSTOHC="yes"#' /etc/conf.d/clock sed -i -e 's/UNICODE=.*/UNICODE="yes"/' /etc/rc.conf sed -i -e 's/CONSOLEFONT=.*/CONSOLEFONT="Cyr_a8x16"/' /etc/conf.d/consolefont sed -i -e 's/.*CONSOLETRANSLATION=.*/CONSOLETRANSLATION="cp866_to_uni"/' /etc/conf.d/consolefont sed -i -e 's/KEYMAP=.*/KEYMAP="ru"/' /etc/conf.d/keymaps echo "NROFF /usr/bin/enconv -L ru -x KOI8-R | /usr/bin/nroff -mandoc -Tlatin1 -c | /usr/bin/enconv -L ru -x UTF-8" >>/etc/man.conf env-update && source /etc/profile && export PS1="(chroot) $PS1" && ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
Создаем файл /etc/fstab
cat > /etc/fstab << end-of-text /dev/md1 /boot ext3 noatime 1 2 /dev/md2 none swap sw 0 0 /dev/md3 / ext3 noatime 0 1 /dev/cdrom /mnt/cdrom audo noauto,ro 0 0 shm /dev/shm tmpfs nodev,nosuid,noexec 0 0 end-of-text
Устанавливаем исходники ядра и другие необходимые пакеты, добавляем в начальную загрузку sshd и сетевой интерфейс eth0
emerge hardened-sources genkernel grub openssh && rc-update add sshd default && rc-update add net.eth0 default
смотрим какое ядро установлено (emerge -s hardened-sources), скачаваем мой конфиг ядра и сохраняем его под соответствующим именем в /etc/kernels
mkdir /etc/kernels ; wget http://klyaznik.ru/files/kernel-config-x86-2.6.27-hardened-r8 -O /etc/kernels/kernel-config-x86-2.6.27-hardened-r8
Создаем файл конфигурации grub
cat > /boot/grub/grub.conf << end-of-text default 0 timeout 5 splashimage=(hd0,0)/grub/splash.xpm.gz
title=Gentoo Linux (2.6.28-hardened-r7) root (hd0,0) kernel /kernel root=/dev/ram0 init=/linuxrc ramdisk=8192 real_root=/dev/md3 noataraid nodmraid noevms nofirewire nolvm nonet nopata nopcmcia nosata noscsi nousb initrd /initramfs
end-of-text
Устанавливаем пароль рута и запускаем grub для установки загрузчика
passwd root grub
В grub вводим следующие команды (замените /dev/sda на Ваш жесткий диск)
device (hd0) /dev/sda root (hd0,0) setup (hd0) quit
Компилируем и устанавливаем ядро и модули
genkernel --menuconfig --bootloader=grub --symlink all
В открывшемся конфиге ядра выбираем правильную модель процессора (в моем случае Pentium-4) и, если нужно, включаем Symmetric multi-processing support, выходим с сохранением конфига. Пьем кофе/пиво, читаем башорг…
Проверяем конфигурацию загрузчика
nano -w /boot/grub/grub.conf
Должно получиться что-то типа этого:
default 0 timeout 5 splashimage=(hd0,0)/grub/splash.xpm.gztitle=Gentoo Linux (2.6.28-hardened-r7) root (hd0,0) kernel /kernel root=/dev/ram0 init=/linuxrc ramdisk=8192 real_root=/dev/md3 ide0=noprobe ide1=noprobe noataraid nodmraid noevms nofirewire nolvm nonet nopata nopcmcia nosata noscsi nousb initrd /initramfs
В зависимости от аппаратной конфигурации сервера можно добавлять следующие флаги, запрещающие загрузку ненужных драйверов из initrd (не указывайте nonet, если нужно грузить сетевые драйверы tg3 или e1000, не указывайте nosata, если у вас жесткие диски Serial ATA):
noataraid nodmraid noevms nofirewire nolvm nonet nopata nopcmcia nosata noscsi nousb
Параметры ide0=noprobe ide1=noprobe нужно использовать в случае, если ваши sata диски определяются как ide.
Выходим из chroot
exit
Отмонтируем файловые системы и перезагружаемся, не забыв вынуть загрузочный CD
cd && umount /mnt/gentoo/boot /mnt/gentoo/dev /mnt/gentoo/proc /mnt/gentoo && reboot
Разбиваем второй жесткий диск также, как и первый и затем присоединяем его разделы к рэйд массиву (не забыв заменить /dev/sd* в случае необходимости)
sfdisk -d /dev/sda | sfdisk /dev/sdb && mdadm -a /dev/md1 /dev/sdb1 && mdadm -a /dev/md2 /dev/sdb2 && mdadm -a /dev/md3 /dev/sdb3
Запускаем grub для установки загрузчика
grub
В grub вводим следующие команды (замените /dev/sdb на Ваш второй жесткий диск)
device (hd0) /dev/sdb root (hd0,0) setup (hd0) quit
Пробуем обновить систему
cat > /etc/portage/package.use << end-of-text net-analyzer/net-snmp extensible sys-apps/grep pcre www-servers/apache auth_digest sys-kernel/hardened-sources symlink dev-libs/libpcre unicode end-of-text
emerge --update --deep --newuse --ask world && dispatch-conf && emerge --depclean && emerge gentoolkit && revdep-rebuild
Наверняка будут сообщения о заблокированных пакетов, решаем их вдумчиво читая хэндбук (http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?full=1#blocked), в моем случае все решилось удалением mktemp
emerge -C mktemp
Повторяем предыдущий шаг. В случае каких-либо ошибок консультируемся с handbook (возможно понадобится запуск fix_libtool_files.sh и emerge -1 libtool)
Устанавливаем необходимые пакеты и добавляем их в автозагрузку
emerge enca sysstat sshguard syslog-ng logrotate paxtest tripwire mc tcpdump tcptraceroute traceroute vim bind-tools iptables netkit-telnetd vconfig gradm iproute2 paxctl slocate vixie-cron ntp logsentry tripwire mdadm unzip unrar && rc-update add syslog-ng default && rc-update add iptables default && rc-update add vixie-cron default && rc-update add ntp-client default && rc-update add mdadm default && rc-update add sysstat default
Настраиваем правила iptables
sed -i -e 's#^SAVE_RESTORE_OPTIONS=".*"#SAVE_RESTORE_OPTIONS=""#g' -e 's#SAVE_ON_STOP="yes"#SAVE_ON_STOP="no"#g' /etc/conf.d/iptables
cat > /var/lib/iptables/rules-save << end-of-text *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] :bad-packets - [0:0] :icmp-allow - [0:0] :sshguard - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -j sshguard -A INPUT -j bad-packets -A INPUT -p icmp -j icmp-allow -A INPUT -p icmp -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 32768:61000 -m state --state NEW -j ACCEPT -A INPUT -p udp -m udp --dport 32768:61000 -m state --state NEW -j ACCEPT -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -j DROP -A FORWARD -p icmp -j icmp-allow -A FORWARD -j bad-packets -A OUTPUT -o lo -j ACCEPT -A OUTPUT -j ACCEPT -A bad-packets -p tcp -m tcp --dport 445 -j DROP -A bad-packets -p tcp -m tcp --dport 135 -j DROP -A bad-packets -p tcp -m tcp --dport 137:139 -j DROP -A bad-packets -p udp -m udp --dport 137:139 -j DROP -A bad-packets -d 169.254.0.0/16 -j DROP -A bad-packets -s 169.254.0.0/16 -j DROP -A bad-packets -d 127.0.0.1/32 -j DROP -A bad-packets -s 127.0.0.1/32 -j DROP -A icmp-allow -p icmp -m icmp --icmp-type 8 -j RETURN -A icmp-allow -p icmp -m icmp --icmp-type 0 -j RETURN -A icmp-allow -p icmp -m icmp --icmp-type 4 -j RETURN -A icmp-allow -p icmp -m icmp --icmp-type 3 -j RETURN -A icmp-allow -p icmp -m icmp --icmp-type 11 -j RETURN -A icmp-allow -p icmp -m icmp --icmp-type 12 -j RETURN -A icmp-allow -j DROP COMMIT *natREROUTING ACCEPT [0:0]
OSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT end-of-text
Настраиваем основные аспекты grsec
cat >> /etc/sysctl.conf << end-of-text
kernel.grsecurity.audit_chdir = 0 kernel.grsecurity.audit_ipc = 0 kernel.grsecurity.audit_mount = 1 kernel.grsecurity.chroot_caps = 1 kernel.grsecurity.chroot_deny_chmod = 1 kernel.grsecurity.chroot_deny_chroot = 1 kernel.grsecurity.chroot_deny_fchdir = 1 kernel.grsecurity.chroot_deny_mknod = 1 kernel.grsecurity.chroot_deny_mount = 1 kernel.grsecurity.chroot_deny_pivot = 1 kernel.grsecurity.chroot_deny_shmat = 1 kernel.grsecurity.chroot_deny_sysctl = 1 kernel.grsecurity.chroot_deny_unix = 1 kernel.grsecurity.chroot_enforce_chdir = 1 kernel.grsecurity.chroot_execlog = 0 kernel.grsecurity.chroot_findtask = 1 kernel.grsecurity.chroot_restrict_nice = 1 kernel.grsecurity.dmesg = 1 kernel.grsecurity.exec_logging = 0 kernel.grsecurity.execve_limiting = 1 kernel.grsecurity.fifo_restrictions = 1 kernel.grsecurity.forkfail_logging = 1 kernel.grsecurity.linking_restrictions = 1 kernel.grsecurity.signal_logging = 1 kernel.grsecurity.timechange_logging = 1 kernel.grsecurity.tpe = 0 kernel.grsecurity.tpe_gid = 0 kernel.grsecurity.tpe_restrict_all = 0 kernel.grsecurity.disable_modules = 0 kernel.grsecurity.grsec_lock = 1
net.ipv4.conf.all.arp_filter=1 net.ipv4.conf.default.arp_filter=1
net.ipv4.neigh.default.gc_thresh1=1024 net.ipv4.neigh.default.gc_thresh2=2048 net.ipv4.neigh.default.gc_thresh3=8192 vm.swappiness=10 vm.vfs_cache_pressure=1000 end-of-text
Настраиваем tripwire (http://gentoo-wiki.com/Setting_Up_Tripwire)
cat > /etc/tripwire/twpol.txt << end-of-text @@section GLOBAL TWROOT=/usr/sbin; TWBIN=/usr/sbin; TWPOL="/etc/tripwire"; TWDB="/var/lib/tripwire"; TWSKEY="/etc/tripwire"; TWLKEY="/etc/tripwire"; TWREPORT="/var/lib/tripwire/report"; HOSTNAME=localhost;
@@section FS SEC_CRIT = $(IgnoreNone)-SHa ; # Critical files that cannot change SEC_SUID = $(IgnoreNone)-SHa ; # Binaries with the SUID or SGID flags set SEC_BIN = $(ReadOnly) ; # Binaries that should not change SEC_CONFIG = $(Dynamic) ; # Config files that are changed infrequently but accessed often SEC_LOG = $(Growing) ; # Files that grow, but that should never change ownership SEC_INVARIANT = +tpug ; # Directories that should never change permission or ownership SIG_LOW = 33 ; # Non-critical files that are of minimal security impact SIG_MED = 66 ; # Non-critical files that are of significant security impact SIG_HI = 100 ; # Critical files that are significant points of vulnerability
(
rulename = "All files",
severity = $(SIG_HI)
)
{
/ -> $(SEC_INVARIANT) (recurse = 0) ;
/bin -> $(SEC_BIN) ;
/boot -> $(SEC_BIN) ;
/etc -> $(SEC_BIN) ;
!/etc/adjtime;
!/etc/grsec/learning.logs;
!/etc/logcheck/tmp;
!/etc/mtab;
!/etc/resolv.conf;
/home -> $(SEC_INVARIANT)(recurse = 0) ;
/lib -> $(SEC_BIN) ;
/lost+found -> $(SEC_BIN) ;
/mnt -> $(SEC_BIN) ;
/opt -> $(SEC_BIN) ;
/sbin -> $(SEC_BIN) ;
/usr -> $(SEC_BIN) ;
!/usr/local/share/man/whatis;
!/usr/share/man/whatis;
/var/db -> $(SEC_BIN) ;
}
end-of-text
echo "TEMPDIRECTORY =/var/tmp" >> /etc/tripwire/twcfg.txt && /etc/tripwire/twinstall.sh
Создаем задания для коллектора статистики и logcheck (http://www.gentoo.org/doc/en/security/security-handbook.xml?part=1&chap=3#doc_chap5)
cat > /etc/cron.d/sysstat << end-of-text ## Run system activity accounting tool every 10 minutes */10 * * * * root /usr/lib/sa/sa1 1 1 ## 0 * * * * root /usr/lib/sa/sa1 -d 600 6 & ## Generate a daily summary of process accounting at 23:53 53 23 * * * root /usr/lib/sa/sa2 -A # end-of-text
echo "/bin/sh /etc/logcheck/logcheck.sh" >> /etc/cron.hourly/logsentry.cron
sed -i -e 's#^\$LOGTAIL /var/log/secure >> \$TMPDIR/check.\$\$#\#\$LOGTAIL /var/log/secure >> \$TMPDIR/check.\$\$#g' -e 's#^\$LOGTAIL /var/log/maillog >> \$TMPDIR/check.\$\$#\#\$LOGTAIL /var/log/maillog >> \$TMPDIR/check.\$\$\n\$LOGTAIL /var/log/auth.log >> \$TMPDIR/check.\$\$\n\$LOGTAIL /var/log/grsec.log >> \$TMPDIR/check.\$\$\n\$LOGTAIL /var/log/kern.log >> \$TMPDIR/check.\$\$#g' /etc/logcheck/logcheck.sh
cat >> /etc/logcheck/logcheck.violations.ignore << end-of-text syslog-ng[.*]: Log statistics sshd[.*]: reverse mapping checking sshd[.*]: Invalid user sshd[.*]: .*uthentication failure sshd[.*]: Failed keyboard-interactive sshd[.*]: .* group is listed in DenyGroups sshd[.*]: pam_unix sshguard[.*]: Blocking end-of-text
cat >> /etc/logcheck/logcheck.ignore << end-of-text syslog-ng[.*]: Configuration reload request received, reloading configuration syslog-ng[.*]: Log statistics syslog-ng[.*]: Termination requested via signal, terminating syslog-ng[.*]: syslog-ng shutting down syslog-ng[.*]: syslog-ng starting up sshd[.*]: sshguard[.*]: end-of-text
Добавляем в конфигурацию syslog-ng директивы, необходимые для sshguard
cd /etc/syslog-ng ; patch -p0 << end-of-text
--- syslog-ng.conf 2008-08-04 15:09:01.000000000 +0400
+++ syslog-ng.conf.new 2008-08-04 15:41:37.000000000 +0400
@@ -60,6 +60,14 @@
destination xconsole { pipe("/dev/xconsole"); };
+destination sshguardproc {
+ program("/usr/sbin/sshguard"
+ template("\$DATE \$FULLHOST \$MESSAGE\n"));
+};
+
+filter authssh { facility(auth, authpriv); };
+log { source(src); filter(authssh); destination(sshguardproc); };
+
filter f_auth { facility(auth); };
filter f_authpriv { facility(auth, authpriv); };
filter f_syslog { not facility(authpriv, mail); };
end-of-text
Теперь применяем изменения
sysctl -p ; /etc/init.d/syslog-ng restart; /etc/init.d/iptables restart
Не забываем добавить алиас для рутовой почты и инициализировать базу данных tripwire
echo "root: sadm@spnet.ru" >>/etc/aliases ; newaliases; tripwire --init
Поздравляю, на этом базовая установка системы закончена.