跳至内容

实验 9:密码学

目标

完成本实验后,你将能够

  • 将密码学概念应用于保护数据和通信安全

完成本实验的估计时间:120 分钟

三个可以保守秘密,如果其中两个死了...

-- 本杰明·富兰克林

常见的密码学术语和定义

密码学

在日常使用中,密码学是指用秘密字符写作的行为或艺术。在技术术语中,它可以定义为利用数学对数据进行加密和解密的科学。

密码分析

密码分析是研究如何破坏(击败)密码机制的学科。它是破解密码、解码秘密、破坏身份验证方案以及普遍破坏密码协议的科学。

密码学

密码学是密码学和密码分析相结合的学科。密码学是数学的一个分支,研究密码方法的数学基础。

加密

加密将数据转换为几乎无法阅读的形式,除非有相应的知识(例如,密钥)。其目的是通过将信息隐藏起来以确保隐私,使其对任何非预期接收者不可见。

解密

解密是加密的逆过程;它将加密数据转换为可理解的形式。

密码

加密和解密方法称为密码。

哈希函数(摘要算法)

密码哈希函数用于各种环境,例如在生成数字签名时计算消息摘要。哈希函数将消息的位压缩为固定大小的哈希值,以将可能的 消息均匀地分布在可能的哈希值之间。密码哈希函数以一种使 生成哈希为特定哈希值的 消息极其困难的方式执行此操作。以下是一些最知名和最广泛 使用的哈希函数的示例。

a) - SHA-1(安全哈希算法) - 这是美国政府发布的一种密码哈希算法。它 从任意长度的字符串生成 160 位哈希值。它被认为非常出色。

b)- MD5(消息摘要算法 5) - 是 RSA Laboratories 开发的一种密码哈希算法。它 可用于将任意长度的字节字符串哈希为 128 位值。

算法

它描述了一个逐步解决问题的过程,尤其是解决问题的一种既定 、递归 的计算过程,它 需要有限的步骤才能完成。从技术上讲,算法必须在有限的步骤 后达到结果。算法的效率可以通过它 解决问题所 花费的基本步骤数量来衡量。密钥 类算法有两类。它们 是

a) -- 对称加密算法(密钥)

对称算法使用相同的密钥进行加密和解密(或者解密密钥 很容易 从加密密钥 中推导出来)。密钥 算法 使用相同的密钥 进行 加密和解密(或者 其中 一个 很容易 从另一个中推导出来)。这是数据加密 更直接 的方法,从数学上讲,它 比公钥密码学 更简单。对称算法 可以分为 流密码 和 分组密码。流密码 可以 一次加密 一个 明文位,而 分组密码 则 采用 几个位(在现代密码 中通常为 64 位),并将 它们 作为一个单元 进行 加密。对称算法 在 计算机 上的执行速度 比 非对称算法 快 得多。

对称算法 的示例 包括 :AES、3DES、Blowfish、CAST5、IDEA 和 Twofish。

b) -- 非对称算法 (公钥 算法 )

另一方面,非对称算法 使用 不同的密钥 进行 加密和解密,并且 无法 从加密密钥 中推导出解密密钥。非对称密码 允许 加密密钥 公开,允许 任何 人 使用该密钥 进行 加密,而 只有 适当的接收者(知道解密密钥 )才能 解密 消息。加密密钥 也 称为 公钥,解密密钥 称为 私钥 或 秘密密钥。

RSA 可能是最著名的非对称加密算法 。

数字签名

数字签名将文档绑定到特定密钥的所有者。

文档的数字签名是基于文档和签名者私钥的信息。它通常通过散列函数和私有签名函数(使用签名者的私钥加密)创建。数字签名是使用某个私钥创建的一小段数据,以及一个公钥,可用于验证签名是否使用相应的私钥生成。

有多种方法可以自由地创建和验证数字签名,但 RSA 公钥算法是最广为人知的。

密码协议

密码学在多个层面上运作。在一个层面上,你有算法,例如分组密码和公钥密码系统。在此基础上,你获得协议,在协议的基础上,你发现应用程序(或其他协议)。以下列出了使用密码协议的典型日常应用。这些协议建立在更低级别的密码算法之上。

i.) 域名服务器安全(DNSSEC)

这是一种用于安全分布式名称服务的协议。目前以互联网草案的形式提供。

ii.) 安全套接字层(SSL)

SSL 是用于安全 WWW 连接的两种协议之一(另一种是 SHTTP)。随着越来越多的敏感信息(例如信用卡号码)通过互联网传输,WWW 安全变得越来越必要。

iii.) 安全超文本传输协议(SHTTP)

这是另一种协议,用于为 WWW 事务提供更多安全性。

iv.) 电子邮件安全和相关服务

GnuPG - GNU Privacy Guard - 符合 RFC2440 中描述的拟议 OpenPGP 互联网标准。

v.) SSH2 协议

此协议适用于互联网的需求,目前用于 SSH2 软件。该协议用于保护终端会话和 TCP 连接。

以下练习将检查两个使用密码协议的应用程序 - GnuPG 和 OpenSSH。

练习 1

GnuPG

GnuPG(GNU Privacy Guard)是一套用于公钥加密和数字签名的程序。这些工具可用于加密数据和创建数字签名。它还包括一个高级密钥管理功能。GnuPG 使用公钥密码术来允许用户安全地进行通信。

以普通用户身份执行以下练习。例如用户 ying

创建新的密钥对

  1. 以用户“ying”身份登录系统

  2. 确保您的系统上已安装 GnuPG 包。输入

    [ying@serverXY ying]$ rpm -q gnupg
    gnupg-*.*
    

    如果未安装,请让超级用户进行安装。

  3. 列出并记下您主目录中的所有隐藏目录。

  4. 列出您当前密钥环中的密钥。输入

    [ying@serverXY ying]$ gpg --list-keys
    

    注意

    您的密钥环中不应有任何密钥。但是,上面的命令也将有助于创建一个默认环境,使您能够首次成功创建新的密钥对。

    实验室任务

    再次列出您主目录中的隐藏目录。新添加的目录名称是什么?

  5. 使用 gpg 程序创建新的密钥对。输入

    [ying@serverXY ying]$ gpg --gen-key
    
    ......................................
    
    gpg: keyring `/home/ying/.gnupg/secring.gpg' created
    
    gpg: keyring `/home/ying/.gnupg/pubring.gpg' created
    
    Please select what kind of key you want:
    
    (1) DSA and ElGamal (default)
    
    (2) DSA (sign only)
    
    (5) RSA (sign only)
    
    Your selection? 1
    

    在创建密钥类型的提示下,接受默认值,即(DSA 和 ElGamal)。输入 1

    警告

    选项 (1) 将为您创建两个密钥对。DSA 密钥对将是主密钥对 - 用于制作数字签名,而从属 ELGamel 密钥对用于数据加密。

  6. 您将创建大小为 1024 的 ELG-E 密钥。在下面的提示下再次接受默认值

    DSA key pair will have 1024 bits.
    
    About to generate a new ELG-E key pair.
    
    minimum key size is 768 bits
    
    default key size is 1024 bits
    
    highest suggested key size is 2048 bits
    
    What key size do you want? (1024) 1024
    
  7. 创建将在一年内过期的密钥。在下面的提示下输入“1y”

    请指定密钥的有效期。

    0 = 密钥永不过期

    n = 密钥在 n 天后过期

    n+w = 密钥在 n 周后过期

    n+m> = 密钥在 n 个月后过期

    n+y = 密钥在 n 年后过期

    密钥有效期为?(0) 1y

  8. 在提示下输入“y”以接受显示的过期日期

    Is this correct (y/n)? y
    
  9. 创建用户 ID 以识别您的密钥

    您需要一个用户 ID 来识别您的密钥;软件按以下格式构建用户 ID

    来自真实姓名、评论和电子邮件地址,格式如下

    "Firstname Lastname (任何评论) yourname@serverXY&"

    真实姓名:Ying Yang Enter

    评论:我的测试 Enter

    电子邮件地址:ying@serverXY Enter

    在确认提示下输入“o”(确定)以接受正确的值。

    您选择了此用户 ID

    "Ying Yang (我的测试) ying@serverXY"

    更改 (N)ame、(C)omment、(E)mail 或 (O)kay/(Q)uit?O

  10. 在下一个提示下选择您不会忘记的密码

    Enter passphrase: **
    
    Repeat passphrase: **
    

练习 2

密钥管理

gpg 程序也用于密钥管理。

列出您的密钥

  1. 在以用户 ying 身份登录系统时,显示您密钥环中的密钥。输入

    [ying@serverXY ying]$  gpg --list-keys
    
    gpg: WARNING: using insecure memory!
    
    /home/ying/.gnupg/pubring.gpg
    
    -----------------------------
    
    pub 1024D/1D12E484 2003-10-16 Ying Yang (my test) <ying@serverXY>
    
    sub 1024g/1EDB00AC 2003-10-16 [expires: 2004-10-15]
    
  2. 要抑制有关“不安全内存”的稍微令人讨厌的“警告”,请在您的个人 gpg 配置文件中添加以下选项。输入

    [ying@serverXY ying]$ echo "no-secmem-warning" >> ~/.gnupg/gpg.conf
    
  3. 再次运行列出您密钥的命令,以确保您的更改生效。

  4. 列出您的密钥及其签名。输入

    [ying@serverXY ying]$ gpg --list-sigs
    
    /home/ying/.gnupg/pubring.gpg
    
  5. 仅列出您的私钥。输入

    [ying@serverXY ying]$ gpg --list-secret-keys
    
    /home/ying/.gnupg/secring.gpg
    
    -----------------------------
    
    sec 1024D/1D12E484 2003-10-16 Ying Yang (my test) <ying@serverXY>
    
    ssb 1024g/1EDB00AC 2003-10-16
    
  6. 显示密钥指纹。输入

    [ying@serverXY ying]$ gpg --fingerprint
    
    /home/ying/.gnupg/pubring.gpg
    
    -----------------------------
    
    pub 1024D/1D12E484 2003-10-16 Ying Yang (my test) <ying@serverXY>
    
    Key fingerprint = D61E 1538 EA12 9049 4ED3 5590 3BC4 A3C1 1D12 E484
    
    sub 1024g/1EDB00AC 2003-10-16 [expires: 2004-10-15]
    
    <span id="anchor-2"></span>Revocation certificates
    
    Revocation certificates are used to revoke keys in case someone gets knowledge of your secret key or in case you forget your passphrase. They are also useful for other various functions.
    

创建吊销证书

  1. 在以用户 ying 身份登录系统时,创建吊销证书。它将在您的标准输出中显示。输入

    [ying@serverXY ying]$ gpg --gen-revoke ying@serverXY
    

    按照提示操作,并在提示时输入您的密码。

  2. 现在创建一个吊销证书,该证书将以 ASCII 格式存储在名为 - 的文件中

    “revoke.asc”。输入

    [ying@serverXY ying]$ gpg --output revoke.asc --gen-revoke ying@serverXY
    
  3. 您应该将吊销证书存储在安全的地方,甚至打印一份硬拷贝。

导出公钥

所有这些加密、签名和解密业务的重点是人们希望彼此沟通 - 但他们也希望以尽可能安全的方式进行沟通。

话虽如此,也许并非所有显而易见的事情都需要说明

您必须交换公钥才能与使用基于公钥的密码系统的其他人进行通信。

或者至少在任何公开可访问的地方(广告牌、网页、密钥服务器、广播、电视、通过电子邮件发送垃圾邮件......等等)提供您的公钥。

导出您的公钥

  1. 以二进制格式将您的公钥导出到名为“ying-pub.gpg”的文件中。输入

    [ying@serverXY ying]$ gpg --output ying-pub.gpg --export <your_key’s_user_ID>
    

    注意

    请替换使用任何字符串,正确地标识您的密钥。在我们的示例系统中,此值可以是以下任何一个

    ying@serverXY、ying、yang

    或者

    实际密钥 ID - 1D12E484

  2. 将您的公钥导出到名为“ying-pub.asc”的文件中。但这次以

    ASCII 编码格式。输入

    [ying@serverXY ying]$gpg --output ying-pub.asc --armor --export ying@serverXY 
    
  3. 使用 cat 命令查看 ying 的公钥(ying-pub.gpg)的二进制版本

  4. 要重置终端,请输入:reset

  5. 使用 cat 命令查看 ying 的公钥(ying-pub.asc)的 ASCII 版本

  6. 您将观察到 ASCII 版本更适合发布在网页上或发送垃圾邮件等。

练习 3

数字签名

创建和验证签名使用公钥/私钥对,这与加密和解密不同。使用签名者的私钥创建签名,可以使用相应的公钥进行验证。

对文件进行数字签名

  1. 创建一个名为“secret-file.txt”的文件,其中包含文本“Hello All”。输入

    [ying@serverXY ying]$ echo "Hello All" > secret1.txt
    
  2. 使用 cat 查看文件的内容。使用 file 命令查看它是什么类型的文件。

  3. 现在使用您的数字签名对文件进行签名。输入

    [ying@serverXY ying]$ gpg -s secret1.txt
    

    在提示时输入您的密码。

    上面的命令将创建另一个文件“secret1.txt.gpg”,该文件已压缩并附加了签名。对该文件运行“file”命令以检查它。使用 cat 查看文件

  4. 检查已签名的“secret1.txt.gpg”文件上的签名。输入

    [ying@serverXY ying]$ gpg --verify secret1.txt.gpg
    
    gpg: Signature made Thu 16 Oct 2003 07:29:37 AM PDT using DSA key ID 1D12E484
    
    gpg: Good signature from "Ying Yang (my test) <ying@serverXY>"
    
  5. 创建另一个名为 secret2.txt 的文件,其中包含文本“ Hello All”。

  6. 对 secret2.txt 文件进行签名,但这次让文件为 ASCII 编码。输入

    [ying@serverXY ying]$ gpg -sa secret2.txt
    

    将在您的 pwd 中创建一个名为“secret2.txt.asc”的 ASCII 编码文件。

  7. 使用 cat 命令查看上面为您创建的 ASCII 编码文件的内容。

  8. 创建另一个名为“secret3.txt”的文件,其中包含文本“hello dude”。输入

    [ying@serverXY ying echo "hello dude" > secret3.txt
    
  9. 将您的签名追加到上面创建的文件主体中。输入

    [ying@serverXY ying]$ gpg --clearsign secret3.txt
    

    这将创建一个未压缩的文件(secret3.txt.asc),该文件包装在您的 ASCII 编码签名中。

    写下验证为您创建的文件签名的命令。

  10. 使用任何分页器打开文件以查看其内容。

    问题

    您能阅读您输入到文件中的文本吗?

在继续之前阅读

确保您的合作伙伴已执行上述所有“练习 1、2 和 3”,然后再继续执行下面的练习 4。

如果您没有合作伙伴,请注销用户 Ying 的帐户,并以用户“me”身份登录系统。

然后以用户“me”身份重复所有“练习 1、2 和 3”。

然后您可以执行下面的练习 4。将“serverPR”上所有对用户 Ying 的引用替换为 ServerXY 上的用户“me”(即您的本地主机)。

在下一项练习中,您可以使用用户“me@serverXY”或用户“ying@serverPR”作为您的合作伙伴。

练习 4

导入公钥

在本练习中,您将使用所谓的“信任网”与另一个用户进行通信。

  1. 以用户 ying 身份登录系统。

  2. 使您的 ASCII 编码公钥文件(ying-pub.asc)对您的合作伙伴可用(使用

    要麼是 - me@serverXY 或是 ying@serverPR)

    注意

    有几种方法可以做到这一点,例如电子邮件、复制和粘贴、scp、ftp、保存在软盘上等等。

    选择最适合您的方法。

  3. 请您的合作伙伴使他们的公钥文件对您可用。

  4. 假设您的合作伙伴的公钥存储在您 pwd 中名为“me-pub.asc”的文件中;

    将密钥导入到您的密钥环中。输入

    [ying@serverXY ying]$ gpg --import me-pub.asc
    
    gpg: key 1D0D7654: public key "Me Mao (my test) <me@serverXY>" imported
    
    gpg: Total number processed: 1
    
    gpg: imported: 1
    
  5. 现在列出您密钥环中的密钥。输入

    [ying@serverXY ying]$ gpg --list-keys
    
    /home/ying/.gnupg/pubring.gpg
    
    -----------------------------
    
    pub 1024D/1D12E484 2003-10-16 Ying Yang (my test) <ying@serverXY>
    
    sub 1024g/1EDB00AC 2003-10-16 [expires: 2004-10-15]
    
    pub 1024D/1D0D7654 2003-10-16 Me Mao (my test) <me@serverXY>
    
    sub 1024g/FD20DBF1 2003-10-16 [expires: 2004-10-15]
    
  6. 特别是列出与用户 ID me@serverXY 关联的密钥。输入

    [ying@serverXY ying]$ gpg --list-keys me@serverXY
    
  7. 查看 me@serverXY 密钥的指纹。输入

    [ying@serverXY ying]$ gpg --fingerprint me@serverXY
    

    加密和解密文件

    加密和解密文件或文档的过程很简单。

    如果您想向用户 ying 加密一条消息,您将使用用户 ying 的公钥对其进行加密。

    收到后,ying 需要使用 ying 的私钥解密消息。

    只有 ying 可以解密使用 ying 的公钥加密的消息或文件

加密文件

  1. 在以用户 ying 身份登录系统时,创建一个名为 encrypt-sec.txt 的文件。输入

    [ying@serverXY ying]$ echo "hello" > encrypt-sec.txt
    

    确保您可以使用 cat 命令读取文件的内容。

  2. 加密文件 encrypt-sec.txt,使其只有用户“me”可以查看。即使用 me@serverXY 的公钥(您现在已将其保存在密钥环中)对其进行加密。键入

    [ying@serverXY ying]$ gpg --encrypt --recipient me@serverXY encrypt-sec.txt
    

    上述命令将在您的 pwd 中创建一个名为“encrypt-sec.txt.gpg”的加密文件。

要解密文件

  1. 您上面加密的文件是为 me@serverXY 准备的。

    尝试解密文件。键入

    [ying@serverXY ying]$ gpg --decrypt encrypt-sec.txt.gpg
    
    gpg: encrypted with 1024-bit ELG-E key, ID FD20DBF1, created 2003-10-16
    
    "Me Mao (my test) <me@serverXY>"
    
    gpg: decryption failed: secret key not available
    
  2. 我们在这里学到了什么宝贵的教训吗?

  3. 将您创建的加密文件提供给正确的所有者,让他们运行上述命令来解密文件。他们是否更成功地解密了文件。

    注意

    在解密二进制文件(例如程序)时要格外小心,因为在成功解密文件后,gpg 会尝试将文件的内容发送到标准输出。

    养成使用以下命令解密文件的习惯

    [ying@serverXY ying]$ gpg --output encrypt-sec --decrypt encrypt-sec.txt.gpg
    

    这将强制将输出发送到名为“encrypt-sec”的文件。

    然后可以使用任何适合该文件(或内容)类型的程序来查看(或运行)它。

    提示

    与 gpg 程序一起使用的大多数命令和选项也具有简短形式,这可以减少用户在命令行上的输入量。例如

    ```
    gpg --encrypt --recipient me@serverXY encrypt-sec.txt
    ```
    The short form of the above command is:
    
    ```
    gpg -e -r me@serverXY encrypt-sec.txt
    ```
    
  4. 要加密字符串“hello”并将其作为 ASCII 盔甲消息发送给邮件地址为 ying@serverXY 的用户;使用以下命令

    echo "hello" | gpg -ea -r ying@serverXY | mail ying@serverXY
    
  5. 要使用“me@serverXY”的公钥加密文件“your_file”并将其写入“your_file.gpg”

    在使用您的用户 ID(使用您的数字签名)对其进行签名后;使用以下命令

    gpg -se -r me@serverXY your_file
    
  6. 在 wwwkeys.pgp.net 上有一个公开可用的密钥服务器。您可以使用 gpg 将您的密钥上传到那里

    gpg --send-keys--keyserver wwwkeys.pgp.net

OpenSSH

OpenSSH 是 OpenBSD 的 SSH(安全外壳)协议实现。

它是 SSH 协议套件网络连接工具的免费版本。OpenSSH 对所有流量(包括密码)进行加密,以有效消除窃听、连接劫持和其他网络级攻击。此外,OpenSSH 还提供大量安全隧道功能以及各种身份验证方法。

它有助于在两个不可信主机之间通过不安全网络(例如互联网)提供安全的加密通信。

它包括服务器端组件和客户端程序套件。

sshd

服务器端包括安全外壳守护程序(sshd)。sshd 是监听来自客户端连接的守护程序。

它为每个传入连接派生一个新守护程序。派生的守护程序处理密钥交换、加密、身份验证、命令执行和数据交换。根据 sshd 的手册页,sshd 的工作原理如下

OpenSSH SSH 守护程序仅支持 SSH 协议 2。每个主机都有一个主机特定密钥,用于识别该主机。每当客户端连接时,守护程序都会以其公共主机密钥进行响应。客户端将主机密钥与其数据库进行比较,以验证其是否未更改。正向安全性通过 Diffie-Hellman 密钥协商提供。这种密钥协商会导致共享会话密钥。会话的其余部分使用对称密码进行加密。

客户端从服务器提供的加密算法中选择加密算法。此外,会话完整性通过加密消息身份验证代码(hmac-md5、hmac-sha1、umac-64、umac-128、hmac-sha2-256 或 hmac-sha2-512)提供。

最后,服务器和客户端进入身份验证对话框。客户端尝试使用基于主机的身份验证、公钥身份验证、GSSAPI 身份验证、挑战-响应身份验证或密码身份验证来验证自身。

OpenSSH 中实现的 SSH2 协议由“IETF secsh”工作组标准化。

ssh

客户端程序套件包括 ssh。这是一个用于登录远程系统并还可用于在远程系统上执行命令的程序。

练习 5

sshd

一些练习涵盖了 sshd 服务器守护程序。

Usage: sshd [options]

Options:

 -f file Configuration file (default /etc/ssh/sshd_config)
 -d Debugging mode (multiple -d means more debugging)
 -i Started from inetd
 -D Do not fork into daemon mode
 -t Only test configuration file and keys
 -q Quiet (no logging)
 -p port Listen on the specified port (default: 22)
 -k seconds Regenerate server key every this many seconds (default: 3600)
 -g seconds Grace period for authentication (default: 600)
 -b bits Size of server RSA key (default: 768 bits)
 -h file File from which to read host key (default: /etc/ssh/ssh_host_key)
 -u len Maximum hostname length for utmp recording
 -4 Use IPv4 only
 -6 Use IPv6 only
 -o option Process the option as if it was read from a configuration file.

大多数 Linux 系统开箱即用已经配置了 OpenSSH 服务器并以一些默认设置运行。sshd 的配置文件通常位于 /etc/ssh/ 下,名为 sshd_config

sshd_config

  1. 使用任何分页器打开 SSH 服务器的配置文件并进行研究。键入

    [root@serverXY root]# less /etc/ssh/sshd_config
    

    注意

    sshd_config 是一个相当奇怪的配置文件。与其他 Linux 配置文件不同,sshd_config 文件中的注释(#)表示选项的默认值。(即,注释表示已编译的默认值。)

  2. 查阅 sshd_config 的手册页。

    问题

    以下选项的作用是什么?

    • AuthorizedKeysFile
    • Ciphers
    • Port
    • Protocol
    • X11Forwarding
    • HostKey
  3. 将您的 pwd 更改为 /etc/ssh/ 目录。

  4. 列出 /etc/ssh/ 下的所有文件

创建主机密钥

您的 SSH 服务器已经拥有它使用的主机密钥。这些密钥是在系统首次安装时生成的。在本练习中,您将学习如何为您的服务器创建主机类型密钥,但您不会使用这些密钥。

要为您的服务器生成主机密钥

  1. 在您的 pwd 下创建一个新目录。将其命名为 spare-keys。cd 到新目录。键入

    [root@serverXY ssh]# mkdir spare-keys && cd spare-keys
    
  2. 使用 ssh-keygen 程序创建具有以下特征的主机密钥

    • 密钥类型应为“rsa”
    • 密钥不应包含任何注释
    • 私钥文件应命名为 - ssh_host_rsa_key
    • 密钥不应使用任何密码短语

    键入

    [root@serverXY spare-keys]# ssh-keygen -q -t rsa -f ssh_host_rsa_key -C '' -N ''
    

    问题

    您必须执行什么操作才能使 sshd 守护程序使用您刚刚生成的主机密钥?

  3. 查看您上面创建的密钥的指纹。键入

    [root@serverXY spare-keys]# ssh-keygen -l -f ssh_host_rsa_key
    
  4. 查看您创建的密钥的指纹,但这次包括密钥指纹的视觉 ASCII 艺术表示。键入

    [root@localhost spare-keys]# ssh-keygen -l -v -f ssh_host_rsa_key
    3072 SHA256:1kQS0Nz4NofWkgqU0y+DxmDoY6AmGsF40GwZkobD8DM ssh_host_rsa_key.pub (RSA)
    +---[RSA 3072]----+
    |X=.+  .*o+.      |
    |B*B o + =o.      |
    |oBE. + o o.+     |
    |+.+o  = ooX o    |
    |+o . . .S*.+     |
    |.      ..        |
    |                 |
    |                 |
    |                 |
    +----[SHA256]-----+
    
  5. 写下创建名为“ssh_host_dsa_key”的 dsa 类型密钥的命令,该密钥不包含任何注释,也不包含任何密码短语。

  6. 检查 sshd 服务的状态。键入

    [root@localhost ~]# systemctl -n 0 status sshd.service sshd.service - OpenSSH server daemon
    Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
    Active: active (running) since Thu 2023-10-05 23:56:34 EDT; 3 days ago
    ...<SNIP>...
    
  7. 如果您对 sshd 配置文件进行了任何配置更改,您可以通过运行以下命令重新启动 sshd 服务

    [root@localhost ~]# systemctl restart sshd.service
    

练习 6

ssh

本节涵盖有关 ssh 客户端程序的练习。

usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]

要使用 ssh

  1. 以用户 me 的身份登录 serverXY。

  2. 使用 ssh 连接到 serverPR。键入

    [me@serverXY me]$ ssh serverPR
    

    在出现提示时输入 me 的密码。如果您收到任何警告消息,请键入“yes”继续。

  3. 登录后,创建一个名为 myexport 的目录,并在新目录下创建一个名为 foobar 的空文件。键入

    [me@serverPR me]$ mkdir ~/myexport && touch myexport/foobar
    
  4. 注销 serverPR。键入

    [me@serverPR me]$ exit
    

    您将返回到 serverXY 上的本地 shell。

  5. 使用 ssh 远程执行“ls”命令,以递归方式查看 serverPR 上 me 的主目录中的文件列表。键入

    [root@localhost ~]# ssh me@serverPR 'ls -lR /home/me/myexport'
    me@localhost's password:
    ...<SNIP>...
    /home/me/myexport:
    total 0
    -rw-rw-r-- 1 me me 0 Oct  9 16:48 foobar
    

    在出现提示时输入 me 的密码。如果您收到任何警告消息,请键入“yes”继续。

  6. 在仍然登录到 serverXY 的情况下,尝试以用户 ying 的身份远程重新启动 serverPR。键入

    [me@localhost ~]# ssh -l ying localhost 'reboot'
    ying@localhost's password:
    ...<SNIP>...
    

    在出现提示时输入 ying 的密码。

    问题

    用户 ying 是否能够远程重新启动 serverPR?为什么 ying 不能远程重新启动 serverPR?

  7. 从 serverXY,尝试以用户 ying 的身份远程查看运行在 serverPR 上的 sshd 服务的状态。键入

    [root@localhost ~]# ssh -l ying localhost 'systemctl status sshd.service'
    ying@localhost's password:
    ● sshd.service - OpenSSH server daemon
    
  8. 从 serverXY,尝试以用户 ying 的身份远程重新启动运行在 serverPR 上的 sshd 服务。键入

    [root@localhost ~]# ssh -l ying localhost 'systemctl restart sshd.service'
    ying@localhost's password:
    Failed to restart sshd.service: Interactive authentication required.
    See system logs and 'systemctl status sshd.service' for details.
    

    问题

    • 用户 ying 是否能够远程查看 serverPR 上的 sshd 服务的状态?
    • 用户 ying 是否能够远程重新启动 serverPR 上的 sshd 服务?
    • 简要解释您观察到的行为。
  9. 键入“exit”注销 serverPR 并返回 serverXY。

scp - 安全复制(远程文件复制程序)

scp 在网络上的主机之间复制文件。它使用 SSH 进行数据传输,使用相同的身份验证,并提供与 ssh 相同的安全级别。

usage: scp [-346BCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file]
            [-J destination] [-l limit] [-o ssh_option] [-P port]
            [-S program] source ... target

要使用 scp

  1. 确保您仍然以用户 me 的身份登录到 serverXY。

  2. 在您的主目录下创建一个名为 myimport 的目录,然后 cd 到该目录。

  3. 使用 scp 复制远程服务器 PR 上“/home/me/myexport/”目录下的所有文件。(命令末尾的点“.”很重要)。键入

    [me@localhost ~myimport]# scp serverPR:/home/me/myexport  .
    me@serverPR's password:
    scp: /home/me/myexport: not a regular file
    

    问题

    简要解释为什么前面的命令失败?

  4. 再次运行前面的命令,但这次将递归选项添加到 scp。键入

    [me@localhost ~myimport]# scp -r me@serverPR:/home/me/myexport  .
    me@localhost's password:
    foobar
    

    问题

    这两个命令变体的区别是什么,以及在什么情况下它们将具有相同的结果?

    • scp me@serverPR:/home/me/myexport.

    • scp serverPR:/home/me/myexport.
  5. 复制 serverPR 上“/home/me/.gnugp/”下的所有文件的命令是什么?

  6. 现在复制 serverPR 上 ying 的主目录。键入

    [me@localhost ~myimport]# scp -r  ying@localhost:/home/ying/  ying_home_directory_on_serverPR
    
  7. 再次运行前面命令的略微变体以复制 serverPR 上 ying 的主目录。键入

    [me@localhost ~myimport]# scp -r  ying@localhost:/home/ying  ying_home_directory_on_serverPR
    

    问题

    两个前面命令变体的细微但重要区别是什么?每个命令的结果是什么?

    • scp -r ying@localhost:/home/ying/ ying_home_directory_on_serverPR

    • scp -r ying@localhost:/home/ying ying_home_directory_on_serverPR
  8. 使用 ls -alR 命令查看前面两步中内容的列表。键入

    [me@localhost ~myimport]# ls -al ying_home_directory_on_serverPR/
    

    问题

    简要解释 ls -alR 命令的输出?例如,解释为什么您似乎拥有这些文件的重复项 .bash_history、.bashrc ...

练习 7

为 SSH 创建用户公钥和私钥

每个想要使用 RSA 或 DSA 身份验证使用 SSH 的用户都需要一对公钥和私钥。ssh-keygen 程序可用于创建这些密钥(就像您之前为系统创建新主机密钥时一样)。

提示

主机密钥和用户密钥之间的一个主要区别是,强烈建议用密码短语保护用户密钥。密码短语是用于加密 [纯文本] 私钥的密码。

公钥存储在与私钥具有相同文件名的文件中,但附加了“.pub”扩展名。无法轻松恢复丢失的密码短语。如果密码短语丢失或忘记,则必须生成新的密钥。

要创建用户公钥/私钥身份验证密钥

  1. 以用户 ying 的身份登录到您的本地机器。

  2. 运行 ssh-keygen 程序以创建具有默认长度的“dsa”类型密钥。键入

    [ying@serverXY ying]$ ssh-keygen -t dsa
    
    Generating public/private dsa key pair.
    

    Enter 接受默认文件位置。

    Enter file in which to save the key (/home/ying/.ssh/id_dsa):
    Created directory '/home/ying/.ssh'.
    

    系统会提示您两次输入密码短语。输入一个好的并且相当难以猜测的密码短语。在每个提示符后按 ENTER

    Enter passphrase (empty for no passphrase):     *****
    Enter same passphrase again:                    *****
    Your identification has been saved in /home/ying/.ssh/id_dsa.
    Your public key has been saved in /home/ying/.ssh/id_dsa.pub.
    The key fingerprint is:
    SHA256:ne7bHHb65e50HJPchhbiSvEZ0AZoQCEnnFdBPedGrDQ ying@localhost.localdomain
    The key's randomart image is:
    +---[DSA 1024]----+
    |   .oo==++o+     |
    |    o+. o E.*    |
    ...<SNIP>...
    

    成功完成后,您将看到一条消息,指出您的身份和公钥已保存在 /home/ying/.ssh/ 目录下。

  3. cd 到您的 ~/.ssh/ 目录。列出目录中的文件。

  4. 用于查看密钥指纹的 ssh-keygen 命令是什么?

  5. 使用 `cat` 命令查看您的公钥文件内容(例如:~/.ssh/id_dsa.pub)。

练习 8

通过公钥进行身份验证

到目前为止,您一直在使用基于密码的身份验证登录 serverPR 上的用户帐户。

这意味着您必须知道远程服务器上相应帐户的密码才能成功登录。

在本练习中,您将在 serverXY 上的 ying 用户帐户和 serverPR 上的 ying 用户帐户之间配置公钥身份验证。

要配置公钥身份验证

  1. 以 ying 用户身份登录到本地系统。

  2. cd 到您的“~/.ssh”目录。

  3. 按所示输入以下命令。系统将提示您输入 serverPR 上 ying 用户的密码。

    [ying@serverXY .ssh]$ cat id_dsa.pub | ssh ying@serverPR \ 
    
    '(cd ~/.ssh && cat - >> authorized_keys && chmod 600 authorized_keys)'
    

    简单来说,上面的命令是指

    a. 读取您的 dsa 公钥文件的内容,并将输出管道(|)发送到 ssh ying@serverPR

    b. 在 serverPR 上以 ying 用户身份运行命令“cd ~/.ssh && cat - >> authorized_keys && chmod 600 authorized_keys”。

    注意

    前面看起来很复杂的命令的目的是将您的公钥文件内容复制并追加到 serverPR 上的“/home/ying/.ssh/authorized_keys”,并赋予其正确的权限。

    提示

    您可以使用 `ssh-copy-id` 实用程序更轻松、更优雅地在系统之间设置公钥/私钥身份验证。`ssh-copy-id` 是一个使用 `ssh` 登录远程机器(可能最初使用登录密码)的脚本。它会组装一个或多个指纹列表(如下所述),并尝试使用每个密钥登录,以查看是否有任何密钥已安装。然后,它会组装一个未能登录的密钥列表,并使用 `ssh` 在远程系统上启用使用这些密钥登录。默认情况下,它会通过将密钥追加到远程用户的 ~/.ssh/authorized_keys 文件(如果需要,会创建该文件和目录)来添加这些密钥。

  4. 将您的公钥添加到远程系统上的 authorized_keys 文件后,尝试以 ying 用户身份通过 ssh 登录 serverPR。输入

    [ying@serverXY .ssh]$ ssh serverPR
    Enter passphrase for key '/home/ying/.ssh/id_dsa': **
    

    请注意,这次会提示您输入您的密码短语,而不是用户密码。输入您之前创建密钥时创建的密码短语。

  5. 成功登录 serverPR 后,注销。

练习 9

ssh-agent

根据手册页 - `ssh-agent` 是一个用于保存用于公钥身份验证(RSA、DSA、ECDSA、Ed25519)的私钥的程序。其理念是,`ssh-agent` 在用户或登录会话开始时启动,所有其他窗口或程序都作为 `ssh-agent` 程序的客户端启动。通过使用环境变量,代理可以被定位并在使用 `ssh` 登录其他机器时自动用于身份验证。

SYNOPSIS
     ssh-agent [-c | -s] [-Dd] [-a bind_address] [-E fingerprint_hash] [-P pkcs11_whitelist] [-t life] [command [arg ...]]
     ssh-agent [-c | -s] -k

在本练习中,您将学习如何配置代理,以便您无需每次使用公钥身份验证连接到另一个系统时都输入密码短语。

  1. 确保您已以 ying 用户身份登录到本地系统。

  2. 输入以下命令

    [ying@localhost ~]$ eval `ssh-agent`
    Agent pid 6354
    

    请注意输出中代理的进程 ID (PID) 的值。

  3. 运行 `ssh-add` 程序以列出代理当前表示的所有 [公钥/私钥] 标识的指纹。输入

    [ying@localhost ~]$ ssh-add -l
    The agent has no identities.
    

    您目前应该还没有任何列出的标识。

  4. 使用不带任何选项的 `ssh-add` 程序将您的密钥添加到您上面启动的代理。输入

    [ying@localhost ~]$ ssh-add
    

    出现提示时输入您的密码短语。

    Enter passphrase for /home/ying/.ssh/id_dsa:
    Identity added: /home/ying/.ssh/id_dsa (ying@localhost.localdomain)
    
  5. 现在再次运行 `ssh-add` 命令以列出已知的指纹标识。输入

    [ying@localhost ~]$ ssh-add -l
    1024 SHA256:ne7bHHb65e50.......0AZoQCEnnFdBPedGrDQ ying@server (DSA)
    
  6. 现在以 ying 用户身份尝试远程连接到 serverPR 并运行一个简单的测试命令。

    假设您到目前为止已正确完成有关设置和存储相关密钥的所有操作,则您不应该被提示输入密码或密码短语。输入

    [ying@serverXY .ssh]$ ssh serverPR 'ls /tmp'
    
  7. 如果您已完成并且不再需要 `ssh-agent` 的服务,或者您只是想恢复到基于密钥的身份验证,您可以从代理中删除所有 [私钥/公钥] 标识。输入

    [ying@localhost ~]$ ssh-add -D
    All identities removed.
    
  8. 全部完成!

作者:Wale Soyinka

贡献者:Steven Spencer、Ganna Zhyrnova