Belajar Kerberos - Autentikasi Database (PostgreSQL, MySQL)
Episode 16 of 31

Belajar Kerberos - Autentikasi Database (PostgreSQL, MySQL)

Episode ini mengamankan koneksi basis data dengan Kerberos: konfigurasi pg_hba.conf dengan metode gss dan hostgssenc, principal postgres dan keytab, koneksi psql serta JDBC, perbandingan GSSAPI dengan SSL, dan plugin autentikasi Kerberos di MySQL serta MariaDB.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

Di episode 15 kalian membuat peramban mengautentikasi diri ke server web dengan tiket Kerberos. Basis data adalah perbatasan berikutnya — dan yang paling rentan: kredensial DB sering disimpan di file konfigurasi aplikasi, diketik manual, atau bahkan terkirim polos sebelum sesi SSL dimulai. Episode ini menutup celah itu untuk PostgreSQL dan MySQL/MariaDB dengan GSSAPI dan Kerberos.

Intinya sama seperti sebelumnya: tiket membuktikan identitas, keytab membuktikan server. Bedanya, kali ini service principal berganti menjadi postgres/server.example.com, dan konfigurasi berada di file seperti pg_hba.conf serta plugin autentikasi bawaan server.

PostgreSQL dengan GSSAPI

PostgreSQL mendukung autentikasi GSSAPI langsung: klien yang punya tiket Kerberos mengautentikasi tanpa password, dan jika diinginkan, seluruh koneksi dienkripsi dengan kunci session Kerberos.

Service principal. Buat principal khusus untuk server database:

Membuat principal postgres dan mengekstrak keytab
kadmin.local -q "addprinc -randkey postgres/db1.example.com"
kadmin.local -q "ktadd -k /etc/krb5.keytab postgres/db1.example.com"

Beri tahu PostgreSQL lokasi keytab lewat parameter krb_server_keyfile di postgresql.conf, lalu pastikan keytab bisa dibaca oleh user yang menjalankan Postgres.

pg_hba.conf. Aturan koneksi ditulis di /etc/postgresql/*/main/pg_hba.conf. Metode gss meminta autentikasi GSSAPI; awalan hostgssenc mewajibkan saluran terenkripsi GSSAPI:

Linux/etc/postgresql/pg_hba.conf - autentikasi GSSAPI
# Autentikasi GSSAPI dengan enkripsi GSSAPI wajib
hostgssenc all all 0.0.0.0/0 gss
# GSSAPI diizinkan, enkripsi boleh ikut
host    all all 0.0.0.0/0 gss include_realm=0 map=krb_map

include_realm=0 di pg_hba.conf membuang bagian realm sehingga alice@EXAMPLE.COM dipetakan ke user alice. Pemetaan tambahan dilakukan di file pg_ident.conf dengan aturan seperti krb_map alice@EXAMPLE.COM alice.

Keytab setup dan koneksi klien. Setelah krb_server_keyfile diatur dan Postgres di-restart, klien cukup memiliki tiket:

Koneksi psql dengan Kerberos
kinit alice
psql "host=db1.example.com dbname=appdb user=alice"

psql memakai TGT untuk meminta service ticket postgres/db1.example.com ke KDC — tidak ada password yang diketik atau dikirim.

Enkripsi GSSAPI vs SSL

PostgreSQL menawarkan dua lapis proteksi koneksi yang mudah tertukar:

AspekGSSAPI encryptionSSL/TLS
AutentikasiTiket KerberosSertifikat (opsional)
EnkripsiKunci session KerberosSertifikat server
TrustKDCCA / trust store
Cocok untukRealm Kerberos yang adaSemua klien

Keduanya bisa digabung: autentikasi via GSSAPI di atas saluran SSL. Performance implications utama ada pada enkripsi: GSSAPI encryption memakai kriptografi Kerberos (biasanya AES) yang ringan untuk server modern, tetapi untuk query berukuran besar, enkripsi lapisan apa pun menambah latensi. Bila jaringan internal sudah dipercaya, gss tanpa hostgssenc cukup untuk autentikasi; gunakan enkripsi GSSAPI atau SSL hanya saat data melintasi jaringan yang tidak dipercaya atau diwajibkan kepatuhan.

Tip

Cek apakah koneksi benar-benar memakai GSSAPI dengan query select * from pg_hba_file_rules; dan lihat kolom connection_type serta auth_method pada baris yang cocok. Untuk memastikan saluran terenkripsi aktif, jalankan query select ssl from pg_stat_ssl where pid = pg_backend_pid(); — nilai true menandakan enkripsi GSSAPI (atau SSL) berjalan. Petunjuk cepat: hostgssenc memaksa enkripsi, host membiarkannya opsional.

MySQL dan Plugin authentication_kerberos

MySQL (mulai versi 8.0) menyediakan plugin authentication_kerberos yang mengautentikasi klien dengan tiket Kerberos. Aktifkan di my.cnf:

Linux/etc/my.cnf - plugin Kerberos MySQL
[mysqld]
plugin-load-add=authentication_kerberos.so
authentication_kerberos_principal_name=mysql/db1.example.com

Lalu buat user yang terikat principal Kerberos:

Membuat user MySQL berbasis Kerberos
CREATE USER 'alice'@'%' IDENTIFIED WITH authentication_kerberos
  AS 'alice@EXAMPLE.COM';

Configuration. Server MySQL harus memakai keytab yang memuat principal tersebut (diatur lewat authentication_kerberos_service_keytab atau keytab default), dan klien perlu libkdc/GSSAPI yang bisa membaca cache Kerberos. Setelah kinit alice, klien bisa login tanpa password.

Limitations. Plugin ini hanya melakukan autentikasi — koneksi itu sendiri tidak dienkripsi oleh GSSAPI; untuk enkripsi tetap dibutuhkan TLS MySQL. Dukungan platform juga terbatas (paling matang di Linux dengan GSSAPI MIT), dan klien yang dipakai harus mendukung mekanisme tersebut, misal lewat mysql_config_editor atau connector yang mengerti Kerberos.

MariaDB dan Plugin GSSAPI

MariaDB mendekati masalah yang sama lewat plugin gssapi yang menawarkan integrasi lebih dalam: autentikasi Kerberos dan enkripsi koneksi berbasis GSSAPI. Aktifkan dengan memuat plugin:

Linux/etc/mysql/mariadb.conf.d/gssapi.cnf - plugin GSSAPI MariaDB
[mariadb]
plugin_load_add=auth_gssapi
gssapi_principal_name=mariadb/db1.example.com
gssapi_keytab=/etc/krb5.keytab

User mapping. Buat user dan petakan ke principal Kerberos:

Membuat user MariaDB dengan GSSAPI
CREATE USER 'alice'@'%' IDENTIFIED VIA gssapi AS 'alice@EXAMPLE.COM';

Connection strings. Dari klien, koneksi dilakukan tanpa password begitu tiket tersedia. Di DSN ODBC atau connector, cukup pilih mekanisme GSSAPI dan pastikan KRB5CCNAME menunjuk ke cache tiket:

Koneksi MariaDB dengan Kerberos
kinit alice
mariadb --user=alice --host=db1.example.com

Satu perbedaan praktis: MariaDB mewajibkan enkripsi GSSAPI bila gssapi_encryption diaktifkan, sehingga data koneksi ikut dilindungi — keunggulan yang tidak dimiliki plugin MySQL.

JDBC Kerberos

Aplikasi Java di server aplikasi memakai driver JDBC, dan JDBC mengenal Kerberos lewat JAAS (Java Authentication and Authorization Service). Koneksi memakai URL khusus:

LinuxJDBC URL dengan Kerberos
jdbc:postgresql://db1.example.com:5432/appdb?gssEncMode=require&user=alice&kerberosServerName=postgres

Untuk MySQL, serupa dengan parameter yang mengaktifkan Kerberos pada connector.

Keytab vs ticket cache. Server aplikasi bisa memakai salah satu sumber kredensial. Ticket cache cocok untuk sesi interaktif; keytab cocok untuk daemon yang berjalan terus-menerus (menggunakan kinit -kt sebelum aplikasi mulai). Mengandalkan cache berisiko: saat tiket kedaluwarsa, aplikasi kehilangan koneksi. Solusi yang umum adalah keytab + renewal terjadwal, atau pemakaian JAAS dengan principal dan keyTab yang dideklarasi.

Connection pooling. Pool koneksi (seperti HikariCP) memperumit Kerberos: koneksi lama yang dipool memegang konteks GSSAPI dari tiket lama. Setelah tiket berganti, koneksi pooled bisa gagal. Praktik baik: setel umur koneksi maksimum sedikit di bawah umur tiket, atau validasi koneksi secara berkala dan buang yang gagal.

Troubleshooting. Pola kegagalan yang paling sering: GSSException: Failure unspecified at GSS-API level berarti context GSSAPI gagal dibangun — cek keytab server, nama principal, dan KRB5CCNAME. Principal not found menunjuk ke pemetaan realm. Mulailah dari klist di kedua sisi, lalu periksa pg_hba.conf untuk memastikan baris gss benar-benar mencocokkan alamat klien.

Important

Perbedaan kunci antara autentikasi dan enkripsi: plugin Kerberos MySQL hanya mengautentikasi, sedangkan GSSAPI PostgreSQL dan MariaDB bisa juga mengenkripsi koneksi. Jangan berasumsi bahwa login Kerberos berarti data terenkripsi — periksa konfigurasi hostgssenc (PostgreSQL) atau gssapi_encryption (MariaDB), dan aktifkan TLS bila kedua hal itu tidak tersedia.

Penutup

Episode ini menutup gerbang terakhir yang sering dijaga password: basis data. Kalian mengautentikasi PostgreSQL lewat metode gss di pg_hba.conf dengan principal postgres/db1.example.com dan krb_server_keyfile, membandingkan enkripsi GSSAPI dengan SSL, mengaktifkan plugin authentication_kerberos di MySQL dan gssapi di MariaDB, lalu menghubungkan aplikasi Java lewat JDBC/JAAS dengan keytab atau ticket cache.

Inti yang harus dibawa pulang:

  • Autentikasi DB dengan Kerberos menghilangkan password dari aplikasi — tiket di cache atau keytab menggantikannya, dan satu pencabutan principal di KDC langsung memutus akses.
  • Autentikasi bukan enkripsi: MySQL authentication_kerberos hanya membuktikan identitas; gunakan hostgssenc (PostgreSQL), gssapi_encryption (MariaDB), atau TLS untuk melindungi data di kawat.
  • Pemetaan nama penting: include_realm=0 dan pg_ident.conf menghubungkan principal alice@EXAMPLE.COM ke user alice yang dikelola database.
  • Untuk daemon, pakai keytab dengan renewal, bukan ticket cache yang bisa kedaluwarsa di tengah sesi; sesuaikan umur koneksi pooled di bawah umur tiket.

Di episode 17 kita meletakkan fondasi direktori: integrasi LDAP dan Kerberos — mulai dari LDAP sebagai backend principal KDC sampai pengikatan SASL/GSSAPI di OpenLDAP. Sampai jumpa!

Belajar Kerberos - Autentikasi Database (PostgreSQL, MySQL) | Belajar Kerberos