实验 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)
这是一个安全的分布式命名服务协议。它目前可作为 Internet 草案提供。
ii.) 安全套接字层 (SSL)
SSL 是用于安全 WWW 连接的两个协议之一(另一个是 SHTTP)。随着越来越多的敏感信息(如信用卡号)通过 Internet 传输,WWW 安全已变得必要。
iii.) 安全超文本传输协议 (SHTTP)
这是另一个为 WWW 交易提供更多安全性的协议。
iv.) 电子邮件安全及相关服务
GnuPG - GNU 隐私卫士 - 符合 RFC2440 中描述的拟议 OpenPGP Internet 标准。
v.) SSH2 协议
该协议对 Internet 的需求非常灵活,目前在 SSH2 软件中使用。该协议用于保护终端会话和 TCP 连接。
以下练习将探讨使用密码协议的两个应用程序 - GnuPG 和 OpenSSH。
练习 1¶
GnuPG¶
GnuPG(GNU 隐私卫士)是一组用于公钥加密和数字签名的程序。这些工具可用于加密数据和创建数字签名。它还包括高级密钥管理功能。GnuPG 使用公钥密码学使用户能够安全地通信。
以普通用户身份执行以下练习。例如:用户 ying
创建新的密钥对¶
-
以用户“ying”身份登录系统
-
确保 GnuPG 软件包已安装在您的系统上。键入
[ying@serverXY ying]$ rpm -q gnupg gnupg-*.*
如果未安装,请让超级用户安装。
-
列出您家目录中的所有隐藏目录并记下。
-
列出您当前密钥环中的密钥。键入
[ying@serverXY ying]$ gpg --list-keys
注意
您的密钥环中应该还没有任何密钥。但是,上述命令也将有助于创建默认环境,使您能够首次成功创建新的密钥对。
实验任务
再次列出您家目录中的隐藏目录。新添加的目录名称是什么?
-
使用 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 密钥对用于数据加密。
-
您将创建一个 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
-
创建将在一年后过期的密钥。在下面的提示处键入“1y”
请指定密钥的有效期限。
0 = 密钥永不过期
n = 密钥在 n 天后过期
n+w = 密钥在 n 周后过期
n+m> = 密钥在 n 月后过期
n+y = 密钥在 n 年后过期
密钥有效期为? (0) 1y
-
键入“y”接受提示中显示的到期日期
Is this correct (y/n)? y
-
创建用户 ID 以识别您的密钥
您需要一个用户 ID 来标识您的密钥;软件根据
真实姓名、注释和电子邮件地址的此形式构建用户 ID
"名字 姓氏(任何注释) yourname@serverXY&"
真实姓名:Ying Yang 回车
注释:my test 回车
电子邮件地址:ying@serverXY 回车
在确认提示符处键入“o”(确定)以接受正确的值。
您选择了此用户 ID
"Ying Yang (my test) ying@serverXY"
更改(N)ame、(C)omment、(E)mail 还是(O)kay/(Q)uit? O
-
在下一个提示符下选择一个您不会忘记的密码
Enter passphrase: ** Repeat passphrase: **
练习 2¶
密钥管理¶
gpg 程序也用于密钥管理。
列出您的密钥¶
-
在仍以用户 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]
-
要抑制有关“不安全内存”的有点烦人的“警告”,请在您的个人 gpg 配置文件中添加以下选项。键入
[ying@serverXY ying]$ echo "no-secmem-warning" >> ~/.gnupg/gpg.conf
-
再次运行命令列出您的密钥。以确保您的更改生效。
-
列出您的密钥及其签名。键入
[ying@serverXY ying]$ gpg --list-sigs /home/ying/.gnupg/pubring.gpg
-
仅列出您的私钥。键入
[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
-
显示密钥指纹。键入
[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.
创建撤销证书¶
-
在仍以用户 ying 身份登录时。创建撤销证书。它将在您的标准输出上显示。键入
[ying@serverXY ying]$ gpg --gen-revoke ying@serverXY
按照提示操作,并在提示时输入您的密码。
-
现在创建一个将在 ASCII 格式中存储在名为 - 的文件中的撤销证书
“revoke.asc”。键入
[ying@serverXY ying]$ gpg --output revoke.asc --gen-revoke ying@serverXY
-
您应该将撤销证书存储在一个安全的地方,甚至打印一份硬拷贝。
导出公钥¶
所有这些加密、签名和解密业务的重点是人们希望相互交流 - 但他们也希望以尽可能安全的方式进行。
话虽如此 - 也许并不那么明显的事情必须说出来
您必须交换公钥才能使用基于公钥的密码系统与其他人通信。
或者至少让您的公钥在任何可公开访问的地方可用(广告牌、网页、密钥服务器、广播、电视、通过电子邮件进行垃圾邮件……等)
导出您的公钥¶
-
将您的公钥以二进制格式导出到名为“ying-pub.gpg”的文件中。键入
[ying@serverXY ying]$ gpg --output ying-pub.gpg --export <your_key’s_user_ID>
注意
请替换
用任何能正确识别您密钥的字符串。在我们示例系统中,此值可以是以下任何一项 ying@serverXY, ying, yang
或
实际密钥 ID - 1D12E484
-
将您的公钥导出到名为“ying-pub.asc”的文件中。但这次以
ASCII 编码格式生成。键入
[ying@serverXY ying]$gpg --output ying-pub.asc --armor --export ying@serverXY
-
使用 cat 命令查看 ying 公钥的二进制版本(ying-pub.gpg)
-
要重置您的终端,请键入:
reset
-
使用 cat 命令查看 ying 公钥的 ASCII 版本(ying-pub.asc)
-
您会发现 ASCII 版本更适合发布在网页或垃圾邮件等内容上。
练习 3¶
数字签名¶
创建和验证签名使用公钥/私钥对,这与加密和解密不同。使用签名者的私钥创建签名,便于使用相应的公钥进行验证。
数字签名一个文件¶
-
创建一个名为“secret-file.txt”的文件,其中包含文本“Hello All”。键入
[ying@serverXY ying]$ echo "Hello All" > secret1.txt
-
使用 cat 查看文件内容。使用 file 命令查看文件类型。
-
现在用您的数字签名签署该文件。键入
[ying@serverXY ying]$ gpg -s secret1.txt
在提示时输入您的密码。
上述命令将创建另一个名为“secret1.txt.gpg”的文件,该文件已压缩并附加了签名。运行“file”命令检查该文件。用 cat 查看文件
-
检查已签名的“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>"
-
创建另一个文件 secret2.txt,其中包含文本“ Hello All”。
-
签署 secret2.txt 文件,但让文件成为 ASCII 编码格式。键入
[ying@serverXY ying]$ gpg -sa secret2.txt
将在您的当前工作目录中创建一个 ASCII 编码文件“secret2.txt.asc”。
-
使用 cat 命令查看您上面创建的 ASCII 编码文件的内容。
-
创建一个名为“secret3.txt”的另一个文件,其中包含文本“hello dude”。键入
[ying@serverXY ying echo "hello dude" > secret3.txt
-
将您的签名附加到您上面创建的文件正文中。键入
[ying@serverXY ying]$ gpg --clearsign secret3.txt
这将创建一个未压缩的文件(secret3.txt.asc),该文件被包装在您的 ASCII 编码签名中。
写下验证为您创建的文件签名的命令。
-
使用任何分页器打开文件查看其内容。
问题
您能读入文件中的文本吗?
继续之前请阅读
确保您的搭档已执行以上所有“练习 1、2 和 3”之后再继续下面的“练习 4”。
如果您没有搭档,请退出 Ying 的帐户并以用户“me”的身份登录系统。
然后以用户“me”的身份重复“练习 1、2 和 3”的全部内容。
然后您可以执行下面的练习 4。将“serverPR”上的用户 Ying 的所有引用替换为“ServerXY”(即您的本地主机)上的用户“me”。
您可以使用用户“me@serverXY”或用户“ying@serverPR”作为下一个练习中的搭档。
练习 4¶
导入公钥¶
在本次练习中,您将使用所谓的“信任网”与其他用户进行通信。
-
以用户 ying 身份登录系统。
-
将您的 ASCII 编码公钥文件(ying-pub.asc)提供给您的搭档(使用
电子邮件、复制粘贴、scp、ftp、保存在软盘等方式)。
注意
为自己选择最有效的方法。
请您的搭档将他们的公钥文件提供给您。
-
假设您的搭档的公钥存储在您当前目录下的名为“ 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
-
特别是列出与用户 ID me@serverXY 关联的密钥。键入
[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]
-
查看 me@serverXY 密钥的指纹。键入
[ying@serverXY ying]$ gpg --list-keys me@serverXY
-
加密和解密文件
[ying@serverXY ying]$ gpg --fingerprint me@serverXY
加密和解密文件或文档的过程很简单。
如果您想加密一条发给用户 ying 的消息,您将使用用户 ying 的公钥进行加密。
收到后,ying 需要使用 ying 的私钥解密消息。
只有 ying 才能解密使用 ying 的公钥加密的消息或文件
加密一个文件¶
在以用户 ying 身份登录系统时,创建一个名为 encrypt-sec.txt 的文件。键入
-
确保您可以使用 cat 读取文件内容。
[ying@serverXY ying]$ echo "hello" > encrypt-sec.txt
加密文件 encrypt-sec.txt,以便只有用户“me”可以查看该文件。即,您将使用 me@serverXY 的公钥(现在您已在密钥环中)对其进行加密。键入
-
上述命令将在您的当前工作目录中创建一个名为“encrypt-sec.txt.gpg”的加密文件。
[ying@serverXY ying]$ gpg --encrypt --recipient me@serverXY encrypt-sec.txt
解密一个文件¶
您上面加密的文件是给 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
-
将您上面创建的加密文件提供给正确的所有者,并让他们运行上述命令来解密文件。他们在解密文件方面是否更成功?
-
解密二进制文件(例如程序)时要格外小心,因为在成功解密文件后,gpg 将尝试将文件的内容发送到标准输出。
注意
养成使用以下命令解密文件的习惯
这会强制将输出发送到名为“encrypt-sec”的文件。
[ying@serverXY ying]$ gpg --output encrypt-sec --decrypt encrypt-sec.txt.gpg
然后可以使用适合文件(或内容)类型的任何程序查看(或运行)它。
提示
gpg 程序使用的大多数命令和选项都有简短形式,可以减少用户在命令行上的输入量。例如
要加密字符串“hello”并将其作为 ASCII 编码消息邮件发送给具有邮件地址 ying@serverXY 的用户;使用以下命令
``` gpg --encrypt --recipient me@serverXY encrypt-sec.txt ``` The short form of the above command is: ``` gpg -e -r me@serverXY encrypt-sec.txt ```
-
要使用“me@serverXY”的公钥加密“your_file”文件,并将其写入“your_file.gpg”
echo "hello" | gpg -ea -r ying@serverXY | mail ying@serverXY
-
使用您的用户 ID(使用您的数字签名)对其进行签名后;使用以下命令
有一个公开可用的密钥服务器 wwwkeys.pgp.net。您可以使用 gpg 将您的密钥上传到那里,使用
gpg -se -r me@serverXY your_file
-
gpg --send-keys
OpenSSH 是 OpenBSD 的 SSH(安全 Shell)协议实现。
它是 SSH 协议网络连接工具套件的免费版本。OpenSSH 加密所有流量(包括密码),以有效消除窃听、连接劫持和其他网络级攻击。此外,OpenSSH 提供了大量的安全隧道功能以及各种身份验证方法。
它有助于在不受信任的两个主机之间通过不安全的网络(如互联网)提供安全的加密通信。
它包括服务器端组件和客户端程序套件。
sshd¶
服务器端包括安全 Shell 守护进程(sshd
)。sshd
是监听客户端连接的守护进程。
它为每个传入连接分叉一个新的守护进程。分叉的守护进程处理密钥交换、加密、身份验证、命令执行和数据交换。根据 sshd 的 man 手册页,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
。这是一个用于登录远程系统的程序,也可用于在远程系统上执行命令。
sshd
¶
练习 5¶
一些练习涵盖 sshd
服务器守护进程。
大多数 Linux 系统开箱即用,OpenSSH 服务器已经配置并运行了一些默认设置。sshd
的配置文件通常位于 /etc/ssh/
下,名为 sshd_config
。
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.
sshd_config
¶
用任何分页器打开 SSH 服务器的配置文件并进行研究。键入
-
sshd_config
是一个相当奇特的配置文件。与其他 Linux 配置文件不同,sshd_config
文件中的注释 (#) 表示选项的默认值。(即,注释代表已编译的默认值。)[root@serverXY root]# less /etc/ssh/sshd_config
注意
查阅
sshd_config
的 man 手册页。 -
以下选项有什么作用?
问题
AuthorizedKeysFile
- Ciphers
- Port
- Protocol
- X11Forwarding
- HostKey
- 将您的当前工作目录更改为 /etc/ssh/ 目录。
-
列出
/etc/ssh/
下的所有文件 -
创建主机密钥¶
您的 SSH 服务器已经有了它使用的主机密钥。这些密钥是在您的系统首次安装时生成的。在此练习中,您将学习如何为您的服务器创建主机类型密钥,但您不会使用这些密钥。
为您的服务器生成主机密钥¶
在您的当前工作目录下的新目录中创建一个名为 spare-keys 的目录。cd 到新目录。键入
-
使用
ssh-keygen
程序创建具有以下特征的主机密钥[root@serverXY ssh]# mkdir spare-keys && cd spare-keys
-
密钥类型应为“rsa”
- 密钥不应有注释
- 私钥文件名应为 - ssh_host_rsa_key
- 密钥不应使用任何密码
- 您必须做什么才能让 sshd 守护进程使用您刚生成的密钥?
类型
[root@serverXY spare-keys]# ssh-keygen -q -t rsa -f ssh_host_rsa_key -C '' -N ''
问题
查看您上面创建的密钥的指纹。键入
-
查看您创建的密钥的指纹,但这次包括密钥指纹的视觉 ASCII 艺术表示。键入
[root@serverXY spare-keys]# ssh-keygen -l -f ssh_host_rsa_key
-
写下创建名为“ssh_host_dsa_key”的 dsa 类型密钥、无注释、无密码的命令。
[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]-----+
-
检查
sshd
服务的状态。键入 -
如果您对
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>...
-
重新启动
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
¶
-
以用户 me 的身份登录 serverXY。
-
使用
ssh
连接到 serverPR。键入[me@serverXY me]$ ssh serverPR
在提示时输入 me 的密码。如果收到任何警告消息,请键入“yes”继续。
-
登录后,创建一个名为 - myexport 的目录,并在新目录下创建一个名为 foobar 的空文件。键入
[me@serverPR me]$ mkdir ~/myexport && touch myexport/foobar
-
注销 serverPR。键入
[me@serverPR me]$ exit
您将被返回到 serverXY 上的本地 shell。
-
使用
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”继续。
-
在仍登录到 serverXY 时,尝试以用户
ying
身份远程重启 serverPR。键入[me@localhost ~]# ssh -l ying localhost 'reboot' ying@localhost's password: ...<SNIP>...
在提示时输入 ying 的密码。
问题
ying 用户能够远程重启 serverPR 吗?为什么 ying 不能远程重启 serverPR?
-
从 serverXY,尝试以用户
ying
身份远程查看 serverPR 上运行的sshd
服务的状态。键入[root@localhost ~]# ssh -l ying localhost 'systemctl status sshd.service' ying@localhost's password: ● sshd.service - OpenSSH server daemon
-
从 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 服务?
- 请简要解释您观察到的行为。
-
键入“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
¶
-
确保您仍然以用户
me
的身份登录 serverXY。 -
在您的家目录下创建一个名为
myimport
的目录并 cd 到该目录。 -
使用
scp
将远程服务器 serverPR 上“/home/me/myexport/”目录下的所有文件复制过来。(命令末尾的点 "." 很重要)。键入[me@localhost ~myimport]# scp serverPR:/home/me/myexport . me@serverPR's password: scp: /home/me/myexport: not a regular file
问题
简要解释为什么之前的命令失败了?
-
再次运行之前的命令,但这次为
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 .
-
复制 serverPR 上“/home/me/.gnugp/”下的所有文件的命令是什么?
-
现在复制 serverPR 上 ying 的家目录。键入
[me@localhost ~myimport]# scp -r ying@localhost:/home/ying/ ying_home_directory_on_serverPR
-
再次,运行前一个命令的一个轻微变体来复制 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
-
使用
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”扩展名的文件中。没有简单的方法可以恢复丢失的密码。如果密码丢失或忘记,则必须生成新密钥。
创建用户公钥/私钥身份验证密钥¶
-
以用户 ying 的身份登录您的本地机器。
-
运行
ssh-keygen
程序创建一个“dsa”类型的密钥,长度为默认值。键入[ying@serverXY ying]$ ssh-keygen -t dsa Generating public/private dsa key pair.
按 回车 接受默认文件位置。
Enter file in which to save the key (/home/ying/.ssh/id_dsa): Created directory '/home/ying/.ssh'.
您将被提示两次输入密码。输入一个好的且相对难以猜测的密码。每次提示后按 回车。
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/
目录中。 -
cd 到您的
~/.ssh/
目录。列出目录中的文件。 -
查看密钥指纹的
ssh-keygen
命令是什么? -
使用 cat 命令查看您的公钥文件(即
~/.ssh/id_dsa.pub
)的内容。
练习 8¶
通过公钥进行身份验证¶
到目前为止,您一直使用基于密码的身份验证来登录 serverPR 上的用户帐户。
这意味着,您必须知道远程端的相应帐户的密码才能成功登录。
在此练习中,您将在 serverXY 上的用户帐户与 serverPR 上的 ying 用户帐户之间配置公钥身份验证。
配置公钥身份验证¶
-
以用户 ying 的身份登录您的本地系统。
-
cd 到您的“~/.ssh”目录。
-
键入以下命令,完全按照所示输入。您将被提示输入 serverPR 上 ying 的密码。键入
[ying@serverXY .ssh]$ cat id_dsa.pub | ssh ying@serverPR \ '(cd ~/.ssh && cat - >> authorized_keys && chmod 600 authorized_keys)'
用大白话说,上面的命令的意思是
a. cat 您的 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(如果需要,则创建文件和目录)来添加密钥。 -
将您的公钥添加到远程系统上的 authorized_keys 文件后。尝试通过 ssh 登录到 serverPR 上的 ying。键入
[ying@serverXY .ssh]$ ssh serverPR Enter passphrase for key '/home/ying/.ssh/id_dsa': **
请注意,这次提示您输入的是您的密码而不是用户密码。输入您在创建密钥时创建的密码。
-
成功登录 serverPR 后;再次退出。
练习 9¶
ssh-agent¶
根据 man 手册页 - 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
在本练习中,您将学习如何配置代理,以便您每次想使用公钥身份验证连接到另一系统时都不必输入密码。
-
确保您以用户 ying 的身份登录到您的本地系统。
-
键入以下命令
[ying@localhost ~]$ eval `ssh-agent` Agent pid 6354
记下您输出中代理的进程 ID (PID) 值。
-
运行
ssh-add
程序列出当前由代理表示的[公钥/私钥]身份的指纹。键入[ying@localhost ~]$ ssh-add -l The agent has no identities.
您应该还没有列出任何身份。
-
使用不带任何选项的
ssh-add
程序将您的密钥添加到您上面启动的代理中。键入[ying@localhost ~]$ ssh-add
在提示时输入您的密码。
Enter passphrase for /home/ying/.ssh/id_dsa: Identity added: /home/ying/.ssh/id_dsa (ying@localhost.localdomain)
-
现在再次运行
ssh-add
命令列出已知的指纹身份。键入[ying@localhost ~]$ ssh-add -l 1024 SHA256:ne7bHHb65e50.......0AZoQCEnnFdBPedGrDQ ying@server (DSA)
-
现在以 ying 用户身份,尝试远程连接到 serverPR 并运行一个简单的测试命令。
假设您到目前为止已正确完成所有关于设置和存储相关密钥的操作,那么您不应该被要求输入密码或口令。键入
[ying@serverXY .ssh]$ ssh serverPR 'ls /tmp'
-
如果您已完成并且不再需要
ssh-agent
的服务,或者您只想恢复到基于密钥的身份验证,您可以删除代理中的所有[私钥/公钥]身份。键入[ying@localhost ~]$ ssh-add -D All identities removed.
-
全部完成!
作者:Wale Soyinka
贡献者:Steven Spencer, Ganna Zhyrnova