简介

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 &amp;,将在 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==

错误

ssh如何协商加密算法 ssh协议传输的数据加密吗_服务器

如果出现上述错误:

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