Armoring Linux

(Red Hat distribution)

Lance Spitzner
http://security.tsu.ru/info/unix/lance/linux.html
 
 
1.
Защита начинается с с установки операционной системы. 
Инсталлировать Linux на изолированной машине ( во время установки машина должна быть вне сети)
2.
Если изолированная сеть нуждается в файлах, скаченных из Интернета, то необходимо завести дополнительную машину, которая будет загружать файлы из Интернета и затем передавать их  в выделенную сеть.
3.
Инсталлируйте только действительно необходимые пакеты.Чем меньше софта - тем меньше дырок. 
Лучше всего пакеты добавлять по необходимости, но не исключайте man's и HOWTO.
4.
При инсталляции под /var завести отдельный раздел для логов и почты, чтобы предотвратить переполнение основного раздела /  и, как следствие, DoS и крушение системы. 400Mb более чем достаточно для /var. Вы также можете завести отдельный раздел под любое приложение,особенно, если оно ведет большие логи. 
5.
После завершения программы установки ОБЯЗАТЕЛЬНО установить все рекомендуемые security patches. См. http://www.redhat.com/support.  Security patches требуют постоянного обновления. Подпишись на bugtraq@netspace.org - источник информации о текущих багах и патчях. 
6.
Анализ /etc/inetd.conf (этот файл определяет какие сервисы за которые отыечает демон /usr/sbin/inetd. Закомметировать (#) все ненужные сервисы. Проверить оставшиеся: grep -v "^#" /etc/inetd.conf 
См. Пример 1
7.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/etc/rc.d/rc3.d/*.rc scripts определяют сервисы, стартующие с помощью init process. Остановить некоторые .rc скрипты либо заменив S на s в названии скрипта либо использовать /usr/sbin/setup (выбрать опцию "System Services" ). Рекомендуется отключить следующие скрипты: 
S05apmd (Только для laptop) 
S10xntpd (Network time protocol) 
S15sound 
S20bootparamd (Для бездисковых рабочих станций) 
S20nfs ( NFS server). 
S20rusersd (Любой r service дает слишком много информации удаленному юзеру.) 
S20rwalld 
S20rwhod 
S25innd (News server) 
S25squid (Proxy server) 
S30sendmail (Если вы выключите этот сервис, вы все равно сможете посылать письма, но не сможете их получать и пересылать). 
S30ypbind  (Если вы NIS client, то  этот сервис нужен) 
S34yppasswdd (сли вы  NIS server, то этот крайне уязвимый сервис вам нужен) 
S35dhcpd 
S35ypserv (Если вы NIS server) 
S40portmap (Если у вас есть rpc сервисы -NIS, NFS) 
S40snmpd (SNMP daemon, может дать удаленному юзеру детальную информацию о вас) 
S55routed (RIP, используйте только, если это вам ДЕЙСТВИТЕЛЬНО нужно) 
S55named (DNS server. Обязятельно проапгрейдить -  http://www.isc.org/bind.html
S60atd (Сервис. похожий на CRON) 
S60lpd (Printing services) 
S72amd (AutoMount daemon, используется для монтирования удаленной FS) 
S75gated (используется для запуска иных протоколов маршрутизации, таких как OSPF) 
s85httpd (Apache webserver, последняя версия  - http://www.apache.org
S95nfsfs (nfs client, используется для монтирования FS с NFS сервера) 
S95pcmcia (У вас laptop?) 

Чтобы проверить, какие скрипты остались, наберите: ps aux | wc -l

8.



 
 
 
 
 
 
 
 
 
 
 
 

Логи пишутся в /var/log. По умолчанию Линукс ведет логи по всему, кроме ftp. Для того, чтобы исправить это, редактируем /etc/inetd.conf
ftp     stream  tcp     nowait  root    /usr/sbin/tcpd  in.ftpd -l -L -i -o 

--- From the man pages --- 

If the -l option is specified, each ftp session is logged in the syslog 
If the -L flag is used, command logging will be on by default as soon as the ftp server is invoked.  This will cause  the  server  to log all USER 
commands, which if a user accidentally enters a password for that command instead of the username, will cause passwords to be logged via 
syslog. 
If the -i option is specified, files received by the ftpd(8) server will be logged to the xferlog(5). 
If the -o option is specified, files transmitted by the ftpd(8) server will be logged to the xferlog(5). 

--- snip snip --- 
Либо конфигурируем /etc/ftpaccess

10.
Cоздаем файл /etc/issue (если его нет). В него пишутся elnet-сессии. Если вы хотите использовать один и тот же файл, подправьте /etc/rc.d/S99local. Иначе каждые раз при перезагрузке этот файл будет очищаться. 
См. Пример 2.
11.
У вас нет файла /etc/shadow - защищенного хранилища паролей, к которому доступ имеет только root?  Тогда в командной строке набираем 
pwconv 
и все пароли из файла /etc/passwd конвертируются в файл /etc/shadow.
12.
Редактируем /etc/passwd - удаляем  ненужные нам эккаунты, созданные по умолчанию программой установки. Вы планируете использовать сервер новостей ? Нет? Удалите эккаунт news ( только не забудьте отредактировать /etc/cron.hourly, который упоминает этого юзера). 
Также  удаляем ftp - эккаунт, используемый для анонимного ftp-доступа : 
man ftpd: 

       Ftpd authenticates users according to four rules. 

       4)     If  the  user name is ``anonymous'' or ``ftp'', an anonymous ftp account must be pre-sent in the password file (user ``ftp'').  In this case the user is allowed to log in by specifying any password (by convention this is given as the client host's name). 
Пример 3.
 

13.
Редактируем /etc/ftpusers. Эккаунты, перечисленные в нем, не имеют ftp-доступа к системе. Поэтому добавляем в него системные эккаунты: root, bin  -  запрещаем системным эккаунтом ftp-доступ к системе
Пример 4.
14.
Редактируем /etc/securetty. Здесь должны быть указаны только терминалы tty1,tty2,tty3 и т.д., чтобы ограничить root  локальным доступом к системе. При необходимости в удаленном доступе рутом, необходимо зарегистрироваться обычным юзером, а затем набрать su. 
Пример 5.
15.



 
 
 
 
 
 
 
 
 

Настраиваем TCP Wrapper - бинарник,"оборачивающий" перечисленные в /etc/inetd.conf сервисы. Он ведет логи по всем попыткам установить соединение с inetd-сервисом и затем сверяет ip-адрес источника с контрольным списком доступа (ACL, Access Control List).В Линуксе TCP Wrapper устанавливается при инсталляции, вам остается отредактировать файлы /etc/hosts.allow и /etc/hosts.deny. .Эти файлы определяют, какие IP-адреса или сети  имеет доступ к вашей системе(/etc/hosts.allow), а какие - нет (/etc/hosts.deny).  По умолчанию эти файлы пустые, значит, доступ разрешен отовсюду, вам необхоимо отредактировать эти файлы. 2 совета: 
1.Используйте IP-адреса и сети вместо доменных имен. 
2.Установите в /etc/hosts.deny запрет всем (ALL: ALL), затем разрешите доступ с определенных сайтов в /etc/hosts.allow 
Пример. 
Также TCP Wrapper позволяет вырезать баннеры и запускать дополнительные программы, например, safe_finger. 
Пример 6.
16.

 
 
 
 
Создаем группу wheel. В ней состоят те юзеры, которым разрешено пользоваться небезопасным командами, например, /bin/su. Редактируем /etc/group, создаем группу wheel, добавляем системных администраторов в эту группу. Определяем уязвимые с точки зрения безопасности команды. Изменяем у таких файлов группу на wheel, права на исполнение этого файла даем только владельцу и вышеупомянутой группе. Для /bin/su: 
/bin/chgrp wheel /bin/su 
/bin/chmod 4750 /bin/su 
17.
Блокируем файлы .rhosts, netrc, /etc/hosts.equiv . r-комманды используют эти файлы для удаленного доступа к системе: 
/bin/touch /.rhosts /.netrc /etc/hosts.equiv 
/bin//chmod 0 /.rhosts /.netrc /etc/hosts.equiv 

18.



 
 
 
 
 
 
 
 
 
 
 
 
 

Вносим изменения в PAM -Pluggable Authentication Modules-набор библиотек, позволяющих выбрать приложение для идентификации юзера. Cм. ftp://ftp.us.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam.html.
Вот так вы можете задать схему шифрования паролей MD5, улучшив защищенность файла /etc/shadow. 
В /etc/pam.d находятся конфигурационные файлы различных бинарников, которые требуют аутотентификации. Большинство из них содержит следующую строку 
password   required     /lib/security/pam_pwdb.so nullok use_authtok 
Вы должны в каждом таком файле, содержащем подобную строку, добавит в ее конец md5: 
password   required     /lib/security/pam_pwdb.so nullok use_authtok md5 
В RedHat5.1 исправлению подлежат следующуи файлы из /etc/pam.d: 
chfn 
chsh 
login 
passwd 
rlogin 
su 
xdm 
19.
Ограничьте физический доступ к компьютеру. Пароль на BIOS и конфигурирование LILO (/etc/lilo.conf) c с паролем (password=xxx). Если есть физический доступ к вашей системе, то защитить ее ничем нельзя .
20.
Не забывайте про существование :
ipchains (пакетный фильтр) 
ssh (защищенный rlogin,rcp, telnet) 
tripwire (отслеживает изменения в системных бинарниках) 
swatch (проверяет логи и рассылает предупреждения) 
Пример 1   -  файл  /etc/inetd.conf. Все сервисы, кроме telnet и ftp закомментированы. 


# inetd.conf    This file describes the services that will be available 
#               through the INETD TCP/IP super server.  To re-configure 
#               the running INETD process, edit this file, then send the 
#               INETD process a SIGHUP signal. 

# Version:      @(#)/etc/inetd.conf     3.10    05/27/93 

# Authors:      Original taken from BSD UNIX 4.3/TAHOE. 
#               Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> 

# Modified for Debian Linux by Ian A. Murdock <imurdock@shell.portal.com> 

# Modified for RHS Linux by Marc Ewing <marc@redhat.com> 

# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args> 

# Echo, discard, daytime, and chargen are used primarily for testing. 

# To re-read this file after changes, just do a 'killall -HUP inetd' 

#echo   stream  tcp     nowait  root    internal 
#echo   dgram   udp     wait    root    internal 
#discard        stream  tcp     nowait  root    internal 
#discard        dgram   udp     wait    root    internal 
#daytime        stream  tcp     nowait  root    internal 
#daytime        dgram   udp     wait    root    internal 
#chargen        stream  tcp     nowait  root    internal 
#chargen        dgram   udp     wait    root    internal 

# These are standard services. 

ftp     stream  tcp     nowait  root    /usr/sbin/tcpd  in.ftpd -l -L -i -o 
telnet stream  tcp     nowait  root    /usr/sbin/tcpd  in.telnetd 
#gopher stream  tcp     nowait  root    /usr/sbin/tcpd  gn 

# do not uncomment smtp unless you *really* know what you are doing. 
# smtp is handled by the sendmail daemon now, not smtpd.  It does NOT 
# run from here, it is started at boot time from /etc/rc.d/rc#.d. 
#smtp   stream  tcp     nowait  root    /usr/bin/smtpd  smtpd 
#nntp   stream  tcp     nowait  root    /usr/sbin/tcpd  in.nntpd 

# Shell, login, exec and talk are BSD protocols. 

#shell  stream  tcp     nowait  root    /usr/sbin/tcpd  in.rshd 
#login  stream  tcp     nowait  root    /usr/sbin/tcpd  in.rlogind 
#exec   stream  tcp     nowait  root    /usr/sbin/tcpd  in.rexecd 
#talk   dgram   udp     wait    root    /usr/sbin/tcpd  in.talkd 
#ntalk  dgram   udp     wait    root    /usr/sbin/tcpd  in.ntalkd 
#dtalk  stream  tcp     waut    nobody  /usr/sbin/tcpd  in.dtalkd 

# Pop and imap mail services et al 

#pop-2   stream  tcp     nowait  root    /usr/sbin/tcpd ipop2d 
#pop-3   stream  tcp     nowait  root    /usr/sbin/tcpd ipop3d 
#imap    stream  tcp     nowait  root    /usr/sbin/tcpd imapd 

# The Internet UUCP service. 

#uucp   stream  tcp     nowait  uucp    /usr/sbin/tcpd  /usr/lib/uucp/uucico    -l 

# Tftp service is provided primarily for booting.  Most sites 
# run this only on machines acting as "boot servers." Do not uncomment 
# this unless you *need* it. 

#tftp   dgram   udp     wait    root    /usr/sbin/tcpd  in.tftpd 
#bootps dgram   udp     wait    root    /usr/sbin/tcpd  bootpd 

# Finger, systat and netstat give out user information which may be 
# valuable to potential "system crackers."  Many sites choose to disable 
# some or all of these services to improve security. 

# cfinger is for GNU finger, which is currently not in use in RHS Linux 

#finger stream  tcp     nowait  root    /usr/sbin/tcpd  in.fingerd 
#cfinger stream tcp     nowait  root    /usr/sbin/tcpd  in.cfingerd 
#systat stream  tcp     nowait  guest   /usr/sbin/tcpd  /bin/ps -auwwx 
#netstat        stream  tcp     nowait  guest   /usr/sbin/tcpd  /bin/netstat    -f inet 

# Time service is used for clock syncronization. 

#time   stream  tcp     nowait  nobody  /usr/sbin/tcpd  in.timed 
#time   dgram   udp     wait    nobody  /usr/sbin/tcpd  in.timed 

# Authentication 

#auth   stream  tcp     nowait    nobody    /usr/sbin/in.identd in.identd -l -e -o 

# End of inetd.conf 
 

Пример 2 -  файл  /etc/issue



#  WARNING:  You must have specific authorization to access 
#            this machine.  Unauthorized users will be logged, 
#            monitored, and then shot on site! 

Пример3   -   файл /etc/passwd. Поле "пароль"  заменено на "x" и не содержит в себе зашифрованный пароль, который был перенесен командой pwconv в файл /etc/shadow. 

root:x:0:0:root:/root:/bin/bash 
bin:x:1:1:bin:/bin: 
daemon:x:2:2:daemon:/sbin: 
adm:x:3:4:adm:/var/adm: 
lp:x:4:7:lp:/var/spool/lpd: 
mail:x:8:12:mail:/var/spool/mail: 
uucp:x:10:14:uucp:/var/spool/uucp: 
nobody:x:99:99:Nobody:/: 
 

Пример 4  -  файл  /etc/ftpusers 

root 
bin 
daemon 
adm 
lp 
mail 
uucp 
nobody 

Пример 5  -  файл  /etc/securetty

tty1 
tty2 
tty3 
tty4 
ttyp1 -- > Эта строка позволяет удаленному юзеру войти в систему под root ! Такой строки не должно быть в вашем файле. 
 

Пример 6 - ACL для  TCP Wrappers.  Синтаксис: 

Service: Source (IP address, network, or name): <optional> : ALLOW or DENY 
Сервис: Источник (IP-адрес.сеть, доменное имя):необязательное поле: ALLOW or DENY 

Пример  /etc/hosts.allow 

in.telnetd: 192.168.1.0/255.255.255.0 : banners /etc/bannerfile : ALLOW 
in.ftpd: 192.168.1.30 :ALLOW 
imapd: ALL : spawn (/usr/local/bin/ids.sh %d %h %H %u) 

Пример  /etc/hosts.deny. Настоятельно рекомендуется виметь только такой hosts.deny файл! 

ALL: ALL DENY 

Прим. перевод.
Следите  за тем, чтобы hosts.allow и hosts.deny  обязательно заканчивались пустой строкой!
 



Перевод  sciurus@mail.ru
4 апреля 2000г.