Freebsd-jail

Iš Žinynas.
18:20, 28 kovo 2006 versija, sukurta \dev\null (Aptarimas | indėlis)
(skirt) ← Ankstesnė versija | Dabartinė versija (skirt) | Vėlesnė versija → (skirt)
Jump to navigation Jump to search

Jail labai puikus FreeBSD sistemos featuras kuris leidžia apsaugoti virtualios sistemos procesus bei padidinti bendą sistemos saugumą. Jail'as tai ne paprastas chroot'as jail'as tai neperlaužiama sistema kuri leidžia vartotojui išnaudoti maksimalų efektyvumą kartu ir didelio saugumo pojutį.

Kol kas jail'as palaiko tik ipv4 ir reikalauja unikalaus adreso, bet įmanoma sukčiauti ir jail'ą statyti ant loopback'o paskui pranatinus į išorę. Tai mes ir pamėginsime padaryti.

Šis straipsnis (HowTO) tinka FreeBSD 5.X, 6.X ir 7.0-Current versijoms.


Laikinas /etc/make.conf kuris bus reikalingas naujam jail'o world'ui bildint (Prieš pradėdami redaguoti seną make.conf nukopijuokite į make.conf.bak):

NO_ACPI=       true    # do not build acpiconf(8) and related programs
NO_BOOT=       true    # do not build boot blocks and loader
NO_BLUETOOTH=  true    # do not build Bluetooth related stuff
NO_FORTRAN=    true    # do not build g77 and related libraries
NO_GDB=        true    # do not build GDB
NO_GPIB=       true    # do not build GPIB support
NO_I4B=        true    # do not build isdn4bsd package
NO_IPFILTER=   true    # do not build IP Filter package
NO_PF=         true    # do not build PF firewall package
NO_AUTHPF=     true    # do not build and install authpf (setuid/gid)
NO_KERBEROS=   true    # do not build and install Kerberos 5 (KTH Heimdal)
NO_LPR=        true    # do not build lpr and related programs
NO_MAILWRAPPER=true    # do not build the mailwrapper(8) MTA selector
NO_MODULES=    true    # do not build modules with the kernel
NO_NETCAT=     true    # do not build netcat
NO_NIS=        true    # do not build NIS support and related programs
NO_SENDMAIL=   true    # do not build sendmail and related programs
NO_SHAREDOCS=  true    # do not build the 4.4BSD legacy docs
NO_USB=        true    # do not build usbd(8) and related programs
NO_VINUM=      true    # do not build Vinum utilities
NOATM=         true    # do not build ATM related programs and libraries
NOCRYPT=       true    # do not build any crypto code
NOGAMES=       true    # do not build games (games/ subdir)
NOINFO=        true    # do not make or install info files
NOMAN=         true    # do not build manual pages
NOPROFILE=     true    # Avoid compiling profiled libraries 
# BIND OPTIONS
NO_BIND=               true    # Do not build any part of BIND
NO_BIND_DNSSEC=        true    # Do not build dnssec-keygen, dnssec-signzone
NO_BIND_ETC=           true    # Do not install files to /etc/namedb
NO_BIND_LIBS_LWRES=    true    # Do not install the lwres library
NO_BIND_MTREE=         true    # Do not run mtree to create chroot directories
NO_BIND_NAMED=         true    # Do not build named, rndc, lwresd, etc.

Jail darymo shell skriptas:

# Sukuriame direktorijas
JAILDIR=/usr/jail
mkdir -p $JAILDIR/dev
mkdir -p $JAILDIR/etc
mkdir -p $JAILDIR/usr/tmp
chmod 777 $JAILDIR/usr/tmp
cd /usr/src/
# Galite išmesti make buildworld jei prieš tai jis buvo sukompiliuotas
make buildworld
make installworld DESTDIR=$JAILDIR
cd /usr/src/etc
cp /etc/resolv.conf $JAILDIR
make distribution DESTDIR=$JAILDIR NO_OPENSSH=YES NO_OPENSSL=YES
cd $JAILDIR
# Primontuojame devfs ir paslepiame nereikalingus devaisus.
mount_devfs devfs $JAILDIR/dev
devfs -m $JAILDIR/dev rule -s 4 applyset
# Darome null kernel
ln -s dev/null kernel
# fstab'as
touch $JAILDIR/etc/fstab
# Panaudosime jau egzistuojantį resolv.conf
cp /etc/resolv.conf $JAILDIR/etc/resolv.conf
# Kopijuojame ssl nustatymus
mkdir -p $JAILDIR/etc/ssl
mkdir -p $JAILDIR/usr/local/openssl
cp /etc/ssl/openssl.cnf $JAILDIR/etc/ssl
cd $JAILDIR/usr/local/openssl/
ln -s ../../../etc/ssl/openssl.cnf openssl.cnf

Dabar galite atstatyti make.conf:

mv /etc/make.conf.bak /etc/make.conf

Keičiame jail'o rc.conf

hostname="jail.example.com"    # Butinai pakeisti
ifconfig_em0="inet 127.0.0.2 netmask 255.255.255.255"
defaultrouter="127.0.0.1"        # Gateway'us
clear_tmp_enable="YES"  # Clear /tmp at startup.
# Taip pat nepagailėkit uždėti didžiausią secure levelį
kern_securelevel_enable="YES"
kern_securelevel="3"

Pridedame ip prie loopback'o

ifconfig lo0 add 127.0.0.2

Kad veiktų devfs pirmą kartą turime padaryti taip:

mount_devfs devfs $JAILDIR/devfs

Jail naudojimas[keisti]

Jei norite pasinaudoti portais ir įdiegti kai kurias programas savo jail'ą turėsite prisimontuoti portų direktoriją su nullfs tas pats galioja ir /usr/src:

mount_nullfs /usr/ports $JAILDIR mount_nullfs /usr/src $JAILDIR

Ir pagaliau startuojame jail:

jail $JAILDIR jail.example.com 127.0.0.2 /bin/sh

jei jail'e nebus paleista servisų, demonų parašius exit jail'as išsijungs.

Kai tik pateksite į jail galite krauti sistemos servisus:

/bin/sh /etc/rc

Slaptažodžio keitimas ir nereikalingų vartotojų pašalinimas:

vipw
passwd root

Dabar lasvai galite diegti openssh iš portų:

cd /usr/ports/security/openssh
make install clean

Automatinis jail'o startavimas sistemos krovimosi metu.

į /etc/rc.local įrašykite:

ifconfig lo0 add 127.0.0.2

į /etc/rc.conf įrašykite:

jail_enable="YES"        # pakeiskite į no jei nenorite, kad automatiškai startuotų jail'as
jail_list="cell"            # tarpais atskirti jail'ų pavadinimai kuriuos įkrauti
jail_set_hostname_allow="NO" # Ar leisti jail'o root'ui keisti hostneimą
jail_socket_unixiproute_only="YES" # Routinti tiktai TCP/IP jail'ui 
jail_cell_rootdir="/usr/jail"
jail_cell_hostname="cell.example.com"
jail_cell_ip="127.0.0.2"
jail_cell_exec_start="/bin/sh /etc/rc"
jail_cell_devfs_enable="YES"
jail_cell_devfs_ruleset="devfsrules_jail"


Valdymas[keisti]

Reiktų primontuoti sistemos portus ir išeitinius kodos vėlesiam jail'o atnaujinimui, portų įdiegimui:

mount_nullfs /usr/ports $JAILDIR mount_nullfs /usr/src $JAILDIR

jls komanda parodo kokie jail'ai yra paleisti:

#jls
   JID  IP Address      Hostname                      Path
    1  127.0.0.2       cell.example.com              /usr/jail

Prisijungimas prie jail'o ar komandų vykdymas jame vyksta pasitelkiant jexec komanda. pvz: startuojame sh shell'ą.

jexec 1 /bin/sh

Išėjimas iš jail'o:

exit

Jail'o panaikinimas, vykdomas jail'o root'e.

kill -KILL -1, arba kill -TERM -1 tada exit


Tinklas[keisti]

Dėmesio! Jei norite, kad jail'e veiktų internet'as reikia iš pradžių prasinatinti pasinaudojus pvz packet filteriu: į /etc/pf.conf įrašome:

nat on išorinis_iface from 127.0.0.2 to any -> išorinis_ip

perkrauname packet filterio taisykles

pfctl -f /etc/pf.conf

Taip pat jei jail'e norite naudoti tinklo servisus kurie interaktyvaus su išorinio pasaulio vartotojais reikia atsiforwardinti portus pvz praforwardinsime ssh:

rdr on išorinis_iface proto tcp from any to išorinis_ip port 21 -> 127.0.0.2

irašome į /etc/pf.conf ir perkrauname:

pfctl -f /etc/pf.conf

Problemos[keisti]

Jei neveikia tam tikri įrankiai pvz: telnet'as reikalauja papildomų bibliotekų kurių nėra jūsų jail'e jas rasite savo sistemos /lib ir /usr/lib direktorijose. Jas galite iškarto persikopijuoti į jail'ą, kad nekiltu problemų:

cd /usr/lib
cp * /usr/jail/usr/lib
cd /lib
cp * /usr/jail/lib