[comment]: # translation:outdated

[comment]: # ({930fae3b-930fae3b})
# 13 Konfigurowanie Kerberos z Zabbix

[comment]: # ({/930fae3b-930fae3b})

[comment]: # ({bfbefd40-5be9f534})
#### Przegląd

Uwierzytelnianie Kerberos może być używane w monitorowaniu WWW oraz w pozycjach HTTP w Zabbix.

Ta strona opisuje przykład konfiguracji Kerberos dla serwera Zabbix, aby wykonywać monitorowanie WWW `www.example.com` z użyciem principal Kerberos dla procesu Zabbix w Debian/Ubuntu.

[comment]: # ({/bfbefd40-5be9f534})

[comment]: # ({e94370cd-edb96e72})
#### Konfiguracja

1\. Zainstaluj KDC i narzędzia klienckie:

```bash
sudo apt update
sudo apt install krb5-kdc krb5-admin-server krb5-user
```

Podczas konfiguracji pakietów odpowiedz na wyświetlane pytania, np.:

```default
Default Kerberos version 5 realm: EXAMPLE.COM
Kerberos servers for your realm: localhost (lub twój FQDN)
Administrative server for your Kerberos realm: localhost (lub twój FQDN)
```

2\. Przypisz przyjazną nazwę hosta (opcjonalnie, do testów lokalnych).

Edytuj /etc/hosts i dodaj wpis dla swojego DC oraz serwera WWW, jeśli nie masz DNS:

```bash
sudo vi /etc/hosts
```

Przykładowy wiersz, który możesz dodać:

```ini
192.168.1.100  dc01.example.com dc01
```

3\. Skonfiguruj klienta Kerberos i realm KDC:

```bash
sudo vi /etc/krb5.conf
```

Przykładowe ustawienia:

```ini
[libdefaults]
    default_realm = EXAMPLE.COM
    dns_lookup_realm = false
    dns_lookup_kdc = false
    rdns = false
    ticket_lifetime = 24h
    renew_lifetime = 7d
    forwardable = true

[realms]
    EXAMPLE.COM = {
        kdc = dc01.example.com
        admin_server = dc01.example.com
    }

[domain_realm]
    .example.com = EXAMPLE.COM
    example.com = EXAMPLE.COM
```

Jeśli planujesz używać `.localdomain` lub innych niepublicznych nazw, dodaj jawne mapowania domena→realm, aby mapowanie nazwa hosta→realm działało poprawnie.  
Niezgodności w tym miejscu powodują błędy `Server not found in Kerberos database`.

4\. Zainicjalizuj bazę danych Kerberos (jednorazowo, na hoście KDC).  
Po wyświetleniu monitu ustaw bezpieczne hasło główne:

```bash
sudo krb5_newrealm
```

5\. Utwórz principal `HTTP/host.fqdn@REALM`, używając dokładnej nazwy hosta, z której będą korzystać klienci; preferowane są małe litery (np. `HTTP/web.example.com@EXAMPLE.COM`).  
Niezgodność wielkości liter/nazwy powoduje `Server not found in Kerberos database`.

```bash
sudo kadmin.local
```

Wewnątrz `kadmin.local`:

```bash
addprinc kerb-admin@EXAMPLE.COM     # principal administracyjny
addprinc -randkey HTTP/dc01.example.com@EXAMPLE.COM
ktadd -k /etc/apache2/http.keytab HTTP/dc01.example.com@EXAMPLE.COM
quit
```

Przenieś keytab na host WWW (lub pozostaw lokalnie, jeśli to ta sama maszyna) i ustaw uprawnienia umożliwiające użycie przez Apache:

```bash
chown www-data:www-data /etc/apache2/http.keytab
chmod 600 /etc/apache2/http.keytab
# weryfikacja
sudo -u www-data -k /etc/apache2/http.keytab
```

6\. Zainstaluj i włącz moduł Apache GSSAPI:

```bash
sudo apt install libapache2-mod-auth-gssapi
sudo a2enmod auth_gssapi
sudo a2enmod headers
sudo systemctl restart apache2
```

:::noteimportant
Nie wszystkie wersje mod_auth_gssapi obsługują każdą dyrektywę `Gssapi*`.  
Jeśli Apache kończy działanie z błędem `Invalid command 'GssapiCredStore'`, usuń nieobsługiwaną dyrektywę lub zaktualizuj moduł.
:::

7\. Skonfiguruj VirtualHost (dostosuj `DocumentRoot` / ścieżkę do interfejsu Zabbix):

```bash
sudo vi /etc/apache2/sites-available/zabbix.conf
```

Wewnątrz `zabbix.conf`:

```apache
<VirtualHost *:80>
    ServerName dc01.example.com
    DocumentRoot /usr/share/zabbix/ui
    <Directory /usr/share/zabbix/ui>
        Options FollowSymLinks
        AllowOverride None
        Require all granted
        AuthType GSSAPI
        AuthName "Kerberos Login"
        GssapiCredStore keytab:/etc/apache2/http.keytab
        GssapiLocalName On
        Require valid-user
    </Directory>
    RequestHeader set X-Remote-User %{REMOTE_USER}s env=REMOTE_USER
    RequestHeader unset Authorization
</VirtualHost>
```

Uruchom ponownie Apache:

```bash
sudo systemctl restart apache2
```

8\. Włącz/uruchom usługi KDC i zweryfikuj porty nasłuchujące (host KDC):

```bash
sudo systemctl enable --now krb5-kdc krb5-admin-server
ss -tnlp | grep :80    # lub: sudo netstat -tnlp | grep :80
```

9\. Uzyskaj TGT do testów (uruchom jako użytkownik, który będzie używać ticketu).

Na liście ticketów powinien być widoczny `krbtgt/EXAMPLE.COM@EXAMPLE.COM`.  
Uruchom `kinit` jako ten sam użytkownik systemu operacyjnego, który potrzebuje ticketu (np. `zabbix` dla testów WWW lub `www-data`/Apache dla interaktywnych testów SSO w przeglądarce).  
Tickety wydane innemu użytkownikowi systemu operacyjnego nie będą widoczne, chyba że zostaną odpowiednio dostosowane `KRB5CCNAME` i uprawnienia.

```bash
kinit kerb-admin@EXAMPLE.COM
klist
```

10\. Przetestuj wymianę SPNEGO za pomocą curl (z klienta z prawidłowym TGT).  
`200 OK` (lub przekierowanie do aplikacji) oznacza, że SPNEGO zadziałało poprawnie:

```bash
curl -v --negotiate -u : http://dc01.example.com/
```

11\. Opcjonalnie, jeśli interfejs Zabbix ma akceptować logowanie uwierzytelniane przez HTTP, włącz HTTP auth w frontendzie Zabbix (ui/conf/zabbix.conf.php):

```php
$ALLOW_HTTP_AUTH = true;
```

W interfejsie WWW przejdź do *Users* > *Authentication* i otwórz kartę [*HTTP settings*](/manual/web_interface/frontend_sections/users/authentication/http).  
Zaznacz pole wyboru *Enable HTTP authentication* i kliknij *Ok* w wyskakującym oknie.  
Wybierz „HTTP login form” z listy rozwijanej *Default login form*.  
Zdecyduj, czy *Case-sensitive login* odpowiada polityce twojego katalogu.  
Kliknij przycisk *Update*, aby zakończyć.

12\. Konfiguracja przeglądarki (jako przykład użyto Firefox): ustaw `network.negotiate-auth.trusted-uris` na host(y) wykonujące Negotiate (`dc01.example.com`), aby przeglądarka automatycznie wysyłała tokeny Kerberos.

W `about:config`:

```default
network.negotiate-auth.trusted-uris = dc01.example.com
```

Po wejściu na `http://dc01.example.com` powinieneś zostać od razu zalogowany do Zabbix bez formularza.

13\. Utrzymuj klucze/tickety aktualne.  
Domyślny czas życia ticketu Kerberos wynosi około 10 godzin.  
Dodaj cron/systemd timer, aby uniknąć wygaśnięcia:

```bash
#dla usługi WWW
kinit -kt /etc/apache2/http.keytab HTTP/dc01.example.com@EXAMPLE.COM
#dla użytkownika monitorowania
kinit -kt /var/lib/zabbix/kerb.keytab kerb-admin@EXAMPLE.COM
```

14\. Kontrole porządkowe:

-   `klist -k /etc/apache2/http.keytab` — sprawdź, czy principal usługi jest obecny w keytab.
-   `sudo tail -f /var/log/apache2/error.log` — obserwuj błędy GSSAPI (`gss_acquire_cred[_from]() failed to get server creds` oznacza problem z keytab/uprawnieniami lub brak principal).
-   Zwracanie 401/403 przez `curl --negotiate` często oznacza nieprawidłowy principal, brak ticketu, niedopasowanie nagłówka hosta lub problem z uprawnieniami systemu plików; sprawdź logi i mapowania domen w `/etc/krb5.conf`.

[comment]: # ({/e94370cd-edb96e72})

[comment]: # ({32287407-notes})
#### Uwagi dotyczące bezpieczeństwa i uprawnień do plików

Pliki keytab muszą być dostępne do odczytu wyłącznie dla konta, które ich potrzebuje.
Przykładowe uprawnienia: `0400` z właścicielem `zabbix:zabbix` dla pliku keytab użytkownika zabbix lub `0440` i `root:www-data` dla pliku keytab Apache.

Unikaj przechowywania na hoście długotrwałych haseł w postaci zwykłego tekstu.
Tam, gdzie to możliwe, używaj plików keytab lub principali maszyn przyłączonych do domeny.

Podczas uruchamiania testów lub skryptów, które ustawiają `KRB5CCNAME` lub kopiują pliki keytab, po zakończeniu operacji dokładnie sprawdź właściciela i uprawnienia — odrzucanie poświadczeń przez serwer WWW często wynika z problemu z uprawnieniami do plików.

[comment]: # ({/32287407-notes})
