目录

  • 1 概论
    • 1.1 课程简介
    • 1.2 导入
    • 1.3 计算机安全概念
    • 1.4 OSI安全体系结构
    • 1.5 安全攻击
    • 1.6 安全服务
    • 1.7 安全机制
    • 1.8 网络安全模型
    • 1.9 讨论和作业
  • 2 对称加密和消息机密性
    • 2.1 对称加密原理
    • 2.2 对称分组加密算法
    • 2.3 随机数和伪随机数
    • 2.4 流密码和RC4
    • 2.5 分组密码工作模式
    • 2.6 讨论和作业
  • 3 公钥密码和消息认证
    • 3.1 消息认证方法
    • 3.2 安全散列函数
    • 3.3 消息认证码
    • 3.4 公钥密码原理
    • 3.5 公钥密码算法
    • 3.6 数字签名
    • 3.7 讨论和作业
  • 4 密钥分配和用户认证
    • 4.1 基于对称加密的密钥分配
    • 4.2 Kerberos
    • 4.3 基于非对称加密的密钥分配
    • 4.4 X.509证书
    • 4.5 公钥基础设施
    • 4.6 联合身份管理
    • 4.7 讨论和作业
  • 5 网络访问控制和云安全
    • 5.1 网络访问控制
    • 5.2 可扩展认证协议
    • 5.3 IEEE 802.1X基于端口的网络访问控制
    • 5.4 云计算
    • 5.5 云安全风险和对策
    • 5.6 云端数据保护
    • 5.7 云安全即服务
    • 5.8 讨论和作业
  • 6 传输层安全
    • 6.1 Web安全需求
    • 6.2 安全套接字层和传输层安全
    • 6.3 传输层安全
    • 6.4 HTTPS
    • 6.5 SSH
    • 6.6 讨论和作业
  • 7 无线网络安全
    • 7.1 无线安全
    • 7.2 移动设备安全
    • 7.3 IEEE 802.11无线局域网概述
    • 7.4 IEEE 802.11i无线局域网安全
    • 7.5 讨论和作业
  • 8 电子邮件安全
    • 8.1 引言
    • 8.2 PGP
    • 8.3 S/MIME
    • 8.4 DKIM
    • 8.5 讨论和作业
  • 9 IP安全
    • 9.1 IP安全概述
    • 9.2 IP安全策略
    • 9.3 IPSec通信协议
    • 9.4 安全关联组合
    • 9.5 因特网密钥交换
    • 9.6 密码套件
    • 9.7 讨论和作业
  • 10 恶意软件
    • 10.1 恶意软件类型
    • 10.2 传播-感染内容-病毒
    • 10.3 传播-漏洞利用-蠕虫
    • 10.4 传播-社会工程-垃圾邮件与特洛伊木马
    • 10.5 载荷-系统破坏
    • 10.6 载荷-攻击代理-僵尸病毒与机器人
    • 10.7 载荷-信息窃取-键盘监测器、网络钓鱼与间谍软件
    • 10.8 载荷-隐身-后门与隐匿程序
    • 10.9 防护措施
    • 10.10 分布式拒绝服务攻击
    • 10.11 讨论和作业
  • 11 入侵者
    • 11.1 入侵者
    • 11.2 入侵检测
    • 11.3 口令管理
    • 11.4 讨论和作业
  • 12 防火墙
    • 12.1 防火墙的必要性
    • 12.2 防火墙特征
    • 12.3 防火墙类型
    • 12.4 防火墙载体
    • 12.5 防火墙的位置和配置
    • 12.6 讨论和作业
  • 13 总结
    • 13.1 信息安全
    • 13.2 网络安全
    • 13.3 系统安全
    • 13.4 思维导图
SSH


扩展阅读


SSH安全协议


安全外壳协议 

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。


功能

传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的, 就是很容易受到“中间人”(man-in-the-middle)这种方式的攻击。所谓“中间人”的攻击方式, 就是“中间人”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。通过使用SSH,你可以把所有传输的数据进行加密,这样”中间人”这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、PoP、甚至为PPP提供一个安全的”通道”


验证

从客户端来看,SSH提供两种级别的安全验证。 

第一种级别(基于口令的安全验证) 

只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。 

第二种级别(基于密匙的安全验证) 

需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。 

用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。 

第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要10秒


详细

如果你考察一下接入ISP(Internet Service Provider,互联网服务供应商)或大学的方法,一般都是采用Telnet或POP邮件客户进程。因此,每当要进入自己的账号时,你输入的密码将会以明码方式发送(即没有保护,直接可读),这就给攻击者一个盗用你账号的机会—最终你将为他的行为负责。由于SSH的源代码是公开的,所以在Unix世界里它获得了广泛的认可。Linux其源代码也是公开的,大众可以免费获得,并同时获得了类似的认可。这就使得所有开发者(或任何人)都可以通过补丁程序或b u g修补来提高其性能,甚至还可以增加功能。开发者获得并安装SSH意味着其性能可以不断提高而无须得到来自原始创作者的直接技术支持。SSH替代了不安全的远程应用程序。SSH是设计用来替代伯克利版本的r命令集的;它同时继承了类似的语法。其结果是,使用者注意不到使用SSH和r命令集的区别。利用它,你还可以干一些很酷的事。通过使用SSH,你在不安全的网络中发送信息时不必担心会被监听。你也可以使用POP通道和Telnet方式,通过SSH可以利用PPP通道创建一个虚拟个人网络( Virtual Private Network,VPN)。SSH也支持一些其他的身份认证方法,如Kerberos和安全ID卡等。 

但是因为受版权和加密算法的限制,可以预计将来会有越来越多的人使用SSH而不是Telnet或者POP3等


层次

SSH 主要由三部分组成: 

1传输层协议 [SSH-TRANS] 

提供了服务器认证,保密性及完整性。此外它有时还提供压缩功能。 SSH-TRANS 通常运行在TCP/IP连接上,也可能用于其它可靠数据流上。 SSH-TRANS 提供了强力的加密技术、密码主机认证及完整性保护。该协议中的认证基于主机,并且该协议不执行用户认证。更高层的用户认证协议可以设计为在此协议之上。 

2用户认证协议 [SSH-USERAUTH] 

用于向服务器提供客户端用户鉴别功能。它运行在传输层协议 SSH-TRANS 上面。当SSH-USERAUTH 开始后,它从低层协议那里接收会话标识符(从第一次密钥交换中的交换哈希H )。会话标识符唯一标识此会话并且适用于标记以证明私钥的所有权。 SSH-USERAUTH 也需要知道低层协议是否提供保密性保护。 

3连接协议 [SSH-CONNECT] 

将多个加密隧道分成逻辑通道。它运行在用户认证协议上。它提供了交互式登录话路、远程命令执行、转发 TCP/IP 连接和转发 X11 连接。


结构

SSH是由客户端和服务端的软件组成的,有两个不兼容的版本分别是:1.x和2.x。 用SSH 2.x的客户程序是不能连接到SSH 1.x的服务程序上去的。OpenSSH 2.x同时支持SSH 1.x和2.x。 

服务端是一个守护进程(daemon),他在后台运行并响应来自客户端的连接请求。服务端一般是sshd进程,提供了对远程连接的处理,一般包括公共密钥认证、密钥交换、对称密钥加密和非安全连接。 

客户端包含ssh程序以及像scp(远程拷贝)、slogin(远程登陆)、sftp(安全文件传输)等其他的应用程序。 

他们的工作机制大致是本地的客户端发送一个连接请求到远程的服务端,服务端检查申请的包和IP地址再发送密钥给SSH的客户端,本地再将密钥发回给服务端,自此连接建立。SSH 1.x和SSH 2.x在连接协议上有一些差异。 

一旦建立一个安全传输层连接,客户机就发送一个服务请求。当用户认证完成之后,会发送第二个服务请求。这样就允许新定义的协议可以与上述协议共存。连接协议提供了用途广泛的各种通道,有标准的方法用于建立安全交互式会话外壳和转发(“隧道技术”)专有 TCP/IP 端口和 X11 连接。 

SSH被设计成为工作于自己的基础之上而不利用超级服务器(inetd),虽然可以通过inetd上的tcpd来运行SSH进程,但是这完全没有必要。启动SSH服务器后,sshd运行起来并在默认的22端口进行监听(你可以用 # ps -waux | grep sshd 来查看sshd是否已经被正确的运行了)如果不是通过inetd启动的SSH,那么SSH就将一直等待连接请求。当请求到来的时候SSH守护进程会产生一个子进程,该子进程进行这次的连接处理


应用

SSH另类应用:用ssh做socks5代理 [5] 

1. 下载MyEntunnel。 

2.下载PuTTY,解压到MyEntunnel程序的目录下。 

3.运行MyEntunnel.exe,设置:SSH Server里头填上ssh ftp的地址或IP,填好用户名和密码,点Connect,系统栏里面的小锁变成绿色就连接成功了。 

4.设置浏览器。IE是不支持socks代理的,用firefox好了,打开firefox的代理设置页,在socks主机处填上127.0.0.1端口填原先设置的,默认7070。 

Win主机环境运行SSH命令的方法 

对于Win主机用户,可以下载工具putty来进行shell管理。具体的命令依赖于登录到远端主机所使用的系统和Shell。 

一些常用的shell命令如下: 

cd[目录名]转换路径 

cd.. 返回上级目录 

ls显示当前目录下所有文件 

rm[-r]-f[][文件名]删除文件,加[-r]可以删除文件下所有子文件,如rm[ -r]-f [abc]删除abc文件夹及文件夹下的所有文件 

tar -xzf [解压下载的压缩包] 

unzip[文件名]解压文件 

cp -rpf .A/* B 将A文件夹中的所有文件拷贝到其上级目录B中 

wget(远程下载文件到服务器上)


扩展

SSH协议框架中设计了大量可扩展的冗余能力,比如用户自定义算法、客户自定义密钥规则、高层扩展功能性应用协议。这些扩展大多遵循 IANA 的有关规定,特别是在重要的部分,像命名规则和消息编码方面。 

SSH采用面向连接的TCP协议传输 应用22号端口 安全系数较高。


启动方法

方法一:使用批处理文件 

在服务器端安装目录下有两个批处理文件“start-ssh.bat”和“stop-ssh.bat”。运行“start-ssh.bat”文件就可以启动SSH服务,要停止该服务只要执行“stop-ssh.bat”文件即可。 

方法二:使用SSH服务配置程序 

在安装目录下,运行“fsshconf.exe”程序,它虽是SSH服务器的配置程序,但也可以用来启动和停止SSH服务。在弹出的“F-Secure SSH Server Configuration”窗口中,点击左面列表框中的“Server Settings”后,在右边的“Service status”栏中会显示服务器状态按钮,如果服务器是停止状态,则按钮显示为“Start service”,点击该按钮就可启动SSH服务,再次点击可停止SSH服务。 

方法三:使用NET命令 

在服务器端的“命令提示符”窗口中,输入“net start ″F-secure SSH Server″”命令,就可以启动SSH服务,要停止该服务,输入“net stop ″F-Secure SSH Server″”命令即可。其中“F-Secure SSH Server”为SSH服务器名,“net start”和“net stop”为Windows系统启动和停止系统服务所使用的命令。 

启动了SSH服务后,一定要关闭Telnet服务,这样服务器就处在安全环境之中了,不用再怕数据被窃取。


SSH 安全技巧

SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。S S H最初是U N I X系统上的一个程序,后来又迅速扩展到其他操作平台。S S H在正确使用时可弥补网络中的漏洞。客户端包含ssh程序以及像scp(远程拷贝)、slogin(远程登陆)、sftp(安全文件传输)等其他的应用程序。SSH有很多非常酷的特性,如果它是你每天的工作伴侣,那么我想你有必要了解以下10条高效使用SSH的秘籍,它们帮你节省的时间肯定会远远大于你用来配置它们的时间。 

服务器间跳转


  有些时候,你可能没法直接连接到某台服务器,而需要使用一台中间服务器进行中转,这个过程也可以自动化。首先确保你已经为服务器配置了公钥访问,并开启了agent forwarding,可以通过2条命令来连接目标服务器,不会有任何提示输入: 

  sshgateway  gatewaysshgateway  gateway ssh db 

  然后在你的本地SSH配置中,添加下面这条配置: 

  Host db 

  HostName 

  ProxyCommand ssh gateway netcat -q 600 %h %p 

  可以通过一条命令来直接连接目标服务器了: 

  $ ssh db 

  这里你可能会需要等待长一点的时间,因为SSH需要进行两次认证,注意netcat也有可能被写成nc或者ncat或者前面还需要加上g,你需要检查你的中间服务器来确定实际的参数。 

省去用户名


  如果你在远程服务器上的用户名和你本地的用户名不同,你同样可以在SSH配置中进行设置: 

  Host www* mail 

  HostName %h 

  User simon 

  就算我的本地用户名是 smylers,我仍然可以这样连接我的服务器: 

  $ ssh www2 

  SSH会使用simon账户连接你的服务器,同样,Putty可以保存这个信息在你的session中。 

主机别名


  你也可以在你的SSH配置中直接定义主机别名,就像下面这样: 

  Host dev 

  HostName 

  你还可以使用通配符来进行分组: 

  Host dev intranet backup 

  HostName %h 

  Host www* mail 

  HostName %h 

  在Putty中你可以为每个主机名保存单独的session,然后双击建立连接(但是它可能没办法支持通配符)。 

省略主机名 

输入服务器的完整主机名来建立一个新的SSH连接实在是太乏味无聊了,尤其是当你有一组拥有相同域名但是子域名不同的服务器需要管理时。 

  或许你的网络已经配置了可以直接使用短域名,比如intranet,但是如果你的网络不支持,实际上你可以自己搞定这个问题,而不用求助网络管理员。 

  解决办法根据你用的操作系统而略有差异,下面是我的Ubuntu系统的配置: 

  prepend domain-search 

然后你需要重启网络:sudorestartnetwork−manager  不同的系统,这两条命令可能会略有差异。连接中转有时候你可能需要从一个服务器连接另外一个服务器,比如在两个服务器之间直接传输数据,而不用通过本地电脑中转:  www1sudorestartnetwork−manager  不同的系统,这两条命令可能会略有差异。连接中转有时候你可能需要从一个服务器连接另外一个服务器,比如在两个服务器之间直接传输数据,而不用通过本地电脑中转:  www1 scp -pr templates www2:PWD  (顺便说一下,当你需要在两台服务器间拷贝文件时,PWD  (顺便说一下,当你需要在两台服务器间拷贝文件时,PWD变量时非常有用的),因为即使你已经在两台服务器上添加了你本地电脑的公钥,scp默认仍然会提示你输入密码:这是因为你用来作为跳板的那台服务器上并没有你的私钥,所以,第二台服务器会拒绝你的公钥,但是一定不要通过将你的私钥拷贝到中转服务器上来解决这个问题,你可以使用agent forwarding来解决这个问题,只要在你的.ssh/config文件中加入下面这行代码就可以了:ForwardAgent yes或者是在Putty中勾上“Allow agent forwarding”选项,本地SSH就变成了第一台服务器的SSH代理,从第一台服务器在连接其它服务器就变和和在你本地一样简单,注意,如果要开启这个选项,前提是这个中间服务器值得你信任。 

别再输入密码 

如果你还在通过密码方式登录SSH,那么你或许应该试试SSH Keys,首先使用OpenSSH为自己生成一对密钥: 

  ssh−keygen  跟随指示,完成之后,你应该可以在你的.ssh目录下看到两个文件,idrsa就是你的私钥,而idras.pub则是你的公钥,现 在你需要将你的公钥拷贝到服务器上,如果你的系统有ssh−copy−id命令,拷贝会很简单:ssh−keygen  跟随指示,完成之后,你应该可以在你的.ssh目录下看到两个文件,idrsa就是你的私钥,而idras.pub则是你的公钥,现 在你需要将你的公钥拷贝到服务器上,如果你的系统有ssh−copy−id命令,拷贝会很简单: ssh-copy-id 

否则,你需要手动将你的公钥拷贝的服务器上的~/.ssh/authorized_keys文件中: 

  $ < ~/.ssh/id_rsa.pub ssh ‘mkdir -p .ssh; cat >> .ssh/authorized_keys; chmod go-w .ssh .ssh/authorized_keys’ 

  试试重新连接到SSH服务器,或是拷贝文件,是不是已经不需要再输入密码了? 

长连接 

如果你发现自己每条需要连接同一个服务器无数次,那么长连接选项就是为你准备的: 

  ControlPersist 4h 

  你每次通过SSH与服务器建立连接之后,这条连接将被保持4个小时,即使在你退出服务器之后,这条连接依然可以重用,因此,在你下一次(4小时之内)登录服务器时,你会发现连接以闪电般的速度建立完成,这个选项对于通过scp拷贝多个文件提速尤其明显,因为你不在需要为每个文件做单独的认证了。 

多条连接共享 

如果你需要在多个窗口中打开到同一个服务器的连接,而不想每次都输入用户名,密码,或是等待连接建立,那么你可以配置SSH的连接共享选项,在本地打开你的SSH配置文件,通常它们位于~/.ssh/config,然后添加下面2行: 

  ControlMaster auto 

  ControlPath /tmp/ssh_mux_%h_%p_%r 

  试试断开你与服务器的连接,并建立一条新连接,然后打开一个新窗口,再创建一条连接,你会发现,第二条连接几乎是在瞬间就建立好了。 

  Windows用户 

  如果你是Windows用户,很不幸,最流行的开源SSH客户端Putty并不支持这个特性,但是Windows上也有OpenSSH的实现,比如这个Copssh,如果你觉得下面的一些技巧对你很有帮助,或许你应该试试Copssh。 

  文件传输 

  连接共享不止可以帮助你共享多个SSH连接,如果你需要通过SFTP与服务器传输文件,你会发现,它们使用的依然是同一条连接,如果你使用的Bash,你会发现,你甚至SSH甚至支持Tab对服务器端文件进行自动补全,共享连接选项对于那些需要借助SSH的工具,比如rsync,git等等也同样有效。 

加速连接


  如果你确保你和某个服务器之间的连接是安全的(比如通过公司内网连接),那么你就可以通过选择arcfourencryption算法来让数据传输更快一些: 

  Host dev 

  Ciphers arcfour 

  注意这个加速是以牺牲数据的“加密”性为代价的,所以如果你连接的是位于网上的服务器,千万不要打开这个选项,并且确保你是通过VPN建立的连接。 

减少延迟 

如果每次连接服务器都意味着你需要等待几十秒而无所事事,那么你或许应该试试在你的SSH配置中加入下面这条: 

  GSSAPIAuthentication no 

  如果这条命令有效的话,你应该通知你的系统管理员让他在服务器上禁用这个选项,这样其他人就不用再分别添加这条配置到它们的本地配置了 

————————————————

版权声明:本文为CSDN博主「Big_quant」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/lvsehaiyang1993/java/article/details/80881107


openssh


OpenSSH 简介

通俗来讲,OpenSSH是一种服务,用于在远程系统上安全运行shell

ssh是通常用来远程登录到该系统的命令

ssh命令也可用于在远程系统中运行命令

常用的登录工具

telnet(23/tcp)

远程登录协议,认证、数据传输明文,不安全

路由交换用到telnet

主要用作测试端口是否处于开启状态

ssh(22/tcp)

通信过程及认证过程是加密的,主机认证(会把信任的主机加入当前家目录的.ssh/known_hosts文件)

用户认证过程加密(需用户名密码)

数据传输过程加密

dropbear

嵌入式系统专用的SSH服务器端和客户端工具

ssh相关

SSH 版本


v1:基于CRC-32做MAC,无法防范中间人(man-in-middle)攻击

v2:双方主机协议选择安全的MAC方式。基于DH算法做密钥交换,基于RSA或DSA算法实现身份认证

SSH 认证方式


基于口令认证(密码,默认)

基于密钥认证(需配置)

OpenSSH工作模式


是基于C/S架构工作的

服务器端   //sshd,配置文件在/etc/ssh/sshd_config(需配置)

客户端     //ssh,配置文件在/etc/ssh/ssh_config(一般默认)

    ssh-keygen      //密钥生成器

    ssh-copy-id     //将公钥传输至远程服务器

    scp             //跨主机安全复制工具


ssh示例

//以指定用户身份在选定主机上连接到远程shell(root是以目标主机的root身份登录,而不是本地主机的root)

[root@localhost ~]# ssh root@192.168.184.133

The authenticity of host '192.168.184.133 (192.168.184.133)' can't be established.

ECDSA key fingerprint is SHA256:OYFdTz2MgvD/tyI9c/0mVl3NrvthKDrQes3tdY9EUhw.

ECDSA key fingerprint is MD5:06:6f:66:41:d3:fc:dd:65:9f:62:30:ca:f3:1d:6d:54.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.184.133' (ECDSA) to the list of known hosts.

root@192.168.184.133's password: 

Last login: Mon Apr  1 15:23:57 2019 from 192.168.184.1


//以当前系统的当前账号身份登录远程主机跟本机相同的账号身份,前提当前用户身份在远程主机上有

[root@localhost ~]# ssh 172.16.12.138

root@172.16.12.138's password:

Last login: Tue Jul 10 07:34:03 2018 from 172.16.12.136


//远程不登录执行命令

[root@localhost ~]# ssh root@192.168.184.133 'ifconfig ens33'

root@192.168.184.133's password: 

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.184.133  netmask 255.255.255.0  broadcast 192.168.184.255

        inet6 fe80::a52:3740:9d26:67cc  prefixlen 64  scopeid 0x20<link>

        ether 00:0c:29:50:8a:81  txqueuelen 1000  (Ethernet)

        RX packets 2674  bytes 249386 (243.5 KiB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 1689  bytes 203341 (198.5 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


ssh主机秘钥

ssh通过公钥加密的方式保持通信安全。当某一ssh客户端连接到ssh服务器时,在该客户端登录之前,服务器会向其发送公钥副本。这可用于为通信渠道设置安全加密,并可验证客户端的服务器。

用户第一次使用ssh连接到特定服务器时,ssh命令可在用户的~/.ssh/known_hosts文件中存储该服务器的公钥,此文件是ssh登录后生成,并且会有主机认证,选yes下一步

此后每次登录,客户端都会对比~/.ssh/known_hosts文件中的服务器条目和服务器发送的的公钥,匹配没输入密码就行,不匹配则连接中断

遇到中断(如公钥丢失或替换公钥),则删除响应的旧条目,或删除整个文件,让其生成新文件即可

//主机密钥存储在SSH服务器上的 /etc/ssh/ssh_host_key* 中

[root@localhost ~]# ls /etc/ssh

moduli       ssh_host_ecdsa_key      ssh_host_ed25519_key.pub

ssh_config   ssh_host_ecdsa_key.pub  ssh_host_rsa_key

sshd_config  ssh_host_ed25519_key    ssh_host_rsa_key.pub


//ssh_host_ecdsa_key.pub,发送的公钥,对方接受认可了身份,就可以登录

//ssh_host_ecdsa_key,私钥


配置基于 SSH 密钥的身份验证

ssh允许用户使用私钥-公钥方案进行身份验证,将生成私钥和公钥这两个密钥

私钥文件用作身份验证凭据,像密码一样,必须妥善保管

公钥复制到用户希望登录的系统,用于验证私钥。公钥并不需要保密

拥有公钥的ssh服务器可以发布仅持有您私钥的系统才可解答的问题。因此,可以根据所持有的密钥进行验证

使用ssh-keygen命令生成秘钥。将会生成私钥~/.ssh/id_rsa(600权限)和公钥 ~/.ssh/id_rsa.pub(644权限),.shh目录(700权限)


//一路回车,默认选项就行

[root@135 ~]# ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa): 

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:6VW4KTIdkEz/NhjVAIgxJ7rUc0wXaVz2b4mcICADv6A root@135

The key's randomart image is:

+---[RSA 2048]----+

|  ..*=*++==o     |

|   +.O+=+o o.    |

|  + + o.= o o    |

| o o + . B * + . |

|E . . o S B + +  |

|       + + . .   |

|        .        |

|                 |

|                 |

+----[SHA256]-----+

//生成公钥私钥

[root@135 ~]# ls .ssh/

id_rsa  id_rsa.pub  known_hosts


在可以使用基于密钥的身份验证前,需要将公钥复制到目标系统上。可以使用ssh-copy-id完成这一操作

[root@135 ~]# ssh-copy-id root@192.168.184.134

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

root@192.168.184.134's password: 


Number of key(s) added: 1


Now try logging into the machine, with:   "ssh 'root@192.168.184.134'"

and check to make sure that only the key(s) you wanted were added


//将主机135上生成的公钥,发送给134主机,并且发送过去后的权限为600

[root@134 ~]# ll .ssh/

总用量 4

-rw-------. 1 root root 390 4月   1 17:06 authorized_keys



验证,135登录134,135的公钥给了134,就可不用密码登录

[root@135 ~]# ssh root@192.168.184.134

Last login: Mon Apr  1 17:02:25 2019 from 192.168.184.135

[root@134 ~]# 


134登135还是需要输入密码,可用另一种方式(scp)验证


[root@134 ~]# ssh root@192.168.184.135

root@192.168.184.135's password: 

Last login: Mon Apr  1 17:19:33 2019 from 192.168.184.134

[root@135 ~]# 


[root@135 ~]# ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa): 

/root/.ssh/id_rsa already exists.

Overwrite (y/n)? y

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:eYVMWfFzjg8vzOzN/wpHyRXhiwZPBatf0uBOqZjZeNs root@135

The key's randomart image is:

+---[RSA 2048]----+

|          .ooo.+.|

|         o.. .+ .|

|          o..+o.o|

|         . .*.=B.|

|        S .. O*+.|

|         .* *=o+ |

|         = +.o* o|

|          . o+ + |

|           . Eo.B|

+----[SHA256]-----+


//将公钥id_rsa.pub以scp方式复制到134主机root/.ssh/下,并改名为authorized_keys

//在配置文件/etc/ssh/sshd_config中定义authorized_keys文件的名字,所以必须叫这个,当然可以改,但一般都默认

[root@135 ~]# scp .ssh/id_rsa.pub root@192.168.184.134:/root/.ssh/authorized_keys

root@192.168.184.134's password: 

id_rsa.pub                                                                   100%  390   356.4KB/s   00:00 


//此时134上的公钥authorized_keys权限为644,需要改成600,然后远程验证


关于scp命令

    -r      //递归复制(针对目录,常用此选项)

    -p      //保持权限

    -P      //端口

    -q      //静默模式

    -a      //全部复制

    //上传下载,只需要把文件名换个位置即可,上传在前,下载在后


上传文件到远程主机

[root@134 ~]# scp test.sh root@192.168.184.135:/tmp

root@192.168.184.135's password:

test.sh                                                       100%   45    29.8KB/s   00:00


从远程主机上下载文件到本地

[root@localhost ~]# scp root@172.16.12.138:/tmp/test.sh .

root@172.16.12.138's password:

test.sh                                                       100%   45    39.1KB/s   00:00


自定义 SSH 服务配置及安全

通常不需要修改,可以在配置文件/etc/ssh/sshd_config中修改

PermitRootLogin {yes|no}    //是否允许root用户远程登录系统

PermitRootLogin without-password    //仅允许root用户基于密钥方式远程登录

PasswordAuthentication {yes|no}     //是否启用密码身份验证,默认开启


密码应该经常换且足够复杂

使用非默认端口,/etc/ssh/sshd_config可修改

限制登录客户端地址

仅监听特定的IP地址

禁止管理员直接登录

仅允许有限制用户登录(/etc/hosts.*)

AllowUsers

AllowGroups

使用基于密钥的认证

禁止使用空密码

禁止使用SSHv1版本

设定空闲会话超时时长

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

限制ssh的访问频度和并发在线数

做好日志的备份,经常分析(集中于某台服务器),/var/log/message和/var/log/secure日志文件中

总结

秘钥认证的过程及配置密钥认证登录步骤


使用ssh-keygen命令生成秘钥:ssh-keygen -t rsa,生成id_rsa(私钥) id_rsa.pub(公钥)

ssh-copy-id将公钥复制到目标系统上(scp命令也可以):ssh-copy-id root@目标主机

查看目标主机家目录.ssh目录下生成的authorized_keys文件权限,权限要是600

登录验证

————————————————

版权声明:本文为CSDN博主「Wahahaaaaaa」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Wahahaaaaaa/java/article/details/88954938