Nieuw homelab
Geschreven op en bijgewerkt op
Inhoudsopgave
Met de (overkill) specificaties van mijn Framework 16 heb ik een nieuw virtueel homelab opgericht.
De volgende dingen zitten nu in dit nieuwe homelab:
- Een Fedora Workstation Rawhide installatie voor mijn algemene nieuwsgierigheid
- Een test netwerk voor het hosten van FreeIPA zaken
Fedora Workstation Rawhide.
Eén van de tradities in een homelab van mij is het draaien van een Fedora Workstation virtuele machine, die is geüpgraded naar de rawhide versie van Fedora.
Dit doe ik omdat ik nieuwsgierig ben naar aankomende wijzigingen in Fedora, en om alvast een voorproefje te hebben voor als ik vragen ga krijgen vanuit mijn omgeving van de mensen die ik help met Fedora.
Het test netwerk.
Dit was de oorspronkelijke bedoeling van het hele homelab idee. Dit is voor mij dé manier om mijn kennis bij te houden en te spelen met techniek en dingen als FreeIPA, Matrix, Forgejo, Wireguard en wie weet wat ik nog meer tegen ga komen.
Opslag van virtuele machines.
Ik heb de mogelijkheid en fysieke plaats voor een aparte SSD die ik kan gebruiken voor het opslaan van virtuele machines en virtuele data. Dat heb ik dan ook gedaan, en ik heb een SSD van 2TB geformatteerd met BTRFS en aangekoppeld op /var/lib/libvirt/images/.
Omdat het een homelab is maak ik geen virtuele machine’s aan met honderden gigabytes aan opslag. Standaard heeft een virtuele machine standaard 80GB aan ruimte. Op een SSD van 2TB zijn dat 25 virtuele machines (2048 / 80). Het moet wel heel vreemd gaan lopen voor ik over die grens heen ga.
Virtualisatiebasis.
Net als al mijn homelab op mijn (oude) desktop is dat dit een virtueel iets is, gebouwd bovenop QEMU/KVM in Fedora.
Om het test netwerk te draaien heb ik een nieuw netwerk (enterprise.lab) aangemaakt en aangepast. Het uiteindelijke resultaat ziet er als volgt uit:
<network xmlns:dnsmasq='http://libvirt.org/schemas/network/dnsmasq/1.0' connections='4'>
<name>enterprise</name>
<uuid>803834b0-e5a8-4a64-a75c-650e48934139</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr1' stp='on' delay='0'/>
<mac address='52:54:00:7b:03:77'/>
<domain name='enterprise.lab'/>
<dns>
<host ip='192.168.100.253'>
<hostname>dc.enterprise.lab</hostname>
</host>
<host ip='192.168.100.252'>
<hostname>code.enterprise.lab</hostname>
</host>
<host ip='192.168.100.251'>
<hostname>chat.enterprise.lab</hostname>
</host>
</dns>
<ip address='192.168.100.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.100.128' end='192.168.100.254'/>
<host mac='52:54:00:bc:40:d0' name='dc.enterprise.lab' ip='192.168.100.253'/>
<host mac='52:54:00:bc:40:d1' name='code.enterprise.lab' ip='192.168.100.252'/>
<host mac='52:54:00:bc:40:d2' name='chat.enterprise.lab' ip='192.168.100.251'/>
</dhcp>
</ip>
<dnsmasq:options>
<dnsmasq:option value='dhcp-option=6,192.168.100.253'/>
</dnsmasq:options>
</network>
De voornaamste aanpassingen zijn:
- Het vast toekennen van een aantal IP’s, mac adressen en hostnamen aan servers
- Het aanpassen van de onderliggende
dnsmasqinstance om de domain controller ook al DNS server in het netwerk op te laten nemen, zodat het domein (en de domeinnaam) ook werkt zonder dat ik alle client(s) aan moet passen
Domeincontroller
De domeincontroller (domain controller) in het test netwerk is een Rocky Linux 10.x server met FreeIPA als LDAP software. Hierin heb ik weinig aangepast, eigelijk het enige is het aanmaken van een gebruiker voor mezelf, en het aanmaken van een aantal groepen om de toegang tot andere zaken in het netwerk te beheren:
- Een admins groep die op clients beheersrechten heeft voor het installeren van software en het installeren van updates
- Een forgejo groep waarvan de leden toegang hebben tot de Forgejo / code server in het netwerk
- Een chat groep waarvan de leden toegang hebben tot de Tuwunel / chat server in het netwerk
Automatisch groeplidmaatschap
Ik heb het zo ingericht dat elke gebruiker die lid is van de admins groep ook automatisch lid word van de volgende groep(en):
chat(cn=chat,cn=groups,cn=accounts,dc=enterprise,dc=lab)forgejo(cn=forgejo,cn=groups,cn=accounts,dc=enterprise,dc=lab)
Dit heb ik als volgt gedaan:
ipa automember-add chat --type=group
ipa automember-add-condition --tyoe=group chat --inclusive-regex='cn=admins,cn=groups,cn=accounts,dc=enterprise,dc=lab' --key memberof
ipa automember-add forgejo --type=group
ipa automember-add-condition --type=group forgejo --inclusive-regex='cn=admins,cn=groups,cn=accounts,dc=enterprise,dc=lab' --key memberof
Voor clients en servers heb ik ook twee (host)groeplidmaatschappen aangemaakt. Eentje voor servers (ipaservers) en eentje voor client(s) (ipaclients). Hosts die in aan het domein worden toegevoegd worden automatisch lid van een van de twee aan de hand van de hostname van de machine.
Dat heb ik gedaan met:
ipa automember-add-condition --type=hostgroup ipaservers --inclusive-regex='(^\D+).enterprise.lab' --key=cn
ipa automember-add ipaclients --type=hostgroup
ipa automember-add-condition --type=hostgroup ipaclients --inclusive-regex='client-([0-9]+).enterprise.lab' --key cn
sudo (groep) regel(s).
Ik heb voor de leden van de admin groep een regel gemaakt dat ze op alle machines in de ipaclients hostgroep sudo mogen gebruiken. Dit zodat ik software kan installeren, updaten en verwijderen bijvoorbeeld.
Dit heb ik op de volgende manier gedaan:
ipa sudorule-add 'allow admins' --desc='Allow members of the admin group to use sudo on client machines.' --runasusercat=all --runasgroupcat=all --cmdcat=all
ipa sudorule-add-user 'allow admins' --group=admins
ipa sudorule-add-host 'allow admins' --hostgroups=ipaclients
Code server.
Dit is een Rocky Linux 10.x virtuele machine met Forgejo als software. Forgejo is een lichtgewicht variatie van iets als GitHub of GitLab.
Deze server heb ik ook lid gemaakt van het domein.
Installatie Forgejo.
Voor de installatie van Forgejo heb ik gebruik gemaakt van de handleiding op de website en ook van de LDAP handleiding om ervoor te zorgen dat Forgejo gebruik kan maken van domeinaccounts.
Configuratie LDAP en Forgejo.
Ik heb de volgende instellingen gebruikt:
| Sleutel | Waarde |
|---|---|
| Authentication type | LDAP (via BindDN) |
| Authentication name | Enterprise LDAP |
| Security protocol | LDAPS |
| Host | dc.enterprise.lab |
| Port | 636 |
| Bind DN | uid=forgejo,cn=sysaccounts,cn=etc,dc=enterprise,dc=lab |
| Bind password | iets veiligs |
| User search base | cn=users,cn=accounts,dc=enterprise,dc=lab |
| User filter | (&(objectclass=person)(|(uid=%[1]s)(mail=%[1]s))(!(uid=admin))) |
| Admin filter | (memberOf=cn=admins,cn=groups,cn=accounts,dc=enteprise,dc=lab) |
| First name attribute | givenName |
| Surname attribute | sn |
| Email attribute | |
| Default domain name used for the email address | enterprise.lab |
Chat server.
Dit is een Rocky Linux 10.x virtuele machine met Tuwunel als software. Tuwunel is een Matrix server.
Ook deze server is lid van het domein.
Installatie Tuwunel.
Voor het installeren van Tuwenel heb ik de generic deployment handleiding op de website van tuwunel gebruikt. Er word een aantal rpm packages aangeboden, met verschillende X86-64 versies. Ik wist niet dat daar verschil in zat, en ik wist ook niet hoe ik de hoogst ondersteunde versie kon achterhalen. Dat laatste kan met het voglende commando:
/lib64/ld-linux-x86-64.so.2 --help
Configuratie Tuwunel.
Standaard komt Tuwunel met een zeer uitgebreid (2163 regels) voorbeeld configuratie bestand wat ik gedownload heb naar /etc/tuwunel/tuwunel.toml en aangepast heb wat nodig is.
Daarna heb ik het (werkende) complete configuratiebestand verplaatst naar /etc/tuwunel/tuwunel-old.toml en heb alleen de dingen die ik nodig had gekopieërd naar etc/tuwunel/tuwunel.toml om het voor mij makkelijk(er) te maken.
Deze ingekortte configuratie ziet er als volgt uit:
# Custom shortened configuration file for Tuwunel.
#
# vim: foldmethod=marker
# global {{{
[global]
server_name = "chat.enterprise.lab"
database_path = "/var/lib/tuwunel"
address = "127.0.0.1"
port = 8008
allow_registration = false
lockdown_public_room_directory = true
auto_join_rooms = ["#general:chat.enterprise.lab"]
allow_guest_registration = false
# }}}
# LDAP {{{
[global.ldap]
enable = true
uri = "ldaps://dc.enterprise.lab:636"
base_dn = "cn=users,cn=accounts,dc=enterprise,dc=lab"
bind_dn = "uid=tuwunel,cn=sysaccounts,cn=etc,dc=enterprise,dc=lab"
bind_password_file = "/etc/tuwunel/bind_password_file"
filter = "(&(objectClass=person)(memberOf=cn=chat,cn=groups,cn=accounts,dc=enterprise,dc=lab)(!(uid=admin)))"
bind_attribute = "uid"
mail_attribute = "mail"
name_attribute = "gecos"
admin_filter = "(&(objectClass=person)(memberOf=cn=admins,cn=groups,cn=accounts,dc=enterprise,dc=lab)(!(uid=admin)))"
# }}}
Cockpit en SSL.
Ik maak standaard gebruik van Cockpit op server(s). Dus ook hier. Standaard heeft Cockpit een self-signed SSL certificaat wat door geen enkele browser (standaard) geaccepteerd zal worden.
Gelukkig is dit iets wat FreeIPA bied, namelijk SSL certificaten. Het enige wat ik moet doen (per server) is het aanvragen van een certificaat en het configureren. Hiervoor doe ik het volgende:
sudo kinit admin
sudo systemctl enable --now certmonger
sudo ipa-getcert request -f /etc/cockpit/ws-certs.d/10-cockpit.cert -k /etc/cockpit/ws-certs.d/10-cockpit.key -K HTTP/$(hostname) -D $(hostname) -I 'cockpit-$(hostname)'
sudo systemctl restart cockpit.socket
Wireguard.
Ik heb tussen de volgende server(s) een Wireguard verbinding:
- Domeincontroller (
dc.enterprise.lab) → Chat (chat.enterprise.lab) - Domeincontroller (
dc.enterprise.lab) → Code (code.enterprise.lab)
Met de volgende adressen en andere details:
| Server | Publiek IP adres | Wireguard IP adres |
|---|---|---|
| DC | 192.168.100.253/32 | 192.168.200.253/32 |
| Code | 192.168.252/32 | 192.169.200.252/32 |
| Chat | 192.168.251/32 | 192.168.200.251/32 |
De Wireguard installatie en configuratie is als volgt gedaan:
sudo -i
dnf install epel-release -y
/usr/bin/crb enable
dnf install wireguard-tools -y
cd /etc/wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey
touch wg0.conf
En het volgende komt in /etc/wireguard/wg0.conf:
[Interface]
Address = <Wireguard IP adres uit tabel hierboven>
ListenPort = 51820
PrivateKey = <inhoud van /etc/wireguard/privatekey>
En dan per server een aparte [Peer], maar dat is per server verschillend dus beschrijf ik hier niet. In het kort heb ik de Wireguard Quick Start pagina gevolgd.
Daarna is het een kwestie van de Wireguard service activeren en starten, en de juiste poort in de firewall openen:
sudo firewall-cmd --add-service=wireguard --permanent
sudo firewall-cmd --reload
sudo systemctl enable --now wg-quick@wg0.service
Meer informatie over LDAP en de filter(s) die ik toepas.
Ik heb meerdere diensten gekoppeld aan mijn domeincontroller via LDAP(S). Hiervoor heb ik LDAP filter(s) gebruikt. Dit verschilt bij de verschillende dingen die ik eraan gekoppeld heb maar ze hebben allemaal een ding gemeen: het volgende filter:
(!(uid=admin))
Dit sluit de admin account die standaard aangemaakt is in FreeIPA uit van gebruik. Dit heb ik gedaan vanuit beveiligingsstandpunt. Als over een aantal jaar blijkt dat er een fout in de code van FreeIPA zit waardoor het admin account makkelijk te misbruiken is ben ik minder kwetsbaar hiervoor. Tenminste, dat hoop ik.
Bronnen en links.
Hier een overzicht van links en bronnen die ik gebruikt heb voor het homelab. Ik beloof niet dat alles hier naar voren komt, maar ik doe mijn best.