第二章 SSH服务

第二章SSH服务

2.1 SSH协议

2.1.1 SSH简介

SSH,全称“Secure Shell”,即安全外壳,用于远程连接、登录。

在SSH之前,一直使用telnet进行远程连接(端口为TCP:23),但由于telnet在进行数据传输时是明文传输,不安全,因此采用加密传输的ssh(端口为TCP:22)

其实CentOS7的系统光盘中是有telnet的安装包的,但安装系统时,默认只安装ssh服务,telnet因为安全性不高,默认不安装。即便在windows系统中,win7以后的版本默认也不安装telnet服务了。

2.1.2 基本实验

下面先来看一下ssh的基本部署步骤:

首先需要两台Linux主机(可以是两台虚拟机),都配置好ip,如:192.168.10.10和192.168.10.11。我们以192.168.10.100的主机作为服务器。

服务器端配置:

1、安装软件包

yum –y install openssh openssh-clients openssh-server

注:依次为主程序包、客户端包、服务器包,一般Linux系统作为ssh服务器的同时,也经常要登录其他主机,所以为了方便工作,建议三个包都装。其实在安装CentOS 7的服务器时,ssh的相关软件已经默认安装

2、启动服务

systemctl restart sshd ---启动ssh服务

注:其实系统默认已经启动了。

3、关闭防火墙

iptables -F ---关闭iptables防火墙

systemctl stop firewalld ---关闭firewalld防火墙

setenforce 0 ---关闭selinux

注:CentOS7默认防火墙不屏蔽ssh访问,所以不关闭也可以

iptables、firewalld、selinux后面章节会详述

客户端配置:

1、安装软件包

yum –y install openssh openssh-server openssh-clients

2、登录

格式:ssh 用户名@服务器的IP/主机名

示例:ssh 192.168.10.10

---登录服务器,默认以当前自己的用户名登录服务器

注:会提示是否确定建立连接,输入yes即可,如下图:

图中,输入yes以后,要求输入root在192.168.10.10上的密码,因为客户端当前登录账号为root。则会使用root登录服务器,若客户端当前用户为zhang,则会要求输入zhang在服务器上的密码,但是如果服务器端没有zhang这个用户的话,则会登录失败。那么则需要指定用户登录服务器,命令如下:

ssh root@192.168.10.10 ---指定用户登录服务器

登录成功后则会显示服务器端的命令提示符,说明正在控制服务端。

exit ---输入该命令退出远程ssh登录

3、服务器查看

客户端登录成功后,服务器可使用w命令查看到客户端的登录状态:

4、windows客户端访问

服务器端部署好后,在windows客户端可以下载xshell、secureCRT、 putty等远程ssh登录工具登录即可,在这里值得注意的是,学习过程中,会使用真实机windows去连接Linux虚拟机的ssh,那么必须遵守上一章讲过了虚拟机与真实机连接的技术,大家可以参考研究一下。windows客户端软件的使用,如:xshell,在实际生产环境中使用颇多,大家一定多加练习与熟悉。

2.1.3 ssh访问控制

默认系统中所有用户都允许在ssh登录时使用,但是我们也可以对其进行限制。服务器端的配置文件是:/etc/ssh/sshd_config(注:该目录下还有一个文件/etc/ssh/ssh_config,是作为客户端的配置文件,在服务器上做管理需要配置服务器配置文件,不要写错了),可以编辑配置它,常用案例如下:

vi /etc/ssh/sshd_config 写入

PermitRootLogin no ---拒绝root用户使用ssh登录

AllowUsers zhang moon ---仅允许zhang和moon使用ssh登录

DenyUsers zhang ---拒绝指定的用户使用ssh登录

注:当denyusers与allowusers冲突时,以denyusers为准

AllowUsers moon@192.168.10.11 ---仅允许moon在10.11上登录

注:此项设置后,其他用户不允许登录,moon用户只能在10.11上登录。

systemctl restart sshd ---以上配置完毕后,需要重启服务才可以生效

以上配置文件是针对客户端所使用的用户做限制的,建议读者可以逐条验证,以明确配置效果。另外,还可以限制客户端的ip,需要使用系统中针对各种通信访问的控制文件:/etc/hosts.allow、/etc/hosts.deny。在这两个文件中可以针对ssh服务进行ip限制。案例如下:

vi /etc/hosts.allow

sshd:192.168.10.11 ---设置允许访问本机ssh的客户端ip

注:配置该文件后,并不代表拒绝其他ip,需要配合/etc/hosts.deny文件共同完成管理逻辑。

vi /etc/hosts.deny

sshd:ALL #或者写sshd:192.168.10.0/24 指定拒绝的ip段

两个文件配合使用表示仅允许10.11访问ssh,其他ip都拒绝。若两个文件中有设置冲突,则以hosts.allow文件为准。

2.1.4 ssh子系统

1、scp命令

scp命令的功能是:借助于ssh连接,登录后实现远程复制。可以下载文件,也可以上传文件。命令案例如下:

scp root@192.168.10.10:/mnt/f1 /mnt/ ---文件下载

scp /mnt/f2 root@192.168.10.10:/mnt/ ---文件上传

2、sftp登录

sftp登录的功能是:使用sftp登录成功后,上传、下载文件

命令案例:

sftp root@192.168.10.10

登录后,并不是所有shell命令都可以使用的,但基本的pwd、cd、ls命令可以使用,操作、显示的是服务器端信息。也可以在命令前加!表示对当前客户端本机做操作,如:!pwd、!cd !ls。

上传、下载的命令使用put、get,案例如下:

put /mnt/f1 ---上传指定文件到服务器端的当前目录

put -r /mnt/d1 ---上传指定目录到服务器端的当前目录

get /mnt/f2 ---下载指定文件到本机的当前目录

get -r /mnt/d2 ---下载指定目录到本机的当前目录

注:在实际生产环境中,sftp方式的使用率并不是很高,所以暂做了解即可。

2.2 ssh验证方式

以上我们的实验中,客户端直接访问服务器,输入正确的账号、密码后即可登录,那么它是如何验证的呢?又是如何保证安全性的呢?带着这两个问题,我们来介绍一下ssh的登录方式。

2.2.1 加密密钥、密钥对

首先我们来介绍下加密的过程,在做数据加密时,有两个重要的概念:密钥、算法。密钥是加密时需要使用到的一些辅助数据;算法是加密时进行的一个运算过程或运算公式。

举例来讲:假设有密码:123456需要做加密,那么我们来进行最简单的操作,给所有数字+1,即:123456+111111=234567,这里的123456即是原始数据,计算时所用的辅助数据111111就可以视为密钥,而加法操作即是算法。再者,加密算法也有两种分类:可逆加密、不可逆加密。顾名思义,可逆加密就是可以通过算法的逆向操作将数据推回来,即解密,如:加法的逆算法是减法;不可逆算法是无法做逆向计算的,如:md5,hash2算法。

另外,密钥也有一个称为密钥对的概念,又称公钥(共有密钥)、私钥(私有密钥)。这种密钥对加密方式是使用两个并非完全相等的密钥(称为非对称式密钥对),虽然不同,但一个密钥加密,完全可以使用另一个密钥解密。而私钥一般都是本机自己使用的,公钥是发送给其他主机(可发送给多台)使用的,这样这台主机就可以与多台不同的主机加密通信了。

ssh作为安全登录的服务,对账号、密码的传输是加密处理的,采用的是可逆算法。这与telnet的登录原理不同(telnet为明文传输,不加密,安全性低)。ssh在登录时支持两种登录验证方式:直登方式、秘钥对验证方式。

2.2.2 基于口令的登录方式 即直登方式

直登方式是ssh的默认登录方式,客户端连接到服务器后,并不是立即做登录验证的,而是先从服务器端接收加密密钥,然后对账号、密码做加密后再进行登录验证,具体步骤如下:

1、Client=>Server:发送连接请求

2、Server方,生成随机密钥对,将公钥发送给Client

3、Client使用该密钥对登录账号、密码做加密,把加密结果发送给Server

4、Server收到结果后解密,做验证

5、登录成功,后双方使用该密钥对做加密传输

以上,Client登录服务器成功后,会把秘钥存放于:$HOME/.ssh/known_hosts 文件中,其中有服务器ip的指定,如下图:

图中后面一长串的字符即是收到的公钥内容,一般是1024bit。另外,在实际生产环境中,还可能出现当服务器发生更换后,仍使用之前ip,但是客户端中记录的是原服务器的公钥,造成登录失败,此时客户端需要手动进入known_hosts文件,删除相应密钥即可。

此种方式最大的缺点是:账号密码需要透露给相关人员,尤其是需要管理员身份时,root密码容易泄露。所以,在企业中,还有一种方式会更加的安全,就是客户端密钥对验证方式。

2.2.3 客户端密钥对验证

说到密钥对验证,上一种方式也使用的是密钥对,但是密钥对是由服务器生成的,而下面要讲的客户端密钥对方式,顾名思义,密钥对是由客户端生成,大体原理如下:

1、Client本地生成密钥对(公钥、私钥),私钥客户端自己使用,公钥,上传服务器使用

2、Client上传公钥给服务器

3、Server把收到的公钥,导入到公钥记录文件

4、Client使用私钥找服务器做登录,服务器使用公钥与其做验证

5、登录成功后双方使用秘钥对做加密传输

结合上面的步骤,我们来逐步演示一下实验:

客户端配置:

ssh-keygen

---生成密钥对,存放于$HOME/.ssh/下,id_rsa私钥 id_rsa.pub 公钥

---会要求设置密钥的使用密码

图中ssh-keygen后,首先询问是否将密钥存放于/root/.ssh/id_rsa文件中,直接回车即可(当然,可以自定义路径和文件名,一般使用磨人的),然后会要求设置密钥的使用密码,再次输入确认两次密码一致后,密钥即生成成功。当然也可以在要求输入密码时不设置密码,直接回车,即表示密钥无密码

scp ~/.ssh/id_rsa.pub root@192.168.10.10:/root/

---网络复制,上传公钥文件

服务器端配置:

mkdir ~/.ssh ---创建密钥存放目录,若家目录下已有.ssh,则无需创建

cat ~/id_rsa.pub >> ~/.ssh/authorized_keys ---导入到公钥记录文件

注:使用>>追加的目录是不影响公钥文件中原有内容。

PS:以上操作中客户端使用scp上传公钥,服务器导入到公钥文件的操作是为了让读者们了解操作原理与过程,其实无需那么麻烦,客户端生成密钥对后, 使用ssh-copy-id即可自动完成上传及导入工作,具体命令如下:

ssh-copy-id root@192.168.10.10 ---上传公钥,并自动导入客户端登录验证:

ssh 192.168.10.10 或 ssh root@192.168.10.10 ---登录、验证

图中可见,登录时会发现无需输入服务器账号、密码,只需要输入本机密钥的密码即可。

原文发布于微信公众号 - 教主小筑(gh_e0879483602d)

原文发表时间:2019-05-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券