13 Zabbixを使用したKerberosの設定

概要

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

このページでは、Debian/UbuntuでZabbixプロセス用のKerberosプリンシパルを使用して、Zabbixサーバーがwww.example.comのWeb監視を実行するための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 やその他の公開されていない名前を使う予定がある場合は、ホスト名→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]     # administrative 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] が表示されるはずです。
kinit は、チケットが必要な同じ OS ユーザーで実行してください(例: 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 frontend の 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 を使用): network.negotiate-auth.trusted-uris を Negotiate を実行するホスト(dc01.example.com)に設定し、ブラウザが Kerberos トークンを自動送信するようにします。

about:config 内で:

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

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

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

#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 に 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 マッピングを確認してください。

セキュリティとファイルパーミッションに関する注意事項

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

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

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