Anmerkungen zu #prosody auf #Xenial mit Letsencrypt und LDAP vs. AD

Bevor ich’s vergesse, mal kurz meine Gedanken zum Thema der Überschrift. Ich bin dank der intelligenten Suchmaschine Google und nicht auffindbarer Dokumentation mit Prosody mal in zwei Punkten aber mal gewaltig vor die Wand gefahren, hab’s anschließend aber „gelöst gefunden bekommen“.

Vorweg: Ich habe von Prosody null Ahnung. Dokumentiere hier nur, wie ich durchs Netz gestolpert bin auf der Suche nach Informationen für das fertige Resultat. Achso. Cyrus SASL geht nicht. Wäre schön zu wissen gewesen, dass ich mod_auth_ldap nehmen soll, war aber nicht dokumentiert oder nur so versteckt, dass ich’s nicht gefunden habe. Zudem fehlte mir die Info, wie ich’s bedienen soll. Im hinterletzten Winkel des Netzes entdecke ich dann auch noch, dass prosody die fullchain.pem von Letsencrypt will. Na sauber. Weiß man das alles, geht’s auch. SO als Proof of Concept gedacht hier, auf dass ich’s nicht wieder vergesse.

Versionsvergleich – 16.04.2 aus 2016/09:

cat /proc/version
Linux version 4.4.0-36-generic (buildd@lcy01-01) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2) ) #55-Ubuntu SMP Thu Aug 11 18:01:55 UTC 2016

so weißt Du gleich, ob Du diese Doku hier verwerfen kannst oder es noch Sinn macht.

Annahmen:

Jabberdomäne: servername.jabberdomain.tld (ändern gegen Deine Hütte)
Lokale Domäne: domain.local (ändern gegen Deine Domain)
Domänencontroller: domaincontroller.domain.local (ändern gegen Deinen DC)


(!) User befinden sich in einer OU ohne Dienstkonten und administrative Berechtigungen um BaseDN kleinzumachen (ich weiß nicht, wie dicht das alles hier ist)

(!) Das genutzte Konto für LDAP talk ist "service.name" und hat lediglich AD-Leseberechtigungen sonst nix weiter

(!) Allet hier mit sudo

 

Türsteher Bescheid geben, dass nachfolgende Dienste TCP zum Horst Jabber wollen (Firewall):

TCP 5222
TCP 5223
TCP 5269
TCP 5280
TCP 5281

Den Leuten draußen und drinnen Bescheid geben, dass da wirklich neue Dienste kommen (DNS)

_xmpp-client._tcp.jabberdomain.tld.   3600 IN SRV     0 5 5222   servername.jabberdomain.tld
_xmpp-server._tcp.jabberdomain.tld.   3600 IN SRV     0 5 5269   servername.jabberdomain.tld

Pakete reintragen

apt update && apt install prosody lua-dbi-mysql lua-sql-mysql lua-sec mercurial python-letsencrypt-apache sasl2-bin libsasl2-modules-ldap lua-ldap lua-cyrussasl

(Noch mit den Cyrus-SASL komponenten, sofern’s denn mal wieder geht nehme ich lieber das, da kann ich wenigstens nach Gruppen filtern, in mod_auth_ldap nur nach BaseDN)


Banküberfall machen

MySQL zumachen

mysql_secure_installation

Datenbank aufmachen

mysql -u root -p

[alert type=“general“ accent_color=““ background_color=““ border_size=“1px“ icon=“fa-exclamation-triangle“ box_shadow=“yes“ animation_type=“0″ animation_direction=“down“ animation_speed=“0.1″ animation_offset=““ class=““ id=““]mySQL-Geraffel zu Fuß, wenn Copy&Paste nicht will. Im Regelfall knallt das mit den ‚hochkommata‘.[/alert]

Nutzer reintun

create user 'prosody'@'localhost' identified by 'BITTEAENDERN';

Datenbank anlegen

create database prosody;
grant all on prosody.* to 'prosody'@'localhost';
quit;

Module für Prosody abholen (alle, aus Faulheit)

cd /user/local
hg clone https://hg.prosody.im/prosody-modules/ prosody-modules


PROSODY CONFIG (Prosody.cfg.lua)

Prosody Config editieren

/etc/prosody/prosody.cfg.lua

Zeile Storage:

storage = "sql" -- Default is "internal" (Debian: "sql" requires one of the
-- lua-dbi-sqlite3, lua-dbi-mysql or lua-dbi-postgresql packages to work)

Zeile SQL

Das auskommentieren entfernen und Kennwort korrigieren:

sql = { driver = "MySQL", database = "prosody", username = "prosody", password = "BITTEAENDERN", host = "localhost" }

Plugin Pfade aus Mercurial in die Config irgendwo wo’s Sinn macht reintun:

plugin_paths = { "/usr/local/prosody-modules" }

Module bei Module dazutun – denke mal, das muss so

modules_enabled = {

        -- Generally required
                "auth_ldap"; -- JOHN HAT HIER LDAP DRIN

Zeile Auth ändern und den Rest hinten unter authentication hinterherschreiben (ich weiß mangels adäquater Doku im Moment nicht, ob er den Kram aus der vhost-config nimmt oder aus der globalen, doppelt gemoppelt hält besser, also gleich auch nochmal in der vhost)

authentication = "ldap"
ldap_server = "domaincontroller.domain.local"
ldap_rootdn = "CN=service name,OU=USERS,DC=domain,DC=local"
ldap_password = "BITTEAENDERN"
ldap_filter = "(mail=$user@$host)"
ldap_scope = "subtree"
ldap_tls = true;
ldap_base = "OU=USERS,OU=DOMAIN,DC=domain,DC=local"
ldap_mode = "bind"


VHOST CONFIG (inkludiert oben)

VHost anlegen für (myjabberdomain.tld und ad-domain domain.local)

cp /etc/prosody/conf.avail/example.com.cfg.lua /etc/prosody/conf.avail/servername.jabberdomain.tld.cfg.lua

vhost config editieren

/etc/prosody/conf.avail/servername.jabberdomain.tld.cfg.lua
-- Section for example.com

VirtualHost "jabberdomain.tld"

authentication = "ldap"
        ldap_base="dc=domain,dc=local"
        ldap_server="domaincontroller.tld.local"
        ldap_rootdn="service.name@domain.local"
        ldap_password="mypassword"
        ldap_filter="sAMAccountName=$user"
        ldap_scope="subtree"
        ldap_tls="false"
        ldap_mode="bind"

        -- Assign this host a certificate for TLS, otherwise it would use the one
        -- set in the global section (if any).
        -- Note that old-style SSL on port 5223 only supports one certificate, and will always
        -- use the global one.
        ssl = {
                key = "/etc/prosody/certs/privkey.pem";
                certificate = "/etc/prosody/certs/fullchain.pem";
                }

 modules_enabled = {
            "bosh";
            "pubsub";
            "ping"; -- Enable mod_ping
        }


------ Components ------
-- You can specify components to add hosts that provide special services,
-- like multi-user conferences, and transports.
-- For more information on components, see http://prosody.im/doc/components

-- Set up a MUC (multi-user chat) room server on conference.example.com:
-- Component "conference.example.com" "muc"

-- Set up a SOCKS5 bytestream proxy for server-proxied file transfers:
--Component "proxy.example.com" "proxy65"

---Set up an external component (default component port is 5347)
--Component "gateway.example.com"
--      component_secret = "password"

VHOST symlinken

ln -sf ../conf.avail/servername.jabberdomain.tld.cfg.lua /etc/prosody/conf.d/servername.jabberdomain.tld.cfg.lua


Ausweise stricken

sudo letsencrypt --apache -d servername.jabberdomain.tld

(ja auch für’n Apachen, dann kann ich da so ’ne schicke Webseite draufbürsten). Email eintragen



Aufgabenplan schreiben

#!/bin/bash
letsencrypt="/etc/letsencrypt/live/servername.jabberdomain.tld/"
certs="/etc/prosody/certs/"
prosody="/etc/prosody/"
/usr/bin/letsencrypt renew >> /var/log/le-renew.log

   find "${letsencrypt}" -name "*.pem" | while read -r file

do
   cp "${file}" "${certs}"
   chown -R prosody:prosody "${prosody}"
   chmod -R 700 "${certs}"
   service prosody restart
done

Script fahrbar machen

chmod +x aufgabenplan.sh

Aufgaben aufmachen

crontab -e

Nano nehmen und Aufgabe eintragen

30 2 * * 1 /pfadzumscript/aufgabenplan.sh

Testen und nachsehen

Hütte durchpusten oder script einmalig ausführen und prosody neu starten

aufgabeplan.sh
service prosody restart

Anmelden mit Adium

Im Protokoll nachsehen

cat /var/log/prosody/prosody.log

Bei https://xmpp.net servername.jabberdomain testen

Bei nichtgefallen in der Config nachpflegen

ciphers = "kECDH:HIGH:!MEDIUM:!LOW:!NULL:!DSS:!AES128-SHA:!AES128-SHA256:!CAMELLIA128-SHA:!aNULL@STRENGTH";

Nochmal bei https://xmpp.net servername.jabberdomain testen

Freuen.