FreeBSD jail
Sisukord
Sissejuhatus
Jail on loogiliselt võttes virtuaalmasin, millest selle sees olevad programmid-kasutajad kuidagi välja reaalsesse süsteemi ei näe. Reaalselt on sellisest võimalusest kasu eelkõige erinevate kriitiliste rakenduste oma sandboxidesse surumiseks. Näiteks levinud on Apache panek oma jaili, et mõnes weebirakenduses ilmnev auk, mis annab ründajale apachei õigustes shelli, ei viiks automaatselt kogu süsteemi nägemiseni. Jaile kasutatakse laialt ka virtuaalserverite puhul, kus kliendile antakse oma jail ja seal võib ta root õigustega tegutseda ilma, et see kuidagi ohustaks reaalse süsteemi turvalisust.
Jail erineb host süsteemist peamiselt selle poolest, et ta on selle limiteeritud osa. Näiteks pole võimalik lisada uusi IP aadresse võrgu liidestele, samuti pole võimalik luua uusi võrguseadmeid ( gif / lo ..etc ), ei ole v6imalik mountida asju.. jaili uptime on sama mis hosti oma, jaili kernel on sama mis hosti oma.. jne.
Ühte multifunktsionaalsesse serverisse mahutatakse seega mitu monofunktsionaalset.
Kuigi jaili kirjeldus kõlab nagu oleks tegu virtuaalmasinaga, on tegu siiski kõigest lisakoodiga turvakriitiliste syscallide juures, mis tähendab, et jailiga ei kaasne mitte mingit lisa mälu overheadi.
FreeBSD jailid omavad peamiselt kolme eesmärki:
- Virtualiseerimine : Iga jail on virtuaalne keskkond mis omab tema enda faile, protsesse, kasutajaid ning administraatori kasutajaid. Seejuures on töötav keskkond (peaaegu) eristamatult sarnane reaalsel raual käivitatud operatsioonisüsteemiga.
- Turvalisus : Iga jail on eraldatud teistest andes sedaviisi lisa turvalisusekihi.
- Telegeerimise lihtsus : Administraatoritel on lihtne ja valutu telegeerida erinevaid ülesandeid, mis vajavad administraatori õigusi, samas ilma kogu süsteemi kontrolli jagamata.
Näites kasutatud host arvuti ip on 172.17.0.183, jaili questi ip hakkab olema 172.17.0.184 ning jaili enda asukoht failisüsteemis /usr/jail/jail1.
Jaili loomine
jail kiirelt ja mustalt
Esimesena tirime cvsupiga süsteemi source
nüüd loome väikese skripti, mis meisterdab meile soovitud kohta jaili valmis. jaili asukoht määratakse süsteemis muutuja D abil
#!/bin/sh D=/usr/jail/jail1 mkdir -p $D cd /usr/src make world DESTDIR=$D cd etc/ make distribution DESTDIR=$D mount_devfs devfs $D/dev
Seejärel käivitame skripti ja loome selle abil valmis jaili baasi Esimene kord võib see võtta päris pikalt aega kuna buildidakse ikkagi terve bsd baas ümber
Jaili startimine ja stopimine
vajalik arvuti /etc/rc.conf lisada
# ip aadressid jailile ja masinale ifconfig_fxp0="inet 172.17.0.183 netmask 255.255.255.0" ifconfig_fxp0_alias0="inet 172.17.0.184 netmask 255.255.255.0" # Kui inetd kasutuses siis tuleb see seadistada nii questis kui hostis kuulama vaid lokaalset soketid, vastasel juhul võib seda rida ignoreerida. inetd_flags="-wW -a 172.17.0.183" # syslog kuulama lokaalset socketit syslogd_flags="-ss" # globaalne jailid seadistus, jail list muutujale tuleb kirjutada kõik kasutavad jailid eraldades nende nimed tühikutega jail_enable="YES" jail_list="test" # loodava testnimelise jaili spetsiifilised parameetrid jail_test_hostname="test" jail_test_ip="172.17.0.184" jail_test_rootdir="/usr/jail/jail1" jail_test_devfs_enable="YES"
Jaili tööks on kindlasti vaja jailine antav ip seadistada serveri võrgukaardile aliaseks.
Näiteks kiirelt saab seda teha käsuga
ifconfig fxp0 172.17.0.184 netmask 255.255.255.0 alias
Seejärel võib anda juba näiteks käsu
# /etc/rc.d/jail start Configuring jails:. Starting jails: test.
Mingit kindlat jaili saab startida ja stopida käsuga
Jaile saab startida ja seisata järgnevalt
/etc/rc.d/jail start test /etc/rc.d/jail stop test
Jaili häälestus
Liigume kausta /usr/jail/jail1
jaili /etc/rc.conf
network_interfaces="" hostname="yhikas" sshd_enable="YES" sendmail_enable="NO" syslogd_flags="-ss"
Jaili /etc/resolv.conf kirjutame enda nimeserveri, mida antud võrgus kasutame
Jaili saab käima panna ka ilma rc.conf'i ning rc skriptita käsuga
jail /usr/jail/jail1 test 172.17.0.184 /bin/sh
Loodud jaili kasutamine
Töötavaid jaile näeme käsuga jls
# jls JID IP Address Hostname Path 1 172.17.0.184 test /usr/jail/jail1
Jailis tegutsemiseks olemas käsk jexec
# jexec 1 /bin/csh
Käske saab jailis käivitada käsuga jexec kasutades jaili id'd nimega jid
# jexec 1 ps -aux USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND root 94791 0.0 0.1 1404 1072 ?? SsJ 10:36PM 0:00.00 /usr/sbin/syslogd -s smmsp 94853 0.0 0.3 3408 2840 ?? IsJ 10:36PM 0:00.00 sendmail: Queue runner@00:30:00 for /var/spool/clientmqueue root 94859 0.0 0.1 1396 1104 ?? IsJ 10:36PM 0:00.00 /usr/sbin/cron -s root 94894 0.0 0.1 1568 1092 p2 R+J 10:41PM 0:00.00 ps -aux
Moundine pordid
# mkdir /home/jail1/usr/ports # mount_nullfs /usr/ports /home/jail1/usr/ports
Jaili alternatiivne loomine kiirelt binaarfailide abil
Põhineb http://pbraun.nethence.com/doc/sysutils_bsd/dragonfly-freebsd-jail.html) ja freebsd-isp listi vestlustel
sysistalli põhine
# mkdir -p /home/jail # sysinstall
sysinstall > Custom > Options > Install Root > /home/jail sysinstall > Custom > Distributions > Minimal sysinstall > Custom > Media > File System > /cdrom sysinstall > Custom > Commit [Visit the general configuration menu ?] > No
Post installi skripte ei tohi teha, need modifitseerivad host masinat mitte guesti
Seejärel käsk
# jail /home/jail footest 10.0.0.2 /bin/sh
Annab shelli jailile ette nii ,et asi tundub töötavat. Edasi võib lisada devfs jms
Alternatiivina saab tegevust automatiseerida kasutada juba valmis konfiguratsioonifaili install.cfg
installVarDefaults releaseName=7.2-RELEASE _ftpPath= ftp://ftp.freebsd.org/pub/FreeBSD/ mediaSetFTP dists=base man distSetCustom installRoot=/srv/jails/example.domain.tld/root installCommit
Siis tuleb installiks vaja anda käsud
# mkdir -p /srv/jails/example.domain.tld/root # sysinstall configFile=/root/install.cfg loadConfig
freebsd-update works within the jail to update patches. For migrating point releases (7.1 to 7.2) after updating the host OS I use the commands below.
ezjail
Peaks töötama ka käsk lisaks ezjail-admin install mis paigaldab jaili binaarfailid üle ftp pole seda käsku ise proovinud. Lihtne peaks nii olema ka uuendamine kuna piisab vaid ezjail-admin update -u" käsust jaili uuendamisels freebsd-update abil. Samuti kasutab ta edasistes mountimistes nullfs'i
cd meedia
Või kasutada installimeediat käskudega
cd /some/media/7.2-RELEASE/base mkdir /path/to/myjail setenv DESTDIR /path/to/myjail sh install.sh
Võimalus on lisaks mountida nullfsi abil baasüsteem ümber jaili
Jaili uuendamine freebsd-update abil
freebsd-update abil jaili uuendamiseks, näiteks migreerides release 7.1 pealt 7.2 versiooniks
# env UNAME_r=7.1-RELEASE-p5 freebsd-update -b /srv/jails/example.domain.tld/root -r 7.2-RELEASE upgrade # freebsd-update -b /srv/jails/example.domain.tld/root install # /etc/rc.d/jail restart <jail> # freebsd-update -b /srv/jails/example.domain.tld/root install
Optimiseerimist
jaili ise kompileerides on soovituslik lülitada välja hulk jailis kasutuid teenused lisades allolevad read /etc/make.conf faili
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 NO_ATM= true # do not build ATM related programs and libraries NO_CRYPT= true # do not build any crypto code NO_GAMES= true # do not build games (games/ subdir) NO_INFO= true # do not make or install info files NO_MAN= true # do not build manual pages NO_PROFILE= 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.
Alates 7.2 versioonist uuendused
Võimalik on 7.2 ja 8.0 versioonides seadistada jailile mitu ip aadressi, selleks tuleb rc.conf'i lisada read nagu
jail_test1_ip_multi0="127.0.0.2" jail_test2_ip_multi0="127.0.0.3"
Lisaks on võimalik startida jailis juba boodilt erinevaid käske lisades rc.conf'i jail_exec_afterstartN täht N märgib siis käsu numbrit
Näiteks
jail_exec_afterstart0="/bin/sh command"
Lingid
http://phk.freebsd.dk/pubs/sane2000-jail.pdf
http://www.freebsd.org/cgi/man.cgi?query=jail&format=html
http://www.bsd.ee/dwiki/doku.php?id=freebsd_jail_loeng
http://sysjail.bsd.lv/ NetBSD ja OpenBSD jaili analoog sysjail
http://www.nycbsdcon.org/2006/files/sysjail-nycbsdcon.pdf.gz
http://www.digitaldaemon.com/FreeBSD/FreeBSD/index.html
http://www.section6.net/wiki/index.php/Creating_a_FreeBSD_Jail põhjalikum õpetus
http://forums.freebsd.org/showthread.php?t=6230 jail ja ZFS
http://blogs.freebsdish.org/pjd/2007/03/18/zfs-and-freebsd-jails/ veel jailist ja ZFSist