在本文中,我们将简单介绍如何配置OpenSSH以启用Kerberos安全机制。

1. 概要

互联网连接全球数以千万计的计算机,Internet协议(包括TCP / IP)在现实网络上提供可靠且可扩展的通信。然而,信息安全已经成为互联网当前所面临的一个主要问题,这个庞大的网络容易受到许多恶意攻击,如窃听,连接劫持,IP欺骗等。使用带有Kerberos身份验证的Secure Shell是理想的防止这些类型的网络风险和威胁的选择。本文讨论了如何设置Kerberos环境以及如何配置Kerberos和Secure Shell以确保通过网络进行安全可靠的通信。 Kerberos有两种版本,Kerberos4和Kerberos5。本指南仅讨论Kerberos5。

2. 身份验证和授权 (Authentication 和Authorization)

在任何网络通信中,用户必须通过的两个阶段从而连接到远程系统并访问远程系统上的资源,这两个阶段分别是“身份验证”和“授权”。

身份验证是“验证由系统实体声明的身份或为系统实体声明的身份的过程”。这是为了保证用户(或系统)是他们所说的人。因此,认证过程将用户具有的信息与已信任的已知信息进行比较。大多数情况下,这是通过与用户交互来完成的,例如获取用户名和密码,将存储身份验证令牌的智能卡。这些标准在RFC 2828(Internet Security Glossary,2000年5月)中描述。

授权是指用户基于用户帐户权限来访问网络资源的能力。这也称为“访问控制”。只有成功进行身份验证的用户才能进入此授权阶段。

3. Kerberos 概述

由麻省理工学院开发和发布的Kerberos是一个AA [认证和授权]系统。 Kerberos有两个目的,安全性和身份验证。在大多数分布式网络系统中,大多数时候,密码用于证明用户的身份,密码必须通过网络从客户端传输到用户想要访问的服务器端。因此,防止任何人拦截或窃听传输的普通密码的机制对于安全性至关重要。使用密码进行身份验证的另一个痛苦是,每次向远程计算机请求连接时都必须提供密码。 Kerberos帮助用户避免这种痛苦,Kerberos解决的核心问题是如何使用密码进行身份验证,而无需通过网络发送密码。

设置Kerberos环境需要以下基础结构

密钥分发中心[KDC]:KDC是Kerberos系统的核心,该系统应该受到严密的保护。此系统应仅运行KDC,并且应拒绝其他远程登录。如果希望允许远程登录,则首选SSH。该系统应保存在物理安全的位置。

Slave KDC [用于备份]:Kerberos无法在没有KDC的情况下运行。因此,为主KDC建立备份系统是有必要的。该主机将定期与主KDC同步,如果主机发生故障,该从机将接管Kerberos 请求。

一旦KDC主机准备就绪,就应该进行适当的配置以便在OpenSSH中使用它。

尽管Kerberos提供了一些最低级别的授权功能,但它仅限于用户可以修改KDC数据库的权限。因此,各个应用程序需要处理授权部分。

本文档主要用于指导用户配置Kerberos以与OpenSSH一起使用。

4. OpenSSH概述

OpenSSH主要由OpenBSD项目开发,是SSH协议网络连接工具的免费版本。 OpenSSH对所有流量(包括密码)进行加密,以有效消除窃听,连接劫持,IP欺骗和其他网络级攻击。 OpenSSH提供了许多身份验证方法,其中之一是Kerberos身份验证。

根据当前版本的OpenSSH ,Kerberos身份验证通过其Kerberos凭据完成,并且经过身份验证的用户可以通过ssh将其凭据转发到远程计算机。 SSH协议1和2可以使用Kerberos身份验证支持。对于SSH协议2.0,也可以使用GSSAPI支持。 除了其他身份验证机制支持之外,GSSAPI还可以使用Kerberos进行身份验证。

5. 常见定义

在深入了解配置细节之前,需要了解一些基本的定义:

Realm:用于识别Kerberos主体数据库的单个实例。如果要为 Realm xyz.org维护KDC,则Realm是运行此KDC服务的Domain的名称。Realm名称通常是大写字母。因此,示例域的域名是XYZ.ORG。该Realm将拥有一个包含用户主体 (principal) 的数据库。

Principal:Principal本质上是在Realm中的用户或者服务。每个用户都需要Realm中的Principal,格式通常为:principal_name @ REALM。例如,sshteam @ ddcloud.COM。除了Principal之外,还必须在网络中的每台计算机上存在一个帐户,以便使用该帐户。通常情况下,Principal名称和帐户名称相同。

Ticket:帮助客户端向服务器验证自身的记录;包含客户端的标识,会话密钥,时间戳和其他信息,所有这些信息都使用服务器的密钥进行加密。

TGT:票证授予票证(Ticket Granting ticket)由AS [认证服务器 – KDC中的组件]发布给客户端,用于所需的应用程序服务,该服务由客户端的密钥加密。

6. 配置Kerberos环境

以下是在Linux上设置Kerberos并[与OpenSSH一起使用的基本要求:

KDC,应用程序服务器和应用程序客户端。使用三台Linux服务器来演示这种配置。 OpenSSH客户端和服务器计算机分别称为应用程序客户端和应用程序服务器计算机;

应该在所有三台服务器上安装Kerberos;

所有机器都应包含/ etc目录中的krb5.conf文件,并确保krb5.conf文件中的配置对于所有3台服务器都是有意义的,如同样的realm;

所有服务器和客户端主机配置DNS;

时钟同步应该在kerberos服务器[KDC]上运行。客户端和服务器计算机时钟之间的时间差可在Kerberos 5中配置。可以在/etc/krb5.conf文件的[libdefaults]设置关键字“clockskew”(以秒为单位),其中包含差值以及服务器可以容忍的差值。默认值为300秒[5分钟]。如果时钟差异超过5分钟,则Kerberos客户端将无法对服务器进行身份验证。

为了演示这些步骤,我们对网络中的系统使用了以下名称:

XYZ.ORG  Realm Name,   KDC正在运行的 Realm

kdcserver.xyz.org 运行KDC的主机名

sshserver.xyz.org  ssh服务器主机名

sshclient.xyz.org  ssh客户端主机名

krbuser用户 必须将此用户的Principal添加到KDC,并且此Principal必须在sshserver.xyz.org上拥有一个帐户

通过以下步骤在所有服务器中,如KDC系统,安装SSH服务器的服务器以及安装SSH客户端的客户端计算机上安装Kerberos。

Kerberos安装步骤可能因Linux发行版而异。 如果正在使用的Linux发行版中的rpm可用于Kerberos,则在所有系统上安装该rpm。

7. 安装Kerberos

从源或rpm安装Kerberos

必须安装以下rpm, 实际系统中,版本号可能不同。 本例子采用的版本是“1.2.7-10”。 下面操作是在Redhat 9.0上进行的:

krb5-devel-1.2.7-10.i386.rpm

krb5-libs-1.2.7-10.i386.rpm

krb5-workstation-1.2.7-10.i386.rpm

下面给出了在Linux上安装rpm的命令:

#rpm -ivh <rpm_name>

否则,可以按照以下说明在Linux系统上构建Kerberos:

下载最新的Kerberos 5源代码[http://www.crypto-publish.org/mit-kerberos5/]

将源tar文件复制到/ usr / local ;

 必须使用“root”用户才能执行以下操作;

cd / usr / local
tar -xvzf krb5-1.3.1.tar.gz
cd krb5-1.3.1
./configure--prefix=/usr/local/krb5
make
make install

如前所述,KDC是Kerberos的主要组件。 运行KDC的主机将具有名称[Realm],它由数据库[Principal列表]组成 ,遵循以下步骤来配置KDC。

8. 配置KDC

在/ usr / local / krb5 / var中创建目录krb5kdc;

将kdc.conf文件从/usr/local/krb5-1.3.1/src/config-files复制到/ usr / local / krb5 / var / krb5kdc

修改kdc.conf文件以获取正确的信息

创建一个访问控制列表文件kadm5.acl并将该文件保存在/ usr / local / krb5 / var / krb5kdc中

此处给出了示例配置文件。 kdc.conf和kadm5.acl文件必须存在于KDC服务器中。 所有计算机上必须存在krb5.conf。 这个文件反映了有关Realm的详细信息,Realm映射以及Principal访问Kerberos数据库的访问权限。 要设置自己的Realm,只需用自己的域名替换所有文件中的XYZ.ORG即可。 按照惯例,所有Realm名称都应使用大写字母,所有DNS主机名和域名都应使用小写字母。

1541946287620361.png

1541946318958265.png

1541946379539879.png

9. 管理KDC数据库[创建KDC数据库,添加用户主体]

首先,必须在KDC主机中创建一个数据库,以保存用户和主机的Principal。此处给出的命令用于创建数据库文件。这些文件将在/ usr / local / krb5 / var / krb5kdc /中创建。

            #/ usr / local / krb5 / sbin / kdb5_util create -r XYZ.ORG -s

Realm[KDC服务器]需要管理员,因此,必须在数据库中添加一个管理员Principal。以下命令执行该任务。

            #/ usr / local / krb5 / sbin / kadmin.local -q“addprinc useradmin/admin@XYZ.ORG”

             Password:* * * * * *

下一步是为kadmind 创建KeyTab。此KeyTab是一个存储用户密钥的文件,kadmind将使用此密钥对管理员Kerberos票证进行解密,以确定是否应该为数据库提供密钥。通过以下命令完成的:

           #/ usr / local / krb5 / sbin / kadmin.local -q \

           “ktadd -k /usr/local/var/krb5kdc/kadm5.keytab => kadmin / admin kadmin / changepw”

对于Realm中的每个用户,如果用户想要使用Kerberos身份验证连接到另一台计算机,则用户必须在KDC中拥有Principal。以下命令用于在KDC数据库中为用户添加Principal。服务器中必须有一个用户帐户,用户希望与此Kerberos Principal连接。为方便起见,建议服务器中的用户帐户和KDC中的Principal名称具有相同的名称。

            #/ usr / local / krb5 / sbin / kadmin.local -q“addprinc krbuser”

KDC配置用户“krbuser”的用户Principal。完成此操作后,必须启动Kerberos服务器;           

            #/ usr / local / krb5 / sbin / krb5kdc
            #/ usr / local / krb5 / sbin / kadmind

10. 配置应用程序服务器系统 (SSH Server)

应用程序服务器需要一个名为/etc/krb5.keytab的KeyTab文件,以对KDC进行身份验证。 为了为服务器主机生成KeyTab,服务器必须在Kerberos数据库中存在Principal。 根据以下步骤添加服务Principal 在KDC 服务器中:

从KDC获取管理员Principal的票证。此命令将导致提示输入管理员密码。为管理员提供密码:

            #/ usr / local / krb5 / bin / kinit admin / admin

            Password:* * * * * *

将服务器[sshserver.xyz.org]的Principal添加到KDC中

            #/ usr / local / krb5 / sbin / kadmin.local -q“addprinc -randkey host / sshserver.xyz.org”

创建KeyTab文件。这将在/etc/krb5.keytab中创建KeyTab文件

            #/ usr / local / krb5 / sbin / kadmin.local -q“ktadd -k /etc/krb5.keytab host / sshserver.xyz.org”

检查KeyTab文件中的信息。 ktutil是一个用于管理keytab文件中的密钥列表的实用程序。 “rkt”表示读取KeyTab。 “l”列出keytab文件中的当前密钥列表。如果需要查询keytab文件中的正确服务器Principal ,使用ktutil命令。 “q”用于退出kutil服务。

    # /usr/local/krb5/sbin/ktutil
ktutil:  rkt /etc/krb5.keytab
ktutil:  l
slot KVNO Principal
---- ---- --------------------------------------------
13host/sshserver.xyz.org@XYZ.ORG
23host/sshserver.xyz.org@XYZ.ORG
ktutil: q

11. 配置应用程序客户端系统 (SSH Client)

客户端机器需要程序“kinit”,“klist”,“kdestroy”和包含KDC服务器详细信息的/etc/krb5.conf文件。 安装kerberos-1.3.1会在/ usr / local / krb5 / bin中创建所有客户端程序。

12. OpenSSH身份验证

Kerberos 5服务器可用于OpenSSH的以下身份验证:

GSS-API身份验证

Kerberos 5身份验证

必须在应用客户端和SSH服务器上提供OpenSSH,即分别在sshclient.xyz.org和sshserver.xyz.org 机器上安装。

13. GSS-API身份验证

在sshserver.xyz.org上编辑ssh服务器配置文件[默认情况下,在/ etc / ssh / sshd_config中],在sshclient.xyz.org上编辑ssh客户端配置文件[默认情况下,在/ etc / ssh / ssh_config]。如果OpenSSH应用程序指定了不同的安装路径,请检查已安装路径中“etc”目录中的sshd_config;

            GSSAPIAuthentication yes

在sshserver.xyz.org上启动sshd服务器。默认情况下,ssh服务器将在端口22上运行;

#/ user / sbin / sshd

确保kdc服务器在KDC机器上运行,[kdcserver.xyz.org]

            #ps -A | grep krb5kdc

            如果服务器未启动,请启动KDC 服务:

            #/usr/local/krb5-1.3.1/sbin/krb5kdc

            #/ usr / local / krb5-1.3.1 / sbin / kadmind

在客户端计算机中获取初始票证(TGT)[sshclient.xyz.org]

            #kinit krbuser

            Password:* * * * * *

一旦获得TGT,可以如下检查。

# klist
Ticket cache: FILE:/tmp/krb5cc_11190
Default principal: krbuser@XYZ.ORG
Valid starting     Expires            Service principal
01/09/04 12:41:09  01/09/04 22:41:09  krbtgt/XYZ.ORG@XYZ.ORG

将ssh客户端连接到服务器

            #ssh krbuser@sshserver.xyz.org

注意:GSS-API身份验证是一种无密码验证。对于成功连接,SSH服务器不应要求验证密码。但是,如果客户端和服务器上有正确的密钥,其他身份验证(例如Publickey)也将在没有密码的情况下连接。要确保GSS-API身份验证成功,可以在Verbose模式下运行ssh客户端。可以通过在ssh客户端使用“-v”来完成。 “v”的数量越多,输出的详细信息就越多。可以给出的最大“v”的数量是3;

      # ssh krbuser@sshserver.xyz.org -vvv
......
debug1: Authentication succeeded (gssapi)

14. Kerberos5身份验证

在sshserver.xyz.org上编辑ssh服务器配置文件[默认情况下,在/ etc / ssh / sshd_config中],在sshclient.xyz.org上编辑ssh客户端配置文件[默认情况下,在/ etc / ssh / ssh_config]。如果OpenSSH应用程序指定了不同的安装路径,请检查已安装路径中“etc”目录中的sshd_config。

            KerberosAuthentication yes

在sshserver.xyz.org上启动sshd服务器。默认情况下,ssh服务器将在端口22上运行;

#/ user / sbin / sshd

确保kdc服务器在KDC机器上运行,[kdcserver.xyz.org]

            #ps -A | grep krb5kdc

            如果服务器未启动,请启动KDC 服务:

            #/usr/local/krb5-1.3.1/sbin/krb5kdc

            #/ usr / local / krb5-1.3.1 / sbin / kadmind

销毁客户端计算机中的ticket

            #kdestroy

将ssh客户端连接到服务器。

            #ssh krbuser@sshserver.xyz.org

注意:在此身份验证中,系统将提示用户输入密码。要输入的密码应为Kerberos中Principal的密码,即kinit运行时使用的密码。

参考

http://web.mit.edu/kerberos/www/ – 麻省理工学院的Kerberos主页

http://web.mit.edu/kerberos/www/dialogue.html – 用简单的英语解释Kerberos协议

http://www.cs.uu.nl/wais/html/na-dir/kerberos-faq/general.html – Kerberos常见问题解答



关注微信服务号,手机看文章
关注微信服务号,手机看文章