阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Ubuntu 14.04-Kerberos安装和配置

146次阅读
没有评论

共计 7096 个字符,预计需要花费 18 分钟才能阅读完成。

Kerberos 是一种基于可信性的第三方的网络认证系统。其他两方为用户和用户希望对其进行身份验证的服务。并不是所有的服务和应用程序可以使用 Kerberos,但是对于那些可以使用的,它使得网络环境更接近于一步到位,就是所谓的 Single Sign On (SSO)。

这一节介绍 Kerberos 服务器的安装和配置,和一些客户端配置的实例。

概览

如果你刚接触 Kerberos,有几个概念,最好在设置一个 Kerberos 服务器之前了解清楚。大多数概念将和你在其他环境中所熟悉的概念相关。

  1. Principal:任何服务器所提供的用户、计算机、服务都将被定义成 Principal。
  2. Instances:用于服务 principals 和特殊管理 Principal。
  3. Realms:Kerberos 安装提供的独特的域的控制,把它想象成你的主机和用户所属的主机或者组。官方约定这域需要大写。默认的,Ubuntu 将把 DNS 域名转换为大写当成这里的域。
  4. Key Distribution Center:(KDC)由三部分组成,一是 principal 数据库,认证服务器,和票据授予服务器。每个 Realm 至少要有一个。
  5. Ticket Granting Ticket:由认证服务器(AS)签发,Ticket Granting Ticket (TGT) 使用用户的密码加密,这个密码只有用户和 KDC 知道。
  6. Ticket Granting Server: (TGS) 根据请求签发服务的票据。
  7. Tickets:确认两个 Principal 的身份。一个主体是用户,另一个是由用户请求的服务。门票会建立一个加密密钥,用于在身份验证会话中的安全通信。
  8. Keytab Files:从 KDC 主数据库中提取的文件,并且包含的服务或主机的加密密钥。

总得来讲就是,一个域至少包含一个 KDC,最好能有更多的冗余,它包含一个 principal 数据库。当用户登录一个被 Kerberos 认证定义的工作站中,KDC 发布一个 TGT。如果用户提供的证书匹配,用户得到认证,之后就能从 TGS 请求被 kerberos 注册过的服务的票据,用户凭票据就可以认证并访问服务,而不需要再提供用户名和密码。

Kerberos 服务器端

安装

这里,我们将提供一个包含以下属性 MIT Kerberos 域(根据自己的需要修改它们):

Realm: EXAMPLE.COM

Primary KDC: kdc01.example.com (192.168.0.1)

Secondary KDC: kdc02.example.com (192.168.0.2)

User principal: steve

Admin principal: steve/admin

tips: 强烈建议你的网络认证用户的 uid 和你其他本地用户的 uid 不在同一个范围(比如:从 5000 开头)。

在安装 Kerberos 服务之前,你需要为你的域名配置合理的 DNS。由于按照约定 Kerberos 的域与域名相匹配,本节使用 EXAMPLE.COM 这个域定义 DNS。

另外,Kerberos 是一个时间敏感的协议。因此,如果客户机和服务器之间的本地系统时间超过五分钟(默认情况下),工作站将无法进行身份验证。要纠正这个问题,所有的主机都应该把自己的时间与统一一个(NTP)服务器同步。细节设置 NTP 参阅使用 NTP 进行时间同步。

创造 Kerberos 领域的第一步是安装 krb5-KDC 和 rb5-admin-server 软件包。从终端输入:

sudo apt-get install krb5-kdc krb5-admin-server

在安装的最后你将被要求为 realm 提供 Kerberos 的主机名和管理服务器名,不一定相同。

tips:默认情况下,realm 是从 KDC 域名创建。

下一步,使用 kdb5_newrealm 工具创建新域。

sudo krb5_newrealm

配置

安装过程中所问到的问题用于配置 /etc/krb5.conf 文件。如果你需要调整 kdc 的设置,你只需要简单的编辑这个文件即可并重新 i 动 krb5-kdc 守护进程。如果你需要从头到尾重新配置,比如重命名 realm 的名字,你可以输入:

sudo dpkg-reconfigure krb5-kdc
  1. 一旦 KDC 正常运行,则需要一个管理员用户–the admin principal。建议使用和平时经常用的用户名有所区别。在终端提示符下输入 kadmin.local:

    sudo kadmin.local
    Authenticating as principal root/admin@EXAMPLE.COM with password.
    kadmin.local: addprinc steve/admin
    WARNING: no policy specified for steve/admin@EXAMPLE.COM; defaulting to no policy
    Enter password for principal "steve/admin@EXAMPLE.COM": 
    Re-enter password for principal "steve/admin@EXAMPLE.COM": 
    Principal "steve/admin@EXAMPLE.COM" created.
    kadmin.local: quit

    在上面的例子中,steve 是这个 Principal,/admin 是一个 Instance,@EXAMPLE.COM 代表这个 realm(域)。“日常”Principal,即用户 Principal,将会是这样:steve@EXAMPLE.COM, 并且只有普通用户的权限。

    tips:把这里的 EXAMPLE.COM 和 steve 替换成你的 realm 和管理员用户名。

  2. 接下来,这个新的管理员用户需要有合适的访问控制列表(ACL)权限。它被配置在 /etc/krb5kdc/kadm5.acl 文件中:

    steve/admin@EXAMPLE.COM     

    这赋予 steve/admin 对域中所有 principals 进行任何操作的能力。你可以对 principals 配置更加严格的权限。这是很方便的,如果你需要一个 admin principal 在 kerberos 客户端中具有较低的权限。更多细节请查看 kadm5.acl 文件。

  3. 现在重 ikrb5-admin-server 使新的 ACL 生效:

    sudo service krb5-admin-server restart
  4. 现在这个新的 user principal 可以通过 kinit 命令进行测试:

    kinit steve/admin
    steve/admin@EXAMPLE.COM's Password:

    输入密码后,使用 klist 命令查看 TGT 的信息:

    klist
    Credentials cache: FILE:/tmp/krb5cc_1000
           Principal: steve/admin@EXAMPLE.COM
    
     Issued           Expires          Principal
    Jul 13 17:53:34  Jul 14 03:53:34  krbtgt/EXAMPLE.COM@EXAMPLE.COM

    其中的缓存文件 krb5cc_1000 由 krb5cc_ 前缀和用户的 id(uid)组成,这里是 1000. 你应该在 /etc/host 文件中添加一个入口,这样客户端才能访问到 KDC。比如:

    192.168.0.1   kdc01.example.com       kdc01

    把 192.168.0.1 替换成你的 KDC 的 ip 地址。这经常发生在你的 Kerberos 域包含被路由分割的不同的网络。

  5. 使客户端自动定位 KDC 的 Realm 的最佳方式,是实用 DNS SRV 记录。添加下面的内容到 /etc/named/db.example.com:

    _kerberos._udp.EXAMPLE.COM.     IN SRV 1  0 88  kdc01.example.com.
    _kerberos._tcp.EXAMPLE.COM.     IN SRV 1  0 88  kdc01.example.com.
    _kerberos._udp.EXAMPLE.COM.     IN SRV 10 0 88  kdc02.example.com. 
    _kerberos._tcp.EXAMPLE.COM.     IN SRV 10 0 88  kdc02.example.com. 
    _kerberos-adm._tcp.EXAMPLE.COM. IN SRV 1  0 749 kdc01.example.com.
    _kpasswd._udp.EXAMPLE.COM.      IN SRV 1  0 464 kdc01.example.com.

    tips:用你的主机名,主 KDC 和从 KDC 替换掉 EXAMPLE.COM, kdc01, 和 kdc02

    参考 域名解析服务 (DNS) 获得设置 DNS 相关细节.

现在,你的新 Kerberos 域已经为认证客户端准备好。

Secondary KDC

一旦你在你的网络中有了一个 KDC,拥有一个 Secondary KDC 是一个好的实践,以防主 KDC 不可用。如果你的 Kerberos 客户端在不同的网络中(可能被使用 NAT 的路由分隔开),在每一个网络中配置 secondary KDC 是一个明智的选择。

  1. 首先,安装包,当被询问 Kerberos 和管理服务器名时填入主 KDC 的名字:

    sudo apt-get install krb5-kdc krb5-admin-server
  2. 一旦包被安装后,创建 Secondary KDC 的主机实体。在命令提示符下输入:

    kadmin -q "addprinc -randkey host/kdc02.example.com"

    tips:随后,使用任何 kadmin 的命令是,你将被提示输入 username/admin@EXAMPLE.COM 实体的密码。

  3. 提取 keytab 文件:

    kadmin -q "ktadd -norandkey -k keytab.kdc02 host/kdc02.example.com"
  4. 现在在你当前目录应该有一个 keytab.kdc02 的文件,把他移动到 /etc/krb5.keytab:

    sudo mv keytab.kdc02 /etc/krb5.keytab

    tips: 如果 keytab.kdc02 的路径不同,看情况调整。
    你还可以在 Keytab 文件中列出这些实体,在解决故障时很有用,使用 klist 命令:

    sudo klist -k /etc/krb5.keytab

    - k 选项表示这是一个 keytab 文件。

  5. 接下来在每个 KDC 节点上需要有 kpropd.acl 文件来列出所有域中的 KDC,在主 KDC 和 secondary KDC,创建 /etc/krb5kdc/kpropd.acl:

    host/kdc01.example.com@EXAMPLE.COM
    host/kdc02.example.com@EXAMPLE.COM
  6. 在 Secondary KDC 上创建一个空的数据库:

    sudo kdb5_util -s create
  7. 现在,开启 kpropd 守护进程,用来监听 kprop 功能的连接。kprop 是用来传输转储文件的。

    sudo kpropd -S
  8. 在主 KDC 的终端创建实体数据库的转储文件:

    sudo kdb5_util dump /var/lib/krb5kdc/dump
  9. 提取主 KDC 的 keytab 文件并拷贝到 /etc/krb5.keytab:

    kadmin -q "ktadd -k keytab.kdc01 host/kdc01.example.com"
    sudo mv keytab.kdc01 /etc/krb5.keytab

    tips: 保证在提取 keytab 之前有 kdc01.example.com 的主机。

  10. 使用 kprop 功能向 Secondary KDC 推送数据库:

    sudo kprop -r EXAMPLE.COM -f /var/lib/krb5kdc/dump kdc02.example.com

    tips: 如果传输成功的话,应该会有一个成功的信息。如果是一个错误信息,请在 secondary KDC 上的 /var/log/syslog 中查看更多信息。

    你可能需要创建一个 cron 任务,来周期性地跟新 Secondary KDC 数据库。比如,下面的命令将每个小时推送一次数据库(请注意,长行已被拆分,以适应本文档的格式):

    
    # m h  dom mon dow   command
    
    0 * * * * /usr/sbin/kdb5_util dump /var/lib/krb5kdc/dump && 
    /usr/sbin/kprop -r EXAMPLE.COM -f /var/lib/krb5kdc/dump kdc02.example.com
  11. 回到 Secondary KDC,创建一个 stash 用来保存 Kerberos master key:

    sudo kdb5_util stash
  12. 最后,在 Secondary KDC 开启 krb5-kdc 守护进程:

    sudo service krb5-kdc start

现在 Secondary KDC 应该已经可以在这个 Realm 签发票据了。你可以在 Primary KDC 上停止 krb5-kdc 进程,并使用 kinit 请求票据来测试。如果一切运行正常的话,你可以从 Secondary KDC 请求到票据。否则,查看下 Secondary KDC 上的 /var/log/syslog and /var/log/auth.log 吧。

Kerberos Linux Client:

本节主要包含配置一个 Linux 系统成为 Kerberos 客户端。一旦用户成功登陆系统,他将有权限访问任何被 Kerberos 认证过后的服务。

安装

为了能够在 Kerberos Realm 中被认证,需要 krb5-user 和 libpam-krb5 两个包。其他的几个包不是必要的但是可以让生态更加友好。在命令提示符下输入以下命令来安装包:

sudo apt-get install krb5-user libpam-krb5 libpam-ccreds auth-client-config

auth-client-config 包使得多个来源认证的 PAM 配置更简单;libpam-ccreds 包将会保存你登录的认证证书,以防 KDC 挂掉。这个包在笔记本使用公司网络进行 Kerberos 认证,却需要被网络接受时,也很有用。

配置

配置客户端,在终端输入:

sudo dpkg-reconfigure krb5-config

你将被提示输入 Kerberos Realm 的名字。另外,如果你没有用 Kerberos SRV 记录设置 DNS,菜单会提示你输入 KDC 和 Realm Administration 服务器的主机名。

dpkg-reconfigure 为你的 Realm 在 /etc/krb5.conf 文件中填入了一些内容。这些内容应该与下列内容类似:

[libdefaults]
        default_realm = EXAMPLE.COM
...
[realms]
        EXAMPLE.COM = {kdc = 192.168.0.1
                admin_server = 192.168.0.1
        }

tips: 如果你设置的网络认证用户都和“安装”的建议一样从 500 开始,然后,你就可以告诉 PAM 只尝试验证 UID>5000 的 Kerberos 用户:

# Kerberos should only be applied to ldap/kerberos users, not local ones.
for i in common-auth common-session common-account common-password; do
 sudo sed -i -r \ 
 -e 's/pam_krb5.so minimum_uid=1000/pam_krb5.so minimum_uid=5000/' \ 
 /etc/pam.d/$i 
done 

这将避免在一个本地用户修改密码时被要求输入(不存在的)Kerberos 密码。

你可以用 kinit 功能请求一个票据来测试你的配置,比如:

kinit steve@EXAMPLE.COM
Password for steve@EXAMPLE.COM:

当票据被授权,你可以用 klist 查看票据的详情:

klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: steve@EXAMPLE.COM

Valid starting     Expires            Service principal
07/24/08 05:18:56  07/24/08 15:18:56  krbtgt/EXAMPLE.COM@EXAMPLE.COM
        renew until 07/25/08 05:18:57


Kerberos 4 ticket cache: /tmp/tkt1000
klist: You have no tickets cached

接着,使用 auth-client-config 来配置 libpam-krb5 模块,来在登录时请求票据:

sudo auth-client-config -a -p kerberos_example

现在你应该在成功登录认证后获得了一个票据。

资源

  1. 查看更多 Kerberos 的 MIT 版本信息,请访问 MIT Kerberos 官网。
  2. Ubuntu Wiki Kerberos 有更多的细节。
  3. O’Reilly 的 Kerberos: The Definitive Guide 在配置 Kerberos 方面是一个非常好的参考。
  4. 另外,当你有 Kerberos 的相关问题时,欢迎到 Freenode 的 #ubuntu-server 和#kerberos IRC 频道查看或提问。

更多 Ubuntu 相关信息见 Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-09/134949.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计7096字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中