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