COMPUTERS EN ZO...

MySQL

Tags
Alle(7)
Fotobewerking(1)
Hardware(1)
Linux(5)
MySQL(1)
PHP(1)
Software(2)
Ubuntu(5)
Windows(2)


pagecounter



MySQL - LOAD DATA INFILE geeft foutmelding "File '/path/file' not found

Voor een website heb ik een PHP-scriptje geschreven wat met behulp MySQL (LOAD DATA INFILE) gegevens leest uit een logfile, en die gegevens worden vervolgens op een webpagina weergegeven. Hier het betreffende stukje code:

$query = "LOAD DATA INFILE "
."'/var/log/mail/".$filename."' "
."INTO TABLE `".$date."` "
."FIELDS ENCLOSED BY \"\"\"\"";

Na een upgrade van de linux-distributie op de server van Ubuntu-server 7.04 naar 8.04 werkt het scriptje niet meer maar verschijnt de foutmelding:

File '/var/log/mail/smtp-200907250000' not found (Errcode: 13)

Errcode 13 geeft aan dat er een probleem is met de permissies, maar bij zowel de map /var/log/mail als de file zijn de rechten zodanig ingesteld dat lezen geen probleem moet zijn. Na wat googelen vond ik de oplossing op bugs.launchpad.net en via dat artikel op wiki.ubuntu.com.

Hierin wordt beschreven dat dit probleem wordt veroorzaakt door AppArmor, een voorziening die vanaf Ubuntu 8.04 standaard actief is, en die ervoor zorgt dat applicaties zoals MySQL (mysqld) slechts toegang hebben tot de mappen en bestanden die echt nodig zijn voor die applicatie. Dit om een extra beveiliging te creëeren tegen misbruik.

Om in dit geval mysqld toegang te geven tot de betreffende logfile moeten we dus in de configuratie van AppArmor duiken. En dat blijkt eenvoudig. Eerst zoek je het AppArmor profile op van de toepassing die problemen heeft. AppArmor schrijft die informatie in /var/log/kern.log. Zoek naar regels beginnend met audit:

Jul 25 20:12:15 testserver kernel: [2152072.869786] audit(1248545535.968:4): type=1503 operation="inode_permission" requested_mask="::r" denied_mask="::r" name="/var/log/mail/smtp-200907250000" pid=11754 profile="/usr/sbin/mysqld" namespace="default"

Hier zien we dat het profile /usr/sbin/mysqld is, en het bijbehorende AppArmor configuratiebestand is te vinden als /etc/apparmor.d/usr.sbin.mysqld. Dit ziet er ongeveer zo uit:

# vim:syntax=apparmor
# Last Modified: Tue Jun 19 17:37:30 2007
#include

/usr/sbin/mysqld {
#include
#include
#include
#include

capability dac_override,
capability setgid,
capability setuid,

/etc/hosts.allow r,
/etc/hosts.deny r,

/etc/group m,
/etc/passwd m,

/etc/mysql/*.pem r,
/etc/mysql/conf.d/ r,
/etc/mysql/conf.d/* r,
/etc/mysql/my.cnf r,
/usr/sbin/mysqld mr,
/usr/share/mysql/** r,
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
/var/log/mysql/ r,
/var/log/mysql/* rw,
/var/run/mysqld/mysqld.pid w,
/var/run/mysqld/mysqld.sock w,

}

We voegen dus onderstaande regels toe vóór het  } -teken (de meest logische plaats is na de /var/log/mysql/* rw, -regel):

/var/log/mail/ r,
/var/log/mail/* r,

Op deze manier geven we mysqld slechts read-access voor de files in /var/log/mail en lossen zo het probleem op.
Nu nog even de wijzigingen opslaan en AppArmor reloaden:

cat /etc/apparmor.d/ | sudo apparmor_parser -r
sudo /etc/init.d/apparmor reload

25 juli 2009 18:26 door Sander.

Tags:


Linux, MySQL, PHP, Ubuntu


  

Er zijn nog geen reacties

Hier graag uw bericht




?
? ?
?

Powered by TalkBack