Zenn
😺

Kerberos 認証について勉強してみた

に公開

Kerberos 認証とは

概要

ネットワーク認証方式の1つでありサーバ/クライアントの相互認証可能、また、認証ネットワークの通信の暗号化を行うセキュアな認証方式で現在メジャーなものとして利用されている。

主な登場人物としては、、、

  • KDC (Key Distribution Center)
    • 許可されたサーバ(サービス)やユーザーの認証情報を一元管理するデータベース
  • AS (Authentication Server)
    • 認証サーバ
  • TGS (Ticket Granting Server)
    • 各サーバ(サービス)を利用するためのチケットを発行するサーバ。
  • プリンシパル
    • KDC が認証を行うサーバ(サービス)やユーザー
  • レルム
    • 同一 KDC 配下を定義する論理的な名称(ドメイン)

参考)
https://www.infraexpert.com/study/security18.html
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system-level_authentication_guide/using_kerberos

Demo1

Linux x 3 台で Kerberos 認証を再現。SSH 認証を Kerberos 認証で実現
今回、test1 -> test2 への SSH 認証を kdc を利用した kerberos 認証で実行する。レルムは EXAMPLE.COM。

  • kdc KDC/AS/TGS 兼ねたサーバ
  • test1 SSH クライアント
  • test2 SSH サーバー

rpm

kdc
yum -y install krb5-libs krb5-server
test1
yum -y install krb5-libs krb5-workstation
test2
yum -y install krb5-libs

設定ファイル

  • /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]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true
 rdns = false
 pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
 default_realm = EXAMPLE.COM
 default_ccache_name = KEYRING:persistent:%{uid}

[realms]
 EXAMPLE.COM = {
  kdc = kdc.private.com # KDC 
  admin_server = kdc.private.com # KDC 
 }

[domain_realm]
# .example.com = EXAMPLE.COM
# example.com = EXAMPLE.COM
  • /var/kerberos/krb5kdc/kdc.conf
    kdc のみ
[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88

[realms]
 EXAMPLE.COM = {
  #master_key_type = aes256-cts
  acl_file = /var/kerberos/krb5kdc/kadm5.acl
  dict_file = /usr/share/dict/words
  admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
  supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
 }
  • /var/kerberos/krb5kdc/kadm5.acl
    kdc のみ

データベース作成

kdc
# kdb5_util create -s -P P#ssw0rd
# systemctl restart kadmin krb5kdc

# netstat -anlp | grep -E 'kadmind|krb5kdc'
tcp        0      0 0.0.0.0:749             0.0.0.0:*               LISTEN      18101/kadmind       
tcp        0      0 0.0.0.0:464             0.0.0.0:*               LISTEN      18101/kadmind       
tcp        0      0 0.0.0.0:88              0.0.0.0:*               LISTEN      18094/krb5kdc       
udp        0      0 0.0.0.0:88              0.0.0.0:*                           18094/krb5kdc       
udp        0      0 0.0.0.0:464             0.0.0.0:*                           18101/kadmind  

プリンシパル設定

kadmin.local コマンドで kdc にてコマンドラインを起動しプリンシパルの設定を行う。

ユーザープリンシパル
addprinc -pw P#ssw0rd user01
サーバプリンシパル
addprinc -randkey host/test2
keytab の登録
ktadd host/test2

keytab ファイルが /etc/krb5.keytab に生成される。
この keytab ファイルをサーバ側 test2 に同じパスでコピーしておくこと。

SSH 設定

サーバ test2 側で/etc/ssh/sshd_configで GSSAPIAuthentication を有効化しておく。これにより SSH 認証に Kerberos 認証が利用できる。

GSSAPIAuthentication yes

Kerberos 認証実施

クライアント test1 で認証を実施していく。

  1. kinit コマンドで user01 の認証チケットを kdc に要求して発行
# kinit user01

# klist
Ticket cache: KEYRING:persistent:0:0
Default principal: user01@EXAMPLE.COM

Valid starting       Expires              Service principal
2023-05-28T09:08:59  2023-05-29T09:08:59  krbtgt/EXAMPLE.COM@EXAMPLE.COM
  1. ssh 接続がクライアント test1 -> test2 に対して実行できる。(パスワード認証や公開鍵認証必要なしに。)
# ssh user01@test2 hostname
test2

Discussion

ログインするとコメントできます