SSH学习笔记

登陆的基本原理

非对称加密

SSH是基于非对称加密实现的。
html

非对称加密的特色web

  • 秘钥由公钥跟私钥组成
  • 公钥会分发到须要发起通讯的多个网络节点。图中的TopGun既是这样的节点
  • 私钥会存储在Server端,不会处处分发
  • 使用公钥加密的内容,只有私钥才能解密
  • TopGun发起通讯时,使用公钥加密。即使被中间人截获,也没法解密内容,由于他没有私钥
  • Server使用私钥对密文进行解密,得到通讯内容

SSH流程

  1. 第一次登录时,remote server会将本身的公钥下发给client端。同时提示client以下信息算法

    The authenticity of host 'ssh-server.example.com (12.18.429.21)' can't be established.
    RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
    Are you sure you want to continue connecting (yes/no)?

    客户端选yes后,会将远程主机的host, ip,公钥放置到本身的.ssh/known_hosts文件中,这使得后续登陆,能够省去第一步。一个典型的know_hosts文件样例centos

    ldn01.jamieweb.net,139.162.222.67 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4bVleGrAZFttdMBen/ExLWbUUr5UaaX3Wd8U4nwH6LEaOMxuYu2cyrBuwIVZ9gjSoI0fEWhe345HeQJbdNzE/rd5ojebtS9bQiAB9+GVNKHxemBP01M0OaZJVA/GJnSzjdoEfrCGG8SWIDPQjY02yTQwgQHW5zYlr12Hq3FjKzofJ1Q2PSWbCy3crsA/R4vPHRVLPd8RDj+EXWVwvFgTHriuQWnt9Q/djy1LOPrqNgHn1n17cIED1M0zgXpImoLNC+Z44DmopVdmtwRW57IkedktWQdpCNRYTyOj/as/xn5YStXIWwxila16NYeq6O7zqoedWPiad6qnFloobOcft
    nyc01.jamieweb.net,157.230.83.95 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8Gh3exdEvvWqZHdbBogN3kbfutx3af0oO9dof1L+4vFsA8xmMOURjdB/BF9uF44i+1yosOhxh+k0Kjgeo0JAjPWy8e94SpEn2oUFJ3/9y1QzpWR81aAi/B9gSX9KR6uDys1yIhjjBKE0omP6vvSSVndY7BkxXnxBsmvWqeCWP59tFFDVFADG4FLRQW6IPUlD3mJLXxzsbsBUP4x67TAFeHynL/ZyImSlHXWBow3hWopwPouqQpkcIcUZxdt8zR9xmAiEwk8wUDWQg5aMoYp2a8zy7fuUL6PXyomRpoVWKHyZposl1cmST88NXjK+J14oWPHzKAd7zcY29XOXSbKnR
  2. 客户端基于该公钥,加密本身的登陆密码,发送给remote server 。 remote server基于本身的私钥,解密消息,得到client发送的密码,完成认证。因为私钥只有server端有,因此即使中间人攻击,拿刀消息,也没法解密获取client发送的密码安全

安全风险

在第一次登陆时,server下发本身的公钥,client须要信任并存储该公钥,这一步若是被中间人攻击,中间人下发了本身的公钥。从而可以获取到client的登陆密码, 中间人再做为client去跟remote server完成登陆
网络

公钥免密登陆

前面SSH登陆中,每次都要输入本身的密码,很繁琐。能够继续利用非对称加密的原理。client本身也生成一组密钥对。将公钥上传至remote server。这样client和server双方,彼此都有一组公私密钥对,整个登陆过程,均可以加密进行,而不须要密码。具体步骤。ssh

配置步骤

client使用ssh-keygen命令,生成一组公私密钥对。生成后通常在.ssh文件夹下,其中id_rsa为私钥,id_rsa.pub为公钥,将公钥上传至remote server 。这一步仅需作一次。加密

client的公钥上传后,通常存在server 端的/.ssh/authorized_keys文件中。.net

将公钥上传至server 的authorized_keys文件的方法有几种rest

  • 方式1,直接将公钥内容,拷贝到server的.ssh/authorized_keys文件中去。拷贝可使用命令ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub,也能够直接登陆到server,而后手动编辑authorized_keys文件。
  • 方式2,使用命令ssh-copy-id user@host

登陆认证步骤

  1. Client将本身的公钥存放在Server上,追加在文件authorized_keys中。
  2. Server端接收到Client的链接请求后,会在authorized_keys中匹配到Client的公钥pubKey,并生成随机数R,用Client的公钥对该随机数进行加密获得pubKey(R)
    ,而后将加密后信息发送给Client。
  3. Client端经过私钥进行解密获得随机数R,而后对随机数R和本次会话的SessionKey利用MD5生成摘要Digest1,发送给Server端。
  4. Server端会也会对R和SessionKey利用一样摘要算法生成Digest2。
  5. Server端会最后比较Digest1和Digest2是否相同,完成认证过程。

ssh服务的管理

.ssh目录结构

.ssh 文件像user的.profile同样,是跟用户相关的。也即root和ops这两个用户,其.ssh的路径和其下的内容是不同的。.ssh文件的目录结构

  • id_rsa 私钥
  • id_rsa.pub 公钥
  • known_hosts 存储了本机作为client,与多个server通讯时,多个server的公钥
  • authorized_keys 存储了本机做为server时,多个client的公钥,以使得client能免密登陆

centos中ssh守护进程的管理

查询守护进程的状态service sshd status
重启service sshd restarts
启动service sshd start
中止service sshd stop

通常更改了/etc/ssh/sshd_config文件,则须要重启sshd服务

一些远程登陆的配置异常

错误1

Authentication refused: bad ownership or modes for file /somepath/.ssh/authorized_keys

这个错误的缘由是,SSH server会在有登陆访问请求时,检查authorized_keys文件的权限是否配置正确,具体来讲,就是不能开放给除当前用户意外的其它用户写权限。因此解决办法很简单。确认下authorized_keys文件的group和Others是否写权限,有的话,直接去掉

chmod g-w authorized_keys

之因此有这个限制缘由是,一个.ssh文件应该只跟对应的用户相关,至关于用户的profile,该文件的编辑权限,应该只有当前用户,和root能够去编辑。而不能容许其它用户去编辑,不然其它用户能够很容易的添加一些不恶意的client的公钥到该文件,使得恶意的client能够登陆到该server。

固然,你能够不改authorized_keys的权限,而是把/etc/ssh/sshd_config配置文件中的StrictModes 设为no ,从而使得sshd不对文件的权限作校验,但很是不建议这么作。

参考连接

https://www.jianshu.com/p/33461b619d53
https://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html
https://www.daveperrett.com/articles/2010/09/14/ssh-authentication-refused/
https://tldp.meulie.net/en/solrhe/chap15sec122.html

相关文章
相关标签/搜索