1、OpenSSH

1、SSH的全称是Secure Shell,简单说来ssh是一种安全的外壳协议,用于两个计算机间安全的远程登陆,说它安全,是因为ssh采用公钥加密的机制。在windows系统上常用到的有Putty、SecureCRT、XManager中的Xshell工具,Openssh即是Linux系统下开源的实现,它开放且免费。
2、SSH是Telnet/rlogin等非安全shell的替代品,这些协议采用明文传输,会引入许多的安全性问题:
3.1 ssh服务 - 图1

2、SSH登录

2.1 ssh登录过程

3.1 ssh服务 - 图2

  1. 服务端运行有ssh服务,并持续监听22号端口,因此可以生成一对公钥和私钥;此时将公钥返回给客户端
  2. 客户端使用公钥,对登录密码进行加密,(如服务器work用户密码为xxx),生成公钥加密字符串
  3. 客户端将公钥加密字符串发送给服务端
  4. 服务端使用私钥,解密公钥加密字符串,得到原始密码
  5. 校验密码是否合法(此为本机work密码)
  6. 返回登录结果给客户端:成功登录或密码错误

2.2 SSH免密登录过程

3.1 ssh服务 - 图3

  1. 在A上生成公钥私钥。
  2. 将公钥拷贝给server B,加入到授权文件authorized_keys中
  3. Server A向Server B发送一个连接请求。
  4. Server B得到Server A的信息后,在authorized_key中查找,如果有相应的用户名和IP,则随机生成一个字符串,并用Server A的公钥加密,发送给Server A。
  5. Server A得到Server B发来的消息后,使用私钥进行解密,然后将解密后的字符串发送给Server B。Server B进行和生成的对比,如果一致,则允许免登录。

总之:A要免密码登录到B,B首先要拥有A的公钥,然后B要做一次加密验证。对于非对称加密,公钥加密的密文不能公钥解开,只能私钥解开。

3、基于公钥的认证

基于用户口令的认证方式每次都要求用户提供正确的口令,比较麻烦,且增加了口令泄露的机率。而基于公钥的认证则不需要用户输入口令即可完成远程登陆。这种认证方式是这样工作的:用户把自己的公钥存储在远程主机上,在登陆时,远程主机向用户发送一段随机字符串,用户用自己的私钥加密这段随机数字,并把加密后的信息发送给远程主机,远程主机用事先存储的公钥来解密这个数据,如果解密成功,则说明请求登陆的用户是可信任的,这样就直接允许用户登陆,而不要求输入密码了。

3.1 生成ssh公钥

第一步:生成本地公钥文件
使用命令:ssh-keygen
image.png

第二步:复制id_rsa.pub到目标主机
使用命令:scp id_rsa.pub root@192.168.66.130:/root/image.png
第三步:在目标服务器上移动重命名并修改权限
mv id_rsa.pub .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
image.png
第四步:验证
image.png

4、sshd配置文件优化

配置文件:/etc/sshd/sshd_config
从以下几个方面
1)不要使用默认的22号端口;
2)不要使用protocol1;
3)限制可登录的用户;
白名单:
AllowUserSUSEr1 user2 …
AllowGroups grp1 grp2…
黑名单:
DenyUsers
DenyGroups
4)设定空闲会话超时时长;
ClientAliveInterval 300
ClientAliveCountMax 0
5)禁止使用空密码;PermitEmptyPasswords no
6)禁止root用户直接登录;
PermitRootLogin no
设置完成之后重启sshd service sshd restart