跳转至内容

Kerberos

来自 ArchWiki

Kerberos 是一个网络认证系统。请参阅 krb5 文档

安装

在您的客户端和服务器上安装 krb5 包。

强烈建议使用时间同步守护进程以保持客户端/服务器时钟同步。

如果尚未配置主机名解析,您可以在每台机器的 hosts(5) 文件中手动添加您的客户端和服务器。请注意,FQDN(myclient.example.com)必须是 hosts 文件中 IP 地址之后的第一个主机名。

服务器配置

创建域

编辑 /etc/krb5.conf 以配置您的域

/etc/krb5.conf
[libdefaults]
    default_realm = EXAMPLE.COM

[realms]
    EXAMPLE.COM = {
        admin_server = $ADDRESS
        # use "kdc = ..." if the kerberos SRV records aren't in DNS (see Advanced section)
        kdc = $ADDRESS
        # This breaks krb4 compatibility but increases security
        default_principal_flags = +preauth
    }

[domain_realm]
    example.com  = EXAMPLE.COM
    .example.com = EXAMPLE.COM

[logging]
    kdc          = SYSLOG:NOTICE
    admin_server = SYSLOG:NOTICE
    default      = SYSLOG:NOTICE

其中 $ADDRESS 是 IP 地址或域名,Kerberos 所在的位置,例如 10.0.0.120kerberos.example.com

此文件的格式在 MIT Kerberos 文档中进行了描述

创建数据库

# kdb5_util -r EXAMPLE.COM create -s
Loading random data                                                             
Initializing database '/var/lib/krb5kdc/principal' for realm 'EXAMPLE.COM',                  
master key name 'K/M@EXAMPLE.COM'
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: ***

最后,启动/启用 krb5-kdc.servicekrb5-kadmind.service

添加主体

启动 Kerberos 管理工具,使用本地认证

# kadmin.local
Authenticating as principal root/admin@EXAMPLE.COM with password.
kadmin.local:

将用户主体添加到 Kerberos 数据库

kadmin.local: addprinc myuser@EXAMPLE.COM
WARNING: no policy specified for myuser@EXAMPLE.COM; defaulting to no policy
Enter password for principal "myuser@EXAMPLE.COM": ***
Re-enter password for principal "myuser@EXAMPLE.COM": ***
Principal "myuser@EXAMPLE.COM" created.

将 KDC 主体添加到 Kerberos 数据库

kadmin.local: addprinc -randkey host/kerberos.example.com
WARNING: no policy specified for host/kerberos.example.com@EXAMPLE.COM; defaulting to no policy
Principal "host/kerberos.example.com@EXAMPLE.COM" created.

最后,将 KDC 主体添加到服务器的 keytab

kadmin.local: ktadd host/kerberos.example.com
Entry for principal host/kerberos.example.com with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/kerberos.example.com with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.

退出 Kerberos 管理工具

kadmin.local: quit

您现在应该能够获取 Kerberos 票据

$ kinit
Password for myuser@EXAMPLE.COM: ***
$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: myuser@EXAMPLE.COM

Valid starting       Expires              Service principal
08/30/2017 14:26:09  08/31/2017 14:26:09  krbtgt/EXAMPLE.COM@EXAMPLE.COM

防火墙

为任何适用的端口/协议添加防火墙 ALLOW 规则

  • 88,TCP 和 UDP 用于 Kerberos v5
  • 749,TCP 和 UDP 用于 kadmin,如果您打算配置它
  • 750,TCP 和 UDP 用于 Kerberos v4,如果您需要向后兼容

DNS 记录

如果您在每台机器的 krb5.conf 中指定了 kerberos 和 kadmin 服务器,则此项不是必需的

db.example.com
kerberos.example.com.           A     1.2.3.4
_kerberos.example.com.          TXT   "EXAMPLE.COM"
_kerberos._udp.example.com.     SRV   0 0  88 kerberos.example.com.
_kerberos-adm._udp.example.com. SRV   0 0 749 kerberos.example.com.

不要忘记反向 DNS。

客户端配置

编辑客户端的 /etc/krb5.conf 以匹配您的服务器配置。您可以从服务器复制此文件,或者仅设置必要的域信息。

测试

您现在应该能够在客户端获取 Kerberos 票据

$ kinit
Password for myuser@EXAMPLE.COM: ***
$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: myuser@EXAMPLE.COM

Valid starting       Expires              Service principal
08/30/2017 15:36:10  08/31/2017 15:36:10  krbtgt/EXAMPLE.COM@EXAMPLE.COM

配置 kadmin

您需要在 kadmin 客户端上配置 /etc/krb5.conf,并且服务器的防火墙要为 kadmin 配置好。

配置 kadmin ACL

创建一个用于管理的principal

kadmin.local:  add_principal myuser/admin@EXAMPLE.COM
WARNING: no policy specified for myuser/admin@EXAMPLE.COM; defaulting to no policy
Enter password for principal "myuser/admin@EXAMPLE.COM": ***
Re-enter password for principal "myuser/admin@EXAMPLE.COM": ***
Principal "myuser/admin@EXAMPLE.COM" created.

将用户添加到 kadmin ACL 文件

/var/lib/krb5kdc/kadm5.acl
myuser/admin@EXAMPLE.COM *

此文件的格式在 MIT Kerberos 文档中进行了描述

配置 kdc.conf

/var/lib/krb5kdc/kdc.conf
[kdcdefaults]
    kdc_ports = 750,88

[realms]
    EXAMPLE.COM = {
        database_name = /var/lib/krb5kdc/principal
        acl_file = /var/lib/krb5kdc/kadm5.acl
        key_stash_file = /var/lib/krb5kdc/.k5.EXAMPLE.COM
        kdc_ports = 750,88
        max_life = 10h 0m 0s
        max_renewable_life = 7d 0h 0m 0s
    }

此文件的格式在 MIT Kerberos 文档中进行了描述

重启 krb5-kdc.servicekrb5-kadmind.service

您现在可以使用 kadmin 作为自己的用户,通过 kerberos 进行认证

$ kadmin
Authenticating as principal myuser/admin@EXAMPLE.COM with password.
Password for myuser/admin@EXAMPLE.COM: ***
kadmin:

服务主体和 keytab

首先,请确保您已在所有相关机器上配置了 krb5.conf。

kerberos 主体有三个组成部分,格式为 `primary/instance@REALM`。对于用户主体,primary 是您的用户名,instance 被省略或是一个角色(例如,“admin”):`myuser@EXAMPLE.COM` 或 `myuser/admin@EXAMPLE.COM`。对于主机,primary 是“host”,instance 是服务器的 FQDN:`host/myserver.example.com@EXAMPLE.COM`。对于服务,primary 是服务缩写,instance 是 FQDN:`nfs/myserver.example.com@EXAMPLE.COM`。realm 通常可以省略,通常会假定本地计算机的默认 realm。

使用远程 kadmin

这是更简单的方法,但需要您已配置 kadmin

在客户端上以 root 用户身份打开 kadmin(以便我们可以写入 keytab),并使用您的管理员主体进行认证

client# kadmin -p myuser/admin
Authenticating as principal myuser/admin with password.
Password for myuser/admin@EXAMPLE.COM:
kadmin:

为任何您将使用的服务添加主体,例如 SSH 认证的“host”或 NFS 的“nfs”

kadmin: addprinc -randkey host/kbclient.example.com
WARNING: no policy specified for host/kbclient.example.com@EXAMPLE.COM; defaulting to no policy
Principal "host/kbclient.example.com@EXAMPLE.COM" created.

将每个密钥保存到本地 keytab

kadmin: ktadd host/kbclient.example.com
Entry for principal host/kbclient.example.com with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/kbclient.example.com with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.

不使用远程 kadmin

在 Kerberos 服务器上启动 kadmin,使用 unix 或 kerberos 认证

# kadmin.local
Authenticating as principal root/admin@EXAMPLE.COM with password.
kadmin.local:

为任何您将使用的服务添加主体,例如 SSH 认证的“host”或 NFS 的“nfs”

kadmin.local: addprinc -randkey host/kbclient.example.com
WARNING: no policy specified for host/kbclient.example.com@EXAMPLE.COM; defaulting to no policy
Principal "host/kbclient.example.com@EXAMPLE.COM" created.

将每个密钥保存到一个新的 keytab,然后传输到客户端

kadmin.local: ktadd -k kbclient.keytab host/kbclient.example.com
Entry for principal host/kbclient.example.com with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.
Entry for principal host/kbclient.example.com with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab FILE:/etc/krb5.keytab.

最后,使用 SCP 或类似方法将 kbclient.keytab 从服务器复制到客户端,然后将其放置在正确的位置并设置正确的权限

# install -b -o root -g root -m 600 kbclient.keytab /etc/krb5.keytab

最后,从服务器和客户端删除 kbclient.keytab。

跨域信任

按照上述方式设置第二个服务器,然后在两个 KDC 上创建跨域主体。跨域主体必须使用强密码创建,而不是 -randkey,并且必须在两个 KDC 上使用相同的密码。该主体在两个 KDC 中必须具有相同的密钥版本号 (kvno)。

要授予 EXAMPLE.COM 的主体访问 EXAMPLE.ORG 资源的权限,您将使用以下主体

kadmin# addprinc krbtgt/EXAMPLE.ORG@EXAMPLE.COM

krb5.conf[capaths] 部分可用于进一步控制跨域信任关系。

SSH 认证

使用 服务主体和 keytab 中的说明为客户端和服务器的“host”服务创建主体,然后将客户端的密钥放入客户端的 keytab,将服务器的密钥放入服务器的 keytab。

修改您的 SSH 服务器配置以启用 GSSAPI 认证

/etc/ssh/sshd_config
# GSSAPI Options
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes

并修改您的客户端配置以发送 GSSAPI 请求

/etc/ssh/ssh_config
Host *
  GSSAPIAuthentication yes
  GSSAPIDelegateCredentials yes

在使用 ssh 之前在客户端获取一个 ticket-granting ticket

$ kinit myuser@EXAMPLE.COM
Password for myuser@EXAMPLE.COM: ***

将 -v 选项传递给 ssh 以观察发生了什么

$ ssh sshserver.example.com -v
debug1: Authentications that can continue: publickey,gssapi-with-mic,password
debug1: Next authentication method: gssapi-with-mic
debug1: Delegating credentials
debug1: Delegating credentials
debug1: Authentication succeeded (gssapi-with-mic).
Authenticated to sshserver.example.com ([192.168.100.136]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: network
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
Last login: Wed Aug 30 15:52:41 2017 from 192.168.100.1

现在您应该能在客户端看到一个 host 票据

client$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: myuser@EXAMPLE.COM

Valid starting       Expires              Service principal
08/30/2017 15:37:40  08/31/2017 15:37:40  krbtgt/EXAMPLE.COM@EXAMPLE.COM
08/30/2017 15:53:04  08/31/2017 15:37:40  host/sshserver.example.com@EXAMPLE.COM

授权其他主体

要允许不同的 kerberos 主体认证到用户帐户,请将主体名称添加到目标帐户的 .k5login 文件中。例如,要允许 robert@EXAMPLE.COM SSH 到 alice 的帐户

/home/alice/.k5login
robert@EXAMPLE.COM

NFS 安全

首先,配置您的 NFS 服务器。另请参阅 NFS/Troubleshooting。强烈建议在客户端和服务器上都配置时间同步守护进程。时钟漂移会导致此功能中断,并且错误消息将无济于事。

使用 #服务主体和 keytab 中的说明为客户端和服务器的“nfs”服务创建主体,然后将客户端的密钥放入客户端的 keytab,将服务器的密钥放入服务器的 keytab。

NFS 服务器

添加 Kerberos 导出选项。如有必要,可以使用冒号作为分隔符指定多个选项,首选设置在前,例如 sec=krb5p:krb5i

  • sec=krb5p 使用 kerberos 进行认证、完整性和加密。
  • sec=krb5i 使用 kerberos 进行认证和完整性检查,但数据仍以未加密的方式传输。
  • sec=krb5 仅使用 kerberos 进行认证,并以未认证和未加密的方式传输数据。
  • sec=sys 是默认选项,不提供任何加密安全。
/etc/exports
/srv/export *(rw,async,no_subtree_check,no_root_squash,sec=krb5p)

然后重新加载导出

# exportfs -arv

NFS 客户端

挂载导出的目录

# mount nfsserver:/srv/export /mnt/

您可以添加 -vv 以获取详细信息,可能需要 -t nfs4-o sec=krb5p 或您选择的安全选项。

使用 mount 命令检查是否成功

mount | grep nfs
nfsserver:/srv/export on /mnt type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=krb5,clientaddr=192.168.100.139,local_lock=none,addr=192.168.100.136)

浏览器

一些浏览器支持 Kerberos 协议,但默认禁用它。以下是启用它的说明

Chromium

Chromium 需要使用命令行参数运行,该参数指定了允许 Kerberos 认证的网站列表。最简单的方法是将持久标志添加到配置文件

/etc/chromium/policies/managed/test_policy.json
{
  "AuthServerAllowlist": "*.mycompany.com",
  "DisableAuthNegotiateCnameLookup": true
}

Firefox

要使用受信任的网站配置 Firefox,请访问 about:config 并将 network.negotiate-auth.trusted-uris 属性设置为 FOO.COM(注意:Firefox 没有“*.”;Chrome 有)。

故障排除

无法设置 GSSAPI 认证名称

Cannot set GSSAPI authentication names, aborting

您的域缺少 kadmin/adminkadmin/changepw 主体。

对于客户端,如果在首次设置时未加载 rpc-gssd,可能会出现无效的参数/选项。通常通过启用启动 nfs-client.target 来实现加载,但在首次设置后,此目标需要重启

连接需要 GSSAPI 和 KeyExchange 的服务器时 SSH 认证失败

如果遇到以下任何错误

$ ssh -v -o GSSAPIDelegateCredentials=yes -o GSSAPIAuthentication=yes <user>@<IP address>
Unable to negotiate with <IP address> port 22: no matching key exchange method found. Their offer: gss-group14-sha1-...
$ ssh -v -o GSSAPIDelegateCredentials=yes -o GSSAPIKeyExchange=yes -o GSSAPIAuthentication=yes <user>@<IP address>
command-line: line 0: Bad configuration option: gssapikeyexchange

这意味着软件包 openssh 没有配置 GSSAPI 补丁以支持 OpenSSH。您可以安装 openssh-gssapiAUR遵循此示例[死链接 2025-04-05—HTTP 404]

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.