linux-运维进阶-14 SSH远程访问服务
概念解析
提示:SSH远程访问服务会在后续章节“linux-运维实战”中,在远程控制腾讯云服务器时使用到,是保证你的服务器不被别人轻易黑掉的重要知识点,所以必须牢牢掌握。
SSH(22端口)是Secure Shell Protocol的简写,由IETF网络工作小组(Network Working Group)制定;在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输。确保了传递的数据安全。
SSH是专为远程登录会话和其他网络服务提供的安全性协议。利用SSH协议可以有效的防止远程管理过程中的信息泄露问题,在当前的生产环境运维工作中,绝大多数企业普通采用SSH协议服务来代替传统的不安全的远程联机服务软件,如telnet(23端口,非加密的)等。
相比较于telnet,ssh可以更好的应对中间人攻击,更加安全,所以现在基本都是通过ssh协议去操作服务器的。
SSH远程登录原理
1、密码口令登录
这种登录方式说白了就是用户名加密码就可以登录,安全级别低。譬如你在未做任何修改之前,别人便可轻易通过用户名root加密码爆破来登录你的服务器。但是无论如何,自己输的密码是加密之后再传送给服务器的,传输过程中即使被截获,那也不会像telnet一样直接看到密码。
主要流程:
1、客户端连接上服务器之后,服务器把自己的公钥传给客户端
2、客户端输入服务器密码通过公钥加密之后传给服务器
3、服务器根据自己的私钥解密登录密码,如果正确那么就让客户端登录
2、公钥登录密码口令登录
公钥登录的使用相对会比较少,之所以用公钥登录是为了解决安全问题和每次登录服务器都要输入密码的问题,这里比较流行使用RSA加密方案,主要流程包含:
1、客户端生成RSA公钥和私钥
2、客户端将自己的公钥存放到服务器
3、客户端请求连接服务器,服务器将一个随机字符串用公钥加密后发送给客户端
4、客户端根据自己的私钥解密这个随机字符串之后,对随机字符串生成摘要并将摘要发送给服务器
5、服务器对自己生成的随机字符串也生成摘要,然后与客户端发过来的摘要两相对比,若一致则登录成功。
公钥登录:
知识回顾
带端口和不带端口ssh远程连接服务器(这里以虚拟机为例,下一章咱们再去腾讯云买服务器玩儿)
1 | [C:\~]$ ssh root@192.168.141.12 |
nmcli网络管理命令
查看当前网络设备
1 | [root@localhost ~]# nmcli connection show |
查看指定网络设备的详细信息
1 | [root@localhost ~]# nmcli connection show ens33 |
给网卡绑定多个配置文件
1 | # 给网卡ens33增加一个名为ens60的配置文件 |
SSH远程访问服务
保证Linux服务器开启ssh之后的基本安全,要做到以下四点:
- 禁止root使用ssh访问远程Linux服务器
- 禁止使用密码登录ssh服务
- 使用非对称密钥登录ssh服务
- 修改ssh服务的默认端口号
解析:
1.禁止root使用ssh访问远程Linux服务器
有效防止黑客利用暴力破解工具,在已知用户名root的情况下,轻易将你的root密码破解。
2.禁止使用密码登录ssh服务
即使你禁止了root使用ssh访问远程Linux服务器,但是依然存在这样一种可能:黑客可能通过社交软件了解了一些你的个人信息,了解到你可能用你的英文名或者社交昵称等作为你的服务器用户名,然后暴力破解出你的用户名和密码,黑掉你的服务器。所以用密码登录服务器,始终是不安全的。
3.使用非对称密钥登录ssh服务
不用密码登录,那咱们怎么验证身份呢?这里我们可以采用比密码安全不知道几万倍的非对称密钥登录ssh服务,别人没有你的秘钥,就无法ssh远程操控你的服务器。
4.修改ssh服务的默认端口号
ssh的默认端口号是22,咱们之前用的命令:
1 | [C:\~]$ ssh root@192.168.141.12 |
这两条命令就是通常我们ssh远程访问服务器所使用的命令,许多小白级别的运维人员,用的root加密码123456就可以登录上去,话说就算小白同学多个心眼改一下ssh端口号,黑客也相对没那么容易攻破你的服务器哇!
步骤:
1.新建一个用户组afeng,然后新建一个用户aaa,用来代替root的使用,加入到afeng组,可以使用sudo命令借用root的权限来管理Linux服务器
1 | [root@localhost ~]# groupadd afeng |
2.锁定root用户的密码
1 | [root@localhost ~]# passwd -l root |
这时候,我们已经可以用普通用户登录到Linux服务器,用sudo su root切换到root用户继续使用root。
可以用xshell另外多开一个会话来验证一下
1 | [C:\~]$ ssh aaa@192.168.141.12 |
发现咱们现在确实可以登陆上来,接下来验证一下咱们能否用sudo su root切换到root用户继续使用root。
1 | [aaa@localhost ~]$ sudo su root |
结果咱们被拒绝了,因为现在aaa用户尚未在sudoers file里。那咱们回到原来的会话(xshell一个窗口就是一个会话),也就是root登录着的那个会话,先把aaa添加进sudoers file里。
1 | [root@localhost ~]# visudo |
现在切换回aaa那个会话,再次验证咱们能否用sudo su root切换到root用户继续使用root
1 | [aaa@localhost ~]$ sudo su root |
3.设置ssh服务,禁止root使用ssh访问远程Linux服务器,禁止使用密码登录ssh服务器,改变服务端口号为10022
1 | [root@localhost ~]# vim /etc/ssh/sshd_config |
4.向防火墙中添加修改的端口,如果开启了selinux,在修改端口号的时候会失败,我们直接关闭selinux
1 | [root@localhost ~]# firewall-cmd --zone=public --add-port=10022/tcp --permanent |
5.生成证书:
注意:新的用户需要生成新的密钥来用来登录
1 | xshell的新会话中先切换回aaa |
命令敲完后,系统会自动生成~/.ssh目录,这个目录下会保存Linux的公钥和私钥以及存放客户端公钥的文件.ssh/authorized_keys
6.windows生成客户端公钥:
此处一直点下一步,直到进入如下选项时,我们设一个密钥名称,密码和确认那俩框不用填,点击完成即可
7.将复制的内容写入到Linux系统中我们新建用户aaa的~/.ssh/authorized_keys文件中
1 | [aaa@localhost ~]$ whoami |
8.重启sshd服务,让ssh配置生效(改/etc/sshd/目录下的文件需要重新服务,添加删除用户密钥并不需要重启sshd服务)
1 | [root@localhost ssh]# systemctl restart sshd |
9.用xshell远程登录Linux服务器即可。
情况一:现在假设黑客猜到了你的ssh端口号是10022,又把你的密钥也搞到了手,现在他尝试用root用户登录
1 | [C:\~]$ ssh root@192.168.141.12 10022 |
黑客登录失败,失败的原因就是我们拒绝了root登录
情况二:假设黑客搞到了你的用户名aaa和ssh端口号10022,但是服务器是拒绝用密码登陆的,也就是他没法爆破,只能用密钥登录,可惜他没有你的aaa用户的密钥feng_system,所以也登录不上
情况三:这是99.99%的情况
别人不知道你的端口号,也不知道你的用户名,更没有你的用户密钥,所以服务器很安全。但是服务器ip很容易就会被知道,ping一下咱网站域名就可以看到服务器ip了。
黑客仅仅知道你的服务器ip的话,是无法ssh远程控制你的服务器的。但是黑客可以搞一个低轨道粒子炮之类的工具,对你的服务器一直轰炸,或者搞一些其他的攻击方式,让你的服务器很难受,这就涉及到网络安全方面的知识了。
当然阿里云腾讯云也有禁止别人ping咱们的服务器的设置,可以勾选即可。
不间断会话服务(虚拟终端)
因为在执行一些脚本的时候,可能要使用的时间很长,而我们电脑可能不会开那么久的终端软件,那么这时候,就要有一个虚拟的终端来帮助我们执行长时间的任务
安装screen
1 | [aaa@localhost ~]$ sudo su root |
新建一个终端任务
1 | [root@localhost ~]# screen -S lnmp |
如果任务没有执行完,我们需要关闭终端,可以直接关掉终端(千万不要用CTRL+Z或者CTRL+C),也可以用ctrl+a,松开a再按一下d(ctrl不要放开)临时退出虚拟终端
恢复最近的一个终端,用screen -r命令
1 | [root@localhost aaa]# screen -r |
如果有多个虚拟终端,我们可以使用命令查看后台运行的虚拟终端
1 | [root@localhost aaa]# screen -list |
要恢复指定的虚拟终端
1 | [root@localhost aaa]# screen -r lnmp |
退出虚拟终端的话,进入虚拟中断(ctrl+c)之后用exit退出就行啦
1 | [root@localhost lnmp1.5]# exit |
虚拟终端这个不好演示,截图的话也没啥意义,上面的命令行足矣