SSH是什么?
早期的主机用来登录的协议是telnet协议,基与TCP的23端口工作。
telnet的缺陷:用户的认证是明文的。
数据传输过程的明文的。
SSH:基于TCP协议的22端口,C/S架构的。ssh通常为两个版本:V1和V2版本,但是V1在设计上有缺陷 ,容易受到攻击,便废弃了。
监听状态:就是服务器端启动起来,等待客户端连接的状态。
客户端:linux:ssh
windows:putty、Secure CRT(很多软件公司都在用的远程连接工具)、Xmanager、MobaXterm
服务器端:sshd
OpenSSH(开源):ssh和sshd。
服务器端:sshd(配置文件位于/etc/ssh/sshd_config)
客户端:ssh(配置文件位于/etc/ssh/ssh_config)
[root@localhost ssh]# ls
moduli sshd_config ssh_host_ecdsa_key.pub ssh_host_ed25519_key.pub ssh_host_rsa_key.pub
ssh_config ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key
ssh_host_ecdsa_key、ssh_host_ecdsa_key.pub
ssh_host_rsa_key、ssh_host_rsa_key.pub:这俩个(rsa和dsa)算法是为v2版本准备的,优先使用rsa。
ssh_host_ed25519_key、sh_host_ed25519_key.pub:这个是为v1算法准备的
私钥文件和配置文件至关重要,所以权限都是600
使用pstree查看进程,会有一个sshd服务主进程来监听客户端请求,一旦有用户请求进来了,就会生成一个子进程来响应客户端的请求,所以登陆的用户多了,ssh进程会启动多个。
这是当我使用三个pts时,是上图。
SSH认证的实现:
sshd:主机密钥(就是在你第一次连接对方是,让你确认的那个玩意)。
基于口令的认证:
通信双方在建立连接之前并没有见到过彼此,那么他们怎么建立安全通信:连接时回答为yes就意味着我们接受了服务器发来的公钥,这个公钥是服务器上一对密钥上的公钥信息。
客户端收到服务器端发来的公钥信息后,会生成一个临时会话密钥(临时对称密钥)
基于密钥认证:
客户端上的用户也生成一对密钥,公钥发送给服务器,而且公钥也要保密的,公钥放在服务器上某个用户的家目录下,以后正在连接这台服务器时候,不用再输入密码,直接对暗号,私钥加密发送过去,对面公钥能解密,就登陆了。这种方法要进行配置。
默认情况下是基于口令的。
一般情况下,不允许管理员直接登陆到服务器,防止密钥传输过程中有人截取数据并进行暴力破解,只能使用普通用户登陆,然后su到root。
正常生产环境中:
1、放在互联网的SSH服务,也只能限定某些主机有限登陆(内网IP)。
2、如果经常出差。可以在SSH服务器端加一个VPN服务器,然后设定SSH服务器仅允许VPN的IP登陆,先登陆到VPN上。再由VPN转由到服务器上。还有最好别用22端口。
3、密码一定要经常换。
SSH服务结构
1、SSH服务由服务端软件OpenSSH和客户端(常见的有SSH),XShell等组成,SSH服务默认使用22端口提供服务。
2、SSH服务端是一个守护进程(daemon),他在后台运行并响应来自客户端的连接请求。SSH服务端的进程名为sshd,负责实时监听远程SSH客户端的连接请求,并进行处理,一般包括公共密钥认证,密钥交换,对称密钥加密和非安全连接等。
- 守护进程:指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控,此类程序会以进程的形式初始化,守护进程程序的名称通常以字母“d”结尾,例如:syslogd就是指管理系统日志的守护进程。
- 他没有父进程,并且在系统进程层级中直接位于init进程之下。守护进程程序通常通过如下方法使自己成为守护进程的:对一个子进程调用fork,然后使其父进程立刻终止,使得这个子进程能在init下运行。这种方法通常被称为“脱种服务,不是对某个系统就是对某个用户程序提供服务”
- 一个守护进程的父进程是init进程,因为他真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是由一个init进程继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是标准输出stdout还是标准错误stderr都需要特殊处理,守护进程的名称通常是以d结尾,比如:sshd,xinetd,crond等
3、ssh客户端包含以及像scp(远程拷贝),slogin(远程登陆),sftp(安全FTP文件传输)等应用程序。
4、ssh的工作机制大致是本地的ssh客户端先发送一个连接请求到远程的ssh服务端,服务端检查连接的客户端发送的数据包和IP地址,如果确认合法,就会发送密钥发回给服务端,自此连接建立。
ssh加密技术
1、服务器端组件监听指定的端口,负责安全连接的建立、对连接方的身份认证、以及为通过身份确认的用户建立正确的环境
2、客户端负责发起最初的TCP三次握手、安全连接的建立,验证服务器的身份与之前记录中的一致,并将自己的验证信息提供给服务器
3、一个SSH会话的建立过程分为两个阶段。第一阶段,双方沟通并同意建立一个加密连接通道以提供后续信息传输用,第二阶段,对请求接入的用户进行身份验证以确定服务器端是否要对该用户开放访问权限。
配置文件解读:
#后边有空格表示:纯注释。
#后边没有空格表示:可以启用的选项或者可以启用的参数,这个参数并不是用 = 来定义的,这个参数就是后边直接跟一个值。
如果要改用其他端口,把Port22这个选项修改掉端口号。
#AddressFamily any:假如主机现在既有IPV4的地址,也有V6的地址,具体在哪一类地址上提供该服务,ang表示都可以。
#ListenAddress 0.0.0.0:监听那个地址?假如有两个地址,只想给一个地址提供服务,就是用该选项。0.0.0.0表示任意地址。
一对密钥默认使用多长时间?
客户端服务器端一直处于连接状态,很有可能被暴力破解,就可以指定几个小时换一次密码。
使用哪一个Facility(设备)来记录日志的,AUTH表示自动
priority表示日志级别(Level)
输入账号之后,等你两分钟,不登陆就强制退出了
是否允许管理员直接登录(企业中一般设置为no)
是否使用严格模式
最大登陆尝试次数
最大连接次数
客户端生成公钥默认放在服务器端的某个用户的家目录下的隐藏目录下。
是否允许基于口令的认证方式
是否启用挑战性握手认证协议,不安全,一般不允许。
是否允许基于kerberos认证
是否允许基于GSSAPI的认证方式
是否使用PAM来认证,一般在系统是都应该使用PAM的,这是一种可插入式认证模块。
是否打印Motd(/etc/motd)文件中的内容。
是否打印上一次通过那个主机,在那个时间登陆?不应该,属于信息泄露。
定制欢迎标语,此处放一个文件路径,欢迎信息在文件中。
将ftp服务基于ssh来实现,就叫sftp
(把ftp基于ssl实现,叫ftps)
reload就是不用重启服务就可以重新加载服务。
1号信号可以让应用程序不用重启也能够重读配置文件
ssh 第一次登陆会让你确定是否需要登陆,然后需要输入密码,有两个确认信息,如果你第一次登陆过后,会在/etc/.ssh下生成一个know文件,删除该文件,下次登陆则再次询问是否确认。
ssh -o StrictHostKeyChecking=no 192.168.15.137
这个可以跳过第一个询问
sshpass -p 123456 ssh root@192.168.15.137
这个可以跳过输入密码(使用epel源下载sshpass)
sshpass -p 123456 ssh -o StrictHostKeyChecking=no 192.168.15.137
直接两个询问都跳过
sshpass -p 123456 ssh root@192.168.15.137
这个可以跳过输入密码(使用epel源下载sshpass)
sshpass -p 123456 ssh -o StrictHostKeyChecking=no 192.168.15.137
直接两个询问都跳过
如果客户端给服务器端第一次传送公钥,会询问你yes还是no,yes后就在在客户端的用户家目录下生成一个known_hosts文件