Kerberos認証は、ZabbixのWeb監視やHTTPアイテムで使用できます。
このページでは、Debian/UbuntuでZabbixプロセス用のKerberosプリンシパルを使用して、Zabbixサーバーがwww.example.comのWeb監視を実行するためのKerberosの設定例について説明します。
1. KDCとクライアントユーティリティをインストールします:
パッケージのセットアップ中にプロンプトに答えます。例:
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サーバーのエントリを追加します:
追加する例:
3. KerberosクライアントとKDCレルムを設定します:
設定例:
[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ホストで一度だけ実行)。 プロンプトが表示されたら安全なマスターパスワードを設定します:
5. クライアントが使用する正確なホスト名でHTTP/host.fqdn@REALMプリンシパルを作成します。小文字を推奨します(例: HTTP/[email protected])。 大文字/小文字や名前の不一致はServer not found in Kerberos databaseの原因となります。
kadmin.local内で:
addprinc [email protected] # 管理用プリンシパル
addprinc -randkey HTTP/[email protected]
ktadd -k /etc/apache2/http.keytab HTTP/[email protected]
quitkeytabを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.keytab6. 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へのパスを調整):
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を再起動します:
8. KDCサービスを有効化/起動し、リッスンポートを確認します(KDCホスト):
sudo systemctl enable --now krb5-kdc krb5-admin-server
ss -tnlp | grep :80 # または: sudo netstat -tnlp | grep :809. テスト用にTGTを取得します(チケットを使用するユーザーで実行)。
チケットリストにkrbtgt/[email protected]が表示されることを期待します。 チケットが必要なOSユーザー(Webチェック用のzabbixや、ブラウザSSOテスト用のwww-data/Apacheなど)でkinitを実行します。 異なるOSユーザーに発行されたチケットは、KRB5CCNAMEとパーミッションを調整しない限り表示されません。
kinit [email protected]
klist10. curlでSPNEGO交換をテストします(有効なTGTを持つクライアントから)。 200 OK(またはアプリへのリダイレクト)が表示されればSPNEGOは成功です:
11. オプションで、Zabbix UIがHTTP認証ログインを受け入れる場合は、Zabbixフロントエンド(ui/conf/zabbix.conf.php)でHTTP認証を有効にします:
Web UIでユーザー > 認証に移動し、HTTP設定タブに移動します。 HTTP認証を有効にするチェックボックスをマークし、ポップアップでOKをクリックします。 デフォルトのログインフォームドロップダウンで「HTTPログインフォーム」を選択します。 大文字と小文字を区別するログインがディレクトリポリシーに合うかどうかを決定します。 更新ボタンをクリックして完了します。
12. ブラウザの設定(例としてFirefoxを使用): network.negotiate-auth.trusted-urisをNegotiateを実行するホスト(dc01.example.com)に設定し、ブラウザが自動的にKerberosトークンを送信するようにします。
about:config内で:
これで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サーバーが認証情報を拒否する場合、ファイルパーミッションの問題であることがよくあります。