13 Zabbixを使用したKerberosの設定

概要

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

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

設定

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

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

パッケージのセットアップ中に、プロンプトに回答します。例:

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サーバー のエントリを追加します:

sudo vi /etc/hosts

追加する行の例:

192.168.1.100  dc01.example.com dc01

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

sudo vi /etc/krb5.conf

設定例:

[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 やその他の非公開名を使用する予定がある場合は、hostname→realm のマッピングが機能するように、明示的な domain→realm マッピングを追加してください。
ここに不一致があると、Server not found in Kerberos database エラーが発生します。

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

sudo krb5_newrealm

5. クライアントが使用する正確なホスト名で HTTP/host.fqdn@REALM principal を作成します。小文字を推奨します(例: HTTP/[email protected])。 大文字小文字や名前の不一致があると、Server not found in Kerberos database が発生します。

sudo kadmin.local

kadmin.local 内で:

addprinc [email protected]     # 管理 principal
addprinc -randkey HTTP/[email protected]
ktadd -k /etc/apache2/http.keytab HTTP/[email protected]
quit

keytab を Web ホストに移動します(同じマシンであればそのままでも可)。その後、Apache から使用できる権限を設定します:

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 モジュールをインストールして有効化します:

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

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

7. VirtualHost を設定します(DocumentRoot / Zabbix UI へのパスは環境に合わせて調整してください):

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

zabbix.conf の内容:

<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 を再起動します:

sudo systemctl restart apache2

8. KDC サービスを有効化/起動し、待ち受けポートを確認します(KDC ホスト上):

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

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

チケット一覧に krbtgt/[email protected] が表示されるはずです。
チケットを必要とする同じ OS ユーザーとして kinit を実行してください(例: Web 監視の場合は zabbix、対話型ブラウザー SSO テストの場合は www-data/Apache)。
別の OS ユーザーに発行されたチケットは、KRB5CCNAME と権限を調整しない限り参照できません。

kinit [email protected]
klist

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

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

11. 必要に応じて、Zabbix UI で HTTP 認証ログインを受け付ける場合は、Zabbix Webインターフェース で HTTP 認証を有効にします(ui/conf/zabbix.conf.php):

$ALLOW_HTTP_AUTH = true;

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

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

about:config 内で:

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

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

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

#for the web service
kinit -kt /etc/apache2/http.keytab HTTP/[email protected]
#for the monitoring user
kinit -kt /var/lib/zabbix/kerb.keytab [email protected]

14. 保守確認項目:

  • klist -k /etc/apache2/http.keytab — keytab にサービス 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 マッピングを確認してください。

セキュリティおよびファイル権限に関する注意

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

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

KRB5CCNAME を設定するテストやスクリプトを実行したり、keytabをコピーしたりする場合は、操作後に所有者と権限を必ず再確認してください。Webサーバーが認証情報を拒否する原因として、ファイル権限の問題はよくあります。