😺
Kerberos 認証について勉強してみた
Kerberos 認証とは
概要
ネットワーク認証方式の1つでありサーバ/クライアントの相互認証可能、また、認証ネットワークの通信の暗号化を行うセキュアな認証方式で現在メジャーなものとして利用されている。
主な登場人物としては、、、
-
KDC (Key Distribution Center)
- 許可されたサーバ(サービス)やユーザーの認証情報を一元管理するデータベース
-
AS (Authentication Server)
- 認証サーバ
-
TGS (Ticket Granting Server)
- 各サーバ(サービス)を利用するためのチケットを発行するサーバ。
-
プリンシパル
- KDC が認証を行うサーバ(サービス)やユーザー
-
レルム
- 同一 KDC 配下を定義する論理的な名称(ドメイン)
参考)
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 で認証を実施していく。
- 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
- ssh 接続がクライアント test1 -> test2 に対して実行できる。(パスワード認証や公開鍵認証必要なしに。)
# ssh user01@test2 hostname
test2
Discussion