Freebsd-jail
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