ssh

secure shell, protocol, 22/tcp, 安全的远程登录

具体的软件实现:

OpenSSH: ssh协议的开源实现,CentOS默认安装
dropbear:另一个开源实现

SSH协议版本

v1: 基于CRC-32做MAC,不安全;man-in-middle
v2:双方主机协议选择安全的MAC方式
  基于DH算法做密钥交换,基于RSA或DSA实现身份认证

两种方式的用户登录认证:

基于password
基于key

Openssh软件组成 

相关包:

openssh
openssh-clients
openssh-server

工具:

基于C/S结构

Linux Client:

  ssh, scp, sftp,slogin

Windows Client:

  xshell, putty, securecrt, sshsecureshellclient

Server:

  sshd

ssh客户端

 
配置文件:/etc/ssh/ssh_config 
  StrictHostKeyChecking no 首次登录不显示检查提示
格式:ssh [user@]host [COMMAND]
ssh [-l user] host [COMMAND]
 常见选项
  -p port:远程服务器监听的端口
  -b:指定连接的源IP
  -v:调试模式
  -C:压缩方式
  -X:支持x11转发
  -t:强制伪tty分配
    ssh -t remoteserver1 ssh -t remoteserver2 ssh remoteserver3。注意使用场景。例如某个公司有ABCD四台主机,配置以下策略,只允许A连B,B连C,C连D。当要连接D主机时,此时可以使用-t选项。ssh -t A ssh -t B ssh -t C ssh  D。
注意:
当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub(CentOS7默认是ssh_host_ecdsa_key.pub)文件中的公钥到客户机的~./ssh/know_hosts中。下次连接时,会自动匹配相应私钥,不能匹配,将拒绝连接。如下图

sshd

ssh配置优化

端口不使用默认22
GSSAPIAuthentication  yes   提高速度可改为no 
UseDNS yes                提高速度可改为no。为yes会通过dns将IP解析为域名。
ClientAliveInterval  300  检查客户端是否活动连接的间隔时长,单位:秒 
u  ClientAliveCountMax  0  检查客户端是否活动连接的次数, 默认3此。和上一项配合使用,300秒内误操作自动退出

sshd部分配置项说明

#LoginGraceTime 2m  ssh链接后等待输入密码的时长。
MaxAuthTries   6   到达配置值的一办就会退出
ClientAliveInterval  0  检查客户端是否活动连接的间隔时长,单位:秒 
ClientAliveCountMax  3 检查客户端是否活动连接的次数, 默认3此
MaxStartups 10:30:100  ssh并发连接在10个以下时全部允许ssh到本机。超过十个且小于100个,则随机挑选30%个拒绝链接,超过100个则全部拒绝

ssh企业应用配置建议

Port 22 :不要使用默认端口;
AllowUsers限制可登录的用户;
ClientAliveCountMax,ClientAliveInterval设定空闲会话超时时长;
ListenAddress 0.0.0.0仅监听特定的IP地址; PermitEmptyPasswords no #禁止使用空密码; PermitRootLogin禁止root用户直接登录; MaxAuthTries,MaxSessions限制ssh的访问频度和并发在线数; 做好日志,经常分析; /vat/log/secure
禁止使用protocol version 1
使用基于密钥的认证;
基于口令认证时,使用强密码策略;
     随机数生成命令
    # tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs
    #openssl rand -base64 30

利用防火墙设置ssh访问策略;

ssh公钥交换步骤

客户端发起链接请求
服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
客户端生成密钥对
客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
客户端发送加密后的值到服务端,服务端用私钥解密,得到Res
服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密

ssh加密通信

client和server都用对方的公钥加密,传输数据。用自己的私钥解密,获取数据。
 

ssh服务验证登录

ssh服务登录验证方式

用户/口令
基于密钥

基于用户和口令登录验证

在进行公钥交换后,用户会根据服务器发来的公钥对密码进行加密,加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功。
 

ssh服务基于密钥登录验证(免密登录)

双方都使用对方的公钥加密同一个字符串,然后发给对方,解密后比对字符串是否一致。

1 首先在客户端生成一对密钥(ssh-keygen)
2 并将客户端的公钥ssh-copy-id 拷贝到服务端
3 当客户端再次发送一个连接请求,包括ip、用户名
4 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:1qazwsx
5 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
6 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
7服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

linux主机之间基于密钥的认证:

(1) 在客户端生成密钥对
ssh-keygen -t rsa [-P ''] [-f “~/.ssh/id_rsa"]
(2) 把公钥文件传输至远程服务器对应用户的家目录
ssh-copy-id [-i [identity_file]] [user@]host

使用xshell连接linux基于密钥的认证:

 (1)使用xshell生成公钥(下面第一张图和第二张图,)

 (2)将公钥复制到目标linux主机,并导入到 ~/.ssh/authorized_keys:ssh-keygen -i -f id_rsa_2048.pub >> .ssh/authorized_keys

 (3)在使用xshell登录时选择密钥登录(第三张图)

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/wxxjianchi/p/13511709.html