简介
SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应用层和传输层基础上的安全协议。对数据进行压缩,加快传输速度。
优点:
-
数据传输是加密的,可以防止信息泄漏
-
数据传输是压缩的,可以提高传输速度
原理
SSH客户端<--------------网络---------------->SSH服务端
- SSH客户端:Putty、 Xshell、CRT
- SSH服务端:OpenSSH
ssh免密码登录主要采用算法:
- 对称加密算法
原理:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。
特点:计算量小、加密解密的速度比较快,适合数据比较长时的使用; 密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦。
- 非对称加密算法
原理:非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
特点:非对称加密技术安全性更好,但性能更慢。
安装
- Centos 7系统默认已安装openssh相关软件包,并将sshd 服务添加为开机自启动。
- sshd服务默认使用的是TCP的22端口,安全协议版本sshv2,出来2之外还有1(有漏洞)
- 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==
错误
如果出现上述错误:
- 可能是B机之前存有A机的公匙,但是A机重新装系统了,需要把旧的公匙删除掉。
- 然后手动复制A机地公匙文件到B机,注意需要修改文件名称为authorized_keys。
- 当你用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博客文章来源:https://www.toymoban.com/news/detail-452233.html
linux ssh命令详解 (taodudu.cc)文章来源地址https://www.toymoban.com/news/detail-452233.html
到了这里,关于远程连接——SSH的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!