前回まででSSH(公開鍵)/Sambaの認証をLDAPでの一元管理にしました。
ここまで問題無く動いているのですがSquidの認証を追加しようとしたときに うへ、またパスワードが増える( ^q^ ) ってなりました。
サービスを増やすごとにLDAPユーザーに増え続ける認証情報、パスワードを変えようと思ったら大変ですね。まぁその代わりサービスごとにパスワードを変えられるので今の時代(ゼロトラスト的な?)はむしろいいのかもしれないのですが。
とはいえやはり面倒ではあるのでkerberos認証でSSOしてみることにしました。SSOでLDAPのユーザー情報から認証情報を一掃しよう作戦です。
なおKerberosは認可情報を持ちません
つまりSambaみたいな認可情報が欲しいサービスを使う場合はKerberos単体ではダメで、LDAPと連携させる必要があります。
SSSDと連携させるとLDAPからの情報取得がスマートにやれるので、Keberos+LDAP+SSSDという組み合わせで進めます。
OSはFedora42です。
SELinuxはEnforcingですが特に問題は出ませんでした。
Kerberosの導入
まずはサーバとクライアントをインストールしてしまいます。
$ dnf install krb5-server krb5-workstation
設定情報を書き換えます。基本はデフォルトのままでコメントアウトされていた所を複製して書き換えました。
レルムはドメイン名home
の大文字(にするのが基本らしい)で設定しました。ホスト名からレルムを検索するときにドメイン名部分を大文字に変えて検索するらしいので、基本に沿っておかないと色々と追加で設定が増えます。
[logging]
...
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
spake_preauth_groups = edwards25519
dns_canonicalize_hostname = fallback
qualify_shortname = ""
# default_realm = EXAMPLE.COM
default_realm = HOME <- 追加
default_ccache_name = KEYRING:persistent:%{uid}
[realms]
# EXAMPLE.COM = {
# kdc = kerberos.example.com
# admin_server = kerberos.example.com
# }
# 追加
HOME = {
kdc = minipc.home
admin_server = minipc.home
}
[domain_realm]
# .example.com = EXAMPLE.COM
# example.com = EXAMPLE.COM
# 追加
.home = HOME
home = HOME
Kerberosのデータベースを作成します。データベース作成時にアクセス用のパスワードの設定も行われます。
$ kdb5_util create -s
続いてKerberosサーバの管理者(admin/adminとか)の作成を対話形式で行います。コマンドでえいやって作るのは面倒な感じでした。
対話状態(kadmin.local:)になったらaddprinceコマンドで管理者を追加します。設定するパスワードを聞かれるので入力し、終わったらquitで抜けます。
$ kadmin.local
kadmin.local: addprince <admin_principal>
これで初期設定は終わりなのでとりあえず立ち上げてみます。
$ systemctl start krb5kdc.service
$ systemctl enable krb5kdc.service
チケットを取得できるか試してみます
# 管理者チケットの取得
$ kinit <admin_principal>
# チケットの確認
$ klist
# チケットの破棄
$ kdestroy
後はFirewall(port:88)を開けておきましょう。
$ firewall-cmd --add-service=kerberos
$ firewall-cmd --add-service=kerberos --permanent
SSHと連携
認可の設定が必要ないSSHの方が簡単そうだったので、まずはSSHとKerberosを連携させてみます。
SSHサーバの登録
Keberos認証と連携するサービス(SSH)のホストを登録しておきます。といっても認証もサービスも全部minipc.homeなんですけどね。
ssh用のプリンシパルはhost/minipc.home@HOME
らしいです。
$ kadmin.local
kadmin.local: addprinc -randkey host/minipc.home@HOME
# 確認
kadmin.local: listprincs
# 間違ったとき
kadmin.local: delprinc <消したいプリンシパル>
※なおサービス側のホスト名とhostname
コマンドの出力が違うと上手く動きません。sshをkerberosで認証させようとするとhostname側のhost/miniPC@HOME
というプリンシパルを探しにいったりされました_(:3」∠)_
sshd_confの修正
# 公開鍵認証をやめるよ
PubkeyAuthentication no
# Kerberosを使うよ
KerberosAuthentication yes
KerberosOrLocalPasswd no
GSSAPIAuthentication yes
設定を反映させます。
$ systemctl restart sshd
ここまででsshでログインできなくなります。
SSHのホストにキータブを作成しSSH用プリンシパルを登録
KeberosとSSHが同じサーバで動いているのでややこしいですがサービス(SSH)側の設定です。
sshdをKerberosと連携させるためのキータブを作成し、SSH用のhost/minipc.home@HOME
を登録します。
$ kadmin.local
kadmin.local: ktadd -k /etc/krb5.keytab host/minipc.home@HOME
klistコマンドで内容を確認できます
# 確認
$ klist -kt /etc/krb5.keytab
SSSDの修正
前回でsssdを導入してsshも動くようにしてあるので今回はLDAPからKerberosを使うように変更するだけですが、SSSDでの認証全てに影響するのでドメイン分けをしていない場合LDAP認証が使えなくなります。
...
# auth_provider = ldap
# chpass_provider = ldap
auth_provider = krb5
chpass_provider = krb5
# もう不要
# ldap_user_ssh_public_key = nsSshPublicKe
# 追加
krb5_realm = HOME
krb5_server = minipc.home
krb5_kpasswd = minipc.home <- 設定しなくても動くけどログにエラーがでる
krb5_keytab = /etc/krb5.keytab <- ここがデフォルトなのでなくても動くけど一応
# LDAPのposixGroupを使って認可制御を行う準備
ldap_group_search_base = ou=Groups,dc=home
ldap_id_mapping = false
...
キャッシュを消して再起動
$ sss_cache -E
$ systemctl restart sssd
$ systemctl restart sshd
これで設定は終わりです
ユーザーの追加
SSHでログインできるようLDAP認証していたユーザーをKerberosに登録しておきましょう。
$ kadmin.local
kadmin.local: addprinc <ユーザー名>@HOME
ログインしてみる
Kerberso認証なので最初にTGTを取得しておく必要があります。
$ kinit <ユーザー名>@HOME
$ ssh <ユーザー名>@minipc.home
成功手順だけ書いてるととても簡単だけど、ここまでかなり紆余曲折_(:3」∠)_
SSHできるユーザーを絞る
sssd.confのldap_group_search_base
に設定したou=Groups,dc=home
の下にSSHAllowという posixGroup を追加しました。
memberUidにユーザーtestのuidを設定しておくとidコマンドでGroup情報が取得できます。
$ sss_cache -E
$ id test
uid=2001(test) gid=2001 groups=2001,10000(SSHAllow)
sshd_confに許可するグループを追加します。
AllowGroups SSHAllow
SSHを再起動すればSSHAllowグループ以外のユーザーはSSHに失敗するようになります。
$ systemctl restart sshd
# もう別のユーザーではログインできない
$ sudo su - aaa
$ kinit
$ ssh minipc.home
aaa@minipc.home: Permission denied (gssapi-keyex,gssapi-with-mic).
Sambaと連携
流石にアレコレめんどくさい_(:3」∠)_
KerberosへSamba用プリンシパルを登録
Sambaにチケットを発行できるようSambaが動いているホストを登録します。
Samba用のプリンシパルはcifs/minipc.home@HOME
らしいです。
$ kadmin.local
kadmin.local: addprinc -randkey cifs/minipc.home@HOME
SambaのホストのキータブにSamba用プリンシパルを登録
KeberosとSambaが同じサーバで動いているのでややこしいですがサービス(Samba)側の設定です。
キータブにSamba用のcifs/minipc.home@HOME
を登録します。
$ kadmin.local
kadmin.local: ktadd -k /etc/krb5.keytab cifs/minipc.home@HOME
smb.confの修正
LDAP認証の設定を消してKerberos認証の設定を追加します。
# LDAP認証はもういらない
passdb backend = tdbsam <- デフォルトなのでコメントのままでもいい
# passdb backend = ldapsam:ldaps://minipc-wifi.home:636
# ldap ssl = no
# ldap admin dn = cn=Directory Manager
# ldap suffix = dc=home
# ldap user suffix = ou=Users,dc=home
# kerberos認証用に追加
realm = HOME
kerberos method = secrets and keytab
dedicated keytab file = /etc/krb5.keytab
再起動して有効にしてお試し。
$ systemctl restart smb
$ smbclient //minipc.home/share -U test
これでつながるにはつながるんですが、問題点が……
- パスワードを聞かれます。SSO、あれ?
- kinitしてないのに認証が通る
testさんの設定は
- Sambaのdbにいない
- Linuxのユーザーでもない
- LDAPはposixAccountしか持ってない
- Kerberosのパスワードが通る
なのでKeberos認証されてるってことになります。
不思議_(:3」∠)_
でもやっぱりSSOやりたいので後日またリトライしてみます……
LDAPのユーザー情報の修正
Keberos認証にしたのでLDAPのユーザー情報からsambaSamAccount/nsPerson/nsAccount辺りのオブジェクトクラスが不要になりました。posixAccountが最低限になります。
LDAPからパスワード情報が消えた!
認可の追加
Sambaの場合は見せるフォルダごとにアクセス制御がすでにされていると思います。
SSHの時にsssdに ldap_group_search_base というposixGroupを取得する設定を入れたのでsmb.confのvalid users = @グループ名
の設定に対応したグループをLDAP側に追加してメンバーを設定すればOKです。
もちろんユーザー名もそのままvalied usersの設定で使えます。
Windows側の対応
KinitとSSHのユーザー名が違うよ問題再び!😇
そうかー、Windowsのユーザーも登録しなきゃだめかー
Sambaの対応
WindowsからSambaへつなぐときは認証がSambaだろうがLDAPだろうがKerberosだろうがWindowsがよしなにやってくれるので、いつもの認証ボックスでユーザーとパスワードを入力するだけです。
資格情報が保存してあればショートカットやドライブ割り当ても当然そのままでいけます。
SSHの対応
SSOにしたら手順がむしろ増えたO(:3 )~ ('、3_ヽ)_
GUIもあるのですが……
よく考えたらWindowsのユーザーとLinuxのユーザー名が違うのでKerberosダメぢゃん/(^o^)\
Windowsでユーザーを作るのはちょっと重たいので、WSLで……
$ dnf install krb5-workstation
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
spake_preauth_groups = edwards25519
dns_canonicalize_hostname = fallback
qualify_shortname = ""
# default_realm = EXAMPLE.COM
default_realm = HOME
default_ccache_name = KEYRING:persistent:%{uid}
[realms]
HOME = {
kdc = minipc.home
# admin_server = kerberos.example.com
}
[domain_realm]
.home = HOME
home = HOME
それではユーザーを変えて、SSHでログインしてみましょう。
$ kdestroy
destroy: No credentials cache found while destroying cache
$ ssh minipc.home
test@minipc.home: Permission denied (gssapi-keyex,gssapi-with-mic).
$ kinit test@HOME
Password for test@HOME:
$ ssh minipc.home
チケットを取らずに認証すると失敗し、チケットを取った後は認証に成功しました。
完了!
後でWindowsユーザーもKerberosに登録しなきゃ(´・ω・`)