Passbolt Passwort Manager mit Nginx

Passbolt Passwort Manager [Update]

[et_pb_section admin_label=“section“]
[et_pb_row admin_label=“row“]
[et_pb_column type=“4_4″][et_pb_text admin_label=“Text“]Einen eigenen Passwort Manager kann man mit Passbolt unter Nginx realisieren. Die App wird dabei auf dem eigenen Server gehostet.
Vorteil: Unabhängigkeit von Passwort-Diensten die in der Cloud meistens auch Geld kosten.
Nachteil: Man braucht einen eigenen Server und tiefgreifendes Wissen.

[box type=“note“ size=“large“ border=“info“]UPDATE: Aktualisiert am 07.08.2017[/box]

Setup Passbolt Passwort Manager

Voraussetzungen erfüllen

Voraussetzungen für die Installation des Passbolt Passwort Manager sind auf der Entwicklerseite gelistet. Falls notwendig – und das ist es bei dieser Installation – müssen fehlenden Packages nachinstalliert werden. Unter Umständen müssen die gpgme Entwickler-Dateien auf dem Server bereitgestellt werden, was wie folgt passieren kann:

apt install libgpgme11 libgpgme11-dev

Um zu prüfen, ob GNUPG vom Webserver/PHP unterstützt wird kann man an der Shell folgenden Befehl absetzen

php --info | grep 'gnupg support'

Code clonen

Der Ort für den Webroot, den Installationsordner für den Passbolt Passwort Manager ,unterliegt der freien Selbstbestimmung des Admins. Also legt man zunächst ein Verzeichnis an mit

mkdir -p /var/www/domain.tld/passbolt
cd /var/www/domain.tld/passbolt
git clone https://github.com/passbolt/passbolt.git .

Berechtigungen setzen

Ein häufiger Quell allen Übels sind Berechtigungen, zumal schnell der Webserver ausgesperrt wird:

chmod +w -R /var/www/domain.tld/passbolt/app/tmp
chmod +w /var/www/domain.tld/passbolt/app/webroot/img/public
chown -R www-data:www-data /var/www/domain.tld/passbolt/

Die letzte Zeile setzt die Berechtigung für den Webserver-User, entsprechend muss man hier wissen als welcher Benutzer Nginx seinen Dienst verrichtet (hier www-data).

Key generieren

Hinweis: Wenn die Entropie des Servers nicht ausreicht – Prüfung mit cat /proc/sys/kernel/random/entropy_avail – dann kann mit apt install rng-tools ein Daemon installiert werden, der bei erneuter Prüfung der Entropie mindestens einen 3-stelligen Wert zurück liefert.

gpg --gen-key

Eine Anleitung dazu ist schnell „ergoogelt“, z.b. auf den Seiten von RedHat, oder in Cyberciti.biz.

[box type=“download“ size=“large“ icon=“none“]TIP1: Sicherstellen, dass keine bestehenden Keys eliminiert werden! [/box]

[box type=“download“ size=“large“ icon=“none“]TIP2: Die Ausgabe des Befehls gpg –gen-key in einer Textdatei (zumindest copy & paste) ablegen. [/box]

[box type=“download“ size=“large“ icon=“none“]TIP3: Kein Passwort verwenden, da dies von php-gnupg nicht supportet wird.[/box]

gpg: key 08D2A7F9 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   3  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 3u
gpg: next trustdb check due at 2027-11-22
pub   2048R/08D2A7F9 2016-12-05
      Key fingerprint = 2FC8 9458 33C5 1946 E937 F9FE D47B 0811 573E E67D
uid                  Chris Moeser (The Admin) <passbolt@domain.tld>
sub   2048R/23B5F24C 2016-12-05

(Werte geändert, das Zeug sieht aber so in etwa aus)

Mit gpg -K kann der Schlüssel (oder auch die) gelistet werden.

Das Ausführen des gnupg-Befehls als root macht Nacharbeiten notwendig.

mkdir /opt/passbolt
gpg --armor --export-secret-keys your_email@domain.com > /opt/passbolt/serverkey.private.asc
gpg --armor --export your_email@domain.com > /opt/passbolt/serverkey.asc
cp -a /root/.gnupg/ /opt/passbolt/
chown -R www-data:www-data /opt/passbolt/.gnupg
chown -R www-data:www-data /opt/passbolt/*

Nginx Server Config

Update: Fehlerkorrektur – das alte Listing zeigte zweimal Port 80, was natürlich Quatsch ist. Entsprechend wurde das neue Listing angepasst. Es setzt die erfolgreiche Generierung eines SSL Zertifikats voraus.

Wenn die DNS-Einstellungen passen, kann das wie folgt geschehen:

/opt/certbot/certbot-auto certonly --standalone -d pass.domain.tld \
--pre-hook="systemctl stop nginx" --post-hook="systemctl start nginx"

Für weitere Informationen gibt es bereits eine Anleitung hier auf adminwerk.

Danach macht man sich an den Webserver. PHP-FPM wird über Sockets angesprochen. Man erstellt dazu einen neuen Pool unter /etc/php/7.0/fpm/pool.d der als listen Direktive folgenden Pfad verwendet:

listen = /run/php/php7.0-fpm.pass_php_over_socket.sock

Diesen nehmen wir gleich im Anschluss in der nginx-Konfiguration als upstream wieder auf. Heißen kann das natürlich wie man will. Übereinstimmen muss es!

upstream pass_php_over_socket {
    server unix:/run/php/php7.0-fpm.pass_php_over_socket.sock;
}

server {
    listen   80;
    server_name passbolt.domain.tld;
    # redirect to SSL
    rewrite ^(.*) http://passbolt.domain.tld$1 permanent;
}

server {
    listen   443 ssl http2;
    listen [::]443 ssl http2;

    server_name passbolt.domain.tld;

    # root directive should be global
    root   /var/www/passbolt.domain.tld/passbolt/public/app/webroot/;
    index  index.php;

    access_log /var/www/passbolt.domain.tld/log/access.log;
    error_log /var/www/passbolt.domain.tld/log/error.log;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root /html;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri $uri/ =404;
        fastcgi_pass    pass_php_over_socket;
        fastcgi_index   index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
    }

    # (optional)
    location ~ /\.ht {
        deny all;
    }

    # (optional)
    location ~* \.(?:css|js)$ {
        try_files $uri /index.php$is_args$args;
        add_header Cache-Control "public, max-age=7200";
        # Add headers to serve security related headers (It is intended to
        # have those duplicated to the ones above)
        # Before enabling Strict-Transport-Security headers please read into
        # this topic first.
        # add_header Strict-Transport-Security "max-age=15768000;
        #  includeSubDomains; preload;";
        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
        # Optional: Don't log access to assets
        access_log off;
    }

    # (optional)
    location ~* \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$ {
        try_files $uri /index.php$uri$is_args$args;
        # Optional: Don't log access to other assets
        access_log off;
    }

    # SSL Optionen
     # from https://cipherli.st/
     # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
 
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    # Let's Encrypt
    ssl_certificate /etc/letsencrypt/live/pass.domain.tld/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/pass.domain.tld/privkey.pem;
}

Code/Config anpassen

Die nachfolgenden Schritte sind absolut relevant um die Sicherheit der Installation zu gewährleisten! In der Konfigurationsdatei sind Anpassungen vorzunehmen:

core.php

cp app/Config/core.php.default app/Config/core.php

In dieser Datei sind Einstellungen vorzunehmen, die das CakePHP-Framwork benötigt. Passbolt verwendet diese nicht. vi app/Config/core.php

Configure::write('Security.salt', 'put your own salt here');
Configure::write('Security.cipherSeed', 'put your own cipher seed here');

Um die beiden Werte mit Daten zu belegen kann man z.B. doorman verwenden, oder sein Gesicht pflichtbewusst auf die Tastatur fallen lassen. In der Konfiguration steht drin, welche Zeichen das System erwartet.

Doorman RNG

Eine weitere Anpassung ist der Pfad zum Bildordner. Versendete Mails referenzieren auf dieses Verzeichnis

Configure::write('App.fullBaseUrl', 'https://pass.domain.tld'); Die zugrundeliegende Datenbank muss unter eingetragen werden. dazu beherzt:

database.php

cp app/Config/database.php.default app/Config/database.php

In der Class DATABASE_CONFIG wird dabei das Array $default angepasst.

(Einstellungen entsprechend anpassen)

public $default = array(
    'datasource' => 'Database/Mysql',
    'persistent' => false,
    'host' => 'localhost',
    'login' => 'username',
    'password' => 'password',
    'database' => 'passbolt'
);

Jetzt geht es an(s Eingemachte) die Zuweisung der GPG Keys im Code. Dazu wird die app.php angelegt, anschließend editiert (vi app.php)

app.php

cp app/Config/app.php.default app/Config/app.php

(Kommentare geben -erweiterte- Hinweise)

   'GPG' => [
     // Tell GPG where to find the keyring
     // Needs to be available by the user the webserver is running as
     'env' => [
       // you can set this to false if you want to use *nix $GNUPGHOME environment variable
       'setenv' => true,
       // otherwise you can set the location here
       // typically on Centos it would be in '/usr/share/httpd/.gnupg'
       // TIP: Der Pfad muss für den Webserver-Benutzer erreichbar sein, sonst bricht die 
       // Installation ab!
       'home' => '/opt/passbolt/.gnupg',
     ],
     // Main server key
     'serverKey' => [
       // Server private key location and fingerprint
       // TIP: Diese Informationen haben wir oben erhalten.

       'fingerprint' => '2FC8945833C51946E937F9FED47B0811573EE67D',
       'public' => '/opt/passbolt/serverkey.asc', 
       'private' => '/opt/passbolt/serverkey.private.asc',

       // PHP Gnupg module currently does not support passphrase, please leave blank
       'passphrase' => ''
     ]
   ]

email.php

Einstellungen innerhalb des $default-Arrays werden auf den entsprechenden Mailserver zugeschnitten.

Installation

Die Ausführung des Befehls

app/Console/cake install --no-admin

nimmt die Installation vor, die fehlerfrei beendet wird, wenn alle Rahmenparameter passen. ein Admin wird dabei zunächst nicht erstellt. Dies folgt im Anschluss.

Passbolt installation success! Enjoy! ☮

Adminbenutzer anlegen

Geschieht wie die Installation an der Kommandozeile mit dem Befehl

app/Console/cake passbolt register_user -u foo@bar.com -f Chris -l Moeser -r admin

und wird auch an der Kommandozeile quitiert! Die nachfolgende Ausgabe ist entsprechend modifiziert

The user has been registered with success, to complete the registration process follow the link : http://pass.domain.tld/setup/install/82735282-729c-3g7c-ab87-2725a8e82c5b/cc9c1918-ce8f-44e1-af96-9f48a86d7c38
The user has been notified by email to complete his registration process.

Done!

Passbolt Firefox

Quellen

[/et_pb_text][/et_pb_column]
[/et_pb_row]
[/et_pb_section]


Beitrag veröffentlicht

in

, , , ,

von

Schlagwörter: