{"id":633,"date":"2018-03-19T03:15:44","date_gmt":"2018-03-19T02:15:44","guid":{"rendered":"http:\/\/www.instruyete.org\/?p=633"},"modified":"2019-08-26T23:16:31","modified_gmt":"2019-08-26T22:16:31","slug":"kerberos-kdc-replication-mit-systemd-units","status":"publish","type":"post","link":"https:\/\/www.instruyete.org\/?p=633","title":{"rendered":"Kerberos KDC replication mit systemd units"},"content":{"rendered":"<p>Um eine automatische Replikation des prim\u00e4ren Kerberos KDC mit dem sekund\u00e4ren zu erzielen, m\u00fcssen auf beiden Rechner systemd service units eingerichtet werden. Zumindest unter Ubuntu 16.04 LTS sind diese in keinster Weise vorhanden, weswegen hier auf die Einrichtung eingangen wird.<\/p>\n<p><strong>Service Unit auf dem sekund\u00e4ren (slave) KDC<\/strong><\/p>\n<p>Auf dem slave KDC muss eigentlich lediglich der kpropd service als stand-alone Instanz gestartet werden. Urspr\u00fcnglich war der kpropd service auf den <em>(x)inetd<\/em> master-daemon ausgelegt. Da dieser mittlerweile fast obsolet wurde benutzen wir den stand-alone service, der ab Version 1.11 des kpropd automatisch erkannt wird.<br \/>\nF\u00fcr das automatische Starten w\u00e4hrend des Boot-Vorgangs ben\u00f6tigt man mittlerweile ein <em>systemd service unit file<\/em>, das in unserem Fall folgenderma\u00dfen aussieht.<\/p>\n<p><code><br \/>\n[Unit]<br \/>\nDescription=Krb5-KDC replication service<br \/>\nRequires=krb5-kdc.service<br \/>\nAfter=network-online.target<br \/>\nWants=network-online.target<\/code><\/p>\n<p><code><code><\/code><\/code><\/p>\n<p>[Service]<br \/>\nExecStart=\/usr\/sbin\/kpropd<br \/>\nType=forking<br \/>\nReadOnlyDirectories=\/<br \/>\nReadWriteDirectories=\/var\/tmp \/tmp \/var\/lib\/krb5kdc \/var\/run \/run \/var\/log<\/p>\n<p><code><br \/>\n<\/code><\/p>\n<p><code>[Install]<br \/>\nWantedBy=multi-user.target<br \/>\n<\/code><\/p>\n<p>Ein Verifikation mit dem systemd hauseigenen Tool sollte keine syntaktischen Fehler ergeben.<br \/>\n<code><br \/>\nsystemd-analyze verify kpropd.service<br \/>\n<\/code><br \/>\nAuf dem Weg zu der hier abgebildeten <em>service unit<\/em>, gab es zwei gro\u00dfe Stolpersteine, welche syntaktisch aber einwandfrei waren, weswegen das verificiation Tool hierbei keine Hilfestellung leisten konnte.<br \/>\nDer erste war die Direktive<br \/>\n<code>Type=forking<\/code><br \/>\nNur damit kann der <em>systemd<\/em> erkennen, dass es ein typischer geforkter UNIX daemon ist, der nicht sofort als <em>dead<\/em> (vom Startprozess her) markiert wird. Die Alternative w\u00e4re das Setzen des <strong>-d<\/strong> (debug) flags, der den Startprozess permanent als ein <em>foreground<\/em> Prozess beh\u00e4lt.<br \/>\nDer zweite, noch gr\u00f6\u00dfere Stolperstein, kommt von den unterschiedlichen <em>After<\/em>\/<em>Wants<\/em> Direktiven. In den meisten Tutorials \u00fcber systemd wird immer auf<br \/>\n<code>After=network.target<\/code><br \/>\nverwiesen, was in diesem Fall zu einem gescheiterten Start von kpropd f\u00fchrt, beispielhaft ausgef\u00fchrt an folgendem syslog Eintrag.<\/p>\n<p><code><br \/>\nMar 18 21:57:30 aurora systemd[1]: Started Light Display Manager.<br \/>\nMar 18 21:57:30 aurora systemd[1]: Started Raise network interfaces.<br \/>\nMar 18 21:57:30 aurora systemd[1]: Reached target Network.<br \/>\nMar 18 21:57:30 aurora systemd[1]: Started Unattended Upgrades Shutdown.<br \/>\nMar 18 21:57:30 aurora systemd[1]: Started Krb5-KDC replication service.<br \/>\nMar 18 21:57:30 aurora systemd[1]: Started BIND Domain Name Server.<br \/>\nMar 18 21:57:30 aurora kpropd[1073]: ready<br \/>\nMar 18 21:57:30 aurora systemd[1]: Reached target Host and Network Name Lookups.<br \/>\nMar 18 21:57:30 aurora kpropd[1073]: getaddrinfo: Der Name oder der Dienst ist nicht bekannt<br \/>\nMar 18 21:57:30 aurora systemd[1]: Starting OpenBSD Secure Shell server...<br \/>\nMar 18 21:57:30 aurora systemd[1]: kpropd.service: Main process exited, code=exited, status=1\/FAILURE<br \/>\nMar 18 21:57:30 aurora systemd[1]: kpropd.service: Unit entered failed state.<br \/>\nMar 18 21:57:30 aurora systemd[1]: kpropd.service: Failed with result 'exit-code'.<br \/>\n<\/code><\/p>\n<p>Das Netzwerk ist &#8222;irgendwie&#8220; schon vorhanden, aber es scheint der resolver Mechanismus (getaddrinfo) noch nicht richtig zu Arbeiten.<br \/>\nDie L\u00f6sung h\u00e4lt dieser <a title=\"Running Services After the Network is up\" href=\"https:\/\/www.freedesktop.org\/wiki\/Software\/systemd\/NetworkTarget\/\">systemd Eintrag von freedesktop.org<\/a> bereit. Entscheidend ist die \u00c4nderung in:<br \/>\n<code>After=network-online.target<\/code><br \/>\nPikanterweise gab es unter Ubuntu aber auch hier wohl einige Zeit eine Unstimmigkeit, bzgl. des resolver Mechanismus unter diesem (passiven) Target, wie man <a title=\"systemd-resolved not available after network-online.target\" href=\"https:\/\/github.com\/systemd\/systemd\/issues\/5650\">hier<\/a> nachlesen kann.<br \/>\nErw\u00e4hnenswert ist noch, dass man den Dienst theoretisch auch ohne root-Rechte starten k\u00f6nnte, wenn man das Capability Feature von Linux nutzt. Dazu setzt man im <strong>[Service]<\/strong> Block des unit files folgende Direktive &#8211; in diesem Fall handelt es sich im das Portbinding, welches beim kpropd \u00fcbrigens auf TCP-Port 754 stattfindet.<br \/>\n<code><br \/>\nCapabilityBoundingSet=CAP_NET_BIND_SERVICE<br \/>\n<\/code><\/p>\n<p><strong>Service Unit auf dem prim\u00e4ren (master) KDC<\/strong><\/p>\n<p>Auf dem primary KDC muss kontinuierlich ein aktueller Dump dem secondary geschickt werden. Das erzeugen des dumps sowie der transmit Befehl sind in folgenden script (kprop.sh) verpackt:<br \/>\n<code><br \/>\n#!\/bin\/bash <\/code><\/p>\n<p><code><code><\/code><\/code><\/p>\n<p># starts the krb5kdc propagation to the secondary KDC<br \/>\n# location of dumpfile and secondary KDC are taken from the<br \/>\n# following variables<\/p>\n<p><code><code><\/code><\/code><\/p>\n<p>dumpfile=\/var\/lib\/krb5kdc\/kdb_repldata<br \/>\nkdcslave=aurora<\/p>\n<p><code><code><\/code><\/code><\/p>\n<p>kdb5_util dump $dumpfile<br \/>\nif [ $? == 0 ]; then<br \/>\nkprop -f $dumpfile $kdcslave<br \/>\nfi<\/p>\n<p><code><br \/>\n<\/code><\/p>\n<p><code>exit $?<br \/>\n<\/code><br \/>\nUm diese Aktion frequentiert aufzurufen, kann man nat\u00fcrlich die globale crontab bem\u00fchen. Es geht aber auch mit kleinen Vorteilen im systemd \u00d6kosystem. Dazu braucht man allerdings dann 2 files.<br \/>\nWieder ein systemd service file (<strong>kprop.service<\/strong>)<br \/>\n<code><br \/>\n[Unit]<br \/>\nDescription=kprop KDC propagation <\/code><\/p>\n<p><code><br \/>\n<\/code><\/p>\n<p><code>[Service]<br \/>\nType=simple<br \/>\nExecStart=\/root\/bin\/kprop.sh<br \/>\n<\/code><br \/>\nund ein systemd timer file (<strong>kprop.timer<\/strong>)&#8230;<br \/>\n<code><br \/>\n[Unit]<br \/>\nDescription=Run kprop daily <\/code><\/p>\n<p><code><code><\/code><\/code><\/p>\n<p>[Timer]<br \/>\nOnCalendar=4:50<br \/>\nPersistent=true<\/p>\n<p><code><br \/>\n<\/code><\/p>\n<p><code>[Install]<br \/>\nWantedBy=timers.target<br \/>\n<\/code><br \/>\n..welches in unserem File t\u00e4glich um 04:50 aufgerufen wird.<br \/>\nBeide files landen in \/etc\/systemd\/system. Aber nur das timer file wird via<br \/>\n<code>sudo systemctl enable kprop.timer<\/code><br \/>\naktiviert.<br \/>\nVorteil dieser L\u00f6sung ist, dass man einerseits mit systemctl auch manuell die Synchronisation ansto\u00dfen kann, aber auch schnell eine \u00fcbersichtliche Darstellung der Logeintr\u00e4ge bekommt, welches man mit<br \/>\n<code>journalctl -u kprop<\/code><br \/>\nauf dem primary KDC, bzw.<br \/>\n<code>journalctl -u kpropd<\/code><br \/>\nauf dem secondary KDC abfr\u00e4gt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Um eine automatische Replikation des prim\u00e4ren Kerberos KDC mit dem sekund\u00e4ren zu erzielen, m\u00fcssen auf beiden Rechner systemd service units eingerichtet werden. Zumindest unter Ubuntu 16.04 LTS sind diese in keinster Weise vorhanden, weswegen hier auf die Einrichtung eingangen wird. Service Unit auf dem sekund\u00e4ren (slave) KDC Auf dem slave KDC muss eigentlich lediglich der &hellip; <a href=\"https:\/\/www.instruyete.org\/?p=633\" class=\"more-link\"><span class=\"screen-reader-text\">Kerberos KDC replication mit systemd units<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,7],"tags":[],"class_list":["post-633","post","type-post","status-publish","format-standard","hentry","category-linux","category-unix"],"_links":{"self":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/posts\/633","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=633"}],"version-history":[{"count":1,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/posts\/633\/revisions"}],"predecessor-version":[{"id":743,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/posts\/633\/revisions\/743"}],"wp:attachment":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=633"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=633"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=633"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}