Active DirectoryでKerberos認証用のキータブファイル(keytab)を作成する方法
多くのLinuxサービス(Apache、Nginxなど)は、keytabファイルを使用することで、パスワードを入力せずにActive Directory上でKerberos認証を行うことができます。keytabファイルには、Kerberosプリンシパルの名前と、それに対応する暗号化済みの鍵(Kerberosパスワードから取得)が保存されています。この記事では、ktpassツールを使用して、Active Directoryアカウントに紐付けられたSPNのkeytabファイルを作成する手順を解説します。
サービスアカウントの作成
keytabファイルを必要とするサービスには、通常、専用のActive Directoryユーザーアカウントを作成します。ただし、コンピューターオブジェクトを使用することも可能です。サービス名はアカウントにバインドされ(ServicePrincipalName — SPN)、SPNはKerberos認証においてサービスインスタンスをADアカウントにマッピングするために使用されます。この仕組みにより、アプリケーションはユーザー名を知らなくてもサービスとして認証できます。
まず、ADにサービスアカウントを作成し、既知のパスワードを設定します。アカウントは、GUIのADUCコンソール(dsa.msc)から作成するか、PowerShell(Active Directoryモジュール)のNew-ADUserコマンドレットで作成できます。
New-ADUser -Name "web" -GivenName "nginx web app" -SamAccountName "web" -UserPrincipalName "web@test.com" -Path "OU=Services,OU=Munich,OU=DE,DC=test,DC=com" –AccountPassword (ConvertTo-SecureString "Sup6r!Pa$s" -AsPlainText -force) -Enabled $true
次に、GUIコンソールまたはPowerShellで、サービスアカウントに対して「ユーザーはパスワードを変更できない」と「パスワードを無期限にする」のオプションを有効にします。
Get-ADUser web|Set-ADUser -PasswordNeverExpires:$True -CannotChangePassword:$true
SPNをアカウントにバインドする
次のステップでは、サービスプリンシパル名(SPN)をユーザーアカウントにバインドします。この手順は、keytabファイル作成時にktpassが自動的に実行するため、本来は個別に行う必要はありません(ここでは、処理の流れを理解しやすくするために実行します)。
以下のコマンドでSPNレコードをwebアカウントにバインドします。
setspn -A HTTP/www.test.com@test.com web
ADユーザーに関連付けられたSPNレコードの一覧を表示して確認します。
setspn -L web
ktpassでkeytabファイルを作成する
keytabファイルを作成するには、以下のコマンドを使用します。
ktpass -princ HTTP/www.test.com@TEST.COM -mapuser web -crypto ALL -ptype KRB5_NT_PRINCIPAL -pass Sup6r!Pa$s -target mundc01.test.com -out c:\share\web.keytab
Successfully mapped HTTP/www.test.com to web.
Password successfully set!
Key created.
Output keytab to c:\share\webt.keytab:
Keytab version: 0x502
keysize 53 HTTP/www.test.com@test.com ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x1 (DES-CBC-CRC) keylength 8 (0x73f868856e046449)
このコマンドにより、HTTP/www@test.comサービスのSPNレコード用のkeytabファイル(c:\share\webt.keytab)が作成されました。SPNレコードは、指定したパスワードでwebアカウントにバインドされています。
サービスのSPNレコードが正常に作成されたことを確認します(手動で作成していない場合)。
setspn -Q */www.test.com@test.com
SPNレコードが見つかり(Existing SPN found!)、webアカウントにバインドされていることがわかります。
keytabファイルの内容を確認する
Windowsにはkeytabファイルの内容を表示する組み込みツールはありません。ただし、コンピューターにJava JREがインストールされていれば、Javaディストリビューションに同梱されているklist.exeを利用できます。
cd "c:\Program Files\Java\jre1.8.0_181\bin"
klist.exe -K -e -t -k c:\PS\web_host.keytab
Key tab: c:\PS\web_host.keytab, 5 entries found.
keytabファイルの内容を確認すると、SPN、鍵、タイムスタンプ、暗号化アルゴリズム、および鍵のバージョン(KVNO — Key Version Number)が表示されます。
keytabファイルを作成すると、ktpassはユーザーアカウントのmsDS-KeyVersionNumber属性の値をインクリメントし(ADの属性エディターで確認可能)、その値をkeytabテーブルのKVNOとして使用します。
パスワード変更時の注意点
アカウントのパスワードを変更すると、属性値が1つ増加し、以前のKVNOを持つすべてのkeytabエントリが無効になります。これは、新しいパスワードが古いパスワードと完全に同一であっても同様です。ADのユーザーパスワードを変更した場合は、keytabファイルを再生成する必要がある点に注意してください。
複数のSPNをkeytabに追加する
1つのkeytabファイルには、異なるSPNの鍵を複数保存できます。追加のSPNと鍵は、ktpassのパラメーター(-in、-setupn、-setpass)を使用してkeytabファイルに追加します。
まとめ
作成したkeytabファイルの活用方法は、適用するサービスによって異なります。たとえば、Zabbixでkeytabファイルを使用して透過的なSSOユーザー認証を実現することなどが可能です。また、keytabファイルのセキュリティ管理も忘れないでください。keytabファイルの内容を読み取ることができる人物は、ファイル内の任意の鍵を利用できてしまうため、適切なアクセス制御が重要です。
-
ZabbixでActive Directory連携のシングルサインオン(SSO)認証を構築する方法【Kerberos設定手順】
本記事では、Kerberosを使用して、Zabbix 4.0以降とActive Directoryを連携させた透過的なSSO(シングルサインオン)認証を段階的に構築する手順を解説します。最終的なゴールは、ユーザーが資格情報を入力することなく、Zabbixのフロントエンドに自動ログインできる状態を作ることです。そのためには、ユーザーがZabbixに登録されたActive DirectoryドメインアカウントでWindowsにログインしている必要があります。さらに、ブラウザ側でも事前設定(Kerberosサポートの有効化やIEでの信頼済みイントラネットサイトへの登録など)が必要です。検証環境今回の
-
【解決方法】「ドメインのActive Directoryドメインコントローラーに接続できませんでした」エラーの修正
「ドメインのActive Directoryドメインコントローラーに接続できませんでした(An Active Directory Domain Controller for the domain could not be contacted)」というエラーは、多くの場合、DNSの設定ミスが原因で発生します。ユーザーからは、別のWindowsワークステーションをドメインに追加しようとした際に、このエラーメッセージが表示されるという報告が寄せられています。「詳細」ボタンをクリックしてエラーの内容を確認すると、「DNS名が存在しません」という旨のメッセージとエラーコードが表示されます。Windows