前回、Active Directory (AD DS)を LDAPサーバーとした、LDAP認証によるPostgreSQLへのログインを試しましたが、今回は AD DS を Kerberosサーバーとして、 Kerberos認証を利用してPostgreSQLへのログインを試します。
構成
テスト用に以下のサーバーを用意します。
前回の構成と同じ構成ですが、今回は AD DSサーバーを Kerberosサーバーとして利用しています。
- Kerberosサーバー(AD DSサーバー/ドメインコントローラー)
- ホスト名:WINSRV001
- ドメイン名:JBS0023.LOCAL
- ユーザー:postgres1(サービスアカウント)、db015(PostgreSQLユーザー)
- PostgreSQLサーバー
- ホスト名:srv-pg-01.jbs0023.local
サービスプリンシパルの作成
サービスアカウントの作成
サービスアカウントとしてpostgres1を作成し、ユーザーのアカウントオプションの「このアカウントでKerberos AES 256 ビット暗号化をサポートする」にチェックを入れます。

Kerberos で許可する暗号化の設定
ローカルセキュリティポリシーを開き、以下の項目を開いてすべてにチェックをつけてください 。
- 「ローカルポリシー」
- 「セキュリティーオプション」
- 「ネットワーク セキュリティ: Kerberos で許可する暗号化の種類を構成する」
- 「セキュリティーオプション」

サービスプリンシパルを登録
次のコマンドを実行し、サービスプリンシパルを登録します。
setspn -s POSTGRES/winsrv001.jbs0023.local postgres1 setspn -s POSTGRES/winsrv001 postgres1
実行例です。
C:\Users\Administrator>setspn -s POSTGRES/winsrv001.jbs0023.local postgres1
ドメイン DC=jbs0023,DC=local を確認しています
CN=postgres1,CN=Users,DC=jbs0023,DC=local の ServicePrincipalNames を登録しています
POSTGRES/winsrv001.jbs0023.local
更新されたオブジェクト
C:\Users\Administrator>setspn -s POSTGRES/winsrv001 postgres1
ドメイン DC=jbs0023,DC=local を確認しています
CN=postgres1,CN=Users,DC=jbs0023,DC=local の ServicePrincipalNames を登録しています
POSTGRES/winsrv001
更新されたオブジェクト
keytab作成
次のコマンドを実行し、keytab を作成します。
KTPass -princ POSTGRES/winsrv001.jbs0023.local@JBS0023.LOCAL -Pass (postgres1のパスワード) -mapuser postgres1@JBS0023.LOCAL -crypto ALL -ptype KRB5_NT_Principal -out postgres.srv-pg-01.jbs0023.local.keytab
実行例です。
C:\Users\Administrator\Documents>KTPass -princ POSTGRES/winsrv001.jbs0023.local@JBS0023.LOCAL -Pass fspxwg1A -mapuser postgres1@JBS0023.LOCAL -crypto ALL -ptype KRB5_NT_Principal -out postgres.srv-pg-01.jbs0023.local.keytab Targeting domain controller: winsrv001.jbs0023.local Using legacy password setting method Successfully mapped POSTGRES/winsrv001.jbs0023.local to postgres1.
作成された postgres.srv-pg-01.jbs0023.local.keytab は postgresql サーバーにコピーします。
postgresqlサーバの設定
krb5-workstationインストール
kerberos をインストールしていない場合は krb5-workstationをインストールします。
yum install krb5-workstation.x86_64
Kerberos設定
/etc/krb5.conf を以下のように編集します。
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = JBS0023.LOCAL
dns_lookup_realm = false
# ticket_lifetime = 24h
# renew_lifetime = 7d
forwardable = true
udp_preference_limit = 1
rdns = false
# pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
# default_ccache_name = KEYRING:persistent:%{uid}
[realms]
JBS0023.LOCAL = {
kdc = winsrv001.jbs0023.local
admin_server = winsrv001.jbs0023.local
}
[domain_realm]
.jbs0023.local = JBS0023.LOCAL
jbs0023.local = JBS0023.LOCAL
keytabファイルの確認
ADサーバーからコピーしたkeytab ファイルの内容を確認します。
[postgres@srv-pg-01 ~]$ klist -k ./krb_server_key/postgres.srv-pg-01.jbs0023.local.keytab Keytab name: FILE:./krb_server_key/postgres.srv-pg-01.jbs0023.local.keytab KVNO Principal ---- -------------------------------------------------------------------------- 3 POSTGRES/winsrv001.jbs0023.local@JBS0023.LOCAL 3 POSTGRES/winsrv001.jbs0023.local@JBS0023.LOCAL 3 POSTGRES/winsrv001.jbs0023.local@JBS0023.LOCAL 3 POSTGRES/winsrv001.jbs0023.local@JBS0023.LOCAL 3 POSTGRES/winsrv001.jbs0023.local@JBS0023.LOCAL
postgresqlのkerberos認証設定
postgresql のパラメータ krb_server_keyfile に keytab のパスを指定します。 postgresql.conf に以下1行を追加します。
krb_server_keyfile = '/var/lib/pgsql/krb_server_key/postgres.srv-pg-01.jbs0023.local.keytab'
ユーザーdb015のkerberos認証の設定を行います。 pg_hba.conf に以下1行を追加します。
host all db015@JBS0023.LOCAL samenet gss include_realm=1 krb_realm=JBS0023.LOCAL
データベースにドメイン名付きでユーザーを作成します。
psql postgres create user db015@JBS0023.LOCAL; \q
Kerberos 認証
db015で認証を行います
[postgres@srv-pg-01 ~]$ kinit db015
Password for db015@JBS0023.LOCAL:
[postgres@srv-pg-01 ~]$ klist
Ticket cache: FILE:/tmp/krb5cc_26
Default principal: db015@JBS0023.LOCAL
Valid starting Expires Service principal
2023-09-14T04:16:46 2023-09-14T14:16:46 krbtgt/JBS0023.LOCAL@JBS0023.LOCAL
renew until 2023-09-15T04:16:40
ログインテスト
通常のログインと同様にログインします。
psql -h srv-pg-01.jbs0023.local -d postgres -U db015@JBS0023.LOCAL psql (12.13) GSSAPI-encrypted connection postgres=>
最後に
Kerberos認証により、SSOでログインが可能になるのでユーザー・パスワード管理の負担が低減できます。
今回はPostgreSQLの認証の確認のみなので、他システムの認証まで連携できるか確認できていませんが、機会があれば確認したいと思います。