| 
       
	1. ssh及openssl简介: 
	  
	SSH: 
	ssh是secure shell,是用来通过网络来提供安全的远程访问的工具,C/S结构,在ssh之前,最早的远程计算机连接工具是telnet 
	telnet是使用明文通信的,所以安全性很差,除非紧急情况,否则不要使用telnet。 
	ssh则比telnet安全许多,而openssl则是ssh的一种开源实现, 
	  
	OPENSSH 
	  
	它可以作为 rlogin、 rsh rcp 以及 telnet 的直接替代品使用。 更进一步, 其他任何 TCP/IP 连接都可以通过 SSH 安全地进行隧道/转发。 OpenSSH 对所有的传输进行加密, 从而有效地阻止了窃听、 连接劫持, 以及其他网络级的攻击。OpenSSH 由 OpenBSD project 维护。 
	登录过程和使用 rlogin 或 telnet 建立的会话非常类似。 在连接时, SSH 会利用一个密钥指纹系统来验证服务器的真实性。 只有在第一次连接时, 用户会被要求输入 yes。 之后的连接将会验证预先保存下来的密钥指纹。 如果保存的指纹与登录时接收到的不符, 则将会给出警告。 指纹保存在 ~/.ssh/known_hosts 中, 对于 SSH v2 指纹, 则是 ~/.ssh/known_hosts2。 
	  
	默认情况下, 较新版本的 OpenSSH 只接受 SSH v2 连接。 如果能用版本 2 则客户程序会自动使用, 否则它会返回使用版本 1 的模式。 此外, 也可以通过命令行参数 -1 或 -2 来相应地强制使用版本 1 或 2。 保持客户端的版本 1 能力是为了考虑较早版本的兼容性。 
	  
	  
	SSH有两个版本: 
	1. sshv1   
	sshv1 基于CRC-32做MAC(完整性校验),无加密,只是校验码,强烈建议不使用。非常不安全 
	  
	2. sshv2 
	  
	sshv2 基于双方主机的协商选择使用最安全的MAC方式 
	加密机制及MAC机制由双方协商选定: 
	基于DH算法,实现密钥交换,基于RSA或DSA实现身份认证 
	客户端通过检查服务器端的主机密钥来判断是否能够继续通信 
	  
	  
	实际使用中,可以通过命令行参数Protocol 2,1 来相应地强制使用版本 1 或 2。  
	保持客户端的版本 1 能力是为了考虑较早版本的兼容性。 
	也可以只写2,而放弃兼容不安全的sshv1 
	  
	  
	2. OPENSSH客户端: 
	  
	openssh是C/S架构,所以就有服务端和客户端两部分组成,linux下常用的客户端软件ssh, windows下常用的有putty,xshell,secrecrt,sshshellclient等 
	  
	2.1 openssh的客户端组件: 
	  
	2.1.1 ssh 配置文件是/etc/ssh/ssh_config 
	  
	语法: 
	
		
			
				
					
						
							
								ssh [username]@host [COMMAND]  [-p PORT] 
							
								ssh -l username host [COMMAND] 
						 
					 | 
				 
			
		 
	 
 
	  
	#若没指定username,则使用本地当前用户尝试登陆,如果远程主机不存在此用户,会报错 
	#COMMAND,就是不远程登陆,只是在远程主机上执行COMMAND,然后将结果返回给本机。 
	  
	例如: 
	需要获取192.168.229.202主机的ifconfig信息,ssh端口监听在2222端口上: 
	  
	  
	2.1.2 scp: 利用ssh协议在主机之间实现安全文件传输的工具 
	  
	语法: 
	scp SRC1...DEST 
	  
	分两种情况: 
	1. 原文件在本机,目标为远程 
	是将本地/path/to/somefile文件,以USERNAME用户登陆到远程主机HOST上,复制到远程主机的/path/to/somewhere 
	  
	例如:  
	将本地/etc/fstab文件复制到www.881027.com主机上/tmp下, 注意www.881027.com主机的ssh端口是2222 
	  
	2. 源文件在远程,本地为目标 
	
		
			
				
					
						
							
								 
							
								-r: 复制目录时使用 
							
								-p: 保持源文件的元数据信息,包括属主,属组,mode,timestamp (如果远程主机不存在这个用户,也不行) 
							
								-q: 静默模式 
							
								-P PORT: 指定ssh协议监听的端口 
							
								例如: 
							
								将远程主机/tmp/fstab文件下载到本机/etc下 
							
								 
						 
					 | 
				 
			
		 
	 
 
	2.1.3 sftp: 基于ssh的ftp服务 
	sftp登陆进去,可以使用很多bash的命令,例如ls,cd, mkdir, put, get等ftp命令 
	  
	用法: sftp USERNAME@HOST 
	  
	例如: 
	sftp登陆到www.881027.com,ssh端口2222,并下载www.881027.com主机上/etc/fstab文件到本地 
	  
	3. openssh的服务器端: sshd 
	  
	配置文件: /etc/ssh/sshd_config 
	ssh端口,控制sshd服务的各种运行参数等,下面最佳实践里有很多应用 
	这个命令可以通过 
	#man sshd_config 
	来查看每一个参数的详细说明和使用帮助 
	  
	服务脚本: /etc/rc.d/init.d/sshd 
	控制sshd服务状态,启动,停止,重启,查看状态等 
	脚本配置文件: /etc/sysconfig/sshd 
	  
	  
	3.1 经常需要修改的参数: 
	
		
			
				
					
						
							
								PORT:修改默认监听的端口 
							
								ListenAddress 0.0.0.0 ;默认表示监听本地所有地址,也可以设定只监听特定ip地址 
							
								Protocol 2,1 ;优先选择2,向下兼容sshv1 
							
								HostKey /etc/ssh/ssh_host_rsa_key;当客户端连接时候,发送的密钥 
							
								HostKey /etc/ssh/ssh_host_dsa_key;当客户端连接时候,发送的密钥, DSA只能做身份验证 
							
								KeyRegenerationInterval 1h;密钥交换间隔,服务器自动进行的 
							
								LoginGraceTime 2m;登陆窗口宽限期, 就是弹出登陆窗口后,给你输入账号密码的时间 
							
								PermitRootLogin yes 
							
								    yes:允许root用户首次直接ssh登录 
							
								    no: 不允许root用户首次直接ssh登陆,但是根据需要,可以从普通用户su - root 
							
								MaxAuthTries 6;最多登陆失败次数 
							
								MaxSessions 10;最多可支持的session数 
							
								RSAAuthentication yes ;是否启用RSA验证 
							
								PubkeyAuthentication yes ;是否启用公钥验证(非对称加密) 
							
								AuthorizedKeysFile .ssh/authorized_keys ;授权的密钥文件, 我们可以通过追加公钥信息到这个authorized_keys,来免密码登陆 
							
								ClientAliveInterval 0 ;服务器端向客户端请求消息的时间间隔,0 为不发送 
							
								ClientAliveCountMax 300 ;服务器发出请求后客户端没有响应的次数达到一定值 
							
								等等 
						 
					 | 
				 
			
		 
	 
 
	我只列举一些常用的选项,还有很多选项没有一一列举,可以#man sshd_config去翻文档吧。 
	  
	  
	4. sshd认证方式: 
	1. 基于口令的认证: 
	没啥好说的, 用户名,密码认证 
	  
	2. 基于密钥(公钥中的密钥)的认证: 
	  
	逻辑: 
	a. 需要一对儿密钥,本地保留private key, 
	b. 将public key放到远程主机上的用户家目录: ~/.ssh/ 
	c. 将本地public key追加到 远程主机家目录 ~/.ssh/authorized_users 
	  
	步骤: 
	
		
			
				
					
						
							
								         
							
								        默认密钥为id_rsa, id_rsa.pub 
							
								        -f path/to/somefile: 密钥文件保存位置 
							
								        -p '' 指定oldpasswd 
						 
					 | 
				 
			
		 
	 
 
	  
	  
	也可以使用工具直接生成密钥对儿,直接上传到远程主机: 
	
		
			
				
					
						
							
								         
							
								        ssh-copy-id -i id_rsa.pub "-p 7767 root@sbi.881027.com" 
							
								        ssh -p 222 hostname 
						 
					 | 
				 
			
		 
	 
 
	  
	5. ssh服务的最佳实践: 
	  
	1. 不要使用默认端口22 
	2. 不要使用protocol 1 
	3. 限制可登陆的用户 
	白名单: 
	AllowUsers user1 user2 user3... 
	AllowGroups grp1 grp2 .... 
	黑名单: 
	DenyUsers user1 user2  
	DenyGroups grp1 grp2 
	  
	#黑白名单不能同时使用,只能使用一种 
	  
	4. 设定空闲会话超时时长 
	ClientAliveInterval 300  #秒数 
	ClientAliveCountMAX 0 #空闲计数最大值为0 
	  
	5. 利用防火墙设置ssh访问策略: 
	  
	6. 仅监听在特定的IP地址上,而非本机所有的IP地址 
	  
	7. 使用强密码策略 
	#tr -dc A-Za-z0-9 < /dev/urandom | head -c 20 | xargs 
	  
	8. 使用基于密钥的认证 
	  
	9, 禁止使用空密码 
	  
	10. 禁止管理员直接登录 
	  
	11. 显示ssh的访问频度 
	iptables可以做到 
	  
	12. 做好日志,经常分析 
	  
	把服务器按照最佳实践来优化一番,在去对比下 lastb的ssh攻击,就会看到明显的效果。等以后学到iptables,在做更进一步的优化吧。 
	  
	另外,提一个小软件 dropbear,是嵌入式轻量级的shh客户端工具,可以编译安装试试。比openssh小很多,但是功能却很完整的ssh开源工具。 
	 
	  
      (责任编辑:IT) |