0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kerberos認証を入れて389DSと連携させSamba/SSHで認可する

Last updated at Posted at 2025-05-08

前回までで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の大文字(にするのが基本らしい)で設定しました。ホスト名からレルムを検索するときにドメイン名部分を大文字に変えて検索するらしいので、基本に沿っておかないと色々と追加で設定が増えます。

/etc/krb5.conf
[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の修正

/etc/ssh/sshd_config
# 公開鍵認証をやめるよ
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認証が使えなくなります。

/etc/sssd/sssd.conf
...
# 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

...

キャッシュを消して再起動

/etc/sssd/sssd.conf
$ 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 を追加しました。

image.png

memberUidにユーザーtestのuidを設定しておくとidコマンドでGroup情報が取得できます。

$ sss_cache -E

$ id test
uid=2001(test) gid=2001 groups=2001,10000(SSHAllow)

sshd_confに許可するグループを追加します。

/etc/ssh/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認証の設定を追加します。

/etc/samba/smb.conf
        # 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が最低限になります。

image.png

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
/etc/krb5.conf
[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に登録しなきゃ(´・ω・`)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?