Linux SSH服务

简介

SSH:Secure Shell Protocol(22/tcp),安全远程登录
软件实现:
	OpenSSH:SSH协议开源实现,CentOS默认安装
	dropbear:另一种开源实现
协议版本:
	v1:基于CRC-32做MAC,不安全,易受中间人攻击
	v2:双方主机协议选择安全的MAC方式(基于DH做密钥交换,基于RSA或DSA实现身份认证)
登录认证:
	基于password
	基于key

OpenSSH

介绍

相关包:
	openssh
	openssh-clients
	openssh-server
工具:
	基于C/S结构
	Client:
		Linux:ssh,scp,sftp,slogin
		Windows:xshell,securecrt,putty
	Server:
		sshd

客户端

配置文件:/etc/ssh/ssh_config
		#StrictHostKeyChecking no :首次登录不显示检查提示
登录格式:ssh [user@]host[command]
常用选项:
	-p port:远程服务器监听端口
	-b:指定连接源ip
	-v:调试模式
	-C:压缩方式
	-X:支持x11转发
	-t:强制伪tty分配
		使用场景:A B C三台主机,A想远程登录C。但是C有防火墙策略不让A登录,但是发现B可以登陆C,
				那么A就可以先远程登录到B然后在跳转到C。
		实现:ssh -t IP_A ssh -t IP_B ssh IP_C(最后一台不需要使用-t选项)
注意:当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub文件公钥至
	 客户端~/.ssh/know_hosts中,下次连接时自动匹配私钥

服务端

服务器端:sshd
配置文件:/etc/ssh/sshd_config
帮助文档:man sshd_config
常用参数:
	Port 22:				监听的端口,建议修改为普通端口,不再默认使用22,22会被各种IP扫描并尝试破解
	
	ListenAddress [IP]:	监听的IP地址,sshd启动后默认监听的是*:22,所有IP都能尝试,将端口和IP绑定
							格式192.168.0.110:22,这样只有一个IP才能访问sshd服务
		
	HostKey:				有多个连接时会尝试使用哪一个
		
	SyslogFacility AUTHPRIV:日志,AUT**加粗样式**HPRIV对应/var/log/secure日志文件
							#awk '/Failed password/{ip[$(NF-3)]++}END{for(i in ip){print i,ip[i]}}' /var/log/secure
							#统计连接IP次数
	
	LoginGraceTime 2m:		在连接时,此选项定义等待时长,超时自动断开
	
	PermitRootLogin yes:	是否允许root登录,改为NO后只允许普通用户登录,但是不限制,普通用户登录后
							使用su切换至root用户
	
	SrtictModes yes:		检查.ssh/目录下文件的所有者,权限等
	
	MaxAuthTries 6:		密码错误连接失败时会再次让输入,定义错误失败连接次数,默认为3
	
	MaxSessione 10:		同一个连接最大会话数量,就是一个窗口克隆出来的子窗口,会话窗口和连接窗口是两码事
	
	PubkeyAuthentication yes:公钥验证,no就为不支持公钥key验证
	
	PasswordAuthentication yes:口令验证,no就为不支持口令验证
	
	PermitEmptyPasswords no:空口令登录,改为禁止,空口令很危险
	
	GSSAPIAuthentication no:GSS验证,使用ssh口令登录时,需要等待,改为no连接速度会变快
	
	UseDNS no:				反向域名解析,关闭后链接速度会变快
	
	ClientAliveInterval 2:	检查客户端是否活跃,默认为秒,2秒检查一次,配合下面选项一起使用
	
	ClientAliveCountMax 3:	如果客户端不活跃,每2秒检查一次,最多检查3次,3次后断开连接,配合上面选项使用。
	
	GatewayPorts no:		端口转发时,是否启动网关功能,就是让不让别人通过你代理访问网站
	
	MaxStartups:			未认证并发连接最大值,默认10
	
	Banner none:			提示信息。与/etc/motd文件相似,登录时可自定义提示画面,无关紧要
	
	allowusers	cheng:		白名单,如果只有一个用户,那么其他用户都被拒绝,有了白名单不看黑名单,优先级高,最好定义黑名单
	
	denyusers	cheng:		黑名单,只拒绝了cheng一个用户,其他用户正常访问,建议定义黑名单,默认文件中没有这两项,需要手动添加
	
	allowgroups	:			白名单组
	
	denygroups	:			黑名单组

基于password验证登录

Linux SSH服务_第1张图片

基于password验证登录步骤:
	1. 客户端发起ssh请求
	2. 服务端发送自己的公钥给客户端
	3. 客户端根据服务端的公钥对密码进行加密,回传给服务端
	4. 服务端私钥解密,密码正确则登录成功

基于key验证登录

Linux SSH服务_第2张图片

基于key验证登录:
	1. 客户端生成一对密钥(ssh-keygen),将公钥ssh-copy-id拷贝到服务端
	2. 客户端发送连接请求,包括ip和用户名
	3. 服务端在authorised_keys中查找,若有对应用户则随机生成一个字符串
	4. 服务端使用客户端公钥对字符串进行加密,发送给客户端
	5. 客户端使用私钥进行解密,将解密后的字符串发送给服务端
	6. 服务端接收到的字符串与原字符串进行比对,一致则允许免密码登录

实验:批量清理基于key验证的密钥

在接手一个环境时,需要清理ssh基于key验证的密钥,写个脚本将.ssh目录下authorized_keys文件清空

	#!/bin/bash
	#
	user=root
	password=galigaygay1121
	while read ip ;do
	expect << EOF
	set timeout 100	
	spawn ssh-copy-id -i /root/.ssh/id_rsa  $user@$ip
	expect {
	"yes/no" { send "yes\n" ;exp_continue }
	"password" { send "$password\n" }
		
	}
	expect eof
	EOF
	done < /root/iplist.txt		#iplist.txt文件放入需要清理的服务器ip

SSH端口转发

介绍

隧道:SSH为其他TCP连接提供的进行传输的安全通道,如telnet等
SSH能自动加密解密所有Client和Server之间的网络数据,还能转发其他TCP端口的网络数据,并提供相应加密解密功能
注:工作环境中防火墙会限制一些网络端口的使用,但会允许SSH的连接,即能够通过端口转发来使用SSH进行通讯

功能

1. 加密SSH-Client端至SSH-Server端之间的通讯数据
2. 突破防火墙的限制完成一些之前无法建立的TCP连接

实验:SSH端口转发

使用场景:工程师出差需要访问内网服务器IP为130,使用ssh端口转发实现,120IP为内网服务器,110为出差人员的IP,在120主机作为转发服务器

120主机:
	ssh -R 9527:192.168.0.120:22 -fNg 192.168.0.110	
# 命令完成后再110 上连接9527的端口,就会被转发到130服务器上,而且是安全的。

110主机上:
	ssh 127.0.0.1 9527	
	# 连接输入用户名密码
	
此项需要配合配置文件实现/etc/ssh/sshd_config
	#GatewayPorts no	:取消注释,修改为yes

-L:指定将本地主机上给定的TCP端口的连接转发到指定的主机和端口,每当连接到本地端口时,连接通过安全通道转发,
	并从远程主机连接到本地端口,PORT:ip:port
	例:9527:192.168.0.110:22,9527为没有使用的随机端口,然后要转发到192.168.0.110的22端口。
-R:指定远程主机上给定的端口的连接将转发到本地端给定的端口
-fN:后台连接
-g:网关,别人可以使用任意IP连接9527端口,不加-g只有127.0.0.1监听端口,加上-g就是*:9527,任意IP都可以
	通过本机当做代理

SSH动态端口转发

当用Firefox访问Internet时,本机的1080端口作为代理服务器,Firefox的访问请求被转发到ssh_server上,由server代替访问Internet

在被当作代理服务器的设备上执行:
	ssh -D 1080 [root@]ssh_server-ip -fNg	
	#端口可自定义,只要是没用的,命令执行完成后在客户端ss -lnt就能看到1080端口已经监听
	#同时需要在浏览器中配置代理,在设置中找到代理配置指定IP和端口
	
curl --scoks5 127.0.0.1:1080 192.168.0.130  
#127.0.0.1是通过本机代理IP+端口,130是想要连接到的服务器IP

部分基于SSH的数据传输工具

scp

两种方式:
	1)scp file user@IP:/dir/	:将本机文件复制到目标主机某目录下	
	2)scp USER@IP:/dir/file /root/	:将远程主机某目录下文件复制到本地
选项:
	-C:压缩数据流
	-r:递归复制
	-p:保持原文件属性信息
	-q:静默模式
	-P port:指明远程主机的监听的端口

特殊用法:将远程主机上的文件拷贝到另一台远程主机
	scp 192.168.0.120:/etc/fstab 192.168.0.130:/data/

rsync

基于ssh和rsh服务实现高效率的远程系统之间的复制文件
使用安全的shell连接为传输方式
	rsync -av /etc host_ip:/tmp		:复制目录和目录下文件
	rsync -av /etc/ host_ip:/tmp	:只复制目录下文件
	
特性:比scp更快,而且只复制不同的文件,没有改变的文件忽略
	
常用选项:
	-n:模拟复制过程
	-v:显示详细过程
	-r:递归复制目录树
	-p:保留权限
	-t:保留时间戳
	-g:保留组信息
	-o:保留所有者信息
	-l:将软链接文件本身进行复制(默认的)
	-L:将软链接文件指向的文件复制
	-a:存档,不保留ACL和selinux的属性

rsync和scp的区别:
	在远程copy文件时,scp命令不论远程主机上是否有相同的文件都会重新复制一份
	而rsync在copy文件时,如果远程主机已经有了相同的文件将不予操作

pssh

小型网络中自动化运维可选工具
默认是基于ssh服务的key验证方式
适用于所有主机已经基于ssh服务key验证之后使用此工具,没有ssh服务的可以验证加-A选项,手动输入密码

pssh是一个Python编写可以再多台服务器上执行命令的工具,也可以实现文件复制

选项如下:
	--version
	-h:主机文件列表,将需要管理的IP地址放在一个文件中,使用-h调用,内容格式"[user@]IP[:port]"
	-H:主机字符串,直接跟IP地址,格式[user@]IP[:port]				
	-A:手动输入密码模式,如果已经基于key验证之后此选项可以忽略
	-i:每个服务器内部处理信息输出	
	-l:登录使用的用户名
	-p:并发的线程数【可选】
	-o:输出的文件目录【可选】
	-e:错误输入文件【可选】
	-t:timeout超时时间设置,0无限制【可选】
	-O:ssh的选项
	-p:打印出服务器返回信息
	-v:详细模式

你可能感兴趣的:(Linux,SSH服务)