[comment]: # ({930fae3b-930fae3b})
# 13 Zabbixを使用したKerberosの設定

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

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

Kerberos認証は、ZabbixのWeb監視やHTTPアイテムで使用できます。

このページでは、Debian/UbuntuでZabbixプロセス用のKerberosプリンシパルを使用して、Zabbixサーバーが`www.example.com`のWeb監視を実行するためのKerberosの設定例について説明します。

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

[comment]: # ({825c7996-edb96e72})
#### 設定

1\. KDC とクライアントユーティリティをインストールします:

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

パッケージのセットアップ中に、たとえば次のようなプロンプトに回答します:

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

2\. わかりやすいホスト名を割り当てます（任意、ローカルテスト用）。

DNS がない場合は /etc/hosts を編集して、DC と Webサーバーのエントリを追加します:

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

追加する行の例:

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

3\. Kerberos クライアントと KDC の realm を設定します:

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

設定例:

```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
```

`.localdomain` やその他の公開されていない名前を使う予定がある場合は、ホスト名→realm の対応が機能するように、明示的な domain→realm マッピングを追加してください。  
ここで不一致があると `Server not found in Kerberos database` エラーが発生します。

4\. Kerberos データベースを初期化します（1回のみ、KDC ホスト上）。  
プロンプトが表示されたら、安全なマスターパスワードを設定します:

```bash
sudo krb5_newrealm
```

5\. `HTTP/host.fqdn@REALM` principal を、クライアントが実際に使用する正確なホスト名で作成します。小文字を推奨します（例: `HTTP/web.example.com@EXAMPLE.COM`）。  
大文字小文字や名前の不一致があると `Server not found in Kerberos database` になります。

```bash
sudo kadmin.local
```

`kadmin.local` 内で:

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

keytab を Web ホストへ移動し（同一マシンならそのままでも可）、Apache が使用できる権限を設定します:

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

6\. Apache の GSSAPI モジュールをインストールして有効化します:

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

:::noteimportant
すべての mod_auth_gssapi バージョンが、すべての `Gssapi*` ディレクティブをサポートしているわけではありません。  
Apache が `Invalid command 'GssapiCredStore'` で失敗する場合は、未対応のディレクティブを削除するか、モジュールをアップグレードしてください。
:::

7\. VirtualHost を設定します（`DocumentRoot` / Zabbix UI へのパスは適宜調整してください）:

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

`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>
```

Apache を再起動します:

```bash
sudo systemctl restart apache2
```

8\. KDC サービスを有効化して起動し、待ち受けポートを確認します（KDC ホスト）:

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

9\. テスト用に TGT を取得します（チケットを使用するユーザーとして実行します）。

チケット一覧に `krbtgt/EXAMPLE.COM@EXAMPLE.COM` が表示されるはずです。  
`kinit` は、チケットが必要な同じ OS ユーザーで実行してください（例: Web チェック用の `zabbix`、または対話的なブラウザ SSO テスト用の `www-data`/Apache）。  
別の OS ユーザーに発行されたチケットは、`KRB5CCNAME` と権限を調整しない限り表示されません。

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

10\. curl で SPNEGO のやり取りをテストします（有効な TGT を持つクライアントから実行）。  
`200 OK`（またはアプリへのリダイレクト）が返れば、SPNEGO は成功しています:

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

11\. 必要に応じて、Zabbix UI が HTTP 認証ログインを受け付けるようにします。Zabbix frontend の HTTP 認証を有効化します（ui/conf/zabbix.conf.php）:

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

Web UI で *Users* > *Authentication* に移動し、[*HTTP settings*](/manual/web_interface/frontend_sections/users/authentication/http) タブを開きます。  
[*Enable HTTP authentication*] チェックボックスをオンにして、ポップアップで *Ok* をクリックします。  
*Default login form* のドロップダウンで "HTTP login form" を選択します。  
*Case-sensitive login* がディレクトリのポリシーに適しているか判断します。  
最後に *Update* ボタンをクリックします。

12\. ブラウザの設定（例として Firefox を使用）: `network.negotiate-auth.trusted-uris` を Negotiate を実行するホスト（`dc01.example.com`）に設定し、ブラウザが Kerberos トークンを自動送信するようにします。

`about:config` 内で:

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

これで `http://dc01.example.com` にアクセスすると、フォームなしでそのまま Zabbix にログインできるはずです。

13\. キー/チケットを最新の状態に保ちます。  
Kerberos チケットのデフォルト有効期間は約 10 時間です。  
期限切れを防ぐために cron/systemd timer を追加します:

```bash
#for the web service
kinit -kt /etc/apache2/http.keytab HTTP/dc01.example.com@EXAMPLE.COM
#for the monitoring user
kinit -kt /var/lib/zabbix/kerb.keytab kerb-admin@EXAMPLE.COM
```

14\. 保守確認:

-   `klist -k /etc/apache2/http.keytab` — keytab に service principal が存在することを確認します。
-   `sudo tail -f /var/log/apache2/error.log` — GSSAPI エラーを監視します（`gss_acquire_cred[_from]() failed to get server creds` は、keytab/権限の問題、または principal の欠如を意味します）。
-   `curl --negotiate` が 401/403 を返す場合は、principal の誤り、チケット未取得、Host ヘッダーの不一致、またはファイルシステム権限の問題であることが多いです。ログと `/etc/krb5.conf` の domain マッピングを確認してください。

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

[comment]: # ({32287407-notes})
#### セキュリティとファイルパーミッションに関する注意事項

Keytabファイルは、それを必要とするアカウントのみが読み取り可能でなければなりません。
例: zabbixユーザーのkeytabの場合は`zabbix:zabbix`所有の`0400`、Apacheのkeytabの場合は`root:www-data`所有の`0440`。

ホストに長期間有効な平文パスワードを保存するのは避けてください。
可能な場合はkeytabやドメイン参加済みのマシンプリンシパルを使用してください。

`KRB5CCNAME`を設定したりkeytabをコピーするテストやスクリプトを実行する場合、操作後に所有権とパーミッションを再確認してください。Webサーバーが認証情報を拒否する場合、ファイルパーミッションの問題であることがよくあります。

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