OwnCloud telepítése (Jessie)

A AdminWiki wikiből

Ebben a leírásban az ownCloud nyílt forrású, közösségi fejlesztésű, fájlszinkronizáló és felhőszolgáltatás frontend szerveralkalmazás 8.x vagy későbbi verzióját telepítjük házirend szerint konfigurált Debian Jessie LAMP (Apache 2.4.x, wsm2 2.6+, MySQL 5.5.x, PHP 5.6.x) webkiszolgálóra.

Az ownCloud elsősorban személyes adatok felhőbeli tárolását és egyszerű megosztását célozza meg; technikailag WebDAV elérést ad a fájlterülethez (melynek bármely eleme írásra és olvasásra is megosztható), CalDAV elérést a személyes naptárak, illetve CardDAV elérést a személyes névjegyek tárolásához, szinkronizálásához. Az ownCloud használatát számos mobil platformon (Android, iOS, stb.) ingyenesen letölthető kliens applikáció támogatja.

Az ownCloud nagy előnye, hogy jól dokumentált API áll rendelkezésre, elsősorban PHP nyelvű egyedi modulok fejlesztésére.

Work in progress - még ne vedd komolyan!

Tartalomjegyzék

Házirend

Elméleti szakasz, nyugodtan átléphető, amennyiben csak telepítési checklistként használjuk ezt a leírást.

Az ownCloud készítői - hasonlóan pl. a WordPress készítőihez - úgy igyekszenek kialakítani a szerveralkalmazást, hogy annak üzemeltetéséhez minimális közreműködés kelljen a szervergép illetve az alapszintű szolgáltatások (webszerver, adatbázis-szerver) üzemeltetőjétől. Sajnos ennek hátulütője, hogy a kódkarbantartás (automatikus frissítés) ugyanazon eszközzel és rendszerszintű hozzáféréssel - a publikus webfelületen keresztül - történik, mint a mindennapi webszolgáltatás. Ily módon a publikus webszervert futtató rendszerfelhasználó (www-data) jogosult kódállományok írására, ami nézetem szerint nagyon előnytelen kompromisszum a biztonság rovására. A jelen leírásban igyekszünk a kódkarbantartást szeparálni, és a wsm2-ben szokásos módon azt kizárólag a webadmin rendszerfelhasználó nevében futó WebDAV szolgáltatás számára fenntartani, szükségképpen korlátozva ezzel az ownCloudon belüli adminisztrátor és az esetleges automatikus frissítőprogramok jogait és lehetőségeit.

Hasonlóan más LAMP webalkalmazásokhoz, az ownCloudot is úgy kívánjuk üzemeltetni, hogy:

  • ne igényeljen dedikált gépet, egy szervergépen - más-más Apache virtualhostok alatt - több példány (instance) is működjön;
  • a példányok egy közös, frissíthető alap (core) kódkészletet használjanak, amely csak olvasható tárterületen (/usr/local/share) helyezkedjen el;
  • minden példány adatterülete a hozzá kapcsolódó virtualhost területén (/var/www/[virtualhost]) belül egy írható könyvtár legyen;
  • minden példány önálló, dedikált MySQL adatbázist használjon.

Ennek érdekében a következő fájlterületeket alakítjuk ki:

A példány saját tárterülete                   Közösen frissített, csak olvasható tárterület

/var/www/[virtualhost]/                       /usr/local/share/
                                                      owncloud/ -> owncloud-versions/owncloud-X.Y.Z
                   app/[community apps] ---------------->  app/[community apps]  # Közösség által szállított modulok
                       [local apps]                                              # Saját fejlesztésű, egyedi modulok
                  data/                                                          # Saját adatterület
                config/                                                          # Saját beállítások
            [any other] --------------------------> [any other]                  # Core kódkészlet

A példány saját tárterülete a wsm2 házirendjének megfelelően a webadmin:www-data tulajdonában van, a szokásos 2750/640 jogokkal (kivéve az írható /data könyvtárat, amely 2770/660 jogokkal). A közös kódkészlet root:root 755/644 jogokkal vagy root:www-data 2750/640 jogokkal telepítendő.

TODO!

Előfeltételek

apt-get install php5-curl php5-gd php5-imagick php5-intl php5-json php5-mcrypt php-pclzip # +: sok függőség
  • Az ownCloud 8.1 és efeletti verziói nem tartalmazzák a Sabre DAV könyvtárat, így szükséges ennek telepítése:
apt-get install php-sabre-dav
  • A PHP globális beállításai között az alábbi függvények engedélyezése:
-rw-r--r-- root root /etc/php5/apache2/conf.d/99-wsm2-php5.ini

[...]
disable_functions = [...] // Remove the enabled functions listed below from here!
[...]
; The 'enable' directives below are invalid, leave them commented!
; You may use only as a reminder, about policy changes above.
;enable_functions = "disk_free_space, diskfreespace, getmypid, include, ini_set, mail, php_uname, set_time_limit, "
[...]
  • Az owncloud-addons használatához az alábbiak telepítése:
apt-get install diffutils patch # nincs függősége, nem hoz sallangokat

Telepítés

Az ownCloud a Debian terjesztésnek része ugyan, de (a rapid közösségi fejlesztéseknél gyakori problémaként) jelenleg kissé elavult változatot tartalmaz, és a házirendünk kívánalmainak sem igazán felel meg; ezért az ownCloudot tarball-ból telepítjük, és a frissítésekről is magunk gondoskodunk.

Az ownCloud core telepítése

Ellenőrizzük a legfrissebb stabil verzió verziószámát, és a /usr írhatóan újracsatolása után csomagoljuk ki a /usr/local/share/owncloud-versions/owncloud-X.Y.Z könyvtárba a házirend szerinti jogosultságok beállításával, pl. az alábbi parancsokkal:

mount -o remount,rw /usr  # Írni kell ide
OC_VERSION="X.Y.Z"        # Töltsük ki az aktuális verzióval!

# Közös kódkészlet könyvtárának elkészítése
mkdir /usr/local/share/owncloud-versions; chown root:staff /usr/local/share/owncloud-versions
mkdir /usr/local/share/owncloud-versions/owncloud-$OC_VERSION

# Letöltés, kicsomagolás
cd /root/tmp
wget http://download.owncloud.org/community/owncloud-$OC_VERSION.tar.bz2 # linket ellenőrizni, változhat!
tar xjvf owncloud-$OC_VERSION.tar.bz2 -C /usr/local/share/owncloud-versions/owncloud-$OC_VERSION --strip-components=1

# Jogosultságok beállítása
chown -R root:www-data /usr/local/share/owncloud-versions/
find /usr/local/share/owncloud-versions/ -type d -exec chmod 750 {} \;
find /usr/local/share/owncloud-versions/ -type f -exec chmod 640 {} \;

# Symlink az aktuális verzióra
ln -s owncloud-versions/owncloud-$OC_VERSION /usr/local/share/owncloud
chown -h root:www-data /usr/local/share/owncloud

Az owncloud-addons telepítése

A (saját készítésű) owncloud-addons csomag kódmódosításokat (foltokat, patcheket) és opcionálisan felhasználható beépülő modulokat (appokat) tartalmaz. Töltsük le és (a /usr partíció átmenetileg írhatóra csatolása után) könyvtárhelyesen csomagoljuk ki owncloud-addons tarball legfrissebb változatát!

Az ownCloud core patchelése

Bár a core kódkészlet megváltoztatásától általában jobb tartózkodni, az ownCloud jelenlegi állapotában a házirendünkkel nem teljesen kompatibilis és ezt csak a core foltozásával tudjuk áthidalni (TODO!). A Samba backend használatához a files_external (core) app valamelyes módosítása is szükséges. Az owncloud-addons minden ownCloud verzióhoz tartalmaz egy patch állományt a /usr/local/share/owncloud-addons/patch könyvtárban. Válasszuk ki a telepített ownCloud verziószámának megfelelőt(!), és alkalmazzuk:

patch -p0 -d /usr/local/share/owncloud </usr/local/share/owncloud-addons/patch/owncloud_X.Y.Z-owncloud-addons-YYYYMMDD.patch

Siker esetén állítsuk helyre az esetleg elromlott jogosultságokat:

chown -R root:www-data /usr/local/share/owncloud/
find /usr/local/share/owncloud/ -type d -exec chmod 750 {} \;
find /usr/local/share/owncloud/ -type f -exec chmod 640 {} \;

3rd party modulok

Az ownCloud alap funkcionalitása beépülő modulokkal (appokkal) sokféleképpen bővíthető; maga a core is számos modult tartalmaz, valamint jelenleg egy halom, alapvetőnek tűnő funkció (címjegyzék, naptár, webmail) közösségi app formájában van megvalósítva. Az owncloud-addons csomag, a /usr/local/share/owncloud-addons/apps könyvtárban tartalmaz néhány előtelepített 3rd party plugint, így ezek minden, később létrehozott ownCloud példányban automatikusan rendelkezésre állnak majd. Ha a csomagban érkező példányokat használjuk, ezekkel az appokkal most nincs teendő; a virtualhostok kialakításakor a használni kívánt modulokat innen fogjuk linkelni.

Az owncloud-addons 3rd party pluginjai jelenleg:

  • Calendar 8.0 - (közösségi) - CalDAV naptár szerver és webfelületű naptár alkalmazás;
  • Contacts 8.0 - (közösségi) - CardDAV címjegyzék szerver és webfelületű címjegyzék alkalmazás;
  • Roundcube External - (saját) - segédapplikáció, lehetővé teszi távoli Roundcube webmail integrálását az ownCloud webfelületébe.

A fentieken kívül beszerezhetünk az egyes ownCloud példányok számára további appokat a közösségi terjesztésből - ezeket célszerű az egyes virtualhostok telepítésekor külön-külön (vagyis nem közös kódkészlet formájában) telepíteni és karbantartani.

A telepítés befejezése

A telepítés befejezéseként csatoljuk újra csak olvashatóan a /usr partíciót:

mount -o remount /usr

Ezzel az ownCloud közös kódkészletét (a core-t és saját módosításainkat) telepítettük, a továbbiakban a virtualhostonként külön-külön alkalmazható beállításokat tekintjük át.

Samba backend előkészítése

Opcionális telepítés illetve beállítás.

Jelen leírásban a Samba integráció célja, hogy másodlagos hozzáférést nyújtson egy közös használatú (pl. céges) tárterülethez. Nem célunk, hogy a közös fájlterületet intenzíven használó távmunkásoknak elsődleges fájlkezelője legyen az ownCloud, mert a DAV-on keresztüli fájlkezelésnek még vannak hátulütői - elsősorban a sokféle eszközön futó és nem feltétlenül megbízható DAV kliensek, amelyekben pl. nincs megvalósítva a zárolás, így a Samba használata során megszokott és természetesnek tűnő szolgáltatások (pl. a fájlt a másodikként szerkesztő felhasználó csak olvasásra nyitja, stb.) nehézkesek. Emiatt nem túl fegyelmezett csoportmunka környezetben talán érdemes a közös Samba fájlterületet csak olvashatóan csatolni, és csak a kizárólagos használatú homes-ban engedni a R/W hozzáférést - távmunkások számára elsődleges eszközként jelenleg inkább a tunnelezett Samba elérést preferálnánk.

Jelen leírásban nem célunk a fájlkiszolgáló ownCloud felőli menedzselése (felhasználók felvétele, megosztások kialakítása, stb.) sem.

Az alábbiakra csak akkor van szükség, ha szeretnénk a felhasználók számára lehetővé tenni (egy vagy több) Samba fájlterület felcsatolását az ownCloud webfelületén, illetve annak elérését WebDAV kliensekkel (tablettel, okostelefonnal, stb.) az ownCloud files_external modulja segítségével. Ehhez szükséges:

  • A PHP globális beállításai között az alábbi függvények engedélyezése:
-rw-r--r-- root root /etc/php5/apache2/conf.d/99-wsm2-php5.ini

[...]
disable_functions = [...] // Remove the enabled functions listed below from here!
[...]
; The 'enable' directives below are invalid, leave them commented!
; You may use only as a reminder, about policy changes above.
;enable_functions = "disk_free_space, diskfreespace, getmypid, include, ini_set, mail, php_uname, set_time_limit, " // ownCloud w/o Samba
;enable_functions = "disk_free_space, diskfreespace, getmypid, include, ini_set, mail, php_uname, set_time_limit, 
;                    exec, escapeshellcmd, escapeshellargs, popen, pclose, shell_exec, "                            // ownCloud with Samba
[...]
  • A Samba parancssori kliens telepítése az ownCloud szerverre:
apt-get install smbclient  # +: sok függőség, ha a Samba nincs telepítve ezen a gépen
  • Az ownCloud 8.1 és efeletti verziói számára, natív PHP kliensként a Debian Jessie disztribúcióban nem szereplő php5-libsmbclient Debian csomag telepítése innen.
    Bug: jelenleg ennek a csomagnak aktuális verziója (0.7.0-7.1) nem tartalmazza a szükséges shared object állományt (libsmbclient.so) és a PHP beállító állományt (libsmbclient.ini) sem, így ez a csomag nem működik - áthidaló megoldásként érdemes az innen letölthető (a számunkra megfelelő amd64 illetve i386 változatú) 0.5.0-1.1 csomagot kézzel telepíteni, és utána opcionálisan beállítani a csomagkezelővel történő frissítést (TODO!);
  • Élő, állandó Samba (TCP:139 illetve TCP:445) adatkapcsolat az ownCloud és a Samba szerver között (ha ezek azonos gépen vannak, akkor a localhost-on, ellenkező esetben külön felépített, titkosított(!) adatkapcsolaton, akár az Interneten keresztül, vagy titkosítatlanul, általában dedikált hálózaton).

Nagy forgalmú adatkapcsolat esetén, amennyiben lehetséges, a dedikált fizikai hálózatot részesítsük előnyben, mert az egyetlen, tunnelezett szerver-szerver kapcsolat tapasztalat szerint jelentősen kisebb teljesítményt biztosít, mint a több szálú (párhuzamosan kezelt), közvetlen TCP kapcsolat.

Közvetlen szerver-szerver SMB kapcsolat

Opcionális beállítás - mivel a Samba forgalom nem "Internet-képes", ez a megoldás általában elkülönített (backend) hálózatot igényel!

Az SMB forgalmat engedélyezni kell mind a telepítés alatt álló (ownCloud) szerver, mind a fájlkiszolgáló csomagszűrő tűzfalán, egyéb teendő nincsen.

Példa Shorewall beállítás: mindkét szervergépen (ownCloud, fájlszerver) definiáljuk a (/etc/network/interfaces-be példánkban eth1-nek már felvett és aktívnak feltételezett) backend hálózati interface-t (ha még nem lenne definiálva):

-rw-r----- root root /etc/shorewall/interfaces

[...]
###############################################################################
?FORMAT 2
###############################################################################
#ZONE           INTERFACE               OPTIONS
back            eth1                    arp_filter,logmartians,nosmurfs,routefilter,tcpflags
[...]

majd engedélyezzük a kétirányú SMB forgalmat a partner (vagyis az ownCloud szerveren a fájlszerver, a fájlszerveren az ownCloud szerver) backend IP címére korlátozva:

-rw-r----- root root /etc/shorewall/rules

[...]
# Enabled Samba traffic from and to the fileserver only
SMB/ACCEPT      back:IP.IP.IP.IP  fw
SMB/ACCEPT      fw                back:IP.IP.IP.IP 
[...]

A beállításokat a Shorewall (mindkét gépen történő) újraindításával érvényesíthetjük:

systemctl restart shorewall

Gyorstesztként csatlakozzunk telnettel a telepítés alatti szervergépről a fájlszerver TCP:139-es portjára:

telnet IP.IP.IP.IP 139  # kilépés: CTRL-5, quit

TODO!

Szerver-szerver SMB kapcsolat SSH tunnelen

Opcionális telepítés illetve beállítás.

Az alábbiakban egyszerű, egyszálú, permanens SSH tunnelt építünk ki, melynek segítségével a távoli fájlszerver Samba szolgáltatása az ownCloudot futtató szervergép TCP localhost:139 portján lesz elérhető. Ehhez (továbbra is root felhasználóként) készítsünk egy passphrase nélküli RSA kulcspárt a telepítés alatt álló szervergép webadmin felhasználója számára:

su - webadmin -c "ssh-keygen -t rsa -b 2048 -C webadmin@$(hostname --fqdn) -f samba_tunnel" # Passphrase legyen üres!
mv /home/webadmin/samba_tunnel* /home/webadmin/.ssh/

Másoljuk a fentebb létrehozott publikus kulcsot a (házirend szerint telepített) Samba szervergép /var/opt/samba/.ssh/authorized_keys2 állományába (az esetleges immutable bit átmeneti levétele után), és szerkesszük meg - korlátozzuk használatát a Samba portok átvitelére:

-r-------- sambauser sambashare /var/opt/samba/.ssh/authorized_keys2

command="/bin/false",no-pty,no-X11-forwarding,no-agent-forwarding,permitopen="localhost:139",permitopen="127.0.0.1:139",permitopen="localhost:445",permitopen="127.0.0.1:445" sh-rsa AAAAB[...]

Fentiekkel lehetővé tesszük a telepítés alatti gép root felhasználója számára (ez az 1024 alatti lokális portszám miatt szükséges), a távoli gép sambauser felhasználója nevében a tunnel felépítését.

Engedélyezzük a csomagszűrő tűzfalon az SSH forgalmat a Samba szervergép felé:

-rw-r----- root root /etc/shorewall/rules

[...]
# RULES HANDLING OUTBOUND CONNECTIONS
[...]
#SSH/ACCEPT     fw              all
SSH/ACCEPT      fw              net:IP.IP.IP.IP
[...]
systemctl restart shorewall

Ellenőrizzük a tunnel használhatóságát:

ssh sambauser@IP.IP.IP.IP -N -T -i /home/webadmin/.ssh/samba_tunnel -L localhost:139:1.0.0.1:139  # Hagyjuk futni
telnet localhost 139  # Másik terminálon; kilépés: CTRL-5, quit; siker esetén a tunnelt CTRL-C-vel szakítsuk meg.

A tunnel állandó fenntartásához opcionálisan töltsük le és (a /usr partíció átmenetileg írhatóra csatolása után) könyvtárhelyesen csomagoljuk ki a ssh-tunnels tarball legfrissebb változatát! Ez az eszköz nem igényel különösebb beállítást, egyszerűen be kell jegyeznünk a fenntartandó tunnelt:

-rw-r--r-- root root /etc/default/ssh-tunnels

[...]
# lport:rhost:rport     user@remotehost         keyfile pathname (W/O passphrase!)
139:127.0.0.1:139       sambauser@IP.IP.IP.IP   /home/webadmin/.ssh/samba_tunnel

Indítsuk is el:

/etc/init.d/ssh-tunnels start
Opened tunnel 139:127.0.0.1:139  sambauser@IP.IP.IP.IP

A kapcsolat megszakadása esetén, annak visszaállításáról egy erre szolgáló cron job gondoskodik.

Természetesen a permanens tunnelezésről más eszközzel is gondoskodhatunk.

Egy ownCloud példány elkészítése

Egy ownCloud példányhoz tartozik:

  • egy dedikált MySQL adatbázis;
  • egy Apache virtualhost tárterülettel és webszerver (alkalmazásszerver) beállításokkal;
  • az ownCloud példány saját beállításai (melyeket a telepítője inicializál).

MySQL adatbázis készítése

A MySQL adatbázisnak egyetlen, az adatbázisra nézve teljes jogú felhasználója van, akinek neve célszerűen megegyezik az adatbázis nevével. A nevet konvencionálisan oc_-vel kezdjük, és célszerű, ha kapcsolatban áll a virtualhost nevével.

Az adatbázist és a felhasználót a MySQL root hozzáféréssel hozzuk létre.

mysql --defaults-file=/etc/mysql/root.cnf

mysql> CREATE DATABASE oc_INSTANCENAME CHARACTER SET utf8 DEFAULT COLLATE utf8_hungarian_ci;
mysql> GRANT ALL PRIVILEGES ON oc_INSTANCENAME.* TO 'oc_INSTANCENAME'@'localhost' IDENTIFIED BY 'PASSWORD';
mysql> FLUSH PRIVILEGES;

ahol a PASSWORD egy megfelelő jelszó. Relatív megjegyezhető, mégis erős jelszó a pwgen segédprogrammal is generálható, pl. a következőképpen:

/usr/bin/pwgen -s -n -c 12 1

Ellenőrizzük, hogy a felhasználó megfelelően létrejött-e:

mysql> SELECT host, user, password FROM mysql.user ORDER BY user;
+-----------+------------------+---------------------------------------------+
| host      | user             | password                                    |
+-----------+------------------+---------------------------------------------+
| localhost | oc_INSTANCENAME  | *73CDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
[...]
+-----------+------------------+---------------------------------------------+

mysql> quit

Ezután próbáljunk a létrehozott felhasználó nevében és jelszavával belépni. Az alábbi parancsokkal ellenőrizhetjük, hogy a felhasználó jogosultságai valóban csak erre az adatbázisra terjednek ki:

mysql -u oc_INSTANCENAME -p
Enter password:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| oc_INSTANCENAME    |
+--------------------+

A felhasználó felvételét és kipróbálását követően töröljük le a .mysql_history állományt, mert ebben a jelszó szabad szöveges formában benne van:

rm ~/.mysql_history

Az adatbázis iniciális feltöltését a telepítő PHP script végzi.

Apache virtualhost készítése

Leírásunkban a http://fully.qualified.hostname weboldal közvetlenül az ownCloud példány nyitólapjára mutat. A virtualhostot a szokott módon, a wsm2 segítségével készítjük el; ennek 2.6 vagy későbbi verzióinál, ha van a /etc/ssl/certs-ben elhelyezett, hitelesített webszerver SSL tanúsítványunk, annak fájlnevét (kiterjesztés nélkül) megadhatjuk harmadik paraméterként (ellenkező esetben önaláírt tanúsítvány készül):

wsm2 -cw FULLY.QUALIFIED.HOSTNAME sysadmin@MYDOMAIN certificate_name

A beállítások idejére érdemes a virtualhostot letiltani (így nem kapunk feleslegesen cron, stb. hibaüzeneteket):

a2dissite FULLY.QUALIFIED.HOSTNAME
systemctl reload apache2

Filerendszer beállítások

A wsm2 által létrehozott download könyvtárat és az index.html állományt töröljük. A virtualhost tárterületén a konfiguráció és az egyedi modulok és sminkek részére a tárterületet (az apps, config és themes könyvtárakat) fizikailag is el kell készíteni, ezekbe belinkeljük a közösségi modulokat és sminkeket. A felhasználók által feltöltött tartalom könyvtárát (upload) átnevezzük, kialakítunk benne egy ideiglenes- (tmp) és egy naplókönyvtárat (log). A /usr/local/share/owncloud alatti összes többi tartalmat egyszerűen belinkeljük:

cd /var/www/FULLY.QUALIFIED.HOSTNAME
pwd # Biztos, ami biztos.

rmdir download
rm index.html
mv upload data

# apps berendezése
mkdir apps; chown webadmin:www-data apps ; chmod 2750 apps
#ln -s /usr/local/share/owncloud-addons/apps/* apps/    # Nem hivatalos modulok, ha vannak
ln -s /usr/local/share/owncloud/apps/* apps/            # Közösségi modulok

# config berendezése (sajnos a www-data írhatja)
setfacl -d -m g::rwX config
ln -s /usr/local/share/owncloud/config/* config/

# data berendezése (www-data írhatja)
mkdir data/tmp; chown webadmin:www-data data/tmp; chmod 2770 data/tmp
mkdir data/log; chown webadmin:www-data data/log; chmod 2770 data/log
touch data/log/owncloud.log; chown www-data:www-data data/log/owncloud.log; chmod 660 data/log/owncloud.log

# log symlinkelése
ln -s ../data/log log/applog

# themes berendezése
mkdir themes; chown webadmin:www-data themes ; chmod 2750 themes
#ln -s /usr/local/share/owncloud-addons/themes/* themes/ # Nem hivatalos sminkek, ha vannak
ln -s /usr/local/share/owncloud/themes/* themes/         # Közösségi sminkek

# minden mást belinkelünk
ln -s /usr/local/share/owncloud/.htaccess .
ln -s /usr/local/share/owncloud/.user.ini .
ln -s /usr/local/share/owncloud/* .
# tulajdonjog átruházása (csak szépség)
find . -type l -exec chown -h webadmin:www-data {} \;

Opcionálisan a felhasználó fájlterületeket (az eddigiek szerint /var/www/FULLY.QUALIFIED.HOSTNAME/data/username könyvtárak lennének) kivihetjük a /var/www hierarchiából, akár másik partícióra is. Ez különösen hasznos akkor, ha a szervergépen hagyományos webszolgáltatások is futnak, amelyeknek relatív kis tárterülete így elkülönítve menthető a cloud fájlterülettől.

Az alábbi példában a felhasználói tárterületet a /mnt/storage/FULLY.QUALIFIED.HOSTNAME könyvtárba visszük ki.

pwd                                           # /var/www/FULLY.QUALIFIED.HOSTNAME legyen
FOLDERNAME="/mnt/storage/$(basename $(pwd))"  # /mnt/storage/FULLY.QUALIFIED.HOSTNAME - vagy írjunk ide, amit szeretnénk
echo "$FOLDERNAME"                            # és ellenőrizzük!

mkdir -m 2771 "$FOLDERNAME"; chown webadmin:www-data "$FOLDERNAME"
getfacl data | setfacl --set-file=- "$FOLDERNAME"

Ezzel az alternatív felhasználói tárhelyet előkészítettük.

A telepítő írni szeretne az /apps és /config könyvtárakba, ezért ezeket átmenetileg tegyük írhatóvá:

chmod g+w apps config

Webszerver beállítások

Módosítsuk a virtualhost (a wsm2 által létrehozott) Apache konfigurációját:

  • a teljes virtualhostra vonatkozóan:
    • felvesszük az esetleges ServerAlias-okat;
    • engedélyezzük a PHP futtatását, engedélyezünk 32 MB RAM használatot és hosszabb futásidőt (feltöltések);
    • módosítjuk az open_basedir bejegyzést, hozzátesszük az OwnCloud kódkönyvtárait és a véletlenszám-generátor forráseszközeit (figyelem: include_path-t nem szabad megadni!);
    • engedélyezzük a PHP file feltöltést, ha az APC telepítve van, a progress bar-t, megadunk (egy eltúlzott) méretkorlátot és egy ideiglenes könyvtárat;
    • engedélyezzük a PHP allow_url_fopen-t;
    • tiltjuk a ModSecurity-t (mindenféle gonoszság várható, amire értelmesen nem tudok szűrni - TODO!);
  • speciálisan a karbantartó PHP scriptre_
    • engedélyezünk 256 MB RAM használatot és hosszabb futásidőt;
  • speciálisan a data (írható) könyvtárra:
    • tiltjuk a szimbolikus linkek követését (ownCloud 8.x hiba);
    • nem vizsgáljuk a ModSecurity-vel a POST tartalmakat, illetve tiltjuk a ModSecurity-t (TODO!);
  • a nem használt (törölt) könyvtárakra vonatkozó bejegyzéseket törölhetjük;
  • a virtualhost ssl konfigurációját az esetleges ServerAlias-ok felvételét kivéve nem kell módosítani.
-rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME.conf

<VirtualHost *:80>
[...]
    <IfModule mod_php5.c>
        php_admin_flag engine on
        php_admin_value open_basedir /var/www/FULLY.QUALIFIED.HOSTNAME/:/usr/local/share/owncloud/:/usr/local/share/owncloud-versions/:/usr/local/share/owncloud-addons/:/dev/random:/dev/urandom
#       php_admin_value include_path .:/usr/share/php5/
        php_admin_value memory_limit 32M
        php_admin_value max_execution_time 300
        [...]
        php_admin_value file_uploads on
#       php_admin_flag apc.rfc1867 on
        php_admin_value upload_max_filesize 100M
        php_admin_value post_max_size 100M
        php_admin_value upload_tmp_dir /var/www/FULLY.QUALIFIED.HOSTNAME/data/tmp/
        php_admin_flag allow_url_fopen on
        php_admin_value user_agent 'PHP (5.x)'
        [...]
    </IfModule>
[...]
    # ModSecurity settings (entire virtualhost).
    <IfModule security2_module>
        # Engine On/Off/DetectionOnly.
        SecRuleEngine Off
    </IfModule>
[...]
    # Virtualhost itself.
    <Directory /var/www/FULLY.QUALIFIED.HOSTNAME>
        Require all granted
        AddDefaultCharset UTF-8
        [...]
    </Directory>

    # Maintenance job
    <Location /cron.php>
        <IfModule mod_php5.c>
            php_admin_value memory_limit 256M
            php_admin_value max_execution_time 600
        </IfModule>
    </Location>
[...]
    # Official upload directory (writable by www-data).
    <Directory /var/www/FULLY.QUALIFIED.HOSTNAME/data>
        Require all denied
        [...]
        # https://doc.owncloud.org/server/8.0/admin_manual/release_notes.html
        # "ownCloud’s file scanner does not follow symlinks"
        Options -FollowSymLinks
        Options -SymLinksIfOwnerMatch
        [...]
        <IfModule security2_module>
            SecRuleEngine Off
            SecRequestBodyAccess Off
        </IfModule>
    </Directory>
[...]

Amennyiben alternatív felhasználói tárhelyet készítettünk elő, annak használatát engedélyezni kell:

  • a PHP open_basedir felsorolásában;
  • egy külön Directory bejegyzésben, amely a data könyvtáréval megegyezik.
-rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME.conf

<VirtualHost *:80>
[...]
    <IfModule mod_php5.c>
        php_admin_value open_basedir [...]:/STORAGE_PATHNAME/:[...]
        [...]
    </IfModule>
[...]
    # Storage directory (writable by www-data).
    <Directory /STORAGE_PATHNAME>
        Require all denied
        AllowOverride None
        ## Bugous, take care!
        ## AllowOverrideList None
        AddType text/plain .html .htm .shtml
        # https://doc.owncloud.org/server/8.0/admin_manual/release_notes.html
        # "ownCloud’s file scanner does not follow symlinks"
        Options -FollowSymLinks
        Options -SymLinksIfOwnerMatch
        # PHP disabled here.
        <IfModule mod_php5.c>
            php_admin_flag engine off
        </IfModule>
        # ModSecurity disabled here.
        <IfModule security2_module>
            SecRuleEngine Off
            SecRequestBodyAccess Off
        </IfModule>
    </Directory>
[...]

A fentiekkel az ownCloud példány virtualhost alapbeállítása megtörtént, az a virtualhost engedélyezése és a webszerver konfiguráció újraolvasása után használatba vehető:

a2ensite FULLY.QUALIFIED.HOSTNAME
systemctl reload apache2

Használatba vétel

Tekintettel arra, hogy a frissen telepített OwnCloud az első, arra tévedő felhasználónak lehetőséget ad adminisztrátori hozzáférésre, a használatba vételt a webszerver konfiguráció újraolvasása után azonnal el kell végezni!

Az ownCloud példány inicializálása

Az ownCloud inicializáló scriptjének lefuttatásához egy, a telepítés alatti szervert HTTP kapcsolaton elérő munkaállomás grafikus böngészőjében hívjuk be a http://FULLY.QUALIFIED.HOSTNAME/ weboldalt, ami az ownCloud telepítőjére visz. Itt csak az adminisztrátori név/jelszó párost (javasolt: admin és legalább 12 karakteres generált jelszó) és a MySQL adatbázis adatait, és ha készítettünk alternatív felhasználói tárhelyet, annak teljes elérési útvonalát kell megadni. A telepítő lefuttatása után lépjünk ki az ownCloud webfelületéről.

Csak HTTPs forgalom kényszerítése

Tekintettel arra, hogy az ownCloud webfelületén szenzitív adatok (fájlok, illetve jelszavak - köztük becsatolt külső tárterületek, szolgáltatások jelszavai) haladnak át, mindenképpen ajánlott a forgalmat https-re kényszeríteni. Noha van az ownCloudnak erre belső funkciója is, jelen leírásban ezt a wsm2 eszközeivel fogjuk megvalósítani.

  • Titkosított adatforgalom esetén célszerű, ha a virtualhostnak van hitelesített (nem self-signed) tanúsítványa.

Ha ezt a virtualhost létrehozatalakor már megadtuk a wsm2-nek, vagy nem rendelkezünk ilyennel, ez a pont kihagyható.

Ha van hitelesített tanúsítványunk, annak állományait helyezzük el azt az Apache wsm2 szerinti authentikációs könyvtárában (lecserélve a wsm2 által készített, önaláírt tanúsítványt):

/etc/apache2/auth.d/
root:root rw-r--r--  FULLY.QUALIFIED.HOSTNAME.pem   # tanúsító által aláírt szerver tanúsítvány
root:root rw-------  FULLY.QUALIFIED.HOSTNAME.key   # a tanúsítvány kérelemhez is használt privát kulcsunk
root:root rw-r--r--  FULLY.QUALIFIED.HOSTNAME.chain # tanúsító saját tanúsítványa (intermediate certificate - ha szükséges)

Érvényesítsük a konfigurációt:

systemctl reload apache2

és a https://FULLY.QUALIFIED.HOSTNAME/ weboldal (azaz az ownCloud példány nyitólapja titkosított adatkapcsolaton) böngészőben történő megtekintésével ellenőrizzük a tanúsítást.

  • Kényszerítsük a https használatát a virtualhost Apache konfigurációjában a wsm2 által előre elhelyezett rewrite aktiválásával:
-rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME.conf

[...]
        # Use to disable public http service (providing content only via https proxy).
        RewriteCond %{HTTP:X-Forwarded-For} !^.*\..*\..*\..*
        RewriteCond %{REMOTE_ADDR} !^(127\.0\.0\.1)$
        RewriteCond %{REMOTE_ADDR} !^(127\.0\.1\.1)$
        # Optionally by server IP also:
#       RewriteCond %{REMOTE_ADDR} !^(IP\.USED\.BY\.HTTPS-PROXY)$
        # Optional exception: the common client certificate may be delivered via http.
#       RewriteCond %{REQUEST_URI} !^/client.p12$
        # Protecting only a part:
#       RewriteRule ^/admin(/.*)*$ https://%{HTTP_HOST}/admin$1 [L,R,QSA]
        # Protecting whole site:
        RewriteRule ^/(.*)         https://%{HTTP_HOST}/$1 [L,R,QSA]
        # 
[...]

Ugyanitt, a virtualhost Apache ssl konfigurációjában, deklaráljuk mindig HTTP proxy útján kiszolgálandónak az ownCloud szolgáltatásait:

-rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME.conf

[...]
        <IfModule mod_rewrite.c>
            [...]
            # Application-specific rules (if any) - examples:
            ## RewriteCond %{REQUEST_URI} ^/some/path/always_https
            ## RewriteRule .* - [L,E=ViaHTTPs:1]
            ## RewriteCond %{REQUEST_URI} ^/some/path/always_http
            ## RewriteRule .* - [E=ViaHTTP:1]
            #
            # ownCloud support
            RewriteCond %{REQUEST_URI} ^/apps/contacts/carddav.php [OR]
            RewriteCond %{REQUEST_URI} ^/index.php [OR]
            RewriteCond %{REQUEST_URI} ^/ocs/ [OR]
            RewriteCond %{REQUEST_URI} ^/remote.php [OR]
            RewriteCond %{REQUEST_URI} ^/status.php
            RewriteRule .* - [E=ViaHTTP:1]
            [...]

Emellett, állítsuk a proxy lekérésekre várakozás időkorlátját a legnagyobb PHP időkorlátnál nem kisebb értékre:

-rw-r--r-- root root /etc/apache2/sites-available/FULLY.QUALIFIED.HOSTNAME.conf

        # Reverse proxy settings (delivering http via https).
        <IfModule mod_proxy.c>
            ProxyRequests off
            ProxyTimeOut 300
            [...]

Érvényesítsük a konfigurációt:

systemctl reload apache2

és a http://FULLY.QUALIFIED.HOSTNAME/ (azaz az ownCloud példány nyitólapja) böngészőben történő megtekintésével ellenőrizzük az automatikus https-re váltást.

Az ownCloud belső beállításai

Az ownCloud belső a config/config.php állományban lehet megadni (az adminisztrációs webfelületen megadott módosítások is ide kerülnek, de nincs minden paraméter oda kivezetve). Módosítsuk a telepítő által létrehozott konfigurációt az alábbiak szerint:

  • tiltjuk a belső https kényszerítést (fontos, mert külsőt alkalmazunk!);
  • nem szeretnénk a .htaccess állományok írását megengedni;
  • az ownCloud saját naplóállományát (applications' log) a telepítésnél kialakított /data/log mappába irányítjuk;
  • tiltjuk alkalmazások (modulok, kódállományok) telepítését az adminisztrátori felületről (www-data nem írhat kódot!);
  • beállítjuk a nyilvános oldalak (pl. a nyitólap) nyelvét és az időzónát;
  • előkészítjük a sminkelést;
  • virtuális alkönyvtárba irányítjuk a felhasználókkal megosztott fájlok és könyvtárak megjelenítését;
  • jelezzük az ownCloud számára, hogy a csatolt tárterületeket más szolgáltatás (pl. külső SMB) is írhatja;
  • rövidítjük a kuka életidejét és a bejelentkezési adatok megjegyzését két látogatás között.

Fentiekhez a konfigurációs állományban a $CONFIG tömböt egészítsük ki az alábbiakkal:

-rw-r----- www-data www-data /var/www/FULLY.QUALIFIED.HOSTNAME/config/config.php

$CONFIG = array (
  [...]
/* Hardened policy */
/* Force use of HTTPS connection (true = use HTTPS) */
  'forcessl' => false,
/* Under wsm2 isn't writable! */
  'check_for_working_htaccess' => false,
/* Cost-benefit decision */
  'config_is_read_only' => false,
/* Logfile moved into /data/log */
  'logfile' => $_SERVER['DOCUMENT_ROOT'].'/data/log/owncloud.log',
/* Time zone in logs (as in PHP) */
  'logtimezone' => date('e'),
/* Log level = warning */
  'loglevel' => 2,
/* Disable installing apps from the appstore */
  'appstoreenabled' => false,
/* R/O apps folder */
  'apps_paths' => array(
    0 =>
    array(
        'path'=> $_SERVER['DOCUMENT_ROOT'].'/apps',
        'url' => '/apps',
        'writable' => false,
    )
  ),
/* End of hardened policy */
/* Other customizations */
/* Local time (not UTC) in application's log */
  'logtimezone' => date('e'),
/* Default language */
  'default_language' => 'hu_HU',
/* Theme to use for ownCloud */
  'theme' => "",
/* Folder for shared with me contents */
  'share_folder' => '/Shared',
/* Filesystem isn't exclusive */
  'filesystem_check_changes' => 1,
/* Lifetime of the remember login cookie, default is 15 days */
  'remember_login_cookie_lifetime' => 60*60*24*15,
/* How long should ownCloud keep deleted files in the trash bin, default value: 30 days */
  'trashbin_retention_obligation' => 30,
);

A változtatás azonnal érvényesül (semmit nem kell újraindítani).

Ezután már elvehetjük a www-data írásjogát a modulkönyvtárról (/apps). Jó lenne ezt elvenni a konfigurációs könyvtárról (/config) és állomány(ok)ról is, de így erősen korlátoznánk az ownCloud adminisztrátori webfelületének használatát és a későbbi core frissítés sem futna le (TODO!). Jobb híján a /config/config.php tulajdonjogát adjuk át a webadmin-nak (ez amúgy is szükséges a DAV-on keresztüli web karbantartáshoz):

pwd # FULLY.QUALIFIED.HOSTNAME legyen
chmod g-w apps
chown webadmin:www-data config/config.php; chmod g+w config/config.php

Webcron beállítása

A karbantartási feladatokat a wsm2 webcron szolgáltatására bízzuk - állítsuk be a cron.php 15 percenkénti meghívását a virtualhost .htcrontab állományában:

-rw-r----- webadmin www-data /var/www/FULLY.QUALIFIED.HOSTNAME/.htcrontab

[...]
*/15 * * * * https://FULLY.QUALIFIED.HOSTNAME/cron.php

Modulok telepítése

Az ownCloud funkcionalitása beépülő modulokkal (app) bővíthető; maga a core is számos modult tartalmaz, valamint jelenleg egy halom, alapvetőnek tűnő funkció (címjegyzék, naptár, webmail) közösségi modulban van megvalósítva, tehát modulokra szükségünk lesz.

A core appokat a fájlterület kialakításakor már belinkeltük, ezeket nem kell külön telepíteni. Amennyiben a virtualhost /apps könyvtára a www-data Linux felhasználó számára írható lenne, a csak ezen ownCloud példány számára szükséges további alkalmazások kiválogatását és letöltését az adminisztrátori webfelületről is kezdeményezhetnénk. A jelen leírásban használt, szigorúbb házirend mellett a kívánt modulokat manuálisan kell letöltenünk és (pl. DAV útján) a fenti könyvtárban elhelyeznünk.

Az owncloud-addons az alábbi (az ownCloud 8.x verzióval a core-ból kikerült) modulokat már tartalmazza, így ezeket külön letölteni nem kell, egyszerűen belinkelhetjük:

  • Calendar - CalDAV naptárszolgáltatás
  • Contacts - CardDAV címjegyzék szolgáltatás.

A linkelésnél ügyeljünk a verziószámra - más-más modulverzió szükséges az egyes ownCloud 8.x, 9.x verziókhoz!

Ezeken kívül, érdemes lehet letölteni és telepíteni az alábbi modulokat:

  • Gallery Plus - képkezelő, a beépített Pictures továbbfejlesztése.
  • Search Lucene 8.0 - felhasználónkénti tartalomindexelés (helyi tartalmak).

Az alábbiak ígéretesek, de még nincs velük tapasztalat - TODO:

  • Bookmarks 8.0 - webes könyvjelzők kezelése.
  • Documents 8.0 - egyidejű dokumentumszerkesztés (mint Google Docs); jelenleg csak szöveges dokumentumot lehet szerkeszteni, és a LibreOffice backend nélkül csak nagyon primitívet, nincs pl. táblázat sem.

A letöltött modulokat egyenként, a symlinkelt core modulokkal analóg módon, az apps/modulneve könyvtárba csomagoljuk ki, és állítsuk be a jogosultságokat. DAV feltöltés esetén ezek automatikusan megfelelőek lesznek, konzolos telepítés esetén használhatjuk pl. az alábbi parancsokat:

cd /var/www/FULLY.QUALIFIED.HOSTNAME/apps
chown -R webadmin:www-data modulneve
find modulneve -type d -exec chmod 750 {} \;
find modulneve -type f -exec chmod 640 {} \;

A telepített modulokat az adminisztrációs webfelületen aktiválhatjuk.

Adminsztrátori beállítások

A http://FULLY.QUALIFIED.HOSTNAME/ böngészőben behívásával (az automatikus https-re váltás után) adminisztrátorként lépjünk be az ownCloudba.

  • A személyes menü, Személyes oldalon:
    • váltsunk magyar nyelvre.
  • Az Alkalmazások menü + jellel előhozható alkalmazásbeállító oldalon:
    • engedélyezzük a Calendar (Naptár) alkalmazást;
    • engedélyezzük a Contacts (Címjegyzék) alkalmazást;
    • engedélyezzük az External Roundcube webmail client (Külső webmail) alkalmazást;
    • engedélyezzük az External storage support (Külső tárhely támogatás) alkalmazást;
    • engedélyezzük a Full Text Search (Tartalomindexelés) alkalmazást;
    • engedélyezzük a Gallery (plus) (Képkezelés) alkalmazást;
    • az Updater (Frissítő) alkalmazás használatát korlátozzuk az admin csoportra;
    • kapcsoljuk ki a Pictures (Képek) alkalmazást;
    • opcionálisan kapcsoljuk ki a Versions (Verziókövetés) alkalmazást (? - TODO!);
    • opcionálisan kapcsoljuk ki a Deleted files (Kuka) alkalmazást (? - TODO!).
  • A személyes menü, Személyes oldalon:
    • legyen az admin teljes neve Adminisztrátor;
    • adjunk meg egy email címet, amelyet pl. elfelejtett jelszó esetén használhat az ownCloud;
    • tesztképpen töltsünk fel egy profilképet (pl. innen beszerezve).
  • A személyes menü, Adminisztráció oldalon:
    • a Külső tárolási szolgáltatások becsatolása alatt engedélyezzük a kívánt protokollokat (pl. Samba backend esetén SMB/CIFS);
    • a Federated Cloud Sharing alatt a send shares... (megosztás külső szerverrel) opciót tiltsuk le;
    • opcionálisan a Roundcube integráció alatt adjuk meg a használni kívánt külső webmail alkalmazás elnevezését és webcímét;
    • ütemezett feladatok legyenek Webcron állásban;
    • a Megosztás linkekkel beállításainál engedélyezzük az email értesítést és az alapértelmezett lejárati időt (egyéb korlátozások: TODO!).
    • az Email kiszolgáló legyen smtp, adjunk meg egy létező feladó címet (jobb híján lehet www-data@SERVER.HOSTNAME) - minden más alapértelmezésen hagyható - és teszteljük a levélküldést.

TODO!

Karbantartás

TODO! - még ne vedd komolyan!

Amanda mentés beállítása

Használjuk pl. ezt a receptet!

Kódkészlet frissítése

Tekintettel arra, hogy az ownCloud (jelenleg még) nem igazán letisztult alkalmazás, a frissítés során bármilyen gonoszság előfordulhat, így azt lehetőleg forgalommentes időben végezzük és legyen mentésünk!

A frissítést parancssori környezetben, root-ként végezzük. Ellenőrizzük a legfrissebb kiadás verzió verziószámát, és a /usr írhatóan újracsatolása után csomagoljuk ki a /usr/local/share/owncloud-versions/owncloud-X.Y.Z könyvtárba a házirend szerinti jogosultságok beállításával, pl. az alábbi parancsokkal:

mount -o remount,rw /usr  # Írni kell ide
OC_VERSION="X.Y.Z"        # Töltsük ki az aktuális verzióval!

# Kódkészlet verzió könyvtárának elkészítése
mkdir /usr/local/share/owncloud-versions/owncloud-$OC_VERSION

# Letöltés, kicsomagolás
cd /root/tmp
wget http://download.owncloud.org/community/owncloud-$OC_VERSION.tar.bz2 # linket ellenőrizni, változhat!
tar xjvf owncloud-$OC_VERSION.tar.bz2 -C /usr/local/share/owncloud-versions/owncloud-$OC_VERSION --strip-components=1

# Jogosultságok beállítása
chown -R root:www-data /usr/local/share/owncloud-versions/owncloud-$OC_VERSION
find /usr/local/share/owncloud-versions/owncloud-$OC_VERSION -type d -exec chmod 750 {} \;
find /usr/local/share/owncloud-versions/owncloud-$OC_VERSION -type f -exec chmod 640 {} \;

Core patch frissítése

A core patcheléséhez szükséges lehet az owncloud-addons tarball legfrissebb változata, amelyet innen töltsünk le, és (továbbra is írható /usr partíció mellett) könyvtárhelyesen csomagoljunk ki (ezzel egyben frissítjük a saját terjesztésű appokat is!). Lehetséges, hogy nem minden ownCloud kiadáshoz tartozik külön owncloud-addons kiadás, ez esetben a meglévő legfrissebb patchet alkalmazhatjuk (de mindenképpen kell foltoznunk!).

A /usr/local/share/owncloud-addons/patch könyvtárból válasszuk ki a telepített ownCloud verziószámának megfelelő (ennek hiányában a legfrissebb) foltot, és alkalmazzuk:

patch -p0 -d /usr/local/share/owncloud-versions/owncloud-$OC_VERSION </usr/local/share/owncloud-addons/patch/owncloud_X.Y.Z-owncloud-addons-YYYYMMDD.patch

Siker esetén állítsuk helyre az esetleg elromlott jogosultságokat:

chown -R root:www-data /usr/local/share/owncloud-versions/owncloud-$OC_VERSION
find /usr/local/share/owncloud-versions/owncloud-$OC_VERSION -type d -exec chmod 750 {} \;
find /usr/local/share/owncloud-versions/owncloud-$OC_VERSION -type f -exec chmod 640 {} \;

Ezzel a frissített közös kódkészletet aktiválásra előkészítettük.

Aktiválás

A frissítést az aktuális kódverzióra mutató symlink átírásával érvényesíthetjük:

if [ -L /usr/local/share/owncloud ]; then rm /usr/local/share/owncloud; fi
ln -s owncloud-versions/owncloud-$OC_VERSION /usr/local/share/owncloud
chown -h root:www-data /usr/local/share/owncloud

A frissítés befejezéseként csatoljuk újra csak olvashatóan a /usr partíciót:

mount -o remount /usr

Az esetleges adatbázis-frissítéseket az egyes ownCloud példányok (nyitólapjának?) következő lekérésekor az ownCloud automatikusan elvégzi.

Gyorsteszt

TODO!

Irodalom