远程连接——SSH

简介

SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应用层和传输层基础上的安全协议。对数据进行压缩,加快传输速度。

优点:

  • 数据传输是加密的,可以防止信息泄漏

  • 数据传输是压缩的,可以提高传输速度

原理

SSH客户端<————–网络—————->SSH服务端

  • SSH客户端:Putty、 Xshell、CRT
  • SSH服务端:OpenSSH

ssh免密码登录主要采用算法:

  • 对称加密算法

原理:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。

特点:计算量小、加密解密的速度比较快,适合数据比较长时的使用; 密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦。

  • 非对称加密算法

原理:非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

特点:非对称加密技术安全性更好,但性能更慢。

安装

  1. Centos 7系统默认已安装openssh相关软件包,并将sshd 服务添加为开机自启动。
  2. sshd服务默认使用的是TCP的22端口,安全协议版本sshv2,出来2之外还有1(有漏洞)
  3. sshd服务的默认配置文件是/etc/ssh/sshd_ config

检查是否安装:

ssh -V

已经安装如下所示:

(base) [root@localhost homes]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
(base) [root@localhost homes]# 

查看一下和ssh相关的安装包:

# centos
yum search ssh

# ubantu
sudo apt-get install ssh

存在ssh的安装包:

(base) [root@localhost homes]# yum search ssh
已加载插件:fastestmirror, langpacks
Repository libnvidia-container is listed more than once in the configuration
Repository libnvidia-container-experimental is listed more than once in the configuration
Repository nvidia-container-runtime is listed more than once in the configuration
Repository nvidia-container-runtime-experimental is listed more than once in the configuration
Loading mirror speeds from cached hostfile
....
scponly.x86_64 : Restricted shell for ssh based file services
sshuttle.noarch : Transparent Proxy VPN
sslh.x86_64 : Applicative protocol(SSL/SSH) multiplexer

使用yum安装:

# rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件
# 安装SSH协议
yum -y install ssh openssh openssh-clients openssh-server rsync 

配置

OpenSSH常用配置文件

类型 路径 说明
客户端配置文件 /etc/ssh/ssh_config 设置与客户端相关的应用可通过此文件实现
服务器端配置文件 /etc/ssh/sshd_config 设置与服务端相关的应用可通过此文件实现

修改配置文件:

# 备份原始配置文件
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.ori

vim /etc/ssh/sshd_config

修改内容如下:

参数 说明
Port 22 sshd服务监听端口
ListenAddress 0.0.0.0 sshd服务监听ip
LoginGraceTime 2m 登录验证时间为2分钟(默认2分钟)
PermitRootLogin yes 是否允许root远程登录
StrictModes yes 检查.ssh/文件的所有者,权限等
MaxAuthTries 6 用来设置最大失败尝试登陆次数为
MaxSessions 10 同一个连接最大会话
UseDNS no 提高速度可改为no 内网改为no 禁用反向解析
PubkeyAuthentication yes 基于key验证
PermitEmptyPasswords no 是否允许空密码登录
PrintLastLog yes 显示上次登入的信息!默认为 yes
PasswordAuthentication yes 是否启用密码验证
AuthorizedKeysFile .ssh/authorized_keys 指定公钥库文件(ls -a可查看)
GatewayPorts no 网关
ClientAliveInterval 10 单位:秒
ClientAliveCountMax 3 默认3
GSSAPIAuthentication no 提高速度可改为no
axStartups 10 未认证连接最大值,默认值10
AllowUsers user1 user2 user3@ip(限制主机) 可登录用户:白名单
DenyUsers user1 user2 user3@ip(限制主机) 禁登录用户:黑名单
AllowGroups g1 g2 可登录用户组:白名单
DenyGroups g1 g2 可登录用户组:白名单

设置开机自启:

# 检查是否修改成功
vimdiff /etc/ssh/sshd_config.ori /etc/ssh/sshd_config

# 查看开机启动sshd服务
systemctl is-enabled sshd

# 未开启
disabled
# 已开启
enabled

# 开启开机自启
chkconfig sshd on

# 禁止开机自启
chkconfig sshd off

命令

ssh

语法

ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-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]]
           [user@]hostname [command]

选项

参数名 参数值 说明
-a 关闭认证代理联机
-p port 连接远程机器上的port。
-P 使用非特定的 port 去对外联机。如果读者的防火墙不淮许从特定的 port去联机时,就可以使用这个选项。注意这个选项会关掉 RhostsAuthentication 和 RhostsRSAAuthentication。
-q 安静模式。把所有的警告和讯息抑制,只有严重的错误才会被显示。
-L listen-port:host:port 指派本地的 port 到达端机器地址上的 port。
-R listen-port:host:port 指派远程上的 port 到本地地址上的 port。
-t 强制配置 pseudo-tty。这可以在远程机器上去执行任意的 screen-based 程 式,例如操作 menu services。
-n 重导 stdin 到 /dev/null (实际上是避免读取 stdin)。必须当 ssh 在幕后执 行时才使用。常见的招数是使用这选项在远程机器上去执行 X11 的程序 例如,ssh -n shadows.cs.hut.fi emacs &,将在 shadows.cs.hut.fi 上激活 emace,并且 X11 连接将自动地在加密的信道上发送。ssh 程序将把它放 在幕后。(假如ssh需要去询问密码时,这将不会动作) 
-i identity_file 选择所读取的 RSA 认证识别的档案。预设是在使用者的家目录 中的 .ssh/identity 。
-g 允许远程主机去连接本地指派的 ports。 
-e character 设定跳脱字符。 
-f 要求ssh 在背景执行命令,假如ssh要询问密码或通行证,但是使用者 想要它在幕后执行就可以用这个方式,最好还是加上-l user 例如在远程场所上激活 X11,有点像是 ssh –f host xterm 。 
-V 显示版本。
-v Verbose 模式。使ssh 去印出关于行程的除错讯息,这在连接除错,认 证和设定的问题上有很的帮助。 
-c blowfish|3des  在期间内选择所加密的密码型式。预设是3des,3des(作三次的资料加密) 是用三种不同的密码键作三次的加密-解密-加密。 blowfish 是一个快速区块密码编制器,它比3des更安全以及更快速。
-l login_name 指定登入于远程机器上的使用者,若没加这个选项,而直接打 ssh lost 也是可以的,它是以读者目前的使用者去做登入的动作。 例如: ssh –l shie mouse.oit.edu.tw 。
-X
-N 是不执行远端命令,在只是端口转发时这条命令很有用处。
-T 不显示终端,只显示连接成功信息。
-2 强制 ssh 去使用协议版本 2。 
-4 强制 ssh 去使用 IPv4 地址。
-6 强制 ssh 去使用 IPv6 地址。

ssh-keygen

语法

ssh-keygen [OPTIONS] <file>...

选项

参数名 参数值 说明
-b <bits> 指定密钥长度
-a <rounds> 保存私钥时,此选项指定使用的 KDF(密钥派生函数,当前为 bcrypt_pbkdf(3))轮数。较高的数字会导致密码验证速度变慢,并增加对暴力密码破解的抵抗力(如果密钥被盗)。默认值为 16 轮
-A <> 对于不存在主机密钥的每种密钥类型(rsa、dsa、ecdsa 和 ed25519),生成具有默认密钥文件路径、空密码、密钥类型的默认位和默认注释的主机密钥。如果还指定了 -f,则其参数用作生成的主机密钥文件的默认路径的前缀。系统管理脚本使用它来生成新的主机密钥
-e <> 读取 OpenSSH 的私钥或者公钥文件
-c <comment> 请求更改私钥和公钥文件中的注释。程序将提示输入包含私钥的文件,如果密钥有密码,则提示输入密码,以及新的评论。
-C <注释 > 注释 
-f <filename> 指定用来保存密钥的文件名
-i <> 读取未加密的 ssh-v2 兼容的私钥/公钥文件,然后在标准输出设备上显示 openssh 兼容的私钥/公钥
-M <生成> 生成候选 Diffie-Hellman 组交换 (DH-GEX) 参数,以供“diffie-hellman-group-exchange-*”密钥交换方法最终使用。此操作产生的数字在使用前必须进一步筛选。
-l <> 显示公钥文件的指纹数据
-L <> 打印一个或多个证书的内容
-k <> 生成一个 KRL 文件。在这种模式下,ssh-keygen 将在通过 -f 标志指定的位置生成一个 KRL 文件,该文件会撤销命令行上提供的每个密钥或证书。要撤销的密钥/证书可以由公钥文件指定
-K <> 从 FIDO 身份验证器下载常驻密钥。对于每个下载的密钥,公钥和私钥文件将写入当前目录。如​​果附加了多个 FIDO 验证器,将从第一个接触的验证器下载密钥
-N <passphrase> 提供一个新密语
-n <主体> 指定签名密钥时要包含在证书中的一个或多个主体(用户名或主机名)。可以指定多个主体,用逗号分隔
-P <passphrase> 提供(旧)密语
-q <> 静默模式
-t <dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | RSA> 指定要创建的密钥类型
-C <> 用于识别这个密钥的注释 ,这个注释你可以输入任何内容(邮箱),很多网站和软件用这个注释作为密钥的名字
-E <md5 | sha256> 指纹哈希 指定显示密钥指纹时使用的哈希算法。默认值为“sha256”。
-g <> 使用 -r 命令打印指纹资源记录时使用通用 DNS 格式
-H <> 散列 known_hosts 文件。这将使用指定文件中的散列表示替换所有主机名和地址;原始内容被移动到带有 .old 后缀的文件中。 ssh 和 sshd 可以正常使用这些哈希值,但如果文件的内容被泄露,它们不会泄露识别信息。此选项不会修改现有的散列主机名,因此可以安全地用于混合散列和非散列名称的文件。
-h <> 签署密钥时,创建主机证书而不是用户证书
-l <> 证书身份
-F <hostname:port> 主机名 | [hostname]:port 在 known_hosts 文件中搜索指定的主机名(带有可选端口号),列出找到的所有匹配项。此选项对于查找散列主机名或地址很有用,也可以与 -H 选项结合使用,以散列格式打印找到的键
-B <> 显示指定私钥或公钥文件的泡泡摘要
-D <> pkcs11 下载 PKCS#11 共享库 pkcs11 提供的公钥。当与 -s 结合使用时,此选项表示 CA 密钥驻留在 PKCS#11 令牌中(有关详细信息,请参阅证书部分)
-p <> 请求更改私钥文件的密码,而不是创建新的私钥。程序将提示输入包含私钥的文件,输入旧密码,两次输入新密码。
-Q <> 请求更改私钥文件的密码,而不是创建新的私钥。程序将提示输入包含私钥的文件,输入旧密码,两次输入新密码。
-R <hostname> 主机名 | [hostname]:port 从 known_hosts 文件中删除属于指定主机名(带有可选端口号)的所有键。此选项对于删除散列主机很有用(请参阅上面的 -H 选项)
-r <hostname> 打印指定公钥文件的名为 hostname 的 SSHFP 指纹资源记录
-s <ca_key> 使用指定的 CA 密钥验证(签名)公钥。生成 KRL 时,-s 指定用于通过密钥 ID 或序列号直接撤销证书的 CA 公钥文件的路径
-U <> 当与 -s 结合使用时,此选项表示 CA 密钥驻留在 ssh-agent 中
-u <> 更新 KRL。当使用 -k 指定时,通过命令行列出的键被添加到现有的 KRL,而不是创建新的 KRL。
-V <> 有效性间隔
-v <详细模式> 使 ssh-keygen 打印有关其进度的调试消息。这有助于调试模数生成。多个 -v 选项会增加详细程度。最大值为 3。
-w <提供者> 指定在创建 FIDO 身份验证器托管密钥时将使用的库路径,覆盖使用内部 USB HID 支持的默认设置。
-y <> 此选项将读取私有 OpenSSH 格式文件并将 OpenSSH 公钥打印到标准输出。
-z <序列号> 指定要嵌入证书中的序列号,以将此证书与来自同一 CA 的其他证书区分开来。如果序列号以“+”字符为前缀,则序列号将为在单个命令行上签名的每个证书递增。默认序列号为零。生成 KRL 时,-z 标志用于指定 KRL 版本号。
-Z <password> 指定在编写 OpenSSH 格式的私钥文件时用于加密的密码。可以使用“ssh -Q cipher”获取可用密码列表。默认为“aes256-ctr”。

示例

密码登录

ssh -l root 192.168.0.11
# or
ssh root@192.168.0.11

不指定用户登录

ssh 192.168.0.11

免密登录

192.168.1.66主机想要通过ssh免密登录192.168.1.78主机,需要在两个主机上都创建公匙与密匙。并且把192.168.1.66的公匙存放在192.168.1.78主机上。

OS 类型 用户 路径(默认)
linux 公匙文件 root /root/.ssh/id_rsa.pub
linux 公匙文件 user  ~/.ssh/id_rsa.pub
linux 密匙文件 root /root/.ssh/id_rsa
windows 公匙文件 user_name C:\Users\User\user_name\.ssh\id_rsa.pub
windows 密匙文件 user_name C:\Users\User\user_name\.ssh\id_rsa
linux 密匙文件 user ~/.ssh/id_rsa

创建RSA密匙

这是没有任何参数的 ssh keygen 的默认行为。默认情况下,它创建 RSA 密钥对,将密钥存储在 ~/.ssh 目录下。请注意,它创建的文件名id_rsa为私钥,id_rsa.pub 为公钥。

[root@localhost ~]# ssh-keygen  -t rsa    -f ~/.ssh/id_rsa   -C "shoufeng"
#                               ~密钥类型  ~密钥文件路径及名称  ~ 备注信息
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):  # 输入密码, 若不输入则直接回车
Enter same passphrase again: # 再次确认密码, 若不输入则直接回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
9a:e3:94:b9:69:c8:e9:68:4b:dc:fa:43:25:7f:53:f1 shoufeng
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|          .      |
|           o     |
|    . .   . E    |
|     +  S.       |
| . .. .=o        |
|  oo.oB. .       |
| ..o=o.+         |
| .++oo+          |
+-----------------+

注意: 密钥的文件名称必须是id_xxx, 这里的xxx就是-t参数指定的密钥类型. 比如密钥类型是rsa, 那么密钥文件名就必须是id_rsa.

修改文件权限

chmod 600 /root/.ssh/id_rsa
chmod 600 /root/.ssh/id_rsa.pub

scp上传公匙

scp /root/.ssh/id_rsa.pub root@192.168.1.78:/root/.ssh/authorized_keys

注意: 如果192.168.1.78主机上的/root/.ssh/authorized_keys文件中存在其他主机的公匙,不要使用scp,否在会出现文件覆盖,删除已有的公匙。仅需把192.168.1.66的公匙添加到192.168.1.78主机上的/root/.ssh/authorized_keys文件中即可。

补充

将SSH密钥转换为不同的格式

默认情况下,由 ssh-keygen 生成的密钥将由 OpenSSH 实现使用。但是,如果要将这些密钥转换为 SSH 商业实现(例如:SSH2),请使用如下所示的 -e 选项。

# ssh-keygen -e
Enter file in which the key is (/root/.ssh/id_rsa):
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "2048-bit RSA, converted from OpenSSH by root@devdb"
AAAAB3NzaC1yc2EAAAABIwAAAQEA5kSivOqhs0U9ZMN20nxFe27QZ3t0lT2zbH7OSXylKd
1rjAjYXGnSXC9j2uaZlemHlptBKVziMJC86ha7Hcj6dVOVrDQ6vF4q34bOCjtKLphQ0IjB
zVIvqILH9eLJdRaOrS34CmgmPaisrCk5wKVlakygvUfcj3HzaTKS6THyZDGx5shdTpa9lb
y8tpOD3JceV7ay4w8r0DipoKPC0OLpvS4EABEeMo9sx8zQEaKv03XygjNCCYtFvxlQQIRG
lVoL7mPaHSaL3anI05RpNbm/PS+9BhZg+BqNjU4ofHBbfkXk5MiN6M7ieR4Sk5BquccboG
F13U5slNgmCEekdt0amw==
---- END SSH2 PUBLIC KEY ----

可以使用以下命令指定文件并将输出存储到其他文件。

# ssh-keygen -e -f /root/.ssh/id_rsa > /root/.ssh/id_rsa.ssh2

# cat /root/.ssh/id_rsa.ssh2
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "2048-bit RSA, converted from OpenSSH by root@devdb"
AAAAB3NzaC1yc2EAAAABIwAAAQEA5kSivOqhs0U9ZMN20nxFe27QZ3t0lT2zbH7OSXylKd
1rjAjYXGnSXC9j2uaZlemHlptBKVziMJC86ha7Hcj6dVOVrDQ6vF4q34bOCjtKLphQ0IjB
zVIvqILH9eLJdRaOrS34CmgmPaisrCk5wKVlakygvUfcj3HzaTKS6THyZDGx5shdTpa9lb
y8tpOD3JceV7ay4w8r0DipoKPC0OLpvS4EABEeMo9sx8zQEaKv03XygjNCCYtFvxlQQIRG
lVoL7mPaHSaL3anI05RpNbm/PS+9BhZg+BqNjU4ofHBbfkXk5MiN6M7ieR4Sk5BquccboG
F13U5slNgmCEekdt0amw==
---- END SSH2 PUBLIC KEY ----

搜索已知主机文件

您也可以使用 ssh-keygen 在 ~/.ssh/known_hosts 文件中搜索密钥。当known_hosts文件中有很多条目时,这很有用。

以下输出指示它在 #10 行的已知主机文件中找到了“dev-db”的条目。

# ssh-keygen -F dev-db
# Host dev-db found: line 10 type RSA
dev-db ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA7QEcjRkbBWpwE7zIShobue9aEGyVObVHDLhK==

显示给定私钥的公钥

以下示例将显示默认 /root/.ssh/id_rsa 私钥的公钥。

# ssh-keygen -y
Enter file in which the key is (/root/.ssh/id_rsa):
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA5kSivOqhs0U9ZMN20nxFe27QZ3t0lT2zbH7OSX==

您还可以使用 -f 选项指定权限键。在此示例中,它将显示 ~/.ssh/id_dsa 私钥的公钥。

# ssh-keygen -y -f ~/.ssh/id_dsa
ssh-dss AAAAB3NzaC1kc3MAAACBAIpmvehoOuFwJ5YHV+7BCrAinV0BZbkUvxkX8KK2prDmynhT==

错误

如果出现上述错误:

  1. 可能是B机之前存有A机的公匙,但是A机重新装系统了,需要把旧的公匙删除掉。
  2. 然后手动复制A机地公匙文件到B机,注意需要修改文件名称为authorized_keys。
  3. 当你用ssh连接到一个新的服务器的时候,ssh会让你确认服务器的信息(域名、IP、公钥),如果你确认了,就会写到known_hosts里。

参考

ssh-keygen 用法和命令 – Dirigent – 博客园 (cnblogs.com)

Linux基础—— SSH免密登录 – 知乎 (zhihu.com)

如何在linux中安装ssh服务_linux安装ssh_沈信得的博客-CSDN博客

Linux安装以及ssh连接 – 简书 (jianshu.com)

Linux的ssh监听多个端口 – 腾讯云开发者社区-腾讯云 (tencent.com)

SSH服务配置_ssh配置_Liq1的博客-CSDN博客

Linux 安装SSH服务 (CentOS 7) (baidu.com)

linux的SSH(远程登录)服务_linux ssh_芒地狠的博客-CSDN博客

linux之ssh命令详解_linux ssh_xiaokanfuchen86的博客-CSDN博客

linux ssh命令详解 (taodudu.cc)

版权声明:本文为博主作者:yeyaozhifengqi原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/yeyaozhifengqi/article/details/129831254

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2024年4月16日
下一篇 2024年4月16日

相关推荐