Jste zde

Mysql v chrootu na OpenBSD

Asi každý ví kdo používá OpenBSD, že www stránky nebo-li httpd je zdůvodu bezpečnosti tzv. chrootu. Tzn. že uživatel www stránek, php scriptu a kdoví čeho ješte, nemá přímý přístup do systému a max. kam se dostane je složka /var/www.

Na tom by nebylo nic tak špané,dokud nenainstalujete Mysql. Záhy zjistíte že sice Mysql beží (ps -aux), ale nedá se na něho dostat přes php scripty. Řešení je jednoduché. Vlastně jsou co já vím dvě řešení.

1. Není nic jednoduššího než upravit cestu v souboru my.cnf na socket  = /var/www/var/run/mysql/mysql.sock,  tím po restartu služby začne všedchno fungovat. (samozřejme nezapomňte vytvořit ten adresář a dát mu potřebná práva). Jenže má to svá úskalí. To že sice vše funguje jak má není zase tak pravda. V mém případě jsem narazil na problém. A to ten, že pomocí cronu spouštím php script a ten samozřejme ten socket nevidí, neboť se dívá strandartně do /var/run/mysql a ten tam samozřejmě není a script nefunguje. Proto existuje další varianta.

2. Nechat my.cnf tak jak je a jen s spustit příkaz  ln -f /var/run/mysql/mysql.sock /var/www/var/run/mysql/mysql.sock a tím začne vše fungovat jak má. Ale aby to nebylo zase tak jednoduché samozřejmě vše funguje do první restartu. Je pravda, že OpenBSD se tak zase neseká a nebo ho není potřeba x týdnů restartovat a když už se restartuje, kdo pořád má myslet na to aby zadal tento příkaz. Naštěsti v OpenBSD existuje soubor /etc/rc.local Ten má za úkol spouštět scripty po stpuštění systému. A tak stačí přídat pár řádků a je to hotové. Nyní uvedu příklad, jak to mám nastavený já:

#!/bin/sh
echo -n 'starting local daemons:'

mkdir -p /var/www/var/run/mysql
chown www:daemon /var/www/var/run/mysql
# wait for a socket to appear
  for i in 1 2 3 4 5 6; do
   if [ -S /var/run/mysql/mysql.sock ]; then
    break
   else
    sleep 1
    echo -n "."
   fi
   done
   printf 'kopirovani mysql.sock do chroot';
   printf ' \n ';
   ln -f /var/run/mysql/mysql.sock /var/www/var/run/mysql/mysql.sock
exit 0

Jen stručne: script testuje jestlí existuje soubor toho socketu, pokud ne počka 1sec. (zkouší to 6x). Pak ho bud zkopíruje (ve skutečnosti se vytváří symbolický link) a nebo se na to vykašle. To že to zkouší 6sec. jsem si nevymyslel já, je to standartní postup ve spousštění scriptů. Pořádně nevím přoč to tak je, neboť mě se spustí hned (hned se vytvoří smybolický link), ale předpokládám, že existuje pomalé stroje a nebo růně nakonfigurávané,kde myslq se nesptustí hned,ale třeba po 3sec. A tím to je to ošetřené.

Tak to je opět vše. Doufám že jsem Vám někomu pomohl.

Pajka