View Source

h1. 5.2.2. A börtön filozófiája

A _jail_ akkor hasznos, ha egy gépünk van csak, s ennek ellenére a futó szolgáltatásokat külön szeretnénk választani. Több előnye is van ennek:
* a szolgáltatások külön-külön frissíthetők, akár több azonos program is futhat más-más IP címen, anélkül, hogy a konfigurációs állományaik összekeverednének.
* a frissítés során előre elkészíthetjük és tesztelhetjük az újabb _jail_-t, majd egyszerűen le kell állítani a régit, átmásolni (vagy átcsatolni) az adatokat és elindítani az újabbat; a kiesés így másodpercekben mérhető.
* a sebezhetőbb szolgáltatásokat külön fájlrendszeren tudjuk futtatni, így a betörés kockázata, illetve a betörés során okozott károk kisebbek lehetnek.

A _jail_ lehetővé teszi, hogy több gépből álló hálózatot készítsünk egy géppel, legyünk hát nagyvonalúak, és tervezzünk egy nagyobb hálózatot, amelyben több _jail_ egyszerű feladatot lát el:
* *logserver*, amely önmaga és a többi _jail_ logjait gyűjti össze
* *ldap*, amely az LDAP adatbázis helye lesz
* *dns*, amely a névfeloldásért felel
* *mail*, amelyben a levelek fogadását és küldését végezzük
* *mailscanner*, amelyben a levelek vírus és spam szűrése történik
* *mailman*, amely a levelezőlistákat kezeli
* *httpd*, amely a webszerverünk lesz
* *pgsql*, amelyben egy PostgreSQL kezeli az adatbázisokat
* *mysql*, amelyben a MySQL adatbáziskezelő fut
* *svn*, amely a Subversion repó helye

Mivel a _logserver_ és a _mail_ használata szinte borítékolható, ezért célszerű a _template_ _jail_-t úgy elkészíteni, hogy a _logserver_ felé naplózzon és a _mail_ felé küldje a leveleket. Be kell állítanunk a _munin-node_ működését, hiszen ezzel fogjuk monitorozni a fenti tíz _jail_ működését.

h2. 5.2.2.1. Helyi névszolgáltatás

A szolgáltatások helyes működéséhez fel kell vennünk megfelelő hosztneveket, amelyekre a _jail_-ben futó szolgáltatások hivatkozni tudnak. Ezt megtehetjük a DNS kiszolgáló adatbázisában is, de ha a DNS szolgáltatás nem érhető el, akkor bajban leszünk, mivel se a logszervert nem éri el a _dns_ _jail_, és még levelet se tud nekünk írni, hogy nem fut a szolgáltatáshoz tartozó démon. Célszerű lehet a {_}/etc/hosts{_} fájlba írni a létrehozandó _jail_-ek IP címét és nevét, így a névfeloldás mindig működni fog, bár a nevekhez tartozó IP címek módosításához mind a tíz _jail_-ben egyszerre kell módosítani az állomány tartalmát, de erre tudunk egy pársoros szkriptet írni. Lássuk a fájl tartalmát (az IP címek kiosztása "történelmi" okokból alakult így):
{code:title=/etc/hosts}
::1 localhost
127.0.0.1 localhost
192.168.2.1 logserver.jails.javaforum.hu
192.168.2.2 ldap.jails.javaforum.hu
192.168.2.3 dns.jails.javaforum.hu
192.168.2.4 mail.jails.javaforum.hu
192.168.2.5 pgsql.jails.javaforum.hu
192.168.2.6 httpd.jails.javaforum.hu
192.168.2.7 svn.jails.javaforum.hu
192.168.2.8 mailman.jails.javaforum.hu
192.168.2.9 mailscanner.jails.javaforum.hu
192.168.2.10 mysql.jails.javaforum.hu
192.168.2.11 munin.jails.javaforum.hu
192.168.2.254 template.jails.javaforum.hu
{code}

A módosítás után lépjünk ki a _jail_-ből, majd lépjünk vissza FQDN használatával, ennek a továbbiakban lesz szerepe:
{code:title=Parancssor}
[root@template:/]$ exit
exit
[root@freebsd:~]$ jail /bpool/jails/v7.1.0/template template.jails.javaforum.hu 192.168.2.254 /usr/local/bin/bash
[root@template:/]$
{code}

h2. 5.2.2.2. Naplózás

Feltelepítettünk egy {_}syslog_ng2{_} csomagot, amelyet arra fogunk használni, hogy a tucatnyi _jail_ egy helyre naplózzon, így hibakereséskor nem kell egyenként végigjárnunk minden érintett _jail_-t, csak a _logserver_ fájlrendszerét kell megnéznünk. Ehhez mindössze annyit kell tennünk, hogy a naplók küldésére konfiguráljuk be a _template_ naplózását:
{code:title=/usr/local/etc/syslog-ng.conf}
options { long_hostnames(off); sync(0); };

source src { unix-dgram("/var/run/log");
unix-dgram("/var/run/logpriv" perm(0600));
internal(); };

destination remote { tcp( "logserver.jails.javaforum.hu" port(1999) ); };
log { source(src); destination(remote); };
{code}

Mint látjuk, a logszerver elérését a _logserver.jails.javaforum.hu_ névvel adtuk meg, amely a _hosts_ fájl alapján IP címmé oldható fel, s a naplóbejegyzések TCP alapon továbbításra kerülnek a megadott IP cím felé. Ellenőrizzük, hogy a _jail_ _/etc/rc.conf_ állományában letiltottuk-e a _syslogd_ futását, illetve engedélyeztük a _syslog-ng_ futását:
{code:title=/etc/rc.conf}
syslogd_enable="NO"
syslog_ng_enable="YES"
{code}

h2. 5.2.2.3. Levelezés

A levelezés helyes beállítása létfontosságú, mivel minden _jail_ naponta, hetente illetve havonta készít egy jelentést, amelyből a _jail_ helyes működésről tudunk tájékozódni. Ehhez szükséges, hogy az alaprendszerben lévő _Sendmail_ a _mail_ _jail_-felé küldje a leveleket. A _Sendmail_ beállítása egyes pletykák szerint pilótavizsgát igényel, holott fél perc alatt be tudjuk állítani, hogy melyik szerver lesz a helyi _Sendmail_ kiszolgálója, egyszerűen a {_}/etc/mail/freebsd.mc{_} állományban a "SMART_HOST" változóban meg kell adnunk a saját szerverünket :
{code:title=/etc/mail/freebsd.mc}
define(`SMART_HOST', `mail.jails.javaforum.hu')
{code}

Az _aliases_ állományban adjuk meg a saját email címünket a _root_ felhasználó _alias_ nevénél, hogy a _root_ felhasználónak címzett leveleket mi kapjuk meg:
{code:title=/etc/mail/aliases}
root: root@javaforum.hu
{code}

Természetesen ettől még nem vagyunk kész, az elmentett változást le kell fordítanunk a _Sendmail_ által érthető formátumra:
{code:title=Parancssor}
[root@template:/etc/mail]$ make
cp freebsd.mc template.jails.javaforum.hu.mc
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4 template.jails.javaforum.hu.mc > template.jails.javaforum.hu.cf
cp freebsd.submit.mc template.jails.javaforum.hu.submit.mc
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4 template.jails.javaforum.hu.submit.mc > template.jails.javaforum.hu.submit.cf
/usr/sbin/sendmail -bi -OAliasFile=/etc/mail/aliases
/etc/mail/aliases: 28 aliases, longest 17 bytes, 296 bytes total
chmod 0640 /etc/mail/aliases.db
[root@template:/etc/mail]$ make install
install -m 444 template.jails.javaforum.hu.cf /etc/mail/sendmail.cf
install -m 444 template.jails.javaforum.hu.submit.cf /etc/mail/submit.cf
{code}

A _make_ parancs a megadott útmutatás szerint elkészíti a _template.jails.javaforum.hu.cf_ állományt, illetve az _aliases_ alapján az _aliases.db_ fájlt. Mint látjuk, a _jail_ FQDN neve lett a lefordított konfigurációs állomány neve, illetve ez belekerül a generált állományokba is.

Ellenőrizzük, hogy a _Sendmail_ futását helyesen állítottuk be a _/etc/rc.conf_ állományban:
{code:title=/etc/rc.conf}
sendmail_enable="NO"
{code}

Zavaró lehet a *NO* paraméter, hiszen használni szeretnénk a _Sendmail_-t levelek küldésére... a _Sendmail_ három paramétert fogad el:
* _YES_, amikor a levelek küldését és fogadását is végzi
* _NO_, amikor a levelek küldésével foglalkozik, de leveleket nem fogad a külvilágból
* _NONE_, amikor nem indul el

h2. 5.2.2.4. Munin-node

Célszerű beállítani egyet a tucatnyi diagnosztikát segítő adatgyűjtő program közül, én a _Munin_ programot használom, amelynek a kliens csomagját _munin-node_ néven már telepítettük. A _Munin_ egy keretrendszer, amely a _4949_-es TCP porton át kérdezgeti a klienseit, amelyek a betöltött pluginek alapján adatot szolgáltatnak. Nézzük a _munin-node.conf_ állományt:
{code:title=/usr/local/etc/munin/munin-node.conf}
log_level 1
log_file Sys::Syslog
port 4949
pid_file /var/run/munin/munin-node.pid
background 1
setseid 1
host *
user root
group wheel
setsid yes
allow ^192\.168\.[0-9]+\.[0-9]+$
{code}

Megnézhetjük az alapértelmezett konfigurációs állományt az egyes sorok leírásáról, a lényeg számunkra a {_}log_file{_}, amely a _Syslog_ használatára utasítja a programot, illetve az _allow_, amely a helyi IP címek felől engedélyezi a lekérdezést. Lépjünk tovább a _plugins_ könyvtárba, ahol egy csomó plugint találunk, töröljük ki ezeket, nem kellenek:
{code:title=Parancssor}
[root@template:/usr/local/etc/munin/plugins]$ ls -l | wc -l
18
[root@template:/usr/local/etc/munin/plugins]$ rm *
{code}

Hozzunk létre egy _df_ és egy _processes_ állományt, majd adjunk nekik futtatási jogot:
{code:title=Parancssor}
[root@template:/usr/local/etc/munin/plugins]$ ls -l | wc -l
18
[root@template:/usr/local/etc/munin/plugins]$ rm *
[root@template:/usr/local/etc/munin/plugins]$ touch df
[root@template:/usr/local/etc/munin/plugins]$ chmod +x df
[root@template:/usr/local/etc/munin/plugins]$ touch processes
[root@template:/usr/local/etc/munin/plugins]$ chmod +x processes
{code}

Majd írjunk bele egy Perl programot a _df_ állományba:
{code:title=/usr/local/etc/munin/plugins/df}
#!/usr/local/bin/perl -w

if ( $ARGV[0] and $ARGV[0] eq "autoconf" )
{
print "yes\n";
exit 0;
}

if ( $ARGV[0] and $ARGV[0] eq "config" )
{
print "graph_title Filesystem usage (in %)\n";
print "graph_args --upper-limit 100 -l 0\n";
print "graph_vlabel %\n";
print "graph_category disk\n";
print "graph_info This graph shows disk usage in the jail.\n";
print "root.label /\n";
print "root.info / -> root\n";
print "root.warning 90\n";
print "root.critical 95\n";
exit 0;
}

print "root.value ";

my @result = `/bin/df -k`;
if ( @result > 1 )
{
my @rootValues = split(/ +/, $result[1]);
if (@rootValues > 5 )
{
my $value = 100.0 * $rootValues[2] / $rootValues[1];
print $value."\n";
exit 0;
}
}
print "0.0\n";
{code}

Illetve a _processes_ fájlba:
{code:title=/usr/local/etc/munin/plugins/processes}
#!/usr/local/bin/perl -w

if ( $ARGV[0] and $ARGV[0] eq "autoconf" )
{
print "yes\n";
exit 0;
}

if ( $ARGV[0] and $ARGV[0] eq "config" )
{
print "graph_title Number of processes\n";
print "graph_args --base 1000 -l 0\n";
print "graph_vlabel number of processes\n";
print "graph_category processes\n";
print "graph_info This graph shows the number of processes in the jail.\n";
print "processes.label processes\n";
print "processes.info The current number of processes\n";
exit 0;
}

print "processes.value ";
my @result = `/bin/ps ax`;
my $value = @result-2; # Header and mine
print $value."\n";
{code}

Utolsó lépésként töröljünk ki mindent a _plugin-conf.d_ könyvtárban lévő _plugin.conf_ állományból, felesleges szeméttel terhelni a klienst, hiszen csak kettő plugint tartottunk meg, amelyek viszont magukat konfigurálják. Ellenőrizzük a _/etc_rc.conf_ állományban, hogy elindul-e a _munin-node_:
{code:title=/etc/rc.conf}
munin_node_enable="YES"
{code}

h2. 5.2.2.5. SSHD

Luxusnak tűnhet minden _jail_-be SSH elérést beállítani, de a kényelmi funkciók okán dobjuk el a többlet erőforrások miatti aggodalmainkat. Ha elindítunk egy _jail_-t (lásd később), akkor az adott processz fa alapján tudjuk csak befolyásolni a _jail_-ben futó alkalmazásokat. Ez a gyakorlatban azt jelenti, hogy ha később a _jail_ parancs segítségével lépünk be, akkor az már egy új processz fát jelent, tehát nem lesz jogunk leállítani régebben elindított szolgáltatást. Ha a _jail_ indításakor elindítunk egy _sshd_ szolgáltatást is, akkor később _ssh_-n belépve - mivel a processz fa azonos - képesek leszünk újraíndítani egyes szolgáltatásokat. Kezdjünk hozzá az _sshd_ beállításához, módosítsunk egy sort a {_}/etc/ssh/sshd_config{_} állományban, hogy be tudjunk lépni _root_ felhasználóval:
{code:title=/etc/ssh/sshd_config}
PermitRootLogin yes
{code}

Adjunk jelszót a _root_ felhasználónak:
{code:title=Parancssor}
[root@template:~]$ passwd root
Changing local password for root
New Password:
Retype New Password:
{code}

S engedélyezzük az _sshd_ futását a _/etc/rc.conf_ állományban:
{code:title=/etc/rc.conf}
sshd_enable="YES"
{code}

Kényelmi szempont lehet még, hogy a _root_ felhasználó is _bash_ _shell_-t kapjon, ehhez a _vipw_ parancs segítségével szerkesztenünk kell a _password_ fájlt. Ha minden szükséges módosítást elvégeztünk, akkor lépjünk ki a _jail_-ből, és takarítsunk ismét:
{code:title=Parancssor}
[root@template:~]$ exit
[root@freebsd:~]$ rm -Rf /bpool/jails/v7.1.0/template/tmp/*
[root@freebsd:~]$ rm /bpool/jails/v7.1.0/template/root/.bash_history
[root@freebsd:~]$ rm /bpool/jails/v7.1.0/template/root/.history
[root@freebsd:~]$ rm /bpool/jails/v7.1.0/template/root/.cshrc
[root@freebsd:~]$ rm /bpool/jails/v7.1.0/template/root/.profile
{code}

h2. 5.2.2.6. A konfiguráció véglegesítése

Az elkészült _template_ _jail_-ről készítsünk egy ZFS _snapshot_ fájlrendszert, s majd ezt fogjuk klónozni a továbbiakban:
{code:title=Parancssor}
[root@freebsd:~]$ zfs snapshot bpool/jails/v7.1.0/template@base
[root@freebsd:~]$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
[...]
bpool/jails/v7.1.0 254M 3.40G 19K /bpool/jails/v7.1.0
bpool/jails/v7.1.0/template 254M 3.40G 254M /bpool/jails/v7.1.0/template
bpool/jails/v7.1.0/template@base 0 - 254M -
{code}

Jól gondoljuk meg, hogy kell-e még valami a _template_ _jail_-be, mivel a _snapshot_ már nem módosítható, ha változtatunk a _template_ fájlrendszeren, az nem fog megjelenni a klónozott fájlrendszerekben!
----
[Előző fejezet|FREEBSD:Jailed template] [Tartalomjegyzék|FREEBSD:FreeBSD in my server] [Következő fejezet|FREEBSD:The first jail]
----
Auth Gábor [auth.gabor@javaforum.hu|mailto:auth.gabor@javaforum.hu]
----