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 レルムを設定します。

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 やその他のパブリックではない名前を使用する場合は、ホスト名からレルムへのマッピングが機能するように、明示的なドメイン→レルムのマッピングを追加します。 ここで不一致があると、Server not found in Kerberos database エラーが発生します。

4. Kerberos データベースを初期化します(KDC ホストで一度だけ実行)。 プロンプトが表示されたら、安全なマスターパスワードを設定します。

sudo krb5_newrealm

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

sudo kadmin.local

kadmin.local 内で次を実行します。

addprinc [email protected]     # 管理用プリンシパル
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
# 確認
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    # または: 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. 有効な TGT を持つクライアントから、curl で SPNEGO 交換をテストします。 200 OK(またはアプリケーションへのリダイレクト)が返されれば、SPNEGO は成功しています。

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

11. 必要に応じて、Zabbix UI で HTTP 認証ログインを受け入れるようにします(ui/conf/zabbix.conf.php)。

$ALLOW_HTTP_AUTH = true;

Webインターフェースで Users > Authentication に移動し、HTTP settings タブを開きます。 Enable HTTP authentication チェックボックスを選択し、ポップアップで Ok をクリックします。 Default login form ドロップダウンから「HTTP login form」を選択します。 Case-sensitive login がディレクトリのポリシーに適合するかどうかを判断します。 Update ボタンをクリックして完了します。

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

about:config 内で次を設定します。

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

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

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

# Webサービス用
kinit -kt /etc/apache2/http.keytab HTTP/[email protected]
# 監視ユーザー用
kinit -kt /var/lib/zabbix/kerb.keytab [email protected]

14. ハウスキーピングの確認:

  • klist -k /etc/apache2/http.keytab - サービスプリンシパルが keytab に存在することを確認します。
  • sudo tail -f /var/log/apache2/error.log - GSSAPI エラーを監視します(gss_acquire_cred[_from]() failed to get server creds は、keytab または権限の問題、あるいはプリンシパルが存在しないことを示します)。
  • curl --negotiate が 401/403 を返す場合、多くの場合、プリンシパルの誤り、チケットがない、ホストヘッダーの不一致、またはファイルシステム権限の問題を意味します。ログと /etc/krb5.conf のドメインマッピングを確認してください。

セキュリティとファイル権限に関する注意事項

keytabファイルは、必要とするアカウントだけが読み取れるようにしてください。 権限の例: zabbixユーザーのkeytabの場合は 0400 で所有者を zabbix:zabbix に設定し、Apacheのkeytabの場合は 0440 で所有者を root:www-data に設定します。

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

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