Child pages
  • Jail philosophy
Skip to end of metadata
Go to start of metadata

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.

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):

/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

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:

Parancssor
[root@template:/]$ exit
exit
[root@freebsd:~]$ jail /dpool/jails/v8.1.0/template template.jails.javaforum.hu 192.168.2.254 /usr/local/bin/bash
[root@template:/]$                                                                                          

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:

/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); };

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:

/etc/rc.conf
syslogd_enable="NO"
syslog_ng_enable="YES"

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 :

/etc/mail/freebsd.mc
define(`SMART_HOST', `mail.jails.javaforum.hu')

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:

/etc/mail/aliases
root:   root@javaforum.hu

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:

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

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:

/etc/rc.conf
sendmail_enable="NO"

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

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:

/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]+$

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:

Parancssor
[root@template:/usr/local/etc/munin/plugins]$ ls -l | wc -l
       18
[root@template:/usr/local/etc/munin/plugins]$ rm *

Hozzunk létre egy df és egy processes állományt, majd adjunk nekik futtatási jogot:

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

Majd írjunk bele egy Perl programot a df állományba:

/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";

Illetve a processes fájlba:

/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";

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:

/etc/rc.conf
munin_node_enable="YES"

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:

/etc/ssh/sshd_config
PermitRootLogin yes

Adjunk jelszót a root felhasználónak:

Parancssor
[root@template:~]$ passwd root
Changing local password for root
New Password:
Retype New Password:

S engedélyezzük az sshd futását a /etc/rc.conf állományban:

/etc/rc.conf
sshd_enable="YES"

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:

Parancssor
[root@template:~]$ exit
[root@freebsd:~]$ rm -Rf /dpool/jails/v8.1.0/template/tmp/*
[root@freebsd:~]$ rm /dpool/jails/v8.1.0/template/root/.bash_history
[root@freebsd:~]$ rm /dpool/jails/v8.1.0/template/root/.history
[root@freebsd:~]$ rm /dpool/jails/v8.1.0/template/root/.cshrc
[root@freebsd:~]$ rm /dpool/jails/v8.1.0/template/root/.profile

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:

Parancssor
[root@freebsd:~]$ zfs snapshot dpool/jails/v8.1.0/template@base
[root@freebsd:~]$ zfs list
NAME                                      USED  AVAIL  REFER  MOUNTPOINT
[...]
dpool/jails/v8.1.0                        254M  3.40G    19K  /dpool/jails/v8.1.0
dpool/jails/v8.1.0/template               254M  3.40G   254M  /dpool/jails/v8.1.0/template
dpool/jails/v8.1.0/template@base             0      -   254M  -

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!

      
      
Page viewed times
#trackbackRdf ($trackbackUtils.getContentIdentifier($page) $page.title $trackbackUtils.getPingUrl($page))
  • No labels