远程访问方式

远程管理介绍

服务器大多数部署在专门的机房环境

  • 电磁、噪声、氧气、温湿度等都不适宜人类长期活动
  • 避免闲杂人等接触业务服务器

远程管理

  • 不同的操作系统都支持远程管理技术
  • 命令行远程管理工具
  • 图形化远程管理工具

远程访问方式

Telnet

古老的命令行远程管理工具

  • 不安全(明文传输一切数据)
  • 应尽量避免使用(适用于不支持ssh的环境)
  • 客户端程序包含在所有系统的默认安装中
  • 服务端口默认TCP 23

客户端使用

1
telnet www.baidu.com 80

服务器安装

1
sudo apt install telnetd

1
2
sudo vi /etc/issue.net     
# 修改操作系统版本信息,就是显示的信息,连接上就会显示这个文件里的信息

服务状态

1
sudo systemctl status inetd.service 

客户端连入服务端

1
telnet 172.16.247.128

SSH

服务器安装:

1
2
sudo apt install openssh-server     # openssh是个工具套件

服务端口默认TCP 22

ssh1、ssh2两个版本(版本2更安全)

服务状态:

1
sudo systemctl status sshd.service

使用:

1
2
ssh cwz@192.168.1.24 -p 22
# 端口默认是22,如果不是22端口需要加端口参数

修改ssh的配置文件:

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
34
35
sudo vim /etc/ssh/sshd_config


# 修改banner信息,就是显示的信息。 建议:
Banner /etc/issue.net

# 改端口
Port 3421


# 公钥认证登录
PubkeyAuthentication yes


# 指定侦听网卡的ip,与指定网卡绑定允许别人来连接
ListenAddress 192.168.13.172

# 建议禁用root进行远程连接,使用sudo暂时获取root权限
PermitRootLogin no


# ubuntu server18默认ssh版本是 版本二,可以强调版本二,加入下面的配置申明
Protocol 2


# 除了可以拒绝root登录,也可以指定用户登录
AllowUsers user1 user2 也可以 DenyUsers user3 除了user3不可以登录,其他都可以


# 添加组登录
AllowGroups sshusers


# 禁止使用密码登录
PasswordAuthentication no

scp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Linux scp 命令用于 Linux 之间复制文件和目录。
scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。


scp a.txt 192.168.1.14: # 拷贝一个文件到目标主机,默认本地账号与远程系统账号同名,文件默认放在主目录

scp a.txt cwz@192.168.1.14:b.txt # 将a.txt改名为b.txt上传

scp a.txt 用户名@192.168.1.14:/tmp/b.txt # 指定用户名,文件存放路径

scp -rv dir/ 用户名@192.168.1.14: # 拷贝一个目录上传

scp 用户名@192.168.1.14:/tmp/b.txt . # 下载文件,注意不要少了后面一个点

SFTP

1
2
3
4
5
6
7
sftp是ssh、ftp的组合

sftp 用户名@192.168.1.14 # 输入密码进入

# 可以使用一些命令:
sftp>helplscd、get、wget等

SSH详解

什么是ssh

简单一点来说,SSH就是一种网络协议,用于在网络主机之间进行加密的一种协议。结合我们的日常工作来说,如果我从一台服务器使用SSH协议登陆另一台服务器,我们就认为这样的登陆是安全的,即使我们的登陆信息在中间被人截获了,我们的密码也不会被泄露。

为什么要搞这么个协议呢?其实,很久很久以前,互联网通信都是明文的,一旦在中间环节被某些中间商截获了,我们的通信内容就暴漏无疑。所以呢,芬兰就有这么一位叫做Tatu Ylonen的人设计了SSH协议,将信息加密,这样就像上面说的,即使我们的登陆信息在中间被人截获了,我们的密码也不会被泄露。目前SSH协议已经在全世界广泛被使用,且已经在成为各个Linux发行版的标配。

SSH原理

从上图中,可以看到我们使用SSH进行登陆时,主要分为以下几步:

  • 用户使用ssh user@host 对远程主机进行登录
  • 远程主机将自己的公钥返回给请求的主机
  • 请求主机使用公钥对用户输入的密码进行加密
  • 请求主机将加密后的密码发送给远程主机
  • 远程主机使用私钥对密码进行解密
  • 最后,远程主机判断解密后的密码是否与用户密码一致,一致就同意登陆,否则反之

看起来没什么毛病,但是在实际工作中,却是存在风险漏洞的。

由于SSH不像https协议那样,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。这就导致如果有人截获了登陆请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪,用户再通过伪造的公钥加密密码,再发送给冒充主机,此时冒充的主机就可以获取用户的登陆密码了,那么SSH的安全机制就荡然无存了,这也就是我们常说的中间人攻击。

known_hosts文件的作用

我们在刚开始使用ssh登录远程主机的时候,会看到这样的提示:

1
2
3
4
The authenticity of host '172.16.247.128 (172.16.247.128 )' can't be established.
ECDSA key fingerprint is SHA256:YMLLk0vyfeoY4rbRTnkMSxY11arS2S4qgVgvnwWpBFw.
ECDSA key fingerprint is MD5:82:75:be:8e:e7:26:ea:18:73:aa:fc:10:44:c8:4f:c3.
Are you sure you want to continue connecting (yes/no)?

上面这段话的意思是,无法确认172.16.247.128主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?这样我们就可以看到,SSH是将这个问题抛给了SSH使用者,让SSH使用者自己来确定是否相信远程主机。但是这样对于用户来说,就存在一个难题,用户怎么知道远程主机的公钥指纹是多少;这的确是一个问题,此时就需要远程主机必须公开自己的公钥指纹,以便用户自行核对。

在经过用户的风险衡量以后,用户只需要输入yes来决定接受这个远程主机的公钥。紧接着,系统会出现以下这样的一句提示,表示远程主机已经得到认可:

1
Warning: Permanently added '172.16.247.128' (ECDSA) to the list of known hosts.

接下来,用户输入远程主机密码即可完成整个登录。

当远程主机的公钥被接受以后,它就会被保存在文件~/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

但是由于known_hosts这个机制的存在,也会引起一些问题,比如远程主机的重新装操作系统了,远程主机就会重新生成公钥,如果我们再登陆远程主机时,由于我们本地的known_hosts文件中记录了原来的公钥,此时就会提示指纹认证失败的错误,这个时候我们只需要删除本地的known_hosts文件即可。又比如,我们经常会写一些自动化的脚本,会自动的登陆到远程主机上去,但是这个known_hosts机制却必须要我们手动输入yes才能完成远程登陆,这样整个自动化登陆就无法完成了,但是我们可以通过修改/etc/ssh/ssh_config配置文件,跳过这个known_hosts的询问机制,将# StrictHostKeyChecking ask修改为StrictHostKeyChecking no即可。

公钥免密登录

上图就是SSH免密登陆原理图,从上图可以看出,SSH免密登陆的前提是使用ssh-keygen -t rsa生成公私秘钥对,然后通过ssh-copy-id -i ~/.ssh/id_rsa.pub user@host命令将公钥分发至远程主机。接下来的每次免密登陆步骤如下:

  • 用户使用ssh user@host命令对远程主机发起登陆
  • 远程主机对用户返回一个随机串
  • 用户所在主机使用私钥对这个随机串进行加密,并将加密的随机串返回至远程主机
  • 远程主机使用分发过来的公钥对加密随机串进行解密
  • 如果解密成功,就证明用户的登陆信息是正确的,则允许登陆;否则反之。

通过ssh-copy-id -i ~/.ssh/id_rsa.pub user@host命令分发的公钥都会被保存至远程主机的~/.ssh/authorized_keys文件中。

SSH的应用

ssh公钥登录

非对称算法(公钥算法)

公钥、私钥

生成密钥对

1
2
3
4
5
6
7
8
ssh-keygen -t rsa -b 4096    # 先在客户端机器生成密钥

~/.ssh/id_rsa # 私钥
~/.ssh/id_rsa.pub # 公钥

ssh-keygen -p -f ~/.ssh/id_rsa # 修改密钥的密码,-f参数是指定修改id_rsa这个秘钥的密码。如果只有一个秘钥,不需要使用-f参数

ssh-keygen -t rsa -b 4096 -f id_mail # 生成多个密钥对 如果还想登录邮件服务器,可以单独设置一个,登录不同的服务器使用不同的密钥对

上传拷贝公钥

1
2
ssh-copy-id 用户名@192.168.1.1     # 拷贝上传公钥
ssh-copy-id -i id_rsa.pub 用户名@192.168.1.1 # 用 i 参数拷贝多个公钥

设置密钥文件权限,出于安全考虑

1
2
chmod 400 ~/.ssh/id_rsa    # 客户端设置只读权限
chmod 600 ~/.ssh/authprized_keys # 服务端

登录

1
ssh cwz@192.168.1.1    # 输入的密码是设置密钥对的时候的密码,而不是系统的密码,这样哪怕得到了系统的密码而没有密钥对的密码,也不能进入连进系统。

SSH 其他应用

远程登录获得一个shell

1
ssh cwz@192.168.50.123
1
2
3
ssh -i ~/.ssh/id_mail cwz@192.168.50.123 -p 2222 ping baidu.com   

# 如果有多个密钥对,用-i参数指定密钥对来解密,因为服务器上有加密的信息,只有对应的密钥对才能解密,-p参数指定端口。 这条命令的意思是ssh登录192.168.50.123这个服务器,登录上去之后不获得shell,也不进入shell这个界面,而是登录完成之后以登录获得后的用户的这个权限运行后面的命令:ping baidu.com,运行结束后又回到本机宿主机的界面。

限速传输:

1
2
3
4
5
6
7
8
9
如果要传输的文件很大,传输的过程会占满带宽,这样其他服务就不能使用了,所以可以先打成tar包,再传送过去,命令是:

tar -cj abc/ | pv | cstream -t 200k | ssh cwz@192.168.50.123 'tar xj'

把abc文件夹打包成tar包,用cstream命令限速200k传输,pv命令显示传输过程,传输给192.168.50.123并解压

# 需要安装pv和cstream
sudo apt install pv
sudo apt install cstream

映射端口:

1
2
3
ssh -fN -L2001:localhost:23 cwz@192.168.50.123 
# 映射远端的23端口到本机的2001端口,-f做端口转发,N参数不占用当前的终端
# -L2001:localhost:23 这玩意就像是水管,

远程映射:

1
ssh -fN -L2002:10.1.1.10:80 cwz@10.1.1.1    # 远程映射,可以将本地的端口映射到互联网上任何的IP的端口上

文件系统的挂载:

1
2
3
4
5
6
7
8
9
10
11
12
sshfs cwz@172.16.247.128:/home/cwz/test a/       # 远程挂载目录 将172.16.247.128的test目录挂载到本机的a目录下

# 应用场景:若是本机硬盘不够的话,可以挂载到存储大的其他机器上 用这种方法要注意网络的带宽和速度




# 刚才只是临时挂载,重启之后就没了。永久生效,可以编辑fstab文件

sudo vim /etc/fstab

user@1.1.1.1:/path /mntpoint(本机挂载点) fuse.sshfs rw,noauto,user,_netdev0

ssh管理多台服务器

当管理大量服务器时,每次都要输入服务器地址,很麻烦又记不住

这时可以在客户端上给每台服务器设置一个标签,方便管理

SSH客户端配置文件

1
2
3
4
5
6
7
8
9
10
11
客户端在./ssh下新建一个config配置文件
vim config

host server1
Hostname 172.16.247.128
Port 22
User cwz


这时直接ssh sever1就可以访问目标服务器了

SSH防爆破

监测 连续10次输错密码的行为,可以判定为攻击者,把ip封杀掉

密码爆破防护

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
34
35
36
37
38
39
40
41
42
43
44
sudo apt install fail2ban   # 安装,fail2ban可以周期性的检查ssh登录的日志,登录成功、失败都会有记载,还可以记录ip地址,当有ip连续登录10次失败了,会把这个ip拿出来,利用系统防火墙把这个ip屏蔽掉


sudo vim /etc/fail2ban/jail.conf # 主配置文件,一般不配置,考虑到更新会把配置文件覆盖,一般会复制一份jail.local文件

sudo cp jail.conf jail.local

sudo vim /etc/fail2ban/jail.loacl # 本地配置文件,软件更新不被覆盖

# 全局的配置内容:
ignoreip = 127.0.0.1/8 192.168.1.245.24 # 忽略地址,即不频率这些地址
bantime = 600 # 禁止访问600秒
findtme = 1 # 每隔1秒检查一次日志
maxretry = 5 # 错误尝试5次,注意周期性检查时间



# jail设置 局部配置
[sshd]
enable = True
filter = sshd
bantime = -1
findtme = 1
maxretry = 5
port = ssh
logpath = /var/log/auth.log # 日志文件
backend = %(sshd_backend)s


sudo systemctl restart fail2ban.service # 重启服务


sudo fail2ban-client status # 查看jail数量状态
sudo iptables -S # 查看防火墙规则
sudo iptables -L -n

sudo fail2ban-client status sshd # 查看jail列表

sudo iptables -D f2b-sshd -s 10.1.1.1 -j REJECT # 通过防火墙手动解除被禁ip
sudo fail2ban-client set sshd unbanip 192.168.1.8 # 手动解除被禁ip


# 重启服务时读取/var/log/auth.log
# 在被禁时间内的IP会再次被禁

VNC

VNC(虚拟网络控制)

介绍

  • 图形化界面
    • 使用图形化界面及工具
    • 是Linux系统最通用的远程图形管理工具,适用于windows

安装图形环境

1
2
sudo apt install gnome-core xfce4 xfce4-goodies    # 安装图形环境
sudo apt install tightvncserver # 安装vnc服务端软件包

重启计算机

运行配置

1
2
3
4
vncserver              # 默认会使用5900往后的端口

~/.vnc/xstartup # 运行文件
vncserver -kill :1 # 结束实例

创建新的运行文件

1
2
3
4
5
6
7
8
9
10
# 自己创建xstartup文件
vim ~/.vnc/xstartup

# 写入脚本
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &


chmod +x xstartup # 赋予可执行权限

客户端程序:https://www.realvnc.com/en/connect/download/viewer/linux/

puppet

介绍

被称为全生命周期的远程管理方案

可以不登录到目标服务器上获取shell,使用一种客户端服务器架构的方式

在被管理的服务器上安装一个agent程序,在另外一个服务器上安装一个puppet的服务端程序,

然后利用puppet的服务端程序去管理puppet的客户端程序。

比如说,我有500台服务器要安装apache服务,我就可以通过puppet服务器定制一个脚本,去管理500台服务器全部安装上apache。

  • 软件安装部署
  • 权限设置
  • 账号管理
  • 支持云平台
  • 支持容器
  • 适合大量服务器管理

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
# 准备步骤  先改主机名  ,再到hosts文件下给两台机器创建ip  域名解析关系
hostnamectl set-hostname puppet

vi /etc/hosts
10.1.1.1 puppet.lab.com puppet
10.1.1.2 client.lab.com client




# 安装
sudo apt install puppetmaster 服务端
sudo apt install puppet 客户端

服务端配置-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cd /etc/puppet/
sudo mkdir -p modules/apache2/manifests # 用来存放资源文件
sudo vi /etc/puppet/modules/apache2/manifests/init.pp

# 配置文件 定义资源 安装apache2
class apache2 {
package {'apache2':
ensure => installed,
}
service {'apache':
ensure => true,
enable => true,
require => package['apache2'],
}
}

定义资源,然后选择给哪些服务器(puppet客户端)使用

服务端配置-2

1
2
3
4
5
6
7
8
9
sudo vi /etc/puppet/manifests/site.pp

# 定义配置,指定管理的puppet客户端资源
node 'client.lab.com' {
include apache2
}

# 重启服务
sudo systemctl restart puppetmaster.service

客户端配置

1
2
3
4
5
6
7
sudo vi /etc/default/puppet

# 添加配置
START=yes

# 重启服务
sudo systemctl restart puppet.service

重启之后,客户端回向以puppet命名的服务器发起请求,申请证书。客户端会自己生成一个签名文件(就是一串字符串),发给服务端之后,服务端(使用自己的私钥)必须给这串字符串签名,客户端才会得到证书。

1
2
3
4
5
6
7
8
9
10
11
12
# 客户端证书签名请求测试
sudo puppet agent --fingerprint
sudo puppet agent --test # 测试查看是否获取签名


# 服务端证书请求查看签名
sudo puppet cert list
sudo puppet cert sign client.lab.com # 给客户端签名

# 日志状态信息
sudo systemctl status puppet.service
/var/log/syslog