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