Owncloud 7 mit Truecrypt verschlüsselung und SSL unter Ubuntu 14.04 installieren

logoDurch verschiedene „angebliche“ Hacks sind öffentliche Cloud-Dienstleister ja wieder einmal ordentlich in die Kritik gerückt worden. Aus diesem Grund erkläre ich hier, wie man seine eigene private Cloud unter einem Ubuntu Server installieren kann.
Die kostenfreie owncloud Software dient uns dafür als Basis für unsere Cloud. Zur Synchronisation von Dateien, Kontakten, Fotos, Kalendern etc. gibt es verschiedene Apps für Windows, Linux, Unix, Android und iOS.
Unsere Daten speichern wir in einem verschlüsseltem Truecrypt Container und können die einzelnen Dateien zusätzlich noch einmal per Server-Side-Encryption verschlüsseln.
Die beste Verschlüsselung hilft natürlich nichts, wenn man einfache Passwörter benutzt.
Die Installation von Owncloud 7 tätige ich auf einem Ubuntu Server 14.04 – das ganze funktioniert aber zum Beispiel auch mit einem Raspberry Pi!
Also Schritt 1: Truecrypt installieren über PPA:

add-apt-repository ppa:stefansundin/truecrypt
apt-get update && apt-get install truecrypt

Truecrypt Volume erstellen:

truecrypt –create

[EXPAND Truecrypt Container erstellung]
truecrypt –create
Volume type:
1) Normal
2) Hidden
Select [1]: 1
Enter volume path: /media/hdd1tb/container.tc
Enter volume size (sizeK/size[M]/sizeG): 300G
Encryption algorithm:
1) AES
2) Serpent
3) Twofish
4) AES-Twofish
5) AES-Twofish-Serpent
6) Serpent-AES
7) Serpent-Twofish-AES
8) Twofish-Serpent
Select [1]:
Hash algorithm:
1) RIPEMD-160
2) SHA-512
3) Whirlpool
Select [1]:
Filesystem:
1) None
2) FAT
3) Linux Ext2
4) Linux Ext3
5) Linux Ext4
Select [2]: 5
Enter password:
Re-enter password:
Enter keyfile path [none]:
Please type at least 320 randomly chosen characters and then press Enter
[/EXPAND]
Truecrypt Volume mounten:

truecrypt -m /media/hdd1tb/container.tc /media/data

Für Owncloud vorbereiten:

mkdir /media/data/oc
touch /media/data/oc/.ocdata
chown www-data:www-data /media/data/oc

Für die owncloud Installation gibt es 2 Möglichkeiten: Entweder via apt-get install owncloud oder manuell.
Ich beschreibe den manuellen weg, dass ist nicht umständlicher und man weiß besser was im Hintergrund passiert und was die Default-Pfade sind.
Manuelle Owncloud installation:
1. Notwendige Abhängigkeiten installieren:

sudo apt-get install apache2 mysql-server libapache2-mod-php5
sudo apt-get install php5-gd php5-json php5-mysql php5-curl
sudo apt-get install php5-intl php5-mcrypt php5-imagick phpmyadmin

Hinweis: Um alle Funktionen nutzen zu können, wird über apt vorgeschlagen die folgenden Pakete zusätzlich noch zu installieren. Ich würde dies erst einmal nicht machen, und nur dass installieren, was später auch wirklich benötigt wird.
[Expand weitere Abhängigkeiten]
ca-certificates-java dbus-x11 default-jre default-jre-headless
desktop-file-utils dictionaries-common fonts-dejavu fonts-dejavu-extra
fonts-font-awesome fonts-liberation fonts-opensymbol fonts-sil-gentium
fonts-sil-gentium-basic gconf-service gconf-service-backend gconf2
gconf2-common gdisk ghostscript gsfonts gvfs gvfs-common gvfs-daemons
gvfs-libs hunspell-en-us icedtea-7-jre-jamvm imagemagick-common java-common
libao-common libao4 libasound2 libasound2-data libasyncns0 libatasmart4
libatk-wrapper-java libatk-wrapper-java-jni libav-tools libavahi-glib1
libavcodec54 libavdevice53 libavfilter3 libavformat54 libavresample1
libavutil52 libbonobo2-0 libbonobo2-common libboost-date-time1.54.0
libboost-system1.54.0 libcaca0 libcanberra0 libcdio-cdda1 libcdio-paranoia1
libcdio13 libcdr-0.0-0 libclucene-contribs1 libclucene-core1 libcmis-0.4-4
libcolamd2.8.0 libcupsfilters1 libcupsimage2 libdc1394-22
libexttextcat-2.0-0 libexttextcat-data libfftw3-double3 libflac8 libfontenc1
libgconf-2-4 libgconf2-4 libgif4 libglu1-mesa libgnome2-0 libgnome2-bin
libgnome2-common libgnomevfs2-0 libgnomevfs2-common libgs9 libgs9-common
libgsm1 libgstreamer-plugins-base1.0-0 libgstreamer1.0-0 libharfbuzz-icu0
libhsqldb1.8.0-java libhunspell-1.3-0 libhyphen0 libicu52 libidl-common
libidl0 libijs-0.35 libjack-jackd2-0 libjbig2dec0 libjs-chosen
libjs-dojo-core libjs-dojo-dijit libjs-dojo-dojox libjs-jcrop
libjs-jquery-minicolors libjs-jquery-timepicker libjs-pdf libjs-sphinxdoc
libjs-twitter-bootstrap liblangtag-common liblangtag1 libldb1 liblqr-1-0
libmagickcore5 libmagickwand5 libmhash2 libmp3lame0 libmspub-0.0-0
libmythes-1.2-0 libneon27-gnutls libnspr4 libnss3 libnss3-1d libnss3-nssdb
libntdb1 liboauth-php libogg0 libopenjpeg2 libopus0 liborbit-2-0 liborbit2
liborc-0.4-0 liborcus-0.6-0 libpaper-utils libpaper1 libphp-pclzip
libphp-phpmailer libpoppler44 libpulse0 libpython3.4 libraptor2-0 librasqal3
libraw1394-11 librdf0 libreoffice libreoffice-avmedia-backend-gstreamer
libreoffice-base libreoffice-base-core libreoffice-base-drivers
libreoffice-calc libreoffice-common libreoffice-core libreoffice-draw
libreoffice-gnome libreoffice-gtk libreoffice-impress
libreoffice-java-common libreoffice-math libreoffice-pdfimport
libreoffice-report-builder-bin libreoffice-sdbc-firebird
libreoffice-sdbc-hsqldb libreoffice-style-galaxy libreoffice-style-human
libreoffice-writer libsamplerate0 libschroedinger-1.0-0 libsdl1.2debian
libsecret-1-0 libsecret-common libservlet3.0-java libsmbclient libsndfile1
libspeex1 libswscale2 libtalloc2 libtdb1 libtevent0 libtheora0
libtidy-0.99-0 libudisks2-0 libva1 libvisio-0.0-0 libvorbis0a libvorbisenc2
libvorbisfile3 libwbclient0 libwpd-0.9-9 libwpg-0.2-2 libwps-0.2-2
libx264-142 libxaw7 libxcb-shape0 libxfont1 libxft2 libxmu6 libxmuu1
libxslt1.1 libxt6 libxv1 libxvidcore4 libxxf86dga1 libyajl2
libzend-framework-php lp-solve mediawiki-classes openjdk-7-jre
openjdk-7-jre-headless owncloud owncloud-doc php-aws-sdk php-crypt-blowfish
php-doctrine-common php-dompdf php-dropbox php-font-lib php-getid3
php-google-api-php-client php-guzzle php-irods-prods php-opencloud
php-patchwork-utf8 php-pear php-phpdocx php-sabre-dav php-sabre-vobject
php-seclib php-services-json php-symfony-console php-symfony-eventdispatcher
php-symfony-routing php-tcpdf php-xml-parser php5-apcu php5-curl
php5-imagick php5-intl php5-ldap php5-oauth php5-tidy php5-xsl
policykit-1-gnome poppler-data python-crypto python-ldb python-ntdb
python-samba python-talloc python-tdb python3-uno samba-common
samba-common-bin samba-libs sdop smbclient sound-theme-freedesktop
ttf-dejavu-core tzdata-java udisks2 uno-libs3 ure vorbis-tools x11-utils
xfonts-encodings xfonts-mathml xfonts-utils zend-framework
zend-framework-bin[/Expand]
2. Owncloud herunterladen, entpacken und verschieben

cd /tmp/
wget https://download.owncloud.org/community/owncloud-7.0.2.tar.bz2
tar xfvj owncloud-7.0.2.tar.bz2
mv owncloud /var/www/html/
chown www-data:www-data -R /var/www/html/owncloud/

3. Jetzt über phpmyadmin eine Datenbank & Benutzer für Owncloud erstellen
4. Owncloud installieren http://meinserver.de/owncloud
Als Datenpfad geben wir unser Mountpunkt des Truecryptcontainers an, z.B. /media/data/oc
Das sollte jetzt erst einmal funktionieren, dann können wir anschließend noch mit der SSL-Verschlüsselung weitermachen.
Um nicht ein selbst-signiertes Zertifikat nutzen zu müssen, verwende ich ein kostenloses Start-SSL Zertifikat. Mann kann sich dort umsonst ein Konto erstellen, nachdem man seine persönlichen Daten angegeben hat und nach erfolgreicher Validierung auch Zertifikate für seine Domain erstellen.
SSL Aktivieren und Zertifikat erzeugen:

a2enmod ssl
service apache2 restart

Zertifikatskey und Request erstellen:

mkdir /etc/apache2/ssl
cd /etc/apache2/ssl
openssl genrsa -out certificate.key 4096

Für den Key würde ich persönlich kein Passwort festlegen, weil man sonst bei jedem Apache neustart dieses Passwort eingeben müsste.
Zertifikats Request erzeugen:

openssl req -new -key certificate.key -out myserver.de.csr
vi myserver.de.csr

Mit diesem Request kann man sich nun bei startssl.com ein Zertifikat erzeugen, dieses dann unter /etc/apache2/ssl/certificate.cer abspeichern.
Nun müssen noch die Root-Zertifikate der Zertifizierungsstelle heruntergeladen werden. Bei StartSSL sind das die folgenden:

wget --no-check-certificate https://www.startssl.com/certs/sub.class1.server.ca.pem
wget --no-check-certificate https://www.startssl.com/certs/ca.pem

Nun die Apache Konfiguration anpassen:

vi /etc/apache2/sites-available/default-ssl.conf

Hier folgende Einträge setzen (Pfade ggf. anpassen):

ServerAdmin webmaster@deineDomain.de
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/certificate.cer
SSLCertificateKeyFile /etc/apache2/ssl/certificate.key
SSLCertificateChainFile /etc/apache2/ssl/sub.class1.server.ca.pem
SSLCACertificateFile /etc/apache2/ssl/ca.pem

Anschließend die SSL Konfiguration aktivieren und Apache neustarten:

a2ensite default-ssl.conf
service apache2 reload

Wenn hier keine Fehlermeldung kommt dann sieht alles gut aus.
Anschließend mal die Seite über https aufrufen:
https://meinServer.de/owncloud
Im Browser müsste dass dann wie folgt aussehen:
ssl
In den Owncloud Einstellungen würde ich jetzt noch die Option „Enforce HTTPS Encryption aktivieren“, dann wird keine unverschlüsselte HTTP Verbindung mehr benutzt.
Dateibasierte Verschlüsselung aktivieren:
Zusätzliches gibt es ein Encryption Modul innerhalb von Owncloud, was die Dateien selbst nochmal verschlüsselt:
encryptionrecovery-key
Nach dem aktivieren des Modules muss man sich neu anmelden, dabei werden die Verschlüsselungskeys erzeugt.
Unter den Einstellungen kann man zusätzlich noch ein Recovery Key eingeben, mit dem man im Notfall die einzelnen Dateien entschlüsseln kann.