Blue Flower

摘要:本文介绍了 Public Key 认证的一般原理,及其在 Linux、Cisco IOS、Cisco NX-OS、F5 BIG-IP、Palo Alto PAN-OS、Fortinet FortiOS 和 Juniper JUNOS 中的配置方法及建议。

一、Public Key 认证基本原理

Public Key(非对称,asymmetric)认证使用一对相关联的 Key Pair(一个公钥 Public Key,一个私钥 Private Key)来代替传统的密码(或知识兔常说的口令,Password)。顾名思义,Public Key 是用来公开的,可以将其放到 SSH 服务器自己的帐号中,而 Private Key 只能由自己保管,用来证明自己身份。

使用 Public Key 加密过的数据只有用与之相对应的 Private Key 才能解密。这样在认证的过程中,Public Key 拥有者便可以通过Public Key 加密一些东西发送给对应的 Private Key 拥有者,如果在通信的双方都拥有对方的 Public Key(自己的 Private Key 只由自己保管),那么就可以通过这对 Key Pair 来安全地交换信息,从而实现相互认证。在使用中,知识兔把自己的 Public Key 放在通过安全渠道放到服务器上,Private Key 自己保管(用一个口令把 Private Key 加密后存放),而服务器的 Public Ke y一般会在第一次登录服务器的时候存放到本地客户端(严格地说来服务器的 Public Key 也应该通过安全渠道放到本地客户端,以防止别人用他自己的 Public Key 来欺骗登录)。

二、Public Key 认证相对于 Password 认证的优点

常用的 SSH 认证方式有:

a. 基于主机 IP(rhost)的认证:对于某个主机(IP)信任并让之登录,这种认证容易受到 IP 欺骗攻击。
b. Kerberos 认证:一个大型的基于域的认证,这种认证安全性高,但是太大、太复杂不方便部署。
c. PAM 认证:类似于传统的密码认证,是绝大多数 Unix/Linux 系统自带的一个认证和记帐的模块,它的功能比较复杂,配置起来比较麻烦。而且,容易由于配置失误而引起安全问题。
d. 传统的 Unix/Linux 口令(或密码 Password)认证:在客户端直接输入帐号密码,然后让 SSH 加密传输到服务器端验证。

在众多 SSH 登录认证中,传统的单口令(Password)认证用得比较多,所以在这里知识兔主要对比一下 SSH 认证中的口令(Password)认证和 Public Key 认证的区别。这种认证方式有着如下明显的缺点:

1)为了确保密码安全,密码必须很长很复杂,但是这样的密码很难记忆;
2)对于自己所拥有的每个帐号,为了安全,不同的帐号都要设置不同的密码,管理起来很不方便;
3)对于默认帐号,默认密码,例如装机时用的帐号,如果一时疏忽没有改密码,被其它不怀好意的人扫描到帐号和密码,可能会造成安全漏洞;
4)如果远程主机已经被攻击,即使使用 SSH 安全通道进行保护,在网络上发送的密码在到达远程主机时也可能被截获;
5)对于每个帐号的修改都要人工登录(为了安全,不能把 Password 放到脚本里),随着服务器数量增多,这项工作会变得十分烦琐。

相反,使用 Public Key 认证正好可以解决上述问题,即其优势所在。

三、Linux Public Key 配置

使用一种被称为 “公私钥” 认证的方式来进行 ssh 登录. “公私钥” 认证方式简单的解释:首先在客户端上创建一对公私钥 (公钥文件:~/.ssh/id_rsa.pub; 私钥文件:~/.ssh/id_rsa)

然后把公钥放到服务器上(~/.ssh/authorized_keys), 自己保留好私钥。在使用 ssh 登录时,ssh 程序会发送私钥去和服务器上的公钥做匹配。如果匹配成功就可以登录了。

步骤如下:先要在本地生成一个 rsa 的公共 key,然后 copy 到远程你要认证的服务器创建 key

(1)本地

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SYSIN-SRV# ssh-keygen -t rsa  #可选参数 -b 2048,CentOS7 中默认
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
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:
SHA256:MfZHl/b8XhGTU59fhLHptmzNFnhCrorySvGojyb69dM root@SYSIN-SRV #root@SYSIN-SRV 这里是当前用户名@主机名,公钥文件中可以删除
The key's randomart image is:
+---[RSA 2048]----+
|+= = . . .... |
|O.E + o . |
|*+ o . . |
|+o. . . o. . . |
|+ o o .SBo . |
| . + oo++=+ |
| o +. o.+. |
| . o.. o . |
| . ... .. |
+----[SHA256]-----+

直接三次回车即可,这里会提示输入密码 passphrase,这个密码与与远程 ssh 登录密码无关。Public-key 证机制比密码要安全,因为密码不在网络上传输,而且可以是用加密的方式存储的。为了安全,也可以设置一个 passphrase,这样,别人拿到密钥也没有用。

1
2
3
4
5
6
7
8
9
10
# cd .ssh/
# ls
id_rsa id_rsa.pub known_hosts
# cp id_ras.pub authorized_keys //本机公钥配置,允许 ssh localhost 免密登录
//id_rsa 文件复制到其他机器上复用,权限需要设置为600
# chmod 600 id_rsa

#ssh 对目录的权限有要求,建议设置如下
chmod 700 ~/.ssh
chmod -R 600 ~/.ssh/*

Correct file permissions on ~/.ssh folder and its content:

Element Permission
.ssh directory 700 ((drwx------)
public keys: id_rsa_pub (=authorized_keys) 644 (-rw-r–r–)
private keys: id_rsa 600 (-rw-------)
authorized_keys 600 (-rw-------)
known_hosts 600 (-rw-------)
config 600 (-rw-------)

(2)将公钥文件复制到远程服务器上:

1
# ssh-copy-id root@目标节点IP

这里 root 是在目标节点上登录的用户,@ 符号后面接目标节点 IP 即可,之后会提示输入目标节点 root 用户密码,输入即可。

添加认证信息后,目标节点主机的 ~/.ssh/ 目录下将会出现一个 authorized_keys 文件,里面包含了管理节点的公钥信息,可以检查一下是否存在。

保存好上述生成的公钥和私钥文件后,可以上传到其他主机(或者网络设备)上直接使用:

1
2
3
4
5
6
7
8
9
## 直接上传已有的 Public key
mkdir ~/.ssh
cd ~/.ssh
上传 id_rsa 和 id_rsa.pub 到当前目录
mv id_rsa.pub authorized_keys
chmod 700 ~/.ssh
chmod -R 600 ~/.ssh/*
## 测试访问是否正常
ssh localhost

(3)修改 sshd 配置文件:

启用 Public key 认证并关闭传统密码认证,重启 sshd 服务生效。

1
2
3
vi /etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication no
1
2
3
4
5
6
7
8
9
10
## CentOS 7 默认配置如下
PasswordAuthentication yes

## 取消注释#PubkeyAuthentication yes
sed -i 's/^#\(PubkeyAuthentication yes\)/\1/' /etc/ssh/sshd_config
## 修改为PasswordAuthentication no,即替换行
sed -i '/^PasswordAuthentication yes/c PasswordAuthentication no' /etc/ssh/sshd_config
## 写入文件需要添加 -i 参数
## 重启sshd服务 (sysin)
service sshd restart

四、SSH 客户端设置

1. 使用 Putty 客户端

知识兔

如果使用 Windows 中的 Putty

如果想使用 putty,因为 ssh-keygen 生成的 SSH2 和 putty 的 key 格式不同,无法直接使用,必须用 puttygen.exe 转换一下:

把 Linux 的 id_rsa copy 到 windows 中,运行 puttygen.exe,选择菜单 Conversions -> Import key 然后 save private key,就可以使用这个 private key 设置 putty 了。

Windows 中设置 Putty 使用 key

1) 启动 Putty,设置好 session 的各项参数(如果以前已经设置过,那么 load 一下),然后从左边选择“SSH->Auth”,点击 Browse 按钮,选择 key.ppk 文件。
2) 设置 auto-login 用户名,Connection -> Data -> Auto-login username
3) 再从左边选择 Session,然后点击 Save 按钮把修改保存下来。然后点击 Open 按钮就可以登录了。

如果上面的操作都没有问题,那这时应该就自动登录了,无需输入密码。

putty 的密钥转换成 SecureCRT 的密钥

以前用的是 putty,生成了 PUB/PRIVATE KEY的,现在用 puttygen.exe load private key,然后用 Conversions 导出到 openssh 格式的 private key,名为 identy,接着把 pubkey 也导出来,叫 identy.pub,放到相同的目录下,最后在 securecrt 的 session 里指定 private key 就 OK 了,一定要弄成 xx xx.pub 的形式,否则会说找不到密码。

2. 使用 SecureCRT 配置公钥

知识兔

在 Windows 客户机上,建立 C:/SSH 目录,然后将 id_dsa 和 id_dsa.pub 原封不动的复制到 C:/SSH 里,确保文件名为 id_dsa 和 id_dsa.pub(macOS类似)

第一步,按向导正常连接一台主机 SSH,填写主机名和用户名
第二步,编辑会话主机的属性,Connection–SSH2,右侧 Authentication 页面选中 PublicKey,点击 “Properties…”
第三步,默认选中 Use global public key ,Use identity or certificate file 那里,点击“…”按钮,浏览我的电脑,找到 C:/SSH 目录,选中 id_dsa 文件,然后确定。

保存好配置,关闭 SecureCRT,然后打开配置了证书的主机,正常情况下将提示要输入密钥的加密字,输入后就应该可以登录进系统了。
同时再打开另一个 SecureCRT 窗口。登录同样的主机,由于 SecureCRT 已缓存了证书及加密字,因此不再需要输入用户名密码,使用就很方便了!

五、Cisco IOS、IOS-XE

1. 启用 public key 认证

知识兔

在 Linux 上生成 key

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SYSIN-SRV# ssh-keygen -t rsa  #可选参数 -b 2048,CentOS7 中默认
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
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:
SHA256:MfZHl/b8XhGTU59fhLHptmzNFnhCrorySvGojyb69dM root@SYSIN-SRV #root@SYSIN-SRV 这里是当前用户名@主机名,公钥文件中可以删除
The key's randomart image is:
+---[RSA 2048]----+
|+= = . . .... |
|O.E + o . |
|*+ o . . |
|+o. . . o. . . |
|+ o o .SBo . |
| . + oo++=+ |
| o +. o.+. |
| . o.. o . |
| . ... .. |
+----[SHA256]-----+

在 Linux 主机上查看 public key

1
2
3
$ cat ~/.ssh/id_rsa.pub
## 默认是一行
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDefQcDto4gCHqf0umUCAY1O7GHPwU+Se92aUHVkVI4Kd8sJVFoQKjvMga9dRm12zGDDO/wM9tSHWKc+msARsz2m6h1HbsiR7CoOTPtTuDc/BN3m7Q7SGXzf51AI3tvOQ4IhlDwRMFBLGTFVVDjpYMDZjwZNEwCBbeZMETNUedCvbyduEmOaZIm5LzCQ5upPG+uEMsP5Sh8XQX5vK8P5P04EmCAEqned5FmHMrPI3kGfabxRhiLa7Ujv3gMh4z59tKmVsoMyKXU3gf+561D9BdvuTo+gvtUElghBvz3wiPA45KW7LL2INBXiJ89p0iOmkiAEnxkDdsXpq+GEj2PaiE9

转换成多行格式

1
2
3
4
5
6
7
8
## Cisco does not accept the entire key pasted into one long line, so you need to break it into multiple lines. The maximum line length at the Cisco CLI is 254 characters, but it's convenient to wrap smaller than this so that it fits on a terminal line.
$ fold -b -w 72 ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDefQcDto4gCHqf0umUCAY1O7GHPwU+Se92
aUHVkVI4Kd8sJVFoQKjvMga9dRm12zGDDO/wM9tSHWKc+msARsz2m6h1HbsiR7CoOTPtTuDc
/BN3m7Q7SGXzf51AI3tvOQ4IhlDwRMFBLGTFVVDjpYMDZjwZNEwCBbeZMETNUedCvbyduEmO
aZIm5LzCQ5upPG+uEMsP5Sh8XQX5vK8P5P04EmCAEqned5FmHMrPI3kGfabxRhiLa7Ujv3gM
h4z59tKmVsoMyKXU3gf+561D9BdvuTo+gvtUElghBvz3wiPA45KW7LL2INBXiJ89p0iOmkiA
EnxkDdsXpq+GEj2PaiE9

在 Cisco IOS 上配置

1
2
3
4
5
6
7
conf t
username admin privilege 15 //创建一个没有密码的账号admin
ip ssh pubkey-chain
username admin
key-string
<< paste your multi-line public key here >>
exit

验证

1
show run | beg pubkey

2. 其他配置

知识兔

Security settings

1
2
3
4
5
## 禁用SSH v1
ip ssh version 2
## 禁用telnet
line vty 0 15
transport input ssh

Multiple keys

1
2
3
4
5
6
## It is possible to have multiple public keys against the same user in the configuration, so that multiple people can login using the same account. Just add further keys as shown above. When you show the configuration, it will look like this:

ip ssh pubkey-chain
username nsrc
key-hash ssh-rsa EFF40492D1D6BF5D0B68491128456D27 [email protected]
key-hash ssh-rsa 768CD77578B0C1B55BCC0C3549D3E573 [email protected]

移除密码

1
2
3
4
5
## You can remove passwords from users in the configuration; this will force those users to use ssh key authentication. If these people require admin rights they will either still need to know the enable secret, or their login can drop them directly into enable mode:
username foo privilege 15
示例:
no username admin
username admin privilege 15

Disable passwords entirely

全局设定,无法通过密码远程访问!!!

1
2
3
4
## If you wish to disable password authentication entirely over ssh, but leave passwords on user accounts for other purposes (e.g. console access), then use:
## 禁用SSH的密码认证,但是保留用户密码用于console登录
no ip ssh server authenticate user password
no ip ssh server authenticate user keyboard

安全建议:
有公网 IP 访问建议启用,特别是设定的用户名比较敏感比如 root、admin 等,取消密码,直接使用 public key 认证

六、Cisco NX-OS

1. 生成公钥文件id_rsa.pub(参看Linux)

知识兔
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SYSIN-SRV# ssh-keygen -t rsa  #可选参数 -b 2048,CentOS7 中默认
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
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:
SHA256:MfZHl/b8XhGTU59fhLHptmzNFnhCrorySvGojyb69dM root@SYSIN-SRV #root@SYSIN-SRV 这里是当前用户名@主机名,公钥文件中可以删除
The key's randomart image is:
+---[RSA 2048]----+
|+= = . . .... |
|O.E + o . |
|*+ o . . |
|+o. . . o. . . |
|+ o o .SBo . |
| . + oo++=+ |
| o +. o.+. |
| . o.. o . |
| . ... .. |
+----[SHA256]-----+

2. 配置用户使用密钥

知识兔

2.1. 传输 id_rsa.pub 文件到交换机的 bootflash 中并配置用户

1
N9K#copy sftp: bootflash

示例使用的用户名为 sysin

1
2
3
N9K##conf
N9K(config)#username sysin role network-admin //创建一个没有密码的用户
N9K(config)#username sysin sshkey file bootflash:id_rsa.pub

2.2. 直接复制密钥进行配置

第二种方式:直接复制 id_rsa.pub 中的 key 输入如下:

1
2
3
N9K##conf
N9K(config)#username sysin role network-admin //创建一个没有密码的用户
N9K(config)#username sysin sshkey ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDefQcDto4gCHqf0umUCAY1O7GHPwU+Se92aUHVkVI4Kd8sJVFoQKjvMga9dRm12zGDDO/wM9tSHWKc+msARsz2m6h1HbsiR7CoOTPtTuDc/BN3m7Q7SGXzf51AI3tvOQ4IhlDwRMFBLGTFVVDjpYMDZjwZNEwCBbeZMETNUedCvbyduEmOaZIm5LzCQ5upPG+uEMsP5Sh8XQX5vK8P5P04EmCAEqned5FmHMrPI3kGfabxRhiLa7Ujv3gMh4z59tKmVsoMyKXU3gf+561D9BdvuTo+gvtUElghBvz3wiPA45KW7LL2INBXiJ89p0iOmkiAEnxkDdsXpq+GEj2PaiE9

3. 验证配置

知识兔
1
2
3
4
5
6
7
8
9
10
N9K# show user-account sysin
user:sysin
this user account has no expiry date
roles:network-admin
no password set. Local login not allowed //没有设置密码只能远程登录
Remote login through RADIUS/TACACS+ is possible
ssh public key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDefQcDto4gCHqf0umUCAY1O7GHPw
U+Se92aUHVkVI4Kd8sJVFoQKjvMga9dRm12zGDDO/wM9tSHWKc+msARsz2m6h1HbsiR7CoOTPtTuDc/BN3
m7Q7SGXzf51AI3tvOQ4IhlDwRMFBLGTFVVDjpYMDZjwZNEwCBbeZMETNUedCvbyduEmOaZIm5LzCQ5upPG+uEMsP5Sh8XQX5vK8P5P04EmCAEqned5FmHMrPI3kGfabxRhiLa7Ujv3gMh4z59tKmVsoMyKXU3gf+561D
9BdvuTo+gvtUElghBvz3wiPA45KW7LL2INBXiJ89p0iOmkiAEnxkDdsXpq+GEj2PaiE9

4. 验证

知识兔

使用 Linux 主机 SSH 登录到交换机上并执行命令,没有任何密码提示:

1
2
3
4
5
SYSIN-SRV# ssh [email protected] "sh system uptime"
Warning: the output may not have all the roles
System start time: Tue May 29 17:51:30 2012
System uptime: 7 days, 19 hours, 42 minutes, 15 seconds
Kernel uptime: 7 days, 19 hours, 45 minutes, 17 seconds

七、F5 BIG-IP

1. 标准做法

知识兔

使用 publc key 认证,参看官方文档:K13454

F5 基于 CentOS 构建,与 Linux 操作方式类似。

1
2
3
4
5
6
## 直接上传已有的Public key
cd /root
mkdir .ssh
cd .ssh
上传 id_rsa.pub 到 .ssh 目录下
cp id_rsa.pub authorized_keys

如果是要两台之间免密登录

1
2
3
4
上传 id_rsa 到 .ssh 目录下
chmod 700 id_rsa
## 测试访问是否正常
ssh localhost

默认 PubkeyAuthentication 是开启的,不需要像 Linux 那样修改 sshd 配置文件(/config/ssh/sshd_config)。

注意:

  1. 禁用密码登录,似乎不支持
  2. 限制源地址访问sshd:全局限制,不能针对用户个别设置

安全建议:

  1. 建议设定 sshd 和 httpd 限制源地址访问
  2. 禁用默认 admin 和 root 账号
  3. 创建替代的管理员帐号

2. 建议做法

知识兔
1
2
3
mkdir -m 755 -p /var/ssh/
mv /home//.ssh/authorized_keys /var/ssh/
cd /home//.ssh && ln -s /var/ssh//authorized_keys

参看系统默认 root 账号配置

当前支持版本:v11.6.5,v12.1.5,v13.1.0,v14.1.0,v15.1.0,v16.0.0 及以上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost:Active:Standalone] config # cd /root/.ssh
[root@localhost:Active:Standalone] config # alias ll='ls -lahF --color'
[root@localhost:Active:Standalone] .ssh # ll
total 10K
drwxr-xr-x. 2 root root 1.0K Jun 23 20:13 ./
dr-x------. 3 root root 1.0K Jul 14 21:42 ../
lrwxrwxrwx. 1 root root 29 Jun 23 20:13 authorized_keys -> /var/ssh/root/authorized_keys
lrwxrwxrwx. 1 root root 22 Jun 23 20:13 identity -> /var/ssh/root/identity
lrwxrwxrwx. 1 root root 26 Jun 23 20:13 identity.pub -> /var/ssh/root/identity.pub
lrwxrwxrwx. 1 root root 25 Jun 23 20:13 known_hosts -> /var/ssh/root/known_hosts
-rw-r--r--. 1 root root 262 Jun 23 16:27 README
[root@localhost:Active:Standalone] .ssh # cat README
WARNING!!

Do not manually change the files in this directory!
The ssh keys in this directory are generated at first boot and are unique
to your machine.
These keys are needed for communication with the SCCP.

To generate new keys, please run `keyswap.sh sccp`.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost:Active:Standalone] config # find / -name authorized_keys
/shared/ssh/root/authorized_keys
/root/.ssh/authorized_keys
find: '/proc/13236': No such file or directory
find: '/proc/13267': No such file or directory
find: '/opt/.sdm/proc/13324': No such file or directory

[root@localhost:Active:Standalone] config # ll /shared/ssh/root/authorized_keys
-rw-r--r--. 1 root root 406 Jul 14 20:06 /shared/ssh/root/authorized_keys
[root@localhost:Active:Standalone] config # cat /shared/ssh/root/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCKV2v1jzTATRIbyat3g6WruNQSWDcdKNafhG66rNyAJ09guCukkjbRwARJGzZWKxdhSqqHvMW32fZYAX6ZCl/9eDoGjh08eKELJVxn6q7UI3xAM/ze+4GUrSStlEdagBsB/sNGvp0gr1b0eaALFpE2VsLxVr1wVpcPMKbPr7HHPfQsALakI3El5zayi6U7Ei1W7dU3hs8WoIlj89eMiuFCUXyZDtBaXht0C2nWk8C6SPJjpVfPNh++dttzW2GOfSLvwEKoCHmYGKe/aolYYvdRVGXSOpqDzZsNWBHHSyU92RqMCm1VLM1mg/ew4KFzYocdlpDssh2IaZTbua7Af+P7 Host Processor Superuser

[root@localhost:Active:Standalone] config # ll /root/.ssh/authorized_keys
lrwxrwxrwx. 1 root root 29 Jun 23 20:13 /root/.ssh/authorized_keys -> /var/ssh/root/authorized_keys
[root@localhost:Active:Standalone] config # cat /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCKV2v1jzTATRIbyat3g6WruNQSWDcdKNafhG66rNyAJ09guCukkjbRwARJGzZWKxdhSqqHvMW32fZYAX6ZCl/9eDoGjh08eKELJVxn6q7UI3xAM/ze+4GUrSStlEdagBsB/sNGvp0gr1b0eaALFpE2VsLxVr1wVpcPMKbPr7HHPfQsALakI3El5zayi6U7Ei1W7dU3hs8WoIlj89eMiuFCUXyZDtBaXht0C2nWk8C6SPJjpVfPNh++dttzW2GOfSLvwEKoCHmYGKe/aolYYvdRVGXSOpqDzZsNWBHHSyU92RqMCm1VLM1mg/ew4KFzYocdlpDssh2IaZTbua7Af+P7 Host Processor Superuser

八、Palo Alto PAN-OS

1. 生成 ssh key,参照 Linux

知识兔
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SYSIN-SRV# ssh-keygen -t rsa  #可选参数 -b 2048,CentOS7 中默认
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
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:
SHA256:MfZHl/b8XhGTU59fhLHptmzNFnhCrorySvGojyb69dM root@SYSIN-SRV #root@SYSIN-SRV 这里是当前用户名@主机名,公钥文件中可以删除
The key's randomart image is:
+---[RSA 2048]----+
|+= = . . .... |
|O.E + o . |
|*+ o . . |
|+o. . . o. . . |
|+ o o .SBo . |
| . + oo++=+ |
| o +. o.+. |
| . o.. o . |
| . ... .. |
+----[SHA256]-----+

2. 配置 Public Key 认证

知识兔

2.1 使用 GUI 界面

参看官方文档

创建或者编辑一个帐号

Device - Administrators,点击 Add

勾选 Use Public Key Authentication (SSH),点击 Import Key,浏览到 id_rsa.pub

可以看到导入后的 key 内容有所变化,被自动转换为Base64编码格式,在使用命令行输入时也需要 Base64 编码格式,否则会报错。

勾选 Use only client certificate authentication (Web),则不需要为账号创建密码(编辑原有用户勾选此选项,原用户密码继续有效)。

此时该用户无法使用 SSH 密码登录,因为没有密码,Web 界面也将无法登录。

2.2 使用 CLI

创建一个同时使用密码和 key 认证的用户账号 sa1

1
2
3
4
5
6
set mgt-config users sa1 password
Enter password :
Confirm password :
set mgt-config users sa1 permissions role-based superuser yes
set mgt-config users sa1 public-key c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCQVFDbjRLMy9Ld1VNZkdJVm4xbDYxNTZOTDR2WHl0T3FORHJUZ2FWb05lcEZuL2tuaE9FOGR4YW1pWWNNK0xJMVU5aksvOVdjeTd0Q2tCeUR3YWs5RjBnS1NVUUlURWpJZTkzNytNQ1NxQU4xR1MxTlNsa2IvcmZjUEs1dGIyam9TejFyb3cyTXl6WDZLVGZDVkc0eVN6UWFTeDRnZmg0d0ZJb3poejdyVFB3YlQ0cjRtejVCaEdKRklBRzAyeUNMdVZNbkhVN0VPdVFmaDI5WTN1cjhOcWdJdnY2UXRTUHN0a0N5dzdrOXNaWmMyZitVVmtTK0FOZVN0dnpXR2JuZ0V0OFlaQjRlRTN1RzRwVWJxbEFXenJjbXVXVmZZRXR6Wkh6VVVtSFlPb1poRVdXbzQ4OER1VXF1NUEvZVJkK1RaZE42WUdMZkliT3dxcG9GVFJyNXc0VEggcm9vdEBTU0xYMTIxCg==
## 注意 public-key 使用Base64编码格式,可以通过Web界面转换

创建一个仅仅使用 key 认证的用户账号 sa2(该用户无法登录 GUI)

1
2
3
4
set mgt-config users sa2 permissions role-based superuser yes
set mgt-config users sa2 client-certificate-only yes
set mgt-config users sa2 public-key c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCQVFDbjRLMy9Ld1VNZkdJVm4xbDYxNTZOTDR2WHl0T3FORHJUZ2FWb05lcEZuL2tuaE9FOGR4YW1pWWNNK0xJMVU5aksvOVdjeTd0Q2tCeUR3YWs5RjBnS1NVUUlURWpJZTkzNytNQ1NxQU4xR1MxTlNsa2IvcmZjUEs1dGIyam9TejFyb3cyTXl6WDZLVGZDVkc0eVN6UWFTeDRnZmg0d0ZJb3poejdyVFB3YlQ0cjRtejVCaEdKRklBRzAyeUNMdVZNbkhVN0VPdVFmaDI5WTN1cjhOcWdJdnY2UXRTUHN0a0N5dzdrOXNaWmMyZitVVmtTK0FOZVN0dnpXR2JuZ0V0OFlaQjRlRTN1RzRwVWJxbEFXenJjbXVXVmZZRXR6Wkh6VVVtSFlPb1poRVdXbzQ4OER1VXF1NUEvZVJkK1RaZE42WUdMZkliT3dxcG9GVFJyNXc0VEggcm9vdEBTU0xYMTIxCg==
## 注意 public-key 使用Base64编码格式,可以通过Web界面转换

九、Fortinet FortiOS

以下在 FortiOS 6.0 下测试通过

  • 生成密钥

一般使用 RSA 2048-bit key,参考 Linux 生成方式

  • 语法
1
2
3
4
5
  config system admin
edit admin
set ssh-public-key1 " "
next
end
  • 示例

注意格式:不要用开头和结尾的 ---- BEGIN SSH2 PUBLIC KEY ---- 或者注释"[2048-bit dsa,…]" 或者 ---- END SSH2 PUBLIC KEY ---- 等内容
示例,同时删除已经设置的密码,新账号不用设置密码:

1
2
3
4
5
6
  config system admin
edit admin
set ssh-public-key1 "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDefQcDto4gCHqf0umUCAY1O7GHPwU+Se92aUHVkVI4Kd8sJVFoQKjvMga9dRm12zGDDO/wM9tSHWKc+msARsz2m6h1HbsiR7CoOTPtTuDc/BN3m7Q7SGXzf51AI3tvOQ4IhlDwRMFBLGTFVVDjpYMDZjwZNEwCBbeZMETNUedCvbyduEmOaZIm5LzCQ5upPG+uEMsP5Sh8XQX5vK8P5P04EmCAEqned5FmHMrPI3kGfabxRhiLa7Ujv3gMh4z59tKmVsoMyKXU3gf+561D9BdvuTo+gvtUElghBvz3wiPA45KW7LL2INBXiJ89p0iOmkiAEnxkDdsXpq+GEj2PaiE9"
unset password "要删除的账号的密码"
next
end

经过测试这里 unset password 后,密码为空,即无需密码就能登录,这或许与一般安全产品的理念不同(没有钥匙则无法开锁)。

  • 注意点:需要同时设置密码!

十、Juniper JUNOS

1. 官方文档

知识兔
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## Enable SSH service on the switch using the following command:
root@Juniper# set system services ssh

## Generate the SSH key on a device running Junos OS by logging into the shell prompt as a root user:
root@Juniper>start shell
root@Juniper% ssh-keygen -t rsa

## Once the keys are generated we can associate the key with the "userid" using the following command.
root@Juniper#set system login user uid 2000
root@Juniper#set system login user class super-user
root@Juniper#set system login user authentication load-key-file /root/.ssh/id_rsa.pub

After running the above configuration commands, it will create a directory with in /var/home and the authorized_key for SSH will be created.

When an upgrade/downgrade is performed, the files id_rsa and id_rsa.pub, which are locally created and are not part of configuration, will not be restored. Hence we will have to copy the contents of the /root/.ssh directory and put them back after the upgrade/downgrade is complete. We also will have to associate the user with the key using the following CLI command:

root@Juniper#set system login user authentication load-key-file /root/.ssh/id_rsa.pub

2. 快速配置

知识兔

通常知识兔已经用 Linux 生成了自己的公钥和私钥,这里直接使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
## 使用root账号登录,将公钥文件id_rsa.pub上传到/root/.ssh/下面(默认需要创建.ssh文件夹)
start shell
cd /root
mkdir .ssh
cd .ssh
## Cluster环境,将id_rsa.pub上传到另外一个节点node1
rcp -T /root/.ssh/id_rsa.pub node1:/root/.ssh/
rlogin -T node1
ls /root/.ssh/id_rsa.pub
## 新建账号,若账号已经创建并使用密码认证,将同时使用pub认证
set system login user class super-user authentication load-key-file /root/.ssh/id_rsa.pub
## 示例 使用key认证并取消密码认证
set system login user sysin class super-user authentication load-key-file /root/.ssh/id_rsa.pub
delete system login user sysin authentication encrypted-password #删除已有账号密码认证
## 示例 同时使用密码和key认证
set system login user sysin class super-user authentication plain-text-password
set system login user sysin class super-user authentication load-key-file /root/.ssh/id_rsa.pub
## 删除用户命令为:delete system login user

## 禁用root账号ssh登录
set system services ssh root-login deny
## 恢复
set system services ssh root-login allow

3. 建议做法

知识兔

1). root 账号有密码,使用 root 账号上传 /root/.ssh/id_rsa.pub
2). 新建一个 admin1 账号,注意不要使用敏感字符,使用 public key 认证,无密码
3). 新建一个 admin2 账号,注意不要使用敏感字符,有复杂密码,或者同时使用 public key 认证,必要时候应急使用
4). 禁用 root ssh login
5). 必要时限制源地址访问,禁用密码认证

下载仅供下载体验和测试学习,不得商用和正当使用。

下载体验

请输入密码查看内容!

如何获取密码?

 

点击下载