Solaris Administrator's Security Guide

Zawartość rozdziału:

  1. Instalacja dodatkowego oprogramowania

7. Instalacja dodatkowego oprogramowania

Poniższa lista pokazuje kolejność, w jakiej należy zainstalować zgromadzone wcześniej narzędzia oraz zawiera ważniejsze informacje dotyczące ich instalacji. Wszystkie pakiety powinny być kompilowane z użyciem konta zwykłego użytkownika, jedynie na czas ich instalacji należy przejść na konto root.

UWAGA!
Instrukcje kompilacji odnoszą się do najnowszych dostępnych wersji programów (platforma x86) w chwili aktualizacji tego podręcznika. Ponieważ jest bardzo prawdopodobne, że w chwili czytania dostępne są już nowsze wersje, ich instalacja może ulec zmianie, w związku z czym należy się zaznajomić z dołączoną do nich dokumentacją.


7.1. GNU zip

tar xvf GNUzip.1.2.4.i86pc.Solaris.7.pkg.tar
/bin/su
pkgadd -d . GNUzip

7.2. Kompilator

gzip -dc GNUgcc.2.95.2.i86pc.Solaris.7.pkg.tgz | tar xvf -
/bin/su
pkgadd -d . GNUgcc

Po zainstalowaniu kompilatora należy usunąć skrypt /usr/ucb/cc, a w jego miejsce utworzyć łącze symboliczne do pliku /usr/local/bin/gcc:

rm /usr/ucb/cc
ln -s /usr/local/bin/gcc /usr/ucb/cc

7.3. GNU Bison

gzip -dc bison-1.25.tar.gz | tar xvf -
cd bison-1.25
./configure
make
/bin/su
make install

7.4. GNU Flex

gzip -dc flex-2.5.4a.tar.gz | tar xvf -
cd flex-2.5.4
./configure
make
/bin/su
make install

7.5. GNU zlib

gzip -dc zlib.tar.gz | tar xvf -
cd zlib-1.1.3
./configure
make
/bin/su
make install

7.6. Perl

Podstawowy język skryptowy wspomagający administrację. Wymagany przez większość z instalowanych tutaj narzędzi.

gzip -dc perl5.005.tar.gz | tar xvf -
cd perl5.005
rm -f config.sh Policy.sh
sh Configure
make
make test
/bin/su
make install

7.7. GNU make

gzip -dc make-3.79.1.tar.gz | tar xvf -
cd make-3.79.1
./configure
make
make check
/bin/su
make install
cd /usr/local/bin
ln make gmake

7.8. Libpcap

gzip -dc libpcap-0.5.2.tar.gz | tar xvf -
cd libpcap-0.5
./configure
make
/bin/su
make install
make install-incl
make install-man

7.9. AIDE (lub Tripwire)

gzip -dc aide-0.7.tar.gz | tar xvf -
cd aide-0.7
./configure
make
/bin/su
make install

Po zakończeniu instalacji należy wykonać bazę skrótów programów. Absolutne minimum to wszystkie programy typu SUID i SGID, ale zalecamy wykonanie bazy danych wszystkich plików z partycji: / (root), /usr, /usr/local (lub /opt).

Mniej dokładną bazę danych można utworzyć w stosunku do partycji /var, ale głównie chodzi nam tutaj o strukturę i prawa dostępu do katalogów, niż o skróty wszystkich plików.

Tak przygotowaną bazę danych należy umieścić na nośniku, który umożliwia pracę w trybie tylko-do-odczytu. Mogą to być dyski twarde z możliwością fizycznego ustawienia (np. za pomocą zworek) tego trybu pracy, ewentualnie zapisanie na dyskietce (nie polecamy, głównie ze względu ich awaryjność). Optymalnym rozwiązaniem byłby jej zapis na nośniku CD-R(W), oraz zrobienie - na wszelki wypadek - wydruku papierowego całej bazy.

Można również umieścić ją na serwerze NFS (również w trybie tylko do odczytu), ale należy wówczas upewnić się, że pracuje on z wykorzystaniem Secure RPC (z włączoną autentyzacja typu DES), oraz zasób ten nie jest dostępny całemu światu, ale tylko określonym komputerom. Z NFS jednak wiążą się inne problemy, a wszystkich zainteresowanych bliżej tym tematem odsyłamy do znakomitej książki Garfinkela i Spafforda "Bezpieczeństwo w Unixie i Internecie"


7.10. TCP wrapper (lub xinetd)

Program ten pozwala kontrolować dostęp do demonów uruchamianych za pośrednictwem inetd.

gzip -dc tcp_wrappers_7.6.tar.gz | tar xvf -
cd tcp_wrappers_7.6
chmod u+w *

Aby zainstalować TCP wrapper należy odkomenentować następujące linie w pliku Makefile:

(linia 47)   REAL_DAEMON_DIR=/usr/sbin
(linia 369)  TLI=-DTLI
(linia 409)  LIBS=-lsocket -lnsl
(linia 494)  STYLE=-DPROCESS_OPTIONS
z kolei linię zawierającą FACILITY należy zamienić na:
(linia 517)  FACILITY=LOG_LOCAL0
Następnie należy skompilować program i przejść na konto roota:
make sunos5
/bin/su
Kolejną czynnością jest zamiana właściciela wszystkich plików:
chown root:sys *
i zainstalowanie plików wykonywalnych w katalogu /usr/local/sbin:
mkdir /usr/local/sbin
chmod 755 /usr/local/sbin
chgrp sys /usr/local/sbin

mv tcpdchk tcpdmatch try-from safe_finger tcpd /usr/local/sbin/
Jeżeli planujemy korzystanie z możliwości integracji TCP wrappera z innymi programami (np.: rpcbind, ssh itp.), należy zainstalować bibliotekę libwrap.a oraz plik nagłówkowy tcpd.h:
mv libwrap.a /usr/local/lib/
mv tcpd.h /usr/local/include/
Podręczniki należy zainstalować w katalogach:
mkdir /usr/local/man
mkdir /usr/local/man/man3
mkdir /usr/local/man/man5
mkdir /usr/local/man/man8
chgrp sys /usr/local/man /usr/local/man/man3 /usr/local/man/man5 \
/usr/local/man/man8 chmod 755 /usr/local/man /usr/local/man/man3 /usr/local/man/man5 \
/usr/local/man/man8 mv *.3 /usr/local/man/man3/ mv *.5 /usr/local/man/man5/ mv *.8 /usr/local/man/man8/
Kolejną czynnością jest stworzenie plików konfiguracyjnych:
touch /etc/hosts.allow
touch /etc/hosts.deny
chgrp sys /etc/hosts.allow /etc/hosts.deny
chmod 644 /etc/hosts.allow /etc/hosts.deny
oraz pliku zbierającego logi:
touch /var/adm/tcpwrap
chgrp sys /var/adm/tcpwrap
chmod 600 /var/adm/tcpwrap
Plik /etc/hosts.allow powinien mieć następującą zawartość początkową:
ALL: 127.0.0.1
Natomiast plik /etc/hosts.deny:
ALL: ALL
Do pliku /etc/syslog.conf należy wstawić linijkę:
local0.debug	/var/adm/tcpwrap
Należy zwrócić uwagę na to, aby pomiędzy wyrazami "debug" a "/var/adm..." znajdowały się tabulatory, a nie spacje, których nie można stosować jako separatory w pliku /etc/syslog.conf.

Oprócz powyższych należy wyedytować plik /etc/inetd.conf i stosując się do wskazówek zawartych w dokumentacji programu zastosować wrapper do wszystkich usług, a następnie przeresetować demony:

pkill -1 syslogd
pkill -1 inetd

Przedstawiona powyżej przykładowa konfiguracja plików /etc/hosts.allow oraz /etc/hosts.deny zezwala na połączenia pochodzące tylko od aplikacji lokalnych, przy czym pozostałe połączenia będą odrzucane i logowane do pliku /var/adm/tcpwrap.


7.11. rpcbind

Rpcbind korzysta z biblioteki libwrap.a programu TCP wrapper, dlatego też należy ją wcześniej zainstalować (patrz: punkt 7.10).

W celu instalacji programu rpcbind należy wykonać następujące polecenia:

gzip -dc rpcbind_2.1.tar.gz | tar xvf -
cd rpcbind_2.1
chmod u+w *
Następnie należy wyedytować plik Makefile i linię zawierającą opcję -DFACILITY zamienić na:
-DFACILITY=LOG_LOCAL0 \

Ostatnią czynnością przed kompilacją jest ustawienie zmiennej WRAP_DIR. W przypadku powłoki Bourne'a należy wydać polecenie:

WRAP_DIR=/usr/local/lib; export WRAP_DIR
natomiast jeśli pracujemy w powłoce csh:
setenv WRAP_DIR /usr/local/lib
po czym można wydać komendy:
make
/bin/su
chown root:sys rpcbind
chmod 755 rpcbind
mv rpcbind /usr/local/sbin/
pkill -TERM rpcbind
/usr/local/sbin/rpbind -w
Kolejną czynnością jest edycja pliku /etc/init.d/rpc i zamiana wszystkich wywołań /usr/sbin/rpcbind na /usr/local/sbin/rpcbind. Zmienione linie powinny mieć następującą postać:
(linia 23)   [-x /usr/local/sbin/rpcbind ] || exit 0
(linia 28)   /usr/local/sbin/rpcbind > /dev/msglog 2>&1

Bazując na konfiguracji z punktu 7.10 usługi RPC będą udostępniane tylko lokalnemu hostowi, natomiast połączenia pochodzące z sieci będą odrzucane i logowane do pliku /var/adm/tcpwrap.


7.12. noshell

gcc -o noshell noshell.c
/bin/su
chown root:sys noshell
chmod 755 noshell
mv noshell /sbin/

7.13. fix-modes

gzip -dc fix-modes.tar.gz | tar xvf -
make
/bin/su
install -f /usr/local/bin -m 700 -u root -g sys fix-modes
install -f /usr/local/bin -m 700 -u root -g sys pmodes
install -f /usr/local/bin -m 700 -u root -g sys secure-modes

7.14. Generator liczb losowych (wymagany przez OpenSSL)

gzip -dc random-0.6.tar.gz | tar xvf -
cd random-0.6
make
/bin/su
chown -R root:sys *
pkgadd -d . ANDIrand
sync
reboot

7.15. OpenSSL (opcjonalnie)

gzip -dc openssl-0.9.6b.tar.gz | tar xvf -
cd openssl-0.9.6b
sh config
make
make test
/bin/su
make install

7.16. SSH (lub OpenSSH)

gzip -dc ssh-3.0.1.tar.gz | tar xvf -
cd ssh-3.0.1
./configure --with-libwrap=/usr/local/lib
make
/bin/su
make install
cd ./startup/solaris
chown root:sys sshd2
mv sshd2 /etc/init.d/
ln /etc/init.d/sshd2 /etc/rc2.d/S95ssh2
ln /etc/init.d/sshd2 /etc/rc0.d/K08ssh2
ln /etc/init.d/sshd2 /etc/rc1.d/K08ssh2
ln /etc/init.d/sshd2 /etc/rcS.d/K08ssh2
Następnie należy wyedytować plik /etc/ssh2/sshd2_config i zmienić następujące linijki na:
(linia 15)   SyslogFacility LOCAL1
(linia 136)  PermitRootLogin no
Kolejną czynnością jest dodanie do pliku /etc/syslog.conf linii:
local1.debug	/var/adm/ssh
oraz utworzenie pliku:
touch /var/adm/ssh
chgrp sys /var/adm/ssh
chmod 600 /var/adm/ssh
Na koniec należy przeresetować demon syslogd:
pkill -1 syslogd
W tym momencie można już uruchomić demon ssh2:
/etc/init.d/sshd2 start

Aby udostępnić wszystkim hostom dostęp za pomocą SSH, do pliku /etc/hosts.allow należy dopisać linię:

sshd2: ALL

7.17. Stunnel (opcjonalnie)

gzip -dc stunnel-3.21c.tar.gz | tar xvf -
cd stunnel-3.21c
./configure --with-pem-dir=/usr/local/ssl/certs
make
/bin/su
make install
cp stunnel.pem /usr/local/ssl/certs/

7.18. lsof

gzip -dc lsof.tar.gz | tar xvf -
tar xvf lsof_4.60.tar
cd lsof_4.60
./Configure solaris
make
/bin/su
install -f /usr/local/man/man8 -m 644 -u root -g sys lsof.8
install -f /usr/local/bin -m 2755 -u root -g sys lsof

7.19. top

gzip -dc top-3.5beta9.tar.gz | tar xvf -
cd top-3.5beta9
./Configure
make
/bin/su
make install

7.20. npasswd

gzip -dc npasswd-2.05.tar.gz | tar xvf -
gzip -dc npasswd-words.tar.gz | tar xvf -
mv npasswd-2.00/dict/* npasswd-2.05/dict/
cd npasswd-2.05
./Configure     (zamiast /usr ustawić /usr/local)
make
/bin/su
make install    (wymaga polecenia gunzip!)
ln /usr/local/lib/passwd/npasswd /usr/local/bin/npasswd

7.21. snort (opcjonalnie)

gzip -dc snort-1.7.tar.gz | tar xvf -
cd snort-1.7
./configure
make
/bin/su
make install
Jeżeli chodzi o zbiór reguł, to należy je skopiować do katalogu /etc:
chown root:sys snortfull.conf
chmod 644 snortfull.conf
cp snortfull.conf /etc/
Kolejną czynnością jest modyfikacja powyższego pliku, a konkretnie zmiennych:
var HOME_NET adres_naszej_podsieci/maska
var EXTERNAL_NET any
Następnie należy utworzyć katalog, w którym będą przechowywane logi, np.:
mkdir /var/adm/snort
chgrp sys /var/adm/snort
chmod 700 /var/adm/snort
oraz utworzyć plik startowy /etc/init.d/snort z następującą zawartością:
#!/bin/sh
case "$1" in
'start')
	/usr/local/bin/snort -Afast -e -c /etc/snortfull.conf -D -l /var/adm/snort -b
	echo "Snort started."
	;;
'stop')
	pkill snort
	echo "Snort stopped."
	;;
*)
	echo "Usage: $0 { start | stop }"
	exit 1
	;;
esac
exit 0
Prawa dostępu do powyższego pliku należy ustawić następująco:
chown root:sys /etc/init.d/snort
chmod 744 /etc/init.d/snort
Następnie należy wykonać sztywne łącza:
ln /etc/init.d/snort /etc/rc2.d/S98snort
ln /etc/init.d/snort /etc/rcS.d/K15snort
ln /etc/init.d/snort /etc/rc1.d/K15snort
ln /etc/init.d/snort /etc/rc0.d/K15snort
Należy również utworzyć katalog /var/run, w którym snort umieszcza swój PID:
mkdir /var/run
chgrp sys /var/run
chmod 1777 /var/run
Następnie można już uruchomić snorta:
/etc/init.d/snort start

7.22. IP Filter (opcjonalnie)

gzip -dc ip-fil3.4.14.tar.gz | tar xvf -
cd ip_fil3.4.14
make solaris CC=gcc
/bin/su
cd SunOS5
make package CC=gcc
Po wykonaniu powyższych poleceń pakiet zostanie zainstalowany w katalogu /opt/ipf.
Jeżeli chodzi o pliki reguł, to powinny mieć następującą lokalizację:
/etc/opt/ipf/ipf.conf
/etc/opt/ipf/ipnat.conf
Reguły są odczytywane przez moduł firewalla przy każdorazowym wejściu do trybu 2, lub przy użyciu poleceń:
/sbin/ipf -Fa -f /etc/opt/ipf/ipf.conf
/sbin/ipnat -CF -f /etc/opt/ipf/ipnat.conf
Domyślnie IPFilter loguje zdarzenia za pomocą syslogd korzystając z LOCAL1. Ponieważ koliduje to z SSH, dlatego też następującą linię należy dopisać do pliku /etc/syslog.conf:
local2.debug	/var/adm/ipfilter
oraz utworzyć plik /var/adm/ipfilter, do którego będą kierowane logi:
touch /var/adm/ipfilter
chmod 600 /var/adm/ipfilter
chgrp sys /var/adm/ipfilter
Należy również pamiętać o restarcie demona syslogd:
pkill -1 syslogd
i oczywiście o używaniu parametru LOCAL2 w regułach firewalla.

Ponieważ konfiguracja firewalla zależy bezpośrednio od zadań stawianych przed serwerem oraz od polityki bezpieczeństwa, nie jest możliwe utworzenie uniwersalnych reguł, które można by odnieść do każdego systemu. W przypadku każdego serwera (lub grupy serwerów) reguły takie należy utworzyć osobno.

Bardzo dobry i zwięzły opis IP-Filtera oraz zasad tworzenia reguł znajduje się w podręczniku napisanym przez Conoboya i Fichtnera "IP Filter Based Firewalls HOWTO", który można ściągnąć ze strony www.ipfilter.org.

Przykładowe pliki reguł umieszczamy poniżej. W naszym przypadku była to stacja robocza 192.168.11.34 znajdująca się w sieci prywatnej 192.168.11.0 z dostępem do internetu (za NAT). Stacja udostępnia tylko usługę SSH (port 22) oraz jest klientem sieci internet (żadne usługi wychodzące nie są blokowane). Głównym celem stawianym przed firewallem jest ochrona hosta przed atakami z sieci wewnętrznej.

Plik /etc/opt/ipf/ipf.conf:

# IP-FILTER rules file

# ========================================================================
# Input packets
# ========================================================================

block in quick on nei0 from 172.16.0.0/12 to any
block in quick on nei0 from 127.0.0.0/8 to any
block in quick on nei0 from 10.0.0.0/8 to any
block in quick on nei0 from 0.0.0.0/32 to any
block in log level local2.alert quick on nei0 from 192.168.11.34/32 to any

# SSH Server
pass in quick on nei0 proto tcp from any to any port = 22 flags S keep state keep frags

# TELNET Server
# pass in quick on nei0 proto tcp from any to any port = 23 flags S keep state keep frags

# FTP Server (Active)
# pass in quick on nei0 proto tcp from any to any port = 21 flags S keep state keep frags

# FTP Server (Passive) (FTP Server (Active) should be uncommented, too)
# pass in quick on nei0 proto tcp from any to any port > 1023 flags S keep state keep frags

block return-rst in log level local2.alert quick on nei0 proto tcp from any to 192.168.11.34/32
block return-icmp-as-dest(port-unr) in log level local2.alert quick on nei0 proto udp from any to 192.168.11.34/32
block in quick on nei0 all

# ========================================================================
# Output packets
# ========================================================================

pass out quick on nei0 proto tcp from any to any flags S keep state keep frags
pass out quick on nei0 proto udp from any to any keep state keep frags
pass out quick on nei0 proto icmp from any to any keep state keep frags

Plik /etc/opt/ipf/ipnat.conf:

# IP-FILTER NAT rules file

# Client of FTP Server (Active)
map nei0 0/0 -> 0/32 proxy port 21 ftp/tcp

7.23. postfix (opcjonalnie)

Instalację postfixa należy rozpocząć od kompilacji programu:

gzip -dc postfix-19991231-pl10.tar.gz | tar xvf -
cd postfix-19991231-pl10
make
/bin/su
Kolejną czynnością jest dokonanie backupu sendmaila:
mv /usr/lib/sendmail /usr/lib/sendmail.OFF
unlink /usr/bin/newaliases
unlink /usr/bin/mailq
chmod 755 /usr/lib/sendmail.OFF
Następnie należy utworzyć grupę oraz użytkownika postfix:
groupadd postfix
useradd -g postfix -d /home/nowhere -s /sbin/noshell -c "Postfix" postfix 
W pliku /etc/aliases należy dodać alias:
postfix: root
Następnie należy dodać grupę maildrop:
groupadd maildrop
oraz uruchomić skrypt:
sh INSTALL.sh
W trakcie wykonywania skryptu należy potwierdzić opcje domyślne z wyjątkiem:
sendmail_path /usr/lib/sendmail
setgid maildrop
Po zakończeniu działania skryptu należy przejść do katalogu /etc/postfix oraz wyedytować plik main.cf zmieniając następujące parametry:
myhostname=nazwa_serwera.pelna.domena.serwera
mydomain=pelna.domena.serwera
mydestination=$myhostname,localhost$.mydomain
alias_maps=dbm:/etc/aliases
mail_spool_directory=/var/mail
smtpd_banner=$myhostname ESMTP (Sendmail, Qmail, whatever you want...)
Następnie można już uruchomić postfixa:
postfix start



Poprzedni rozdział Spis treści Następny rozdział