Open die poorten! » |
Aanpassen owner en group
Bij het kopiëren van een website om als basis te dienen van een volgende website, komt het nog wel eens voor dat die nieuwe site niet van dezelfde owner moet zijn als de oorspronkelijke site. Middels het linux commando chown is dat snel te regelen, maar heeft een lastige beperking: het past alle files en mappen aan, ook die van de owner apache zijn, om bijvoorbeeld logs of uploads te verwerken.
mkdir /www/newsite cp -r -a /www/oldsite/website /www/newsite/
Bovenstaande regels maken eerst middels mkdir een nieuwe map aan om de nieuwe site in te plaatsen. De tweede regel kopieert (cp) de map /www/oldsite/website naar de zojuist aangemaakte directory. Daarbij worden 2 switches gebruikt:
- -r zegt dat we recursief willen werken, dus niet alleen de lege map moet gekopieerd worden, maar ook de inhoud aan files en submappen moet meekomen
- -a staat voor -dR of --perserve=all. Eigenlijk wordt dus de -r van hiervoor dus ook al meegenomen. Belangrijker vind ik het dat preserver de owner, mode (chmod) en timestamps meeneemt.
Als ik dus als "root" deze map kopieer, dan zijn daarna niet de files ineens van Root, maar nog steeds van "ownerOldSite".
drwxrwx--- 2 owneroldsite apache 4096 Apr 20 2012 cache drwxr-x--- 2 owneroldsite apache 4096 Feb 27 15:01 cli drwxr-x--- 2 owneroldsite apache 4096 May 16 10:14 config drwxr-x--- 9 owneroldsite apache 4096 May 16 10:11 docroot drwxrwx--- 3 owneroldsite apache 4096 Jul 18 2012 documenten drwxrwx--- 2 owneroldsite apache 4096 Jun 14 2012 logs drwxr-x--- 9 owneroldsite apache 4096 May 15 16:14 mvc
Vervolgens wil ik de site niet van deze owner laten zijn, maar van een nieuwe user: ownerNewSite.
useradd ownerNewSite
De volgende stap is om hem de rechten te geven op de zojuist gekopieerde document root. In principe zou
chown -R ownerNewSite /www/oldsite/website
voldoen. Echter, in de map documenten in in logs staan files die door de webserver (php) bewerkt moeten kunnen worden. Ze zijn veelal ook aangemaakt door php en hebben daarom als owner ook Apache staan. Met de bovenstaande chown actie zouden die files allemaal een nieuwe eigenaar krijgen en daarmee zouden ze niet meer beschrijfbaar zijn voor PHP.
Oplossing
Er moet dus gefilterd worden op de files die als owner nu ownerOldSite hebben. Dat gaat met de volgende regel:
find ./ -user ownerOldSite
Alternatief, als het numerieke userid bekend is:
find ./ -uid 999
Dit uid is bijvoorbeeld te vinden in /etc/passwd. Bovenstaand commando zoekt vanuit de huidige map: ./
Daarmee hebben we de files te pakken, maar nog niet aangepast. Dat kan middels -exec:
find ./ -user ownerOldSite -exec chown ownerNewSite {} +
Eventueel kan ook de group van de files nog aangepast worden met:
find ./ -group groupOldSite -exec chgrp groupNewSite {} +
Hiermee heb je dan dus een complete document root gekopieerd, de files die schrijfbaar moeten zijn voor Apache zijn van Apache gebleven, en er is een nieuwe user die de site kan beheren.
Waarom?
Het was voor mij een terugkerende ergernis: ik gebruikte het botte chown om de nieuwe owner aan te geven, en moest daarna door de boom met mappen heen om de juiste mappen weer schrijfbaar te maken voor Apache. Hiermee zou dat verleden tijd moeten zijn