linux-运维进阶-14 SSH远程访问服务

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、服务器对自己生成的随机字符串也生成摘要,然后与客户端发过来的摘要两相对比,若一致则登录成功。

公钥登录:

1ZPEee.png

1ZPQQf.png

1ZPly8.png

知识回顾

带端口和不带端口ssh远程连接服务器(这里以虚拟机为例,下一章咱们再去腾讯云买服务器玩儿)

1
2
3
4
5
[C:\~]$ ssh root@192.168.141.12

[C:\~]$ ssh root@192.168.141.12 22

PS:不带端口时,就是默认采用了22端口

nmcli网络管理命令

查看当前网络设备

1
2
3
4
5
[root@localhost ~]# nmcli connection show
NAME UUID TYPE DEVICE
Wired connection 1 e574440b-5a39-3a2b-a14d-ea6a2d920a7e ethernet ens37
ens33 9c86a9bc-0939-4790-8580-274041e5eff3 ethernet ens33
[root@localhost ~]#

查看指定网络设备的详细信息

1
[root@localhost ~]# nmcli connection show ens33

给网卡绑定多个配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# 给网卡ens33增加一个名为ens60的配置文件
[root@localhost ~]# nmcli connection add con-name ens60 ifname ens33 autoconnect no type ethernet ipv4.addresses 192.168.141.200/24 gw4 192.168.141.2
Connection 'ens60' (8ad23f3d-e490-48a8-bc9f-273ae773435a) successfully added.
[root@localhost ~]# nmcli connection show
NAME UUID TYPE DEVICE
Wired connection 1 e574440b-5a39-3a2b-a14d-ea6a2d920a7e ethernet ens37
ens33 9c86a9bc-0939-4790-8580-274041e5eff3 ethernet ens33
ens60 8ad23f3d-e490-48a8-bc9f-273ae773435a ethernet --

# 启用ens60配置文件
[root@localhost ~]# nmcli connection up ens60

# 启用了这个配置之后,IP就可以ping通,但ifconfig可能看不到这个配置,同时ens33的ip会变化,xshell会断开,这个先不用着急。

SSH远程访问服务

保证Linux服务器开启ssh之后的基本安全,要做到以下四点:

  1. 禁止root使用ssh访问远程Linux服务器
  2. 禁止使用密码登录ssh服务
  3. 使用非对称密钥登录ssh服务
  4. 修改ssh服务的默认端口号

解析:

1.禁止root使用ssh访问远程Linux服务器

  有效防止黑客利用暴力破解工具,在已知用户名root的情况下,轻易将你的root密码破解。

2.禁止使用密码登录ssh服务

  即使你禁止了root使用ssh访问远程Linux服务器,但是依然存在这样一种可能:黑客可能通过社交软件了解了一些你的个人信息,了解到你可能用你的英文名或者社交昵称等作为你的服务器用户名,然后暴力破解出你的用户名和密码,黑掉你的服务器。所以用密码登录服务器,始终是不安全的。

3.使用非对称密钥登录ssh服务

  不用密码登录,那咱们怎么验证身份呢?这里我们可以采用比密码安全不知道几万倍的非对称密钥登录ssh服务,别人没有你的秘钥,就无法ssh远程操控你的服务器。

4.修改ssh服务的默认端口号

​ ssh的默认端口号是22,咱们之前用的命令:

1
2
3
4
[C:\~]$ ssh root@192.168.141.12
[C:\~]$ ssh root@192.168.141.12 22

PS:不带端口时,就是默认采用了22端口

  这两条命令就是通常我们ssh远程访问服务器所使用的命令,许多小白级别的运维人员,用的root加密码123456就可以登录上去,话说就算小白同学多个心眼改一下ssh端口号,黑客也相对没那么容易攻破你的服务器哇!

步骤:

1.新建一个用户组afeng,然后新建一个用户aaa,用来代替root的使用,加入到afeng组,可以使用sudo命令借用root的权限来管理Linux服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~]# groupadd afeng
[root@localhost ~]# useradd aaa -G afeng
[root@localhost ~]# cat /etc/group | grep aaa
afeng:x:1000:aaa
aaa:x:1001:
[root@localhost ~]#
[root@localhost ~]# cat /etc/passwd | grep aaa
aaa:x:1000:1001::/home/aaa:/bin/bash
[root@localhost ~]#

可以看到,用户aaa的UID是1000,GID是1001对应的也就是aaa,所以其主组是aaa
从/etc/group下的afeng:x:1000:aaa也可以看出afeng是aaa的附属组

设置用户aaa的密码
[root@localhost ~]# passwd aaa
Changing password for user aaa.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost ~]#

2.锁定root用户的密码

1
2
3
4
5
6
7
8
[root@localhost ~]# passwd -l root
Locking password for user root.
passwd: Success

# 查看root用户密码的状态
[root@localhost ~]# passwd -S root
root LK 2018-09-24 0 99999 7 -1 (Password locked.)
[root@localhost ~]#

这时候,我们已经可以用普通用户登录到Linux服务器,用sudo su root切换到root用户继续使用root。

可以用xshell另外多开一个会话来验证一下

1
2
3
4
5
6
7
8
9
[C:\~]$ ssh aaa@192.168.141.12


Connecting to 192.168.141.12:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

WARNING! The remote SSH server rejected X11 forwarding request.
[aaa@localhost ~]$

发现咱们现在确实可以登陆上来,接下来验证一下咱们能否用sudo su root切换到root用户继续使用root。

1
2
3
4
5
6
7
8
9
10
11
12
[aaa@localhost ~]$ sudo su root

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

[sudo] password for aaa:
aaa is not in the sudoers file. This incident will be reported.
[aaa@localhost ~]$

  结果咱们被拒绝了,因为现在aaa用户尚未在sudoers file里。那咱们回到原来的会话(xshell一个窗口就是一个会话),也就是root登录着的那个会话,先把aaa添加进sudoers file里。

1
2
3
4
5
6
[root@localhost ~]# visudo 
找到
root ALL=(ALL) ALL
在上面这一行下面新加一行:
aaa ALL=(ALL) ALL
保存退出

现在切换回aaa那个会话,再次验证咱们能否用sudo su root切换到root用户继续使用root

1
2
3
4
5
[aaa@localhost ~]$ sudo su root
[sudo] password for aaa:
[root@localhost aaa]#

这回可以了

3.设置ssh服务,禁止root使用ssh访问远程Linux服务器,禁止使用密码登录ssh服务器,改变服务端口号为10022

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@localhost ~]# vim /etc/ssh/sshd_config 

禁止Root使用ssh远程登录
38行将
#PermitRootLogin yes
改成
PermitRootLogin no
别忘了#号也要去掉,#号是备注的意思

开启证书登录的功能
43行将
#PubkeyAuthentication yes
去掉注释改成
PubkeyAuthentication yes


禁止使用密码登录ssh服务器
65行将
PasswordAuthentication yes
改为
PasswordAuthentication no

改变ssh服务端口号
17行将
#Port 22
改成
Port 10022


保存后退出,重启ssh服务(sshd就是ssh device的意思)
[root@localhost ~]# systemctl restart sshd
如果这里报错了,那一定是上面/etc/ssh/sshd_config 这个配置文件你哪里写错了

4.向防火墙中添加修改的端口,如果开启了selinux,在修改端口号的时候会失败,我们直接关闭selinux

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@localhost ~]# firewall-cmd --zone=public --add-port=10022/tcp --permanent 
success
[root@localhost ~]# firewall-cmd --reload
success
查看端口是否添加成功:
[root@localhost ~]# firewall-cmd --zone=public --query-port=10022/tcp
yes
[root@localhost ~]#

[root@localhost ~]# vim /etc/selinux/config

SELINUX=enforcing
改为
SELINUX=disabled


检查一下
[root@localhost ~]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted


[root@localhost ~]#

5.生成证书:

注意:新的用户需要生成新的密钥来用来登录

1
2
3
4
xshell的新会话中先切换回aaa
[root@localhost aaa]# su aaa
[aaa@localhost ~]$ ssh-keygen
此处一直敲回车即可

​ 命令敲完后,系统会自动生成~/.ssh目录,这个目录下会保存Linux的公钥和私钥以及存放客户端公钥的文件.ssh/authorized_keys

6.windows生成客户端公钥:

1etFfA.png

此处一直点下一步,直到进入如下选项时,我们设一个密钥名称,密码和确认那俩框不用填,点击完成即可

1etElt.png

7.将复制的内容写入到Linux系统中我们新建用户aaa的~/.ssh/authorized_keys文件中

1
2
3
4
5
6
7
[aaa@localhost ~]$ whoami
aaa
[aaa@localhost ~]$ vim ~/.ssh/authorized_keys
[aaa@localhost ~]$ cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAurKiTVI2mKJswDThaEYNF/DiBOJZeMTCofxFXw0ZjD0fisnKmLmnBQKEna1NArHFVn42RcwRYM3o5KezSNz9dcj0QB2KB9Rby7N5RBL6WQP5HhhclY5ldHI8AIrMDKtzd+IbZYoMknIXWt0iQ9Z069YmQB4dQlQrq9ZUxEdgz5mhusjoSZxVu2kf14/qhuK28/Mo5NLATvTIbN04D8bXX2Jh9vlhhhK8XCnvyuIxV2lNvfU5K88CgM+utOAvELjKhsiMlmrhvNs4kh5o3JSpmIyJfayFpnLvdrGn9w6u1ndzoTE29oTCUKllwD3BZRqPmdVGDF+koBLzipNMCjk21w== rsa 2048-013019
[aaa@localhost ~]$ chmod 600 ~/.ssh/authorized_keys
[aaa@localhost ~]$

8.重启sshd服务,让ssh配置生效(改/etc/sshd/目录下的文件需要重新服务,添加删除用户密钥并不需要重启sshd服务)

1
2
3
4
5
[root@localhost ssh]# systemctl restart sshd
[root@localhost ssh]# netstat -ntlp | grep 10022
tcp 0 0 0.0.0.0:10022 0.0.0.0:* LISTEN 6110/sshd
tcp6 0 0 :::10022 :::* LISTEN 6110/sshd
[root@localhost ssh]#

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
2
3
4
[aaa@localhost ~]$ sudo su root
[sudo] password for aaa:
[root@localhost aaa]#
[root@localhost aaa]# yum install screen -y

新建一个终端任务

1
2
3
4
[root@localhost ~]# screen -S lnmp
回车之后进入到新的终端开始一个任务

[root@localhost aaa]# wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz && tar zxf lnmp1.5.tar.gz && cd lnmp1.5 && ./install.sh lnmp

  如果任务没有执行完,我们需要关闭终端,可以直接关掉终端(千万不要用CTRL+Z或者CTRL+C),也可以用ctrl+a,松开a再按一下d(ctrl不要放开)临时退出虚拟终端

恢复最近的一个终端,用screen -r命令

1
[root@localhost aaa]# screen -r

如果有多个虚拟终端,我们可以使用命令查看后台运行的虚拟终端

1
2
3
4
5
6
[root@localhost aaa]# screen -list
There is a screen on:
6327.lnmp (Detached)
1 Socket in /var/run/screen/S-root.

[root@localhost aaa]#

要恢复指定的虚拟终端

1
[root@localhost aaa]# screen -r lnmp

退出虚拟终端的话,进入虚拟中断(ctrl+c)之后用exit退出就行啦

1
[root@localhost lnmp1.5]# exit

虚拟终端这个不好演示,截图的话也没啥意义,上面的命令行足矣

欢迎打赏,谢谢
------ 本文结束------
0%