Rootmanual:Keycloak: Skillnad mellan sidversioner

Från Lysators datorhandbok, den ultimata referensen.
Hoppa till navigering Hoppa till sök
Ingen redigeringssammanfattning
Rad 19: Rad 19:
== Reverse proxy ==
== Reverse proxy ==


Framför java-applikationsservern sitter en reverse proxy (Apache httpd). Kör man SELinux och vill att apache ska kunna ansluta via nätverk kan man behöva tillåta det genom
Framför java-applikationsservern sitter en reverse proxy (nginx). Kör man SELinux och vill att apache ska kunna ansluta via nätverk kan man behöva tillåta det genom


<pre>setsebool -P httpd_can_network_connect on </pre>
<pre>setsebool -P httpd_can_network_connect on </pre>
Rad 25: Rad 25:
I övrigt bör det gå bra att låta letsencrypts certbot sätta upp cert och så vidare och att man konfar en location i stil med
I övrigt bör det gå bra att låta letsencrypts certbot sätta upp cert och så vidare och att man konfar en location i stil med
<pre>
<pre>
<Location / >
location {
proxy_set_header Forwarded $proxy_add_forwarded;
proxy_set_header Forwarded $proxy_add_forwarded;
proxy_set_header X-Forwarded-Host $host:443;
proxy_set_header X-Forwarded-Host $host:443;
Rad 33: Rad 33:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://130.236.254.116:8443;
proxy_pass https://130.236.254.116:8443;
}

</Location>
</pre>
</pre>



Versionen från 22 augusti 2024 kl. 09.03

Keycloak är en identity manager skriven i Java och som utvecklas av Redhat. Den är byggd ovanpå applikationsservern WildFly (tidigare JBoss), och en relevant feature för Lysator är att den kan tillhandahålla SSO (single sign on) via t.ex. openid connect och kan federera med ldap. Detta innebär att när du loggar in på t.ex. datorhandboken så gör du det via keycloak, som autentiserar dig mot ldap och eventuellt också tilldelar dig roller utifrån de grupptillhörigheter som du har i ldap (t.ex. så kan man sätta upp att medlemmar i gruppen lysroot får en roll "root" i sin claim, vilket i sin tur kan användas för auktorisering i den webapp du loggar in på).

Installationen har i princip följt den dokumentation som finns tillgänglig (ex. https://www.keycloak.org/guides )

Installation

  1. Sätt upp en postgresserver och skapa en databas som heter keycloak, samt en användare till denna databas
  2. Packa upp zipfil du laddar ner
  3. Du kommer först köra keycloak i dev-läge, och då vill den bara kommas åt lokalt, så sätt t.ex. upp nginx som en reverse proxy (enligt nedan), fast med proxy_bind konfigurerat serverns ipv4 så att webbanrop ser ut att komma från localhost.
  4. Konfigurera inloggningsuppgifter för postgres samt tls i conf/keycloak.conf. Du behöver ett cert och en nyckel för fqdn.
  5. Kör KEYCLOAK_ADMIN=anvnamn KEYCLOAK_PASSWORD=lösenord ./bin/kc start-dev
  6. Konfa mailserver i webbgucket
  7. Skapa en ny realm (om du har en exporterad realm från tidigare har du möjlighet att ladda upp denna json-fil - förslagsvis kan du prepopulera denna med secrets och så vidare så att man slipper en massa jobb med att regenerera dessa och sedan byta på klienterna, exportfunktionen exporterar nämligen inte dessa)
  8. Stäng ner servern igen, kör ./bin/kc build för att bygga om applikationen
  9. Lägg till ldapserverns certifikat i truststoren enligt nedan
  10. Skapa en användare på servern, typ svc-keycloak, lägg applikationen under /opt, skapa en systemd-service
  11. När du enable:at och startat den så ska det hela förhoppningsvis funka.

Reverse proxy

Framför java-applikationsservern sitter en reverse proxy (nginx). Kör man SELinux och vill att apache ska kunna ansluta via nätverk kan man behöva tillåta det genom

setsebool -P httpd_can_network_connect on 

I övrigt bör det gå bra att låta letsencrypts certbot sätta upp cert och så vidare och att man konfar en location i stil med

        location {
                 proxy_set_header        Forwarded $proxy_add_forwarded;
                 proxy_set_header        X-Forwarded-Host   $host:443;
                 proxy_set_header        X-Forwarded-Server $host;
                 proxy_set_header        X-Forwarded-Port   443;
                 proxy_set_header        X-Forwarded-Proto  https;
                 proxy_set_header        X-Forwarded-For    $proxy_add_x_forwarded_for;
                 proxy_pass              https://130.236.254.116:8443;
        }

För forwarded-headern behöver du även lägga till nedanstående, t.ex. ovanför serverblocket:

map $remote_addr $proxy_forwarded_elem {
    # IPv4 addresses can be sent as-is
    ~^[0-9.]+$          "for=$remote_addr";

    # IPv6 addresses need to be bracketed and quoted
    ~^[0-9A-Fa-f:.]+$   "for=\"[$remote_addr]\"";

    # Unix domain socket names cannot be represented in RFC 7239 syntax
    default             "for=unknown";
}

map $http_forwarded $proxy_add_forwarded {
    # If the incoming Forwarded header is syntactically valid, append to it
    "~^(,[ \\t]*)*([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?(;([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?)*([ \\t]*,([ \\t]*([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?(;([!#$%&'*+.^_`|~0-9A-Za-z-]+=([!#$%&'*+.^_`|~0-9A-Za-z-]+|\"([\\t \\x21\\x23-\\x5B\\x5D-\\x7E\\x80-\\xFF]|\\\\[\\t \\x21-\\x7E\\x80-\\xFF])*\"))?)*)?)*$" "$http_forwarded, $proxy_forwarded_elem";

    # Otherwise, replace it
    default "$proxy_forwarded_elem";
}

Se till att brandväggen är öppen (men öppna inte 8443)

  firewall-cmd --permanent --add-port=443/tcp
  firewall-cmd --permanent --add-port=80/tcp
  firewall-cmd --reload

Systemd

Fil /etc/systemd/system/keycloak.service med innehåll typ:

[Unit]
Description=Keycloak
#After=network.target
After=postgresql.service

[Service]
Type=idle
ExecStart=/opt/keycloak/bin/kc.sh start
TimeoutStartSec=600
TimeoutStopSec=600
User=svc-keycloak
Group=svc-keycloak

[Install]
WantedBy=multi-user.target

Kör man SELinux och vill att startupskriptet ska kunna köras av systemd behöver det ev ha bin_t-flagga

chcon -t bin_t /opt/keycloak/bin/kc.sh

Därefter bör det gå att köra efter

systemctl daemon-reload
systemctl enable keycloak
systemctl start keycloak

LDAP-serverns certifikat i keycloaks truststore

Du använder kanske lämpligast openssl:s cli-verktyg för att hämta certifikatet och lägger det i /opt/keycloak/conf/truststores/, t.ex. med följande kommando:

openssl x509 -in <(openssl s_client -connect trocca.ad.lysator.liu.se:636 -prexit 2>/dev/null) -out /opt/keycloak/conf/truststores/trocca.pem

TODO

Beskriva:

  • Uppsättning av realm med federering mot ldap
  • Roles claim