1、远程连接
1.1、telnet
-
密码会被明文发送
-
数据内容也是明文传输的
1.2、ssh
-
使用公私钥来进行身份验证,以及产生会话的共享密钥
-
数据内容加密
2、加密
2.1、对称加密
加密和触密使用同一个密钥
2.2、非对称加密
-
有两个密钥,一个公钥,一个私钥。
-
用公钥加密的数据,有且只有私钥能解密;用私钥加密的密码,有且只有公钥能解密。
应用场景:
-
公钥加密数据,私钥解密
-
私钥签名,公钥验证签名
3、SSH认证方式
-
基于账号和密码的验证方式,对称加密
-
基于公钥的验证方式,非对称加密
4、基于账号和密码的验证
在服务端,开启SSH服务,会自动生成密钥对:/etc/ssh/ssh_host*。比如:删除已经存在的密钥,然后重启SSHD服务,发现又重新生成了密钥对。
4.1、验证过程
-
client通过SSH客户端软件,向server端发送连接请求
-
server收到连接请求,会把自己的公钥以明文方式发送给client
-
client收到后:
− 如果是第一次连接,会提示要不要继续,就是问你要不要接收这个公钥,因为这个公钥有可能是中间人提供的,需要你通过公钥的fingerprint去查证这个公钥有没有问题,(在server端通过:ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub命令就可以查到这个公钥的fingerprint值)。输入yes,确认接收后,保存到当前用户的家目录下(/root/.ssh/known_hosts)
− 如果client之前已经保存过server公钥,再次连接时,不会再提示,但是会去比对接收到的公钥和已经保存的公钥,比对成功,就进入密码验证阶段,如果比对不成功,则提醒,并退出连接。比如:服务器重新生成了新的密钥对,再次连接服务器时,需要先将client端的~.ssh/know_hosts这个文件里记录的旧公钥删除才行。
− 注:如果第一次登陆时,不想它提示,可用以下方法:ssh -o StrictHostKeyChecking=no root@server
-
进入密码验证阶段,client端用server的公钥对输入的密码进行加密,并发送给server
-
server收到后,用自己的私钥解密,密码正确,允许登陆。
5、基于公钥验证(无密码验证)
如果一个client,想通过公钥认证的方式连接到一台server,需要在client端先生成一个密钥对,包括一个公钥和一个私钥,然后将公钥复制到server端。
5.1、验证过程
-
当client通过SSH连接server时,首先发送自己的公钥到server
-
server收到这个公钥后,和自己本地存储的client的公钥进行比对,比对成功,就用client的公钥加密一段随机数,并发送给client
-
client收到后,用自己的私钥解密,并将解密后的内容发还给server
-
serve收到数据后,和之前生成的随机数进行比对,比对成功,表示client可信,从而建立一条安全通道。
-
这就是一个公钥认证过程,其间不需要用户手工输入密码。
6、实现公钥验证
#在client端生成一个密钥对
#生成的密钥对存放在当前用户的家目录下。
#如:当前是root,私钥:/root/.ssh/id_rsa;公钥:/root/.ssh/id_rsa.pub
ssh-keygen
#把公钥传给server的对应用户,并将公钥改名
#将公钥传给server,并将公钥内容写入到server端的:/root/.ssh/authorized_keys文件内
ssh-copy-id root@server
7、ssh命令
#远程连接到10.0.0.1
ssh root@10.0.0.1
#通过SSH通道传输图形
ssh -X root@10.0.0.1
-
-X 表示ssh过去之后,可以打开图形化工具,比如;nm-connection-editor
#并不登陆,只是远程执行一条命令,然后退出
ssh root@10.0.0.1 ls /boot
#假如ssh服务更改过端口,需要用-p去指定端口
ssh root@10.0.0.1 -p 22
8、scp命令
在传输过程中,拷贝文件会被加密
#把本地的文件拷到远程机器
scp /tmp/tt root@10.0.0.1:/tmp/
#把远程机器的文件拷到本地
scp root@10.0.0.1:/tmp/tt /tmp
9、lrzsz工具
#安装lrzsz工具
yum install lrzsz -y
#上传文件
rz
#下载文件
sz
10、密钥错误的解决方法
SSHD服务启动时,会先去查看/etc/ssh目录下有没有密钥对,如果没有,就会自动生成密钥对。
10.1、账号密码验证方式错误
如果删除server端的密钥对,重启sshd服务,又会自动重新生成。这时,客户端就没法再登陆了,因为客户端保存的是旧的公钥,客户端需要删除旧的,再重新获取。
10.2、公钥验证方式错误
如果client重新执行了ssh-keygen,会覆盖旧密钥对,公钥认证就失效了。需要先到server端,删掉旧的密钥:/root/.ssh/authorized_keys,再重新copy
11、访问权限控制
对于SSHD的访问权限控制,有两个方法:
-
sshd自己的配置文件,可以做精确的控制
-
TCP Wrappers
− 在系统中,有一个叫TCP Wrappers的程序,对传入本地的网络流量进行基本过滤,可以允许或拒绝从其它系统访问到本机运行的网络服务。
− 默认,没有作任何限制
− 优点:设置后立即生效,不需要重启SSHD服务
11.1、TCP Wrappers
注意:
-
在RHEL8中,将抛弃此方式
TCP Wrappers有两个配置文件:
-
/etc/hosts.allow,允许
-
/etc/hosts.deny,拒绝
11.2、配置文件读取规则
-
首先读取/etc/hosts.allow文件,并从上到下读取。
-
如果守护程序 - 客户端对与文件中的第一行匹配,则授予访问权限。
-
如果该行不匹配,则读取下一行并执行相同的检查。
-
如果读取所有行并且不匹配,则从顶部开始读取/etc/hosts.deny文件。
-
如果在拒绝文件中找到守护程序 - 客户端对匹配,则拒绝访问。
-
如果在任一文件中找不到守护程序 - 客户端对的规则,或者两个文件都不存在,则授予对服务的访问权限。
总结:
-
当hosts.allow和 host.deny相冲突时,以hosts.allow设置为准。
11.3、语法
daemon_list: client_list [: command]
注意:
-
除了IP,还可以使用域名:如“.example.com”匹配example.com域中的所有主机
#允许172.25.254.0这个网段访问sshd服务
vi /etc/hosts.allow
sshd: 172.25.254.*:allow
-
:allow可以省略
#禁止172.25.254.1访问sshd服务
vi /etc/hosts.deny
sshd: 172.25.254.1:deny
-
:deny可以省略
#拒绝172.25.254.0这个网段内的所有主机访问本地所有网络服务
vi /etc/hosts.deny
all: 172.25.254.*
#拒绝.example.com这个域内的所有主机访问本地所有网络服务
vi /etc/hosts.deny
all: .example.com
#拒绝所有人访问telnet
vi /etc/hosts.deny
telnetd: all
11.4、sshd配置文件
vim /etc/ssh/sshd_config
#禁止root用户登陆
PermitRootLogin no
#禁止指定用户登陆
DenyUsers user2
#仅允许指定用户登陆:
AllowUsers root,user1
#禁止指定IP登陆:
#禁止172.25.254.1这个IP登陆
DenyUsers *@172.25.254.1
#只禁止从172.25.254.1这个IP,使用root登陆,其它用户可以
DenyUsers root@172.25.254.1
#允许指定IP登陆:
AllowUsers *@172.25.254.1
#禁止使用密码认证
#注:这样也就是说仅允许基于密钥验证
PasswordAuthentication no
12、禁用DNS反向解析
-
当客户端试图登录SSH服务器时,服务器端先根据客户端的IP地址进行DNS PTR反向查询出客户端的主机名,然后根据查询出的客户端主机名进行DNS正向A记录查询,验证与其原始IP地址是否一致,这是防止客户端欺骗的一种措施。
-
但是,如果DNS服务器上没有相应记录,则会等到DNS查询超时(5秒)才会进行下一步,造成客户端连接很慢。
-
如果SSH连接全是内网连接,建议关掉。
vim /etc/ssh/sshd_config
UseDNS no