Установка 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
3
a
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.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 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
*nat
 :P REROUTING ACCEPT [0:0]
 :P 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

Поздравляю, на этом базовая установка системы закончена.

Комментарии запрещены.