SSH协议
SSH(Secure Shell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录或文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多的安全隐患。随着人们对网络安全的重视,这些方式已经慢慢不被接受。SSH协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的登录和其他安全网络服务。作为Telnet和其他不安全远程shell协议的安全替代方案,目前SSH协议已经被全世界广泛使用,大多数设备都支持SSH功能。
- SSH是如何工作的?
SSH由服务器和客户端组成,在整个通信过程中,为建立安全的SSH通道,会经历如下几个阶段:
- 连接建立
SSH服务器在指定的端口侦听客户端的连接请求,在客户端向服务器发起连接请求后,双方建立一个TCP连接。
- 版本协商
SSH协议目前存在SSH1.X(SSH2.0之前的版本)和SSH2.0版本。SSH2.0协议相比SSH1.X协议来说,在结构上做了扩展,可以支持更多的认证方法和密钥交换方法,同时提高了服务能力。SSH服务器和客户端通过协商确定最终使用的SSH版本号。
- 算法协商
SSH支持多种加密算法,双方根据各自支持的算法,协商出最终用于产生会话密钥的密钥交换算法、用于数据信息加密的加密算法、用于进行数字签名和认证的公钥算法以及用于数据完整性保护的HMAC算法。
- 密钥交换
服务器和客户端通过密钥交换算法,动态生成共享的会话密钥和会话ID,建立加密通道。会话密钥主要用于后续数据传输的加密,会话ID用于在认证过程中标识该SSH连接。
- 用户认证
SSH客户端向服务器端发起认证请求,服务器端对客户端进行认证。SSH支持以下几种认证方式:
-密码(password)认证:客户端通过用户名和密码的方式进行认证,将加密后的用户名和密码发送给服务器,服务器解密后与本地保存的用户名和密码进行对比,并向客户端返回认证成功或失败的消息。
-密钥(publickey)认证:客户端通过用户名,公钥以及公钥算法等信息来与服务器进行认证。
-password-publickey认证:指用户需要同时满足密码认证和密钥认证才能登录。
-all认证:只要满足密码认证和密钥认证其中一种即可。
7. 会话请求
认证通过后,SSH客户端向服务器端发送会话请求,请求服务器提供某种类型的服务,即请求与服务器建立相应的会话。
- 会话交互
会话建立后,SSH服务器端和客户端在该会话上进行数据信息的交互。
网络
SSH客户端<----------------------------------------->SSH服务端
数据传输是加密的,可以防止信息泄露
数据传输是压缩的,可以提高传输速度
目前SSH协议应用较为广泛(加密传输)
TELNET是铭文传输,用抓包软件即可截取传输的所有数据,不安全
- SSH常用工具
- SSH客户端:Putty Xshell CRT
- SSH服务端:OpenSSH
OpenSSH
是实现 SSH 协议的开源软件项目。适用于各种 UNIX LINUX 操作系统软件
在centos7中 ssh程序是默认打开的默认端口是 TCP 22
默认端口为
TCP 22
SSH是默认开启的远程管理程序,如果没有开启SSH服务就需要去机房接上显示器去打开服务
启动SSH服务
[root@localhost ssh]# systemctl start sshd
sshd 服务端的默认配置文件是/etc/ssh/sshd_config
sshd_config //服务端配置文件(常修改的配置文件)
ssh_config //客户端配置文(基本不修改)
[root@localhost ssh]# vim /etc/ssh/sshd_config //服务端配置文件
#Port 22 //监听端口为22(需要修改不然容易被爆破)
#ListenAddress 0.0.0.0 //监听地址为任意网段所有,也可以指定OpenSSH服务器的具体IP(apv4)
#ListenAddress :: //监听ipv6的所有端口
#LoginGraceTime 2m //登录验证时间为2分钟
#PermitRootLogin yes //禁止root用户直接登录
#MaxAuthTries 6 //最大重试次数为6次
#PermitEmptyPasswords no //禁止空密码用户登录
#UseDNS yes //禁止 DNS 反向解析,以提高服务器的响应速度
#设置黑白名单
#llowUsers yuji@192.168.85.10 lisi //只允许yuji用户从192.168.85.10访问,允许lisi从所有地址访问
#enyUsers liwu //不允许使用liwu用户登录
#白名单的优先级高于黑名单。如果一个用户同时加入了白名单和黑名单,那么该用户是可以访问的。
#如果不设置白名单,则所有用户都可以登录访问。一旦设置了白名单,那么只有白名单内的用户可以访问。
sshd服务支持两种验证方式;1.密码验证 对服务器中本地系统用户的登录名称、密码进行验证。简便,但可能会被暴力破解
如果在刷新SSHD服务出错了 关闭防火墙即可
根据上面设定的不允许root用户直接登录
反正加入3次后会被强制退出
日志文件中也会有体现
没有密码的用户也被禁止了所以也无法登陆
虽然不可以直接登录root但是可以用别的账户登录以后再去登录root账户
黑白名单
白名单的优先级高于黑名单,如果一个地址既在白名单也在黑名单中,该地址是可以访问的。
如果有人在攻击我可以查看
日志的管理文件,记录了日志的规则
[root@localhost ~]# vim /etc/rsyslog.conf
/var/log/secure
#设置黑白名单
#allowUsers yuji@192.168.85.10 lisi //只允许yuji用户从192.168.85.10访问,允许lisi从所有地址访问
#denyUsers liwu //不允许使用liwu用户登录
直接在配置文件中添加即可实现
[root@localhost log]# vim /etc/ssh/sshd_config
secure文件包含了所有的登录信息
进入这个文件中就会看到登录失败的信息
密钥对严重
密钥对验证:要求提供匹配的密钥信息才能通过验证,首先在客户端创建一对密钥文件(公钥、私钥),后把公钥文件放到需要远程连接的服务器中。
公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分,私钥则是非公开的部分。 公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。通过这种算法得到的密钥对能保证在世界范围内是唯一的。 使用这个密钥对的时候,如果用其中一个密钥加密一段数据,则必须用另一个密钥才能解密。. 比如用公钥加密的数据就必须用私钥才能解密,如果用私钥进行加密也必须用公钥才能解密,否则将无法成功解密。
说明:由于私钥的非公开属性,建议在SSL证书申请过程中,由客户自己生成私钥,并妥善保管。
vim /etc/ssh/sshd_config
PasswordAuthentication yes //启用密码验证
PubkeyAuthentication yes //启用密钥对验证
AuthorizedKeysEile .ssh/ authorized_keys //指定公钥库文件
使用 SSH 客户端程序
l.ssh远程登录
当用户第一次登漱SSH服务器时,必须接受服务器发来的ECDSNA密钥(根据提示输入"yes")后才能继续验证。接收的密钥信息将保存到~/.ssih inown_hosts文件中。密码验证成功以后,即可登录目标服务器的命令行环境中了。
SSH [选项] lisi@192.168.85.10
选项:
-p :指定非默认的端口号,缺省时默认使用 22端口
SSH -p 123 lisi@192.168.85.10
不指定用户代表默认使用当前用户去登录别的主机 ssh 192.168.85.10
使用ssh第一次登录服务器是就会验证
同时也会创建出.ssh文件
目录当中也会出现登陆过的信息
更改端口号
系统默认是22端口
[root@localhost ~]# vim /etc/ssh/sshd_config
[root@localhost ~]# systemctl restart sshd
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
查看端口号
[root@localhost ~]# netstat -lntp | grep sshd
端口号就改变了
客户端登录
不加上-p 的话登录不上,因为更改过端口号了
[root@localhost ~]# ssh root@192.168.85.10
ssh: connect to host 192.168.85.10 port 22: Connection refused
加上端口号即可登录成功
[root@localhost ~]# ssh -p 2345 root@192.168.85.10
The authenticity of host '[192.168.85.10]:2345 ([192.168.85.10]:2345)' can't be established.
ECDSA key fingerprint is SHA256:8sMJzI7gfT3b2V/p1D59j4uLgrXvGOA+pnw9jZwVlNk.
ECDSA key fingerprint is MD5:51:06:17:41:4e:0b:f1:81:6f:9f:db:d3:bf:45:bc:19.
Are you sure you want to continue connecting (yes/no)? yue
Please type 'yes' or 'no': yes
Warning: Permanently added '[192.168.85.10]:2345' (ECDSA) to the list of known hosts.
root@192.168.85.10's password:
[root@localhost ~]# exit //退出登录
登出
Connection to 192.168.85.10 closed.
就可以直接登录
scp 远程复制
#下行复制(拉取)
scp root@192.168.85.10 :/etc/passwd /root/passwd10.txt
#将远程主机中的/etc/passwd文件复制到本机
#上行复制(推过去,给对方主机)
scp -r /etc/ ssh/ root@192.168.85.10 : /opt
将本机的/etc/ssh目录复制到远程主机
客户端使用方式
远程登录
ssh [-p端口] [用户]@服务端IP
推送 上行复制
scp [-r 目录] 文件 [用户]@服务端IP:保存路径
拉取 下行复制
scp -P [用户]@服务端IP:保存路径 本地路径
sftp [-P] [用户]@服务端IP
sftp 安全 FTP
SFTP是SSH File Transfer Protocol的缩写,安全文件传送协议。SFTP与FTP有着几乎一样的语法和功能。SFTP为SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。
ftp vsftp tcp 20 21
常规的文件传输协议,明文传输,传输速度较快但不安全,一般在局域网中使用
sftp tcp 22
安全ftp,传输时会加密压缩,传输效率比普通ftp要低,但是安全性更高
tftp udp 69
简单的轻量级文件传输协议,一般用于传输一些小文件
sftp [-P] [用户]@服务端IP
put abc .txt 可以推送文件
get #下载文件
get -r #下载目录
put #上传文件
put -r #上传目录
quit、exit、bye #退出
sshd服务支持登录验证方式
sshd服务支持两种验证方式
认证方式: 用户账户密码认证 ,密钥对认证
- 要求提供相匹配的密钥信息才能通过验证。 通常先在客户端中创建一对密钥文件(公钥、私钥),然后将公钥文件放到服务器中的指定位置。 远程登录时,系统将使用公钥、私钥进行加密/解密关联验证。 能增强安全性,且可以免交互登录。
- 当密码验证、密钥对验证都启用时,服务器将优先使用密钥对验证。 可根据实际情况设置验证方式
- 公钥和私钥是成对生成的,这两个密钥互不相同,可以互相加密和解密;
- 不能根据一个密码来推算出另一个密钥;
- 公钥对外公开,私钥只有私钥的持有人才知道。
密钥对过程
配置密钥对验证
1.在客户端创建密钥对 通过ssh-keygen 工.具为当前用户创建密钥对文件。可用的加密算法为RSA、ECDSA或DSA等(ssh-keygen命令的"-t"选项用于指定算法类型)。
[root@localhost ~]# ssh-keygen -t rsa //生成密钥对文件
[root@localhost ~]# cd .ssh/
[root@localhost .ssh]# ls
id_rsa id_rsa.pub known_hosts
id_rsa //公钥文件
id_rsa.pub //私钥文件
不同的算法后缀也是不一样的
[root@localhost .ssh]# ls
id_ecdsa id_ecdsa.pub known_hosts
手动传输私钥文件
主意:如果修改了端口号记得加上 -P 端口
[root@localhost .ssh]# scp id_rsa.pub root@192.168.85.20:/opt
root@192.168.85.20's password:
id_rsa.pub 100% 408 620.7KB/s 00:00
查看私钥里面的文本
[root@localhost opt]# cat id_rsa.pub
复制到这个文件里面,就可以使用了
[root@localhost .ssh]# vim authorized_keys
公钥文件
[root@localhost .ssh]# ssh root@192.168.85.20 //直接登录
root@192.168.85.20's password:
Last failed login: Sun Aug 21 21:59:24 CST 2022 from 192.168.85.10 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Sun Aug 21 21:32:23 2022 from 192.168.85.1
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.85.20 netmask 255.255.255.0 broadcast 192.168.85.255
inet6 fe80::debe:70ce:ed53:3915 prefixlen 64 scopeid 0x20<link>
登录后就是另外一台主机
自动传输
[root@localhost .ssh]# ssh-copy-id wang@192.168.85.20
如果要一次性传输多个密钥对文件 -i 文件 即可
ssh-copy-id -i
创建密钥对验证
1、在客户端创建密钥对
ssh-keygen -t rsa ecdsa dsa (算法)
2.把公钥文件导到 ssh服务端
手动传输 复制客户端公钥文件id_ecdsa.pub 的内容,
文件在服务端用户的家目录 .ssh 目录中 创建authorized_keys 文件并把客户端公钥文件内容粘贴到这个文件中
自动传输 在客户端 ssh-copy-id -i 公钥文件 用户@服务端IP
3.在客户端使用ssh 用户@服务端IP登录服务端,使用密钥对私钥的密码进行验证
实现免交互登录
1.直接创建空密钥对文件即可
2.在导入公钥文件后,在客户端ssh-agent bash
ssh-add ,此方式只能在当前连接中有效
# TCP Wrappers 访问控制
TCP_Wrappers是一个工作在第四层(传输层)的的安全工具,对有状态连接的特定服务进行安全检测并实现访问控制,凡是包含有libwrap.so库文件的的程序就可以受 TCP_Wrappers 的安全控制。 它的主要功能就是控制谁可以访问,常见的程序有rpcbind、vsftpd、sshd,telnet。 TCP_Wrappers有一个TCP的守护进程叫作tcpd。 以ssh为例,每当有ssh的连接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件,符合要求,则会把这次连接原封不动的转给真正的ssh进程,由ssh完成后续工作;如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供ssh服务。
有些进程不受tcp_wrappers管理,例如 httpd、smb、squid等
工作原理
- TCP_Wrappers有一个TCP的守护进程叫作tcpd。以ssh为例,每当有ssh的连接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件,符合要求,则会把这次连接原封不动的转给真正的ssh进程,由ssh完成后续工作;如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供ssh服务。
格式:
<服务程序列表>海<客户端地址列表>
(1)服务程序列表ALL:代表所有的服务。
单个服务程序:_如"ySftpd 。
多个服务程序组成的列长:如"vsftpd,sshd"。
(2)客户端地址列表
ALL:代表任何客户端地址。LOCAL:代丧本机地址。
多个地址以逗号分隔
允许使用通配符“*”和“?”,前者代表任意长度字符,后者仅代表一个字符网段地址,如“192.168.80.”或者192.168.80.0/255.255.255.0
区域地址,如”.benet.com*匹L 配benet.com域中的所有主机。
TCP Wrappers的访问策略
- 1、策略的配置格式 ❝ 两个策略文件的作用相反,但配置记录的格式相同,如下所示: : 服务程序列表、客户端地址列表之间以冒号分隔,在每个列表内的多个项之间以逗号分隔。 1)服务程序列表 ALL:代表所有的服务; 单个服务程序:如“vsftpd”; ...
- 2、访问控制的基本原则 关于TCP Wrappers机制的访问策略,应用时遵循以下顺序和原则:首先检查/etc/hosts.allow文件,如果找到相匹配的策略,则允许访问;否则继续检查/etc/hosts.deny文件,如果找到相匹配的策略,则拒绝访问;如果检查上述两个文件都找不到相匹配的策略,则允许访问。
- 3、TCP Wrappers配置实例 实际使用TCP Wrappers机制时,较宽松的策略可以是“允许所有,拒绝个别”,较严格的策略是“允许个别,拒绝所有”。
黑白名单
“允许所有,拒绝个别”
只需在/etc/hosts.deny文件中添加相应的拒绝策略
“允许个别,拒绝所有”
除了在/tc/hosts.allow中添加允许策略之外,还需要在/etc/hosts.deny文件中设置"ALL:ALL"的拒绝策略。
vi /etc/hosts.allow //设置允许访问 TCP 服务程序的策略
sshd:12.0.0.1,192.168.80.*
vi ietc/hosts.deny //设置禁止访问 TCP 服务程序的策略
sshd:ALL
sshd:192.168.85.0.* EXCEPT 192.168.85.10
禁止该网段的所有地址使用sshd服务进行访问,除了192.168.85.10
服务:客户端地址
先看 lhosts.allow 文件中的策略,匹配上则直接放过,如果没有匹配再去看 hosts.deny 文件中的策略,匹配上则禁止/柜绝访问指定的tcp服务程序,如果也没有匹配上则默认允许放过