Active Directory の Kerberos認証で PostgreSQL にログインする

前回、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の認証の確認のみなので、他システムの認証まで連携できるか確認できていませんが、機会があれば確認したいと思います。

執筆担当者プロフィール
三条 光暢

三条 光暢(日本ビジネスシステムズ株式会社)

Oracle、PostgreSQLを中心に各種データベースの設計・構築・運用を携わっています。

担当記事一覧