Pemahaman Asas Kerberos dan SSH
Pelayan & Klien (sambungan dalaman) dalam VM Fedora

Saya melaburkan masa yang agak lama untuk menghadam kegunaan protokol Kerberos menerusi banyaknya sesi percubaan yang mengecewakan. Setelah menempuh bersiri-siri episod kehampaan, kali ini terbayar juga sekian jumlah sumbangan tenaga yang agak melelahkan itu.
Penjelasan yang tuntas mengenai kaedah pengesahan dengan Kerberos ini boleh diperolehi dari YouTube,
Kerberos Authentication Explained | A deep dive.
Sungguh! Prosesnya begitu rumit, sementelah betapa sebelum ini banyak kekeliruan yang saya alami dek kurangnya kemahiran dan kefahaman tentang perbezaan antara domain dan REALM, juga dalam bab menguruskan domain.
Sila rujuk “ufw-script.sh” pada entri yang berkenaan dengan “Perkhidmatan Kerberos” untuk pengurusan firewall di hos.
Makanya, empat topik yang akan saya sentuh di sini iaitu:
- Pemasangan & Konfigurasi Kerberos di KDC
- Pemasangan & Konfigurasi Kerberos di Klien
- Sambungan SSH Menggunakan Pengesahan GSSAPI
- Penyediaan dua VM Fedora (QEMU/KVM),
khusus untuk tujuan belajar Kerberos ini. Saya kebelakangkan topik ini agar tumpuan utama diberikan kepada topik Kerberos terlebih dahulu. Topik ini hanya untuk dirujuk apabila perlu kepada pengetahuan menguruskan VM yang mungkin tidak cukup dimahiri sebelum ini.
Tetapan Wajib di Kedua-dua Mesin Maya
Maklumat rangkaian kedua-dua VM Fedora: VM1 adalah sebagai KDC yakni server manakala VM2 akan bertindak sebagai klien. Nama pengguna untuk kedua-dua VM adalah sama, iaitu
hadoop./etc/hosts192.168.0.101 master.cluster.loc master # KDC/Server 192.168.0.102 worker.cluster.loc worker # Klien(Optional) Jika perlu memindahkan fail antara VM sebelum menggunakan tiket Kerberos untuk log masuk SSH, disarankan menjana kunci SSH di setiap VM. Kemudian, salin kunci tersebut antara VM secara timbal balik untuk membolehkan sambungan SSH tanpa kata laluan. Setelah itu, barulah digantikan dengan kaedah pengesahan menggunakan
TGTmelalui proses-proses konfigurasi seterusnya.bashssh-keygen ssh-copy-id -i ~/.ssh/id_ed25519.pub <hostname / IP address>Fail konfigurasi SSH:
~/.ssh/config# global options Host * IdentitiesOnly yes IdentityFile ~/.ssh/id_ed25519 # host & client specific options Host master HostName master.cluster.loc Host worker HostName worker.cluster.locUruskan perihal masa yang perlu diselaraskan terlebih dahulu. Fedora menetapkan masa kepada lokal secara lalai. Kita mahu seragamkan masa ini secara automatik melalui rangkaian dan bukan secara lokal. Maka nyahkan terlebih dahulu tetapan lokal. Fedora menetapkan servis
chronydsecara lalai untuk NTP maka boleh semak statusnya dari servis berkenaan.bashsudo timedatectl set-local-rtc 0 timedatectl chronyc trackingReference ID : 2BD8B124 (ntp2.demimasa.my) Stratum : 3 Ref time (UTC) : Sun Feb 09 08:24:45 2025 System time : 0.000619294 seconds fast of NTP time Last offset : +0.000626924 seconds RMS offset : 0.061736684 seconds Frequency : 6.417 ppm fast Residual freq : -4.732 ppm Skew : 0.215 ppm Root delay : 0.029564878 seconds Root dispersion : 0.054725591 seconds Update interval : 64.8 seconds Leap status : Normal
Umumnya, aras Stratum yang bagus adalah 5 dan ke bawah kerana ia menunjukkan bahawa jam telah diseragamkan dengan sumber yang dipercayai. Semestinya aras 1 adalah terbaik tetapi peranti yang mencapai aras 1 keseragaman masa biasanya melibatkan kos yang tinggi, namun tidaklah semahal peranti-peranti yang menjadi sumber primer dalam rujukan bagi keselarasan masa dengan aras Stratum 0. Dalam kes saya ini, aras 3 sudah memadai.
Pemasangan & Konfigurasi Kerberos di KDC
- Pemasangan:
bashsudo dnf install krb5-server krb5-libs krb5-workstation -y
Terdapat empat fail konfigurasi yang mesti ada:
krb5.conf
/etc/krb5.conf# To opt out of the system crypto-policies configuration of krb5, remove the
# symlink at /etc/krb5.conf.d/crypto-policies which will not be recreated.
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]
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
default_realm = CLUSTER.LOC
default_ccache_name = KEYRING:persistent:%{uid}
[realms]
CLUSTER.LOC = {
kdc = master.cluster.loc
admin_server = master.cluster.loc
}
[domain_realm]
.cluster.loc = CLUSTER.LOC
cluster.loc = CLUSTER.LOCkdc.conf
/var/kerberos/krb5kdc/kdc.conf[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
CLUSTER.LOC = {
database_name = /var/kerberos/krb5kdc/principal
acl_file = /var/kerberos/krb5kdc/kadm5.acl
key_stash_file = /var/kerberos/krb5kdc/.k5.CLUSTER.LOC
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
default_principal_flags = +preauth
max_life = 10h 0m 0s
max_renewable_life = 7d 0h 0m 0s
master_key_type = aes256-cts-hmac-sha1-96
supported_enctypes = aes256-cts-hmac-sha1-96:normal aes128-cts-hmac-sha1-96:normal
# aes256-cts-hmac-sha384-192:normal aes128-cts-hmac-sha256-128:normal camellia256-cts-cmac:normal camellia128-cts-cmac:normal
}kadm5.acl
/var/kerberos/krb5kdc/kadm5.acl*/admin@CLUSTER.LOC *
hadoop/admin@CLUSTER.LOC e *Arch Linux, fail-fail konfigurasi dan pangkalan data untuk admin KDC ditempatkan di /var/lib/krb5kdc/.Pengisian entri baris dirujuk dari Dokumentasi MIT untuk kadm5.acl yang antaranya memetik:
“The extract privilege is not included in the wildcard privilege; it must be explicitly assigned. This privilege allows the user to extract keys from the database, and must be handled with great care to avoid disclosure of important keys like those of the kadmin/* or krbtgt/* principals. The lockdown_keys principal attribute can be used to prevent key extraction from specific principals regardless of the granted privilege.”
.k5login
~/.k5loginhadoop@CLUSTER.LOC- Log masuk sebagai pengguna tempatan (pengguna yang sama iaitu
hadoop) melalui SSH juga memerlukan entri baris di atas. Jika tiada, SSH akan kembali kepada pengesahan menggunakan kunci awam. - Katakan nama pengguna di VM2 ialah
krbclient. Dalam situasi di mana KDC (VM1) perlu membuat sambungan SSH ke dalam VM2, krbclient mesti mempunyai entriKDC_user@KERBEROS.REALMdalam fail ini.
▪ Iaitu sebagaimana entri di atas dalam/home/krbclient/.k5login. - Begitu juga sebaliknya. Sekiranya
krbclientmahu membuat sambungan SSH ke dalam KDC, KDC mesti mempunyai entrikrbclient@CLUSTER.LOCdalam/home/hadoop/.k5login. Entri ini bertindak sebagai pemberi kebenaran untuk log masuk bagi pihak klien.
KDC sebagai kadmin dengan arahan berikut:▪ "
addprinc krbclient@CLUSTER.LOC" dan▪ "
addprinc krbclient/admin@CLUSTER.LOC" untuk urusan pentadbiran.Cipta pangkalan data:-
bashsudo kdb5_util -r CLUSTER.LOC create -sInitializing database '/var/kerberos/krb5kdc/principal' for realm 'CLUSTER.LOC', master key name 'K/M@CLUSTER.LOC' You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter KDC database master key: Re-enter KDC database master key to verify:
Mulakan servis:-
bashsudo systemctl enable --now krb5kdc sudo systemctl enable --now kadminDalamArch Linux, kedua-dua servis dinamakan sebagaikrb5-kdcdankrb5-kadmind.Teruskan dengan langkah-langkah selanjutnya. Dua langkah pertama menambah prinsipal untuk kegunaan pengguna biasa dan pentadbiran, diikuti dengan penjanaan prinsipal
host/master.cluster.locmenggunakan kunci rawak bagi pengesahan hos. Akhir sekali,ktadddigunakan untuk menyimpan kunci tersebut dalam fail keytab bagi membolehkan akses tanpa kata laluan.bashsudo kadmin.localAuthenticating as principal root/admin@CLUSTER.LOC with password. kadmin.local: addprinc hadoop@CLUSTER.LOC No policy specified for hadoop@CLUSTER.LOC; defaulting to no policy Enter password for principal "hadoop@CLUSTER.LOC": Re-enter password for principal "hadoop@CLUSTER.LOC": Principal "hadoop@CLUSTER.LOC" created. kadmin.local: addprinc hadoop/admin@CLUSTER.LOC No policy specified for hadoop/admin@CLUSTER.LOC; defaulting to no policy Enter password for principal "hadoop/admin@CLUSTER.LOC": Re-enter password for principal "hadoop/admin@CLUSTER.LOC": Principal "hadoop/admin@CLUSTER.LOC" created. kadmin.local: addprinc -randkey host/master.cluster.loc No policy specified for host/master.cluster.loc@CLUSTER.LOC; defaulting to no policy Principal "host/master.cluster.loc@CLUSTER.LOC" created. kadmin.local: ktadd host/master.cluster.loc Entry for principal host/master.cluster.loc with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab. Entry for principal host/master.cluster.loc with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab. kadmin.local: quit
Sesi percubaan: dapatkan tiket Kerberos di KDC.
bashkinitPaparkan maklumat tiket.
bashklistTicket cache: KCM:1000 Default principal: hadoop@CLUSTER.LOC
Valid starting Expires Service principal 02/09/2025 10:10:02 02/09/2025 20:10:02 krbtgt/CLUSTER.LOC@CLUSTER.LOC renew until 02/10/2025 10:09:58Sebelum beralih ke konfigurasi untuk klien, salin fail
/etc/krb5.confke dalam direktori$HOMEterlebih dahulu.bashcp /etc/krb5.conf .
Konfigurasi Kerberos di Klien
krb5-libsdankrb5-workstationmemang sudah terpasang dalam Fedora Server. Salin failkrb5.confdari KDC (VM1) ke Klien (VM2) dan alihkannya ke direktori/etc/:bashscp master:krb5.conf . sudo mv krb5.conf /etcPastikan Klien dapat berkomunikasi dengan KDC melalui arahan berikut:
bashsudo dnf install telnet telnet-server -y ping -c3 master.cluster.loc # Check connectivity telnet master.cluster.loc 88 # Verify KDC is listening on port 88Sesi percubaan: dapatkan tiket Kerberos di Klien.
bashkinitPaparkan maklumat tiket.
bashklistTicket cache: KCM:1000 Default principal: hadoop@CLUSTER.LOC
Valid starting Expires Service principal 02/09/2025 10:17:52 02/09/2025 20:17:52 krbtgt/CLUSTER.LOC@CLUSTER.LOC renew until 02/10/2025 10:17:48Cuba akses
kadmindari klien sebagairoot:bashsudo kadmin -p hadoop/adminAuthenticating as principal hadoop/admin with password. Password for hadoop/admin@CLUSTER.LOC: kadmin: listprincs K/M@CLUSTER.LOC hadoop/admin@CLUSTER.LOC hadoop@CLUSTER.LOC host/master.cluster.loc@CLUSTER.LOC kadmin/admin@CLUSTER.LOC kadmin/changepw@CLUSTER.LOC krbtgt/CLUSTER.LOC@CLUSTER.LOC kadmin:
Sambungan SSH Menggunakan Pengesahan GSSAPI
Konfigurasi universal
SSH(tetapkan perkara di bawah ini di kedua-dua VM). Nyahkan komen dan aktifkan opsyenKerberossertaGSSAPI:/etc/ssh/sshd_config# Kerberos options KerberosAuthentication yes # GSSAPI options GSSAPIAuthentication yes GSSAPICleanupCredentials yes GSSAPIKeyExchange yes/etc/ssh/ssh_configHost * GSSAPIAuthentication yes GSSAPIDelegateCredentials yes GSSAPIKeyExchange yesKaedah pengesahan denganKeyExchangetidak disokong dalamArch Linux. Sebaliknya, kaedah pengesahan yang digunakan adalahgssapi-with-mic.Mulakan semula servis:
sudo systemctl restart sshd.Di VM2 (Klien): Tambahkan hos klien dan hasilkan kunci rambang untuknya. Saya percaya langkah ini adalah bertepatan dengan perbincangan di ArchWiki pada bab [5.1: Service principals and keytabs with remote kadmin].
bashsudo kadmin -p hadoop/adminkadmin: addprinc -randkey host/worker.cluster.loc No policy specified for host/worker.cluster.loc@CLUSTER.LOC; defaulting to no policy Principal "host/worker.cluster.loc@CLUSTER.LOC" created. kadmin: ktadd host/worker.cluster.loc Entry for principal host/worker.cluster.loc with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab. Entry for principal host/worker.cluster.loc with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab. kadmin: quit
Cuba SSH ke KDC (Server) dengan opsyen
-v.bashssh -v master... debug1: Next authentication method: gssapi-keyex Authenticated to master.cluster.loc ([192.168.0.101]:22) using "gssapi-keyex". ...
Semak maklumat tiket di kedua-dua VM dengan arahan
klist.VM1 (KDC):
Ticket cache: KCM:1000:71016 Default principal: hadoop@CLUSTER.LOC
Valid starting Expires Service principal 02/10/2025 10:47:54 02/10/2025 20:47:29 krbtgt/CLUSTER.LOC@CLUSTER.LOC renew until 02/17/2025 10:47:27VM2 (Klien):
Ticket cache: KCM:1000 Default principal: hadoop@CLUSTER.LOC
Valid starting Expires Service principal 02/10/2025 10:47:29 02/10/2025 20:47:29 krbtgt/CLUSTER.LOC@CLUSTER.LOC renew until 02/17/2025 10:47:27 02/10/2025 10:47:54 02/10/2025 20:47:29 host/master.cluster.loc@CLUSTER.LOC renew until 02/17/2025 10:47:27Saya kira, selesai sudah bahagian
Kerberosini. Cache tiket boleh dihapuskan dengan perintahkdestroy.Untuk menyemak kunci:
bashsudo klist -kte /etc/krb5.keytabKeytab name: FILE:/etc/krb5.keytab KVNO Principal ---- -------------------------------------------------------------------------- 2 host/worker.cluster.loc@CLUSTER.LOC (aes256-cts-hmac-sha1-96) 2 host/worker.cluster.loc@CLUSTER.LOC (aes128-cts-hmac-sha1-96)
Untuk memadam kunci:
bashsudo kadmin.localAuthenticating as principal root/admin@CLUSTER.LOC with password. kadmin.local: ktrem -q host/worker.cluster.loc kadmin.local:
Penyediaan dua VM Fedora (QEMU/KVM)
- Sila rujuk di bahagian nota: “Penyediaan dua VM Fedora (QEMU/KVM)”
Penyelesaian Masalah
After rebooting the VMs, there was an issue with the sssd-kcm service in VM2, where the kinit command threw the following error:
kinit: Connection refused while getting default ccache
Checking the service status using:
systemctl status sssd-kcm
returned the following output:
Failed to init Kerberos context [Permission denied]
Failed to start sssd-kcm.service - SSSD Kerberos Cache Manager.
The issue can be temporarily fixed using the command below, but ChatGPT and DeepSeek do not recommend this as a long-term solution for a production system:
bashsudo semanage permissive -d sssd_tThe recommended approach is to create or modify an SELinux policy to properly allow sssd-kcm to function without disabling security mechanisms.
Bolehkah Dua Realm Kerberos Berbeza Dipautkan?
Ya, boleh! Untuk membolehkan dua KDC saling mempercayai dan menyokong cross-realm authentication, anda perlu menetapkan tiga seksyen utama dalam fail konfigurasi /etc/krb5.conf pada kedua-dua pelayan KDC:
[realms][domain_realm][capaths]
Sebagai contoh, KDC 1 menggunakan realm ARCHEY.LOC, manakala KDC 2 menggunakan realm CLUSTER.VM.
...
[realms]
ARCHEY.LOC = {
kdc = kdc.archey.loc
admin_server = kdc.archey.loc
}
CLUSTER.VM = {
kdc = single.cluster.vm
admin_server = single.cluster.vm
}
[domain_realm]
.archey.loc = ARCHEY.LOC
.cluster.vm = CLUSTER.VM
# Cross-realm authentication
[capaths]
ARCHEY.LOC = {
CLUSTER.VM = .
}
CLUSTER.VM = {
ARCHEY.LOC = .
}...
[realms]
CLUSTER.VM = {
kdc = single.cluster.vm
admin_server = single.cluster.vm
}
ARCHEY.LOC = {
kdc = kdc.archey.loc
admin_server = kdc.archey.loc
}
[domain_realm]
.cluster.vm = CLUSTER.VM
.archey.loc = ARCHEY.LOC
# Cross-realm authentication
[capaths]
CLUSTER.VM = {
ARCHEY.LOC = .
}
ARCHEY.LOC = {
CLUSTER.VM = .
}Langkah Tambahan yang Diperlukan
Tambahkan prinsipal cross-realm trust pada kedua-dua pangkalan data KDC seperti yang diterangkan dalam dokumentasi rasmi MIT Kerberos di bahagian Cross-realm authentication:
krbtgt/ARCHEY.LOC@CLUSTER.VMkrbtgt/CLUSTER.VM@ARCHEY.LOC
Pastikan prinsipal hos KDC turut disilangkan ke keytab utama di pelayan lawan:
- Dari KDC1:
host/kdc.archey.loc@ARCHEY.LOCmesti dimasukkan ke/etc/krb5.keytabdi KDC2. - Dari KDC2:
host/single.cluster.vm@CLUSTER.VMmesti dimasukkan ke/etc/krb5.keytabdi KDC1.
- Dari KDC1:
Jangan lupa juga menambah entri pengguna lintas-realm (
<user>@REALM) dalam fail~/.k5loginpada setiap hos supaya pengguna dari realm berlawanan dapat disahkan masuk.
