8.8. PPP 认证

使用 PPP,每个系统可以要求其对等方使用两种认证协议之一进行身份验证:密码认证协议 (PAP) 和 挑战握手认证协议 (CHAP)。当连接建立时,每一端都可以请求另一端验证其身份,无论它是呼叫方还是被呼叫方。在接下来的描述中,当我们想要区分发送身份验证请求的系统和响应请求的系统时,我们将粗略地谈论“客户端”和“服务器”。PPP 守护程序可以通过发送另一个 LCP 配置请求来请求其对等方进行身份验证,该请求标识所需的身份验证协议。

8.8.1. PAP 与 CHAP

PAP 由许多互联网服务提供商提供,其工作方式基本上与正常的登录过程相同。客户端通过向服务器发送用户名和(可选的加密)密码来验证自身身份,服务器将其与秘密数据库进行比较。[1] 这种技术容易受到窃听者的攻击,他们可能会尝试通过监听串行线路来获取密码,并且容易受到重复试错攻击。

CHAP 没有这些缺陷。使用 CHAP,服务器向客户端发送一个随机生成的“挑战”字符串,以及其主机名。客户端使用主机名查找相应的密钥,将其与挑战结合起来,并使用单向哈希函数加密该字符串。结果与客户端的主机名一起返回给服务器。现在服务器执行相同的计算,如果得到相同的结果,则确认客户端。

CHAP 也不要求客户端仅在启动时进行身份验证,而是定期发送挑战,以确保客户端没有被入侵者替换,例如通过切换电话线,或者由于调制解调器配置错误导致 PPP 守护程序没有注意到原始电话呼叫已断开,并且其他人已拨入。

pppd 将 PAP 和 CHAP 的密钥保存在两个单独的文件中,分别称为/etc/ppp/pap-secrets/etc/ppp/chap-secrets。通过在一个或另一个文件中输入远程主机,您可以精细地控制是使用 PAP 还是 CHAP 来验证您自己与对等方的身份,反之亦然。

默认情况下,pppd 不要求远程主机进行身份验证,但当远程主机请求时,它会同意验证自身身份。由于 CHAP 比 PAP 强大得多,因此 pppd 尽可能尝试使用前者。如果对等方不支持它,或者如果 pppd 在其chap-secrets文件中找不到远程系统的 CHAP 密钥,则它会退回到 PAP。如果它也没有其对等方的 PAP 密钥,则它会完全拒绝进行身份验证。结果,连接被关闭。

您可以通过多种方式修改此行为。当给定auth关键字时,pppd 要求对等方验证自身身份。pppd 同意使用 CHAP 或 PAP,只要它在其 CHAP 或 PAP 数据库中具有对等方的密钥。还有其他选项可以打开或关闭特定的身份验证协议,但我在这里不会描述它们。

如果所有与您通过 PPP 通信的系统都同意验证他们自己的身份,您应该将authoption 在全局/etc/ppp/options文件中,并在chap-secrets文件中为每个系统定义密码。如果某个系统不支持 CHAP,请为其在pap-secrets文件中添加一个条目。这样,您可以确保没有未经身份验证的系统连接到您的主机。

接下来的两节讨论了两个 PPP 密钥文件,pap-secretschap-secrets。它们位于/etc/ppp中,包含客户端、服务器和密码的三元组,可选地后跟 IP 地址列表。客户端和服务器字段的解释对于 CHAP 和 PAP 是不同的,并且还取决于我们是否使用对等方验证自身身份,或者我们是否要求服务器使用我们验证自身身份。

8.8.2. CHAP 密钥文件

当它必须使用 CHAP 向服务器验证自身身份时,pppd 搜索chap-secrets文件,查找客户端字段等于本地主机名,服务器字段等于 CHAP 挑战中发送的远程主机名的条目。当要求对等方验证自身身份时,角色会简单地反转:pppd 然后查找客户端字段等于远程主机名(在客户端的 CHAP 响应中发送),服务器字段等于本地主机名的条目。

以下是一个示例chap-secrets文件,用于 vlager:[2]

# CHAP secrets for vlager.vbrew.com
#
# client         server           secret                addrs
#---------------------------------------------------------------------
vlager.vbrew.com  c3po.lucas.com   "Use The Source Luke" vlager.vbrew.com
c3po.lucas.com    vlager.vbrew.com "arttoo! arttoo!"     c3po.lucas.com
*                 vlager.vbrew.com "TuXdrinksVicBitter"  pub.vbrew.com

vlager 建立与 c3po 的 PPP 连接时,c3po 要求 vlager 通过发送 CHAP 挑战来验证自身身份。pppdvlager 上然后扫描chap-secrets查找客户端字段等于 vlager.vbrew.com,服务器字段等于 c3po.lucas.com 的条目,并找到示例中显示的第一行。[3] 然后,它从挑战字符串和密钥(Use The Source Luke)生成 CHAP 响应,并将其发送给 c3po

pppd 还为 c3po 组成一个 CHAP 挑战,其中包含唯一的挑战字符串及其完全限定的主机名 vlager.vbrew.comc3po 以我们讨论的方式构建 CHAP 响应,并将其返回给 vlagerpppd 然后从响应中提取客户端主机名 (c3po.vbrew.com),并搜索chap-secrets文件,查找匹配 c3po 作为客户端,vlager 作为服务器的行。第二行执行此操作,因此 pppd 组合 CHAP 挑战和密钥arttoo! arttoo!,对其进行加密,并将结果与 c3po 的 CHAP 响应进行比较。

可选的第四个字段列出了客户端字段中命名的客户端可接受的 IP 地址。地址可以用点分十进制表示法给出,也可以作为使用解析器查找的主机名。例如,如果 c3po 请求在 IPCP 协商期间使用不在此列表中的 IP 地址,则该请求将被拒绝,并且 IPCP 将被关闭。在上面显示的示例文件中,因此 c3po 被限制为使用其自己的 IP 地址。如果地址字段为空,则允许任何地址;值为“-”阻止与该客户端一起使用 IP。

示例的第三行chap-secrets文件允许任何主机与 vlager 建立 PPP 链接,因为客户端或服务器字段为*是匹配任何主机名的通配符。唯一的要求是连接主机必须知道密钥,并且必须使用与 pub.vbrew.com 关联的 IP 地址。带有通配符主机名的条目可以出现在密钥文件中的任何位置,因为 pppd 将始终使用它可以找到的服务器/客户端对的最佳匹配项。

pppd 可能需要一些帮助来形成主机名。如前所述,远程主机名始终由对等方在 CHAP 挑战或响应数据包中提供。本地主机名默认通过调用gethostname(2)函数获得。如果您已将系统名称设置为不完全限定的主机名,则还必须使用domain选项为 pppd 提供域名
# pppd … domain vbrew.com

此规定将 Brewery 的域名附加到 vlager,用于所有与身份验证相关的活动。其他修改 pppd 对本地主机名理解的选项是usehostnamename。当您在命令行上使用 local:remotelocal作为名称而不是点分十进制时,pppd 将其用作本地主机名。

8.8.3. PAP 密钥文件

PAP 密钥文件与 CHAP 的非常相似。前两个字段始终包含用户名和服务器名称;第三个字段保存 PAP 密钥。当远程主机发送其身份验证信息时,pppd 使用服务器字段等于本地主机名,用户字段等于请求中发送的用户名的条目。当我们需要将我们的凭据发送给对等方时,pppd 使用用户字段等于本地用户名,服务器字段等于远程主机名的密钥。

PAP 密钥文件示例可能如下所示
# /etc/ppp/pap-secrets
#
# user          server          secret          addrs
vlager-pap      c3po            cresspahl       vlager.vbrew.com
c3po            vlager          DonaldGNUth     c3po.lucas.com

第一行用于在我们与 c3po 通信时验证我们自己的身份。第二行描述了名为 c3po 的用户如何使用我们验证自身身份。

第一列中的名称 vlager-pap 是我们发送给 c3po 的用户名。默认情况下,pppd 选择本地主机名作为用户名,但您也可以通过给出user选项,后跟该名称来指定不同的名称。

当从pap-secrets文件中选择条目以向远程主机标识我们自己时,pppd 必须知道远程主机的名称。由于它无法找到该名称,因此您必须在命令行上使用remotename关键字,后跟对等方的主机名来指定它。例如,要使用上面的条目与 c3po 进行身份验证,我们必须将以下选项添加到 pppd 的命令行中
# pppd ... remotename c3po user vlager-pap

在 PAP 密钥文件的第四个字段(以及所有后续字段)中,您可以指定允许该特定主机的 IP 地址,就像在 CHAP 密钥文件中一样。对等方将仅被允许请求来自该列表的地址。在示例文件中,c3po 拨入时将使用的条目(c3po 是客户端的行)允许它使用其实际 IP 地址,而不能使用其他地址。

请注意,PAP 是一种相当弱的身份验证方法,您应该尽可能使用 CHAP 代替。因此,我们在此处不会更详细地介绍 PAP;如果您有兴趣使用它,您将在pppd(8)手册页中找到更多 PAP 功能。

注释

[1]

“Secret” 只是密码的 PPP 名称。PPP 密钥没有与 Linux 登录密码相同的长度限制。

[2]

双引号不是密钥的一部分;它们仅用于保护其中的空格。

[3]

此主机名取自 CHAP 挑战。