You are viewing documentation for the development version, it may be incomplete.
Join our translation project and help translate Zabbix documentation into your native language.

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 (またはFQDN)
       Administrative server for your Kerberos realm: localhost (または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ユーザー(Webチェック用のzabbixや、ブラウザSSOテスト用のwww-data/Apacheなど)でkinitを実行します。 異なる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フロントエンド(ui/conf/zabbix.conf.php)でHTTP認証を有効にします:

$ALLOW_HTTP_AUTH = true;

Web UIでユーザー > 認証に移動し、HTTP設定タブに移動します。 HTTP認証を有効にするチェックボックスをマークし、ポップアップでOKをクリックします。 デフォルトのログインフォームドロップダウンで「HTTPログインフォーム」を選択します。 大文字と小文字を区別するログインがディレクトリポリシーに合うかどうかを決定します。 更新ボタンをクリックして完了します。

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タイマーを追加します:

#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の場合はzabbix:zabbix所有の0400、Apacheのkeytabの場合はroot:www-data所有の0440

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

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