ZabbixでActive Directory連携のシングルサインオン(SSO)認証を構築する方法【Kerberos設定手順】
本記事では、Kerberosを使用して、Zabbix 4.0以降とActive Directoryを連携させた透過的なSSO(シングルサインオン)認証を段階的に構築する手順を解説します。
最終的なゴールは、ユーザーが資格情報を入力することなく、Zabbixのフロントエンドに自動ログインできる状態を作ることです。そのためには、ユーザーがZabbixに登録されたActive DirectoryドメインアカウントでWindowsにログインしている必要があります。さらに、ブラウザ側でも事前設定(Kerberosサポートの有効化やIEでの信頼済みイントラネットサイトへの登録など)が必要です。
検証環境
今回の検証では以下の環境を使用しています。
- Ubuntu Server 18.04 LTS
- 機能レベル2008以上のActive Directoryドメイン
- Zabbix Server 4.0.11、WebサーバーはApache2(Zabbixのインストール手順は別記事参照)
注意: 本記事ではSSOの実装に、libapache2-mod-auth-kerbモジュールを組み込んだApache2を使用します。Nginxについては割愛しますが、Nginxの場合はソースコンパイル時にspnego-http-auth-nginx-moduleを別途有効化する必要があります。
ZabbixとActive DirectoryのLDAP認証設定
まず、ドメインユーザーをZabbixに紐付ける必要があります。具体的には、ADドメイン上のログイン名と同じ名前でZabbix側にユーザーを作成するだけでOKです。例えば、あなたのログイン名(sAMAccountName属性)が「user_5」であれば、Zabbix上にも同じログイン名のユーザーを作成してください。この作業は、Zabbixを利用する全ユーザーに対して行います。
次に、Zabbixをドメインに接続(バインド)するための専用ユーザーアカウントをActive Directoryに作成します。実運用では既存の任意のドメインアカウントを使うことも可能ですが、サービス用アカウントとして独立したものを作成しておくのがベストプラクティスです。ここではzabbix_adminというアカウントを作成します。PowerShellのNew-ADUserコマンドレットを使うと以下のように作成できます。
New-ADUser -Name "zabbix_admin" -GivenName "zabbix_admin" -Surname "zabbix_admin" -SamAccountName "zabbix_admin" -AccountPassword (Read-Host -AsSecureString "Password:") -DisplayName "zabbix_admin" -Enabled $true
このコマンドをPowerShellコンソールで実行し、パスワードを設定してください。作成したユーザーは、ドメインルートのUsersコンテナ配下に配置されます。
続いて、Zabbix側でLDAP認証を設定します。Zabbixフロントエンドの Administration(管理) → Authentication(認証) にあるLDAP設定タブを開き、「Enable LDAP authentication」にチェックを入れて、以下の項目を入力します。
- LDAP host:
ldap://dc1.domain.local - Port:
389 - Base DN:
DC=domain, DC=local - Search attribute:
sAMAccountName - Bind DN:
CN=zabbix_admin,OU=Users,DC=domain,DC=local
各パラメータの詳細な説明は、Zabbix公式ドキュメントのLDAP認証セクションを参照してください:https://www.zabbix.com/documentation/current/manual/web_interface/frontend_sections/administration/authentication
設定を保存する前に、必ずTestボタンでテストログインを行い、設定が正しいことを確認しましょう。先ほど作成したアカウントのユーザー名とADパスワードを指定してテストします。
テストが成功したら設定を保存し、Zabbixの認証方式をInternalからLDAPへ変更します。
さらにHTTP認証も有効化します(HTTP Settings → Enable HTTP authentication)。これでLDAP認証の設定は完了です。
ヒント: LDAPサーバーがダウンするとZabbixにアクセスできなくなります。その場合は内部認証に戻す必要があります。MySQLで以下のコマンドを実行してください。
update zabbix.config set authentication_type='0' where configid='1';
Zabbixで透過的(シングルサインオン)認証を構成する(Apache2・krb5-user)
まず、/etc/hostnameにサーバーのFQDN名を指定します。この名前はドメイン内のDNSレコードと一致していなければなりません。ここではzabbix.domain.localとします。
また、/etc/hostsにも、サーバーのローカルIPアドレスおよびサーバー自身のIPアドレスに対してFQDNを記述しておきます。
127.0.0.1 localhost zabbix.domain.local 10.1.1.10 zabbix.domain.local
Kerberos認証を正しく動作させるには、時刻をドメインコントローラーと同期させる必要があります。ntpdateパッケージをインストールし、ドメインコントローラーに同期させましょう。
apt-get install ntp ntpdate
ntpdate dc.domain.local
なお、CentOS 8では時刻同期にChronyが使用されており、公式リポジトリにntpやntpdateパッケージは存在しない点に注意してください。
次に、ドメインコントローラー上でkeytabファイルを生成します。keytabとは、SPN(サービスプリンシパル名)と暗号化キーを格納したファイルで、Kerberosベースの認証に使用されます。
- ドメインコントローラーにログインし、管理者権限でコマンドプロンプトを開いてC:\に移動します。
- 以下のコマンドを入力します。
ktpass -princ HTTP/zabbix.domain.local@DOMAIN.LOCAL -mapuser zabbix_admin -pass STRONGPASS -crypto ALL -ptype KRB5_NT_PRINCIPAL -out zabbix.keytab -setupn –setpass - C:\zabbix.keytabファイルを、Zabbixサーバーの/etc/apache2/ディレクトリにコピーします。
Kerberos関連パッケージとApache2用モジュールをインストールします。
#apt install krb5-user libapache2-mod-auth-kerb
krb5-userを設定します。/etc/krb5.confを編集してください。
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = DOMAIN.LOCAL
default_keytab_name = /etc/apache2/zabbix.keytab
dns_lookup_kdc = false
dns_lookup_realm = false
forwardable = true
ticket_lifetime = 24h
[realms]
DOMAIN.LOCAL = {
kdc = dc.domain.local
default_domain = DOMAIN.LOCAL
admin_server = dc.domain.local
}
[domain_realm]
.domain.local = DOMAIN.LOCAL
domain.local = DOMAIN.LOCALご自身のドメイン名に合わせて書き換えてください。一部の項目ではドメイン名を大文字で記述する決まりがあるため、このルールは厳守してください。
注意: 「default_keytab_name = /etc/apache2/zabbix.keytab」の行にあるkeytabファイルのパスを確認し、実際にファイルがそこに存在することを確かめてください。www-dataユーザーに読み取り権限を付与するため、以下も実行します:chown www-data:www-data /etc/apache2/zabbix.keytab
Linux上でKerberos認証が機能しているか確認します。
kinit -kV -p HTTP/zabbix.domain.local –t /etc/apache2/zabbix.keytab
以下のようなエラーが表示される場合があります。
kinit: Client 'HTTP/zabbix.domain.local@DOMAIN.LOCAL’ not found in Kerberos database while getting initial credentials
その場合は、別のユーザーの資格情報で認証を試してみてください。
kinit -pV LOGIN
認証が成功するなら、問題はkeytabファイル側にあります。正しく生成されているか、生成コマンドに入力ミスがないかを確認しましょう。
また、Zabbixのサービスアカウントに対するSPNレコードがADに存在するかも確認が必要です。ドメインコントローラーで以下のコマンドを実行します。
setspn -l zabbix_admin
HTTP/zabbix.domain.local形式のエントリが表示されるはずです。レコードが存在しない場合は、次のコマンドで追加します。
setspn -a HTTP/zabbix.domain.local zabbix_admin
ユーザーのログオン名が「HTTP/zabbix.domain.local」に変更されていることも確認してください。変更されていない場合は手動で修正します。
続いて、Apache2の設定ファイル /etc/apache2/sites-available/000-default.conf を編集します。「ServerName zabbix.domain.local」行の下に、以下を追加してください。
<Location /> AuthType Kerberos AuthName "Kerberos authenticated" KrbAuthRealms DOMAIN.LOCAL #KrbServiceName HTTP/zabbix.domain.local KrbServiceName Any Krb5Keytab /etc/apache2/zabbix.keytab KrbMethodNegotiate On KrbSaveCredentials on KrbLocalUserMapping on Require valid-user </Location>
KrbServiceNameがkeytabファイル内の名前と一致しないとエラーが発生します。テスト中はAny値を設定しておくと便利です。システムが正常に動作することを確認したら、正しいサービス名を明示的に指定しましょう。サービス名は以下のコマンドで確認できます。klist -le /etc/apache2/zabbix.keytab
ブラウザ側のKerberos認証設定方法
Internet ExplorerでZabbixに対してKerberos認証を使用するには、ZabbixのURLをローカルイントラネットサイトに追加する必要があります。Google ChromeはIEの設定を引き継ぐため、個別の設定は不要です。
注意: ZabbixサイトのURLを「信頼済みサイト」に登録してはいけません。そうするとKerberosが動作しなくなります。登録先は必ず「イントラネット」ゾーンのみにしてください。
IEで「インターネットオプション」→「セキュリティ」タブを開きます。
「ローカルイントラネット」のSites(サイト)ボタンをクリックし、スクリーンショットの通りオプションにチェックを入れて「詳細設定」をクリックします。
ZabbixサーバーのURLを入力します。
次に「詳細設定」タブに移動し、「統合Windows認証を使用する」にチェックを入れます。
また、グループポリシーを使ってZabbixのURLをローカルイントラネットゾーンに登録することも可能です(コンピューターの構成 → 管理用テンプレート → Windowsコンポーネント → Internet Explorer → インターネット コントロール パネル → セキュリティ ページ → サイトとゾーンの割り当て一覧。イントラネットサイトのゾーンコードは1を使用します)。
Mozilla Firefoxの場合は、about:configで以下の3つのパラメータにZabbixサーバーのURLを追加してください。
network.automatic-ntlm-auth.trusted-uris network.negotiate-auth.delegation-uris network.negotiate-auth.trusted-uris
問題が発生した場合は、ブラウザにおけるKerberos設定の詳細記事を参照してください。
これですべての設定は完了です。ZabbixサーバーのURLにアクセスすると、自動的に認証され、パスワードの入力を求められないはずです。
ApacheにおけるKerberos認証のデバッグとトラブルシューティング
問題が発生した場合は、Apache2のデバッグモードを有効にしましょう。
/etc/apache2/sites-available/000-defaults.conf の閉じタグ </VirtualHost> の直前に、以下を追記します。
LogLevel trace8
Apacheを再起動し、error.logファイル内のKerberosモジュールのエラーを確認します。
見やすくするために、IPアドレスでフィルタリングする以下のコマンドが便利です。
tail -f /var/log/apache2/error.log | grep ‘Your IP address’
Kerberosの操作・診断には、kinitとklistコマンドが活用できます。
kinitはKerberosチケットを取得してキャッシュするツールです。使用例は以下の通りです。
kinit –V -k -t /etc/apache2/zabbix.keytab –p HTTP/zabbix.domain.local@DOMAIN.LOCAL
keytabファイルが正しく生成されていれば、このコマンドは正常に実行され、認証成功のメッセージが表示されます。
klistを使うと、キャッシュされたKerberosチケットを確認できます。
klist -a
-
Active Directory Server 2003 を Active Directory Server 2016 に段階的に移行する方法
このチュートリアルでは、Windows Server 2003 Active Directory を Windows Server 2016 AD に移行する方法を紹介します。ご存じのとおり、Windows Server 2003 のサポートと更新は 2015 年 7 月に終了し、多くの企業が既に移行しているか、Windows Server 2003 サーバーを Windows Server 2012R2 または Windows Server 2016 にアップグレードする予定です。 Active Directory の移行は、重要かつ深刻な手順です。なぜなら、AD サーバーは、ネットワーク
-
Active Directoryでユーザーの最終ログイン日時を確認する2つの方法
Active Directory上のユーザーが最後にログインした日時を確認したい場合は、本チュートリアルをご活用ください。ここでは、ADユーザーの最終ログイン時刻を調べるための2つの方法(GUI操作とPowerShell)をわかりやすく解説します。ADユーザーが任意のワークステーションからActive Directoryにログオンするたびに、システムはその日時をlastLogon属性およびlastLogonTimestamp属性に記録します。このうち、より正確なのはlastLogon属性です。この属性には、特定のドメインコントローラー(DC)が認証した直近のログオン情報が反映されます。※補足: