Dateien browsen mittels HTTPS

Hinweis:
Diese Seite gibt meinen Wissensstand von ca. 2014 wieder und sollte heutzutage nicht mehr als Blaupause für das Anlegen eines Fileservers genutzt werden. Für eine Anleitung, die erst später veraltet sein wird, bitte die übergeordnete Seite betrachten. ;-)

Als Nächstes steht die Konfiguration des Webservers auf dem Plan. Dazu wird dieser zuerst installiert:

# pacman -S apache

Die Konfiguration liegt im Verzeichnis /etc/httpd/conf/. In dem Tutorial Step by Step: Configuring SSL Under Apache werden Zertifikat und Server-Key getrennt voneinander dort abgelegt, weil dies der Default-Konfiguration des Webservers entspricht. Ob man das am Ende genauso macht bleibt letztlich jedem selbst überlassen. Der Konsistenz halber mache ich das genauso wie bei vsftpd (im Prinzip kann man sogar dasselbe Zertifikat benutzen).

# openssl req -new -x509 -days 365 -sha1 -newkey rsa:1024 -nodes -keyout /etc/ssl/certs/httpd.pem -out /etc/ssl/certs/httpd.pem
[...]
# chmod 600 /etc/ssl/certs/httpd.pem
# openssl x509 -fingerprint -in /etc/ssl/certs/httpd.pem -noout
SHA1 Fingerprint=8C:E6:C1:A1:D8:69:D3:1D:6A:86:07:1E:7B:6E:67:BA:3B:80:49:90
# vi /etc/httpd/conf/httpd.conf

Die Beispiel-Konfiguration ist bereits ein wahres Monster. Wenn man dieser folgt, dann würde man die Konfigurationsdatei extra/httpd-ssl.conf einbinden und zusätzlich zum normalen Webserver auf Port 80 einen virtuellen Webserver auf Port 443 erhalten, der SSL macht. Das ist jedoch für unseren Anwendungsfall Quatsch und vergrößert nur die Angriffsfläche. Stattdessen werden wir die bestehende Konfiguration umbauen.

#Listen 80
User felix
Group users
DocumentRoot "/srv/http"
<Directory "/srv/http">
    Options Indexes FollowSymLinks
    AllowOverride None
#Require all granted
    AuthName "My files"
    AuthType Basic
    AuthUserFile /etc/httpd/conf/auth_file
    Require valid-user
</Directory>

Zuerst kommentieren wir die Listen-Anweisung für Port 80 aus. Danach werden die existierenden Einträge User und Group geändert. Damit läuft der Webserver mit genau den Privilegien, die der normale User-Account hat -- das ist notwendig, weil sämtliche Dateizugriffsrechte ebenfalls auf diesen User laufen.

DocumentRoot und der dazugehörige Directory-Eintrag bleiben auf /srv/http stehen. Details siehe unten.

Der nächste Abschnitt sorgt für den Zugriffsschutz. Zwar wollen wir, dass die Dateien per HTTPS durchsuchbar sind, aber natürlich soll das nicht jeder können. Für diesen Zweck reicht Basic Authentication dicke aus, denn die Übertragung der Login-Daten ist ja durch das SSL geschützt. (Das sieht übrigens auch die Apache-Dokumentation zu mod_auth_digest so.)

Als Nächstes habe ich die Konfiguration aus extra/httpd-ssl.conf direkt unterhalb des auskommentierten "Listen 80" eingefügt und auf das Folgende abgespeckt:

Listen 443

SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLPassPhraseDialog  builtin
SSLSessionCache        "shmcb:/run/httpd/ssl_scache(512000)"
SSLSessionCacheTimeout  300
SSLEngine on
SSLCertificateFile "/etc/ssl/certs/httpd.pem"
SSLCertificateKeyFile "/etc/ssl/certs/httpd.pem"
BrowserMatch "MSIE [2-5]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

Jetzt müssen noch die folgenden Module geladen werden:

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so

Als letzter Schritt wird die in der Konfiguration angekündigte Datei /etc/httpd/conf/auth_file angelegt und der Service gestartet. (Die Passwort-Datei sollte mit normalen Benutzerrechten angelegt werden, damit sie dem richtigen Benutzer gehört).

# htpasswd -cs /etc/httpd/conf/auth_file felix
New password:
Re-type new password:
Adding password for user felix
# chown felix:users /etc/httpd/conf/auth_file
# chmod 600 /etc/httpd/conf/auth_file
# systemctl start httpd.service

Wir werden später die SVN-Repositories über den URL https://filebox/svn zugängig machen. Damit es nicht zu Überdeckungen von Verzeichnissen bzw. Dateien kommt, sollen die auf dem Server abgelegten Dateien über https://filebox/files erreichbar sein. Außerdem soll für den Fall, dass nur https://filebox/ angegeben wird, eine Art Startseite mit Links auf die (logischen) Unterverzeichnisse angezeigt werden.

Zu diesem Zwecke legen wir in /srv/http, das per Directory-Eintrag bzw. DocumentRoot als "/" angezeigt wird, einen symbolischen Link auf /mnt/files an. Außerdem wird eine Datei mit Namen index.html angelegt, die als Startseite dient.

# cd /srv/http
# ln -s /mnt/files
# vi index.html

<html>
  <head>
    <title>My stuff</title>
  </head>
  <body>
    <h1>My stuff</h1>
    <ul>
      <li><a href="files/">files/</a></li>
      <li><a href="svn/">svn/</a></li>
    </ul>
  </body>
</html>

Damit ist die grundlegende Konfiguration abgeschlossen. Wer allerdings etwas mehr Zeit investieren kann, der sollte sich die httpd.conf noch mal genau ansehen und evtl. nicht benötigen Krempel entfernen. Die Dokumentation auf der Apache-Webseite ist ziemlich gut, aber das Thema ist auch sehr umfangreich.


Zurück zur Hauptseite