• SSH


    SSH简介

    	1)ssh(secure shell),是由IETF小组所制定的,ssh是创建在应用层和传输层基础上的安全协议,为计算机上的shell提供安全的传输和使用环境。
    	2)ssh目前是较为可靠的,专为远程登录会话和其他网络服务提供安全性协议,利用ssh协议可以有效防止远程管理过程中的信息泄漏问题,通过ssh可以对所有传输的数据进行加密,也能防止DNS欺骗和IP欺骗。
    	3)ssh的另一个优点就是其传输的数据是可以经过压缩的,所以可以加快传输的速度,ssh有很多功能,它既可以代替Telnet,有可为FTP、POP、甚至PPP提供一个安全通道。
    	4)ssh是一种协议,监听在TCP的22端口,主要提供安全的远程登录功能。
    	5)openssh是ssh协议的开源实现,在嵌入式服务器中,用户通过远程主机通过openssh连接服务器,在linux下,是基于tty运行login程序来供client程序连接。
    	6)具体的软件实现:
    		OpenSSH:ssh协议的开源实现,CentOS 默认安装
    		dropbear:另一个开源实现
    	7)SSH 协议版本
    		v1:基于CRC-32做MAC,不安全,man-in-middle
    		v2:双方主机协议选择安全的MAC方式
    		基于DH算法做密钥交换,基于RSA或DSA实现身份认证
    	8)用户登录认证的两种方式:
    		1》基于password
    			只要你知道自己帐号和口令,就可以登录到远程主机。
    			所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。
    			可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。
    		2》基于key
    			ssh结合了公钥(public key)和私钥(secret key)。
    			公钥用于在建立安全通道前在客户端和服务端之间传输密钥和进行身份认证;
    			私钥则用来作为ssh会话的安全保证,对数据进行加密和解密。
    

    SSH的主要特性

    	1)加密:
    		避免数据内容泄漏。
    	2)通信的完整性:
    		避免数据被篡改,以及避免发送或接受地址伪装。
    		检查数据是否被篡改,数据是否来自发送者:
    			SSH-2通过MD5和SSH-1实现
    			SSH-1是使用CRC-32实现
    	3)认证:
    		识别数据发送者或接收者身份。
    		客户端验证SSH服务端身份:
    			避免中介人攻击和重定向请求的攻击,openssh通过在know-hosts中存储的主机名和host key对服务端身份进行认证
    		服务端验证请求者身份:
    			提供安全性较弱的用户密码方式,和安全性更强的per-user public-key signature,此外ssh还支持与第三方安全服务系统的集成,如kerberos等。
    	4)授权:
    		用户访问控制
    	5)寄发或建立通道来加密传递基于TCP/IP的会话。
    		可以通过ssh为telnet、ftp等提供通信安全保障。
    		支持三种类型的寄发操作:
    			端口寄发
    			X寄发
    			代理寄发
    

    SSH的组成

    	1)传输层协议 [SSH-TRANS]
    		提供了服务器认证,保密性及完整性。
    		此外它有时还提供压缩功能。 
    		SSH-TRANS 通常运行在TCP/IP连接上,也可能用于其它可靠数据流上。 
    		SSH-TRANS 提供了强力的加密技术、密码主机认证及完整性保护。
    		该协议中的认证基于主机,并且该协议不执行用户认证。
    		更高层的用户认证协议可以设计为在此协议之上。
    	2)用户认证协议 [SSH-USERAUTH]
    		用于向服务器提供客户端用户鉴别功能。
    		它运行在传输层协议 SSH-TRANS 上面。
    		当SSH-USERAUTH 开始后,它从低层协议那里接收会话标识符(从第一次密钥交换中的交换哈希)。
    		会话标识符唯一标识此会话并且适用于标记以证明私钥的所有权。 
    		SSH-USERAUTH 也需要知道低层协议是否提供保密性保护。
    	3)连接协议 [SSH-CONNECT]
    		将多个加密隧道分成逻辑通道。
    		它运行在用户认证协议上。
    		它提供了交互式登录话路、远程命令执行、转发TCP/IP连接和转发X11连接。
    

    SSH处理过程

    	分解为4个主要阶段:
    		1)协商阶段
    		2)服务端认证阶段
    		3)客户端认证阶段
    		4)数据传输阶段
    	1)协商阶段
    		1》服务器打开服务端口(默认为22),等待客户端连接。
    		2》客户端发起TCP连接请求,服务端接收到该请求后向客户端发送包括SSH协议版本信息。
    		3》客户端根据该版本信息与自己的版本。决定将要使用的SSH版本,并向服务端发送选用的SSH版本信息。
    		4》服务端检查是否支持客户端的决定使用的SSH版本、
    		5》上面为止,双方协商已经完成。在该过程中,客户端和服务短发送ssh版本无法兼容时,任何一方都可以断开连接。
    	2)服务端认证阶段
    		完成协议协商后,客户端和服务端已经建立的明文的通信通道,之后进入服务端认证阶段。
    		而ssh协议中没有明确的服务端认证过程,而是通过一系列服务和客户端的交互来确定服务端的身份的,该过程中还会我那次host key、session key、server key等在客户和服务端间进行传输。
    		1》建立明文通道连接后,服务端向客户端发送:
    				host key:用于认证服务端身份。
    				server key:用于帮助建立安全的数据传输通道。
    				8字节的随机数:客户端通过在下一次响应中包含该随机数,防止IP地址欺诈。
    				服务端支持加密算法、压缩方式和认证方式。
    				此时,客户端和服务端使用host key、server key和8字节随机数生成一个128为的MD5值,作为此次会话的session id。
    		
    		2》客户端在接收到服务端host key后,会检查自己的know host数据库中(一般为~/.ssh/know_hosts文件),是否已经包含当前服务端的host key,如果有则继续下一步,如果没有或包含当前服务端的其他host key,则由用户决定是否值得信任该服务端,或终止当前连接。
    		3》客户端向服务端发送session key,由于当前通道还是采用明文的方式传输,所有客户端会采用host key和server key对session key进行两次解密来加强安全性。
    		4》服务端得到session key后,客户端和服务端就可以通过session key对数据进行加密操作,到此,双方完成安全加密的通信连接。
    		5》注意:
    			1。。host key 和server key都是公钥加密(非对称加密),只有通过服务端的私钥才能对其进行解密,以得到session key。
    			2。。在正式使用安全通道前,客户端要求服务端发送使用的session key加密的确认信息,以验证服务端的身份。
    			3。。为避免session key的泄漏,ssh还采取了其他的安全措施:session key仅保存在内存避免其泄漏,周期性更好session key,默认为1小时。
    	3)客户端认证阶段
    		SSH提供了多种客户端认证方式
    			SSH-1的客户端认证方式:
    				password
    				key
    				kerberos
    				Rhost &&RhostsRSA
    				TIS
    			SSH-2的客户端认证方式:
    				password
    				key
    				hostbased
    		查看ssh 服务登录验证
    	4)数据传输阶段
    		该阶段通过session key提供的对称加密算法,进行数据加密,保证传输数据的安全性。
    

    SSH协议的实现工具

    	openssh 是ssh协议的开源实现,linux各发行版都默认现象。
    	opensshd 相关包:
    		openssh
    		openssh-clients
    		openssh-server
    

    ssh 客户端

    	1)客户端组件:
    		1》ssh (ssh client)
    			配置文件:/etc/ssh/ssh_config
    		2》scp
    		3》sftp
    		4》Windows 客户端:
    			xshell, putty, securecrt, sshsecureshellclient
    	2)允许实现对远程系统经验证地加密安全访问
    	3)当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub (CentOS7 默认是ssh_host_ecdsa_key.pub )文件中的公钥到客户机的~./.ssh/know_hosts中,下次连接时,会自动匹配相应私钥,不能匹配,将拒绝连接。
    

    ssh 服务器

    	1)服务器端:
    		sshd (ssh daemon)
    			配置文件: /etc/ssh/sshd_config
    	2)常用参数:
    		Port	指定sshd监听的端口,默认为22(建议修改为非标准端口从而提高安全性)
    		ListenAddress 	ip
    		LoginGraceTime 	2m
    		PermitRootLogin 	yes
    		StrictModes 	yes
    		MaxAuthTries 	6
    		MaxSessions 	10 ,一个连接最大会话
    		PubkeyAuthentication 	yes
    		PermitEmptyPasswords 	no
    		PasswordAuthentication 	yes
    		GatewayPorts 	no
    		ClientAliveInterval	( 单位: 秒)
    		ClientAliveCountMax	( 默认3)
    		UseDNS 	yes(提高ssh速度改为no)
    		MaxStartups  	未认证连接最大值,默认值10
    		Banner 	/path/file
    		 GSSAPIAuthentication 	yes  (提高速度可改为no)
    	3)限制可登录用户的办法:
    			AllowUsers user1 user2 user3
    			DenyUsers
    			AllowGroups
    			DenyGroups
    

    ssh 服务的最佳实践

    	要使用默认端口
    	禁止使用protocol version 1
    	限制可登录用户
    	设定空闲会话超时时长
    	利用防火墙设置ssh 访问策略
    	仅监听特定的IP 地址
    	基于口令认证时,使用强密码策略
    		tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30| xargs
    	使用基于密钥的认证
    	禁止使用空密码
    	禁止root 用户直接登录
    	限制ssh 的访问频度和并发在线数
    	做好日志,经常分析
    
  • 相关阅读:
    Codeforces Round #485 (Div. 2) C题求三元组(思维)
    MongoDB设置访问权限、设置用户
    与MySQL交互(felixge/node-mysql)
    centos Supervisor
    Async详解之一:流程控制
    C# Socket连接请求超时机制
    tcp-client-c++
    C#TCPClient应用-一个简单的消息发送和接收
    centos下各种c++库文件的安装
    AngularJS与RequireJS集成方案
  • 原文地址:https://www.cnblogs.com/shenxm/p/8456749.html
Copyright © 2020-2023  润新知