01-远程管理
远程访问方式
远程管理介绍
服务器大多数部署在专门的机房环境
- 电磁、噪声、氧气、温湿度等都不适宜人类长期活动
- 避免闲杂人等接触业务服务器
远程管理
- 不同的操作系统都支持远程管理技术
- 命令行远程管理工具
- 图形化远程管理工具
远程访问方式
Telnet
古老的命令行远程管理工具
- 不安全(明文传输一切数据)
- 应尽量避免使用(适用于不支持ssh的环境)
- 客户端程序包含在所有系统的默认安装中
- 服务端口默认TCP 23
客户端使用
1 | telnet www.baidu.com 80 |
服务器安装1
sudo apt install telnetd
1 | sudo vi /etc/issue.net |
服务状态
1 | sudo systemctl status inetd.service |
客户端连入服务端
1 | telnet 172.16.247.128 |
SSH
服务器安装:
1 | sudo apt install openssh-server # openssh是个工具套件 |
服务端口默认TCP 22
ssh1、ssh2两个版本(版本2更安全)
服务状态:
1 | sudo systemctl status sshd.service |
使用:
1 | ssh cwz@192.168.1.24 -p 22 |
修改ssh的配置文件:
1 | sudo vim /etc/ssh/sshd_config |
scp
1 | Linux scp 命令用于 Linux 之间复制文件和目录。 |
SFTP
1 | sftp是ssh、ftp的组合 |
SSH详解
什么是ssh
简单一点来说,SSH就是一种网络协议,用于在网络主机之间进行加密的一种协议。结合我们的日常工作来说,如果我从一台服务器使用SSH协议登陆另一台服务器,我们就认为这样的登陆是安全的,即使我们的登陆信息在中间被人截获了,我们的密码也不会被泄露。
为什么要搞这么个协议呢?其实,很久很久以前,互联网通信都是明文的,一旦在中间环节被某些中间商截获了,我们的通信内容就暴漏无疑。所以呢,芬兰就有这么一位叫做Tatu Ylonen的人设计了SSH协议,将信息加密,这样就像上面说的,即使我们的登陆信息在中间被人截获了,我们的密码也不会被泄露。目前SSH协议已经在全世界广泛被使用,且已经在成为各个Linux发行版的标配。
SSH原理
从上图中,可以看到我们使用SSH进行登陆时,主要分为以下几步:
- 用户使用
ssh user@host
对远程主机进行登录 - 远程主机将自己的公钥返回给请求的主机
- 请求主机使用公钥对用户输入的密码进行加密
- 请求主机将加密后的密码发送给远程主机
- 远程主机使用私钥对密码进行解密
- 最后,远程主机判断解密后的密码是否与用户密码一致,一致就同意登陆,否则反之
看起来没什么毛病,但是在实际工作中,却是存在风险漏洞的。
由于SSH不像https协议那样,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。这就导致如果有人截获了登陆请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪,用户再通过伪造的公钥加密密码,再发送给冒充主机,此时冒充的主机就可以获取用户的登陆密码了,那么SSH的安全机制就荡然无存了,这也就是我们常说的中间人攻击。
known_hosts文件的作用
我们在刚开始使用ssh登录远程主机的时候,会看到这样的提示:
1 | The authenticity of host '172.16.247.128 (172.16.247.128 )' can't be established. |
上面这段话的意思是,无法确认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 | ssh-keygen -t rsa -b 4096 # 先在客户端机器生成密钥 |
上传拷贝公钥
1 | ssh-copy-id 用户名@192.168.1.1 # 拷贝上传公钥 |
设置密钥文件权限,出于安全考虑
1 | chmod 400 ~/.ssh/id_rsa # 客户端设置只读权限 |
登录
1 | ssh cwz@192.168.1.1 # 输入的密码是设置密钥对的时候的密码,而不是系统的密码,这样哪怕得到了系统的密码而没有密钥对的密码,也不能进入连进系统。 |
SSH 其他应用
远程登录获得一个shell
1 | ssh cwz@192.168.50.123 |
1 | ssh -i ~/.ssh/id_mail cwz@192.168.50.123 -p 2222 ping baidu.com |
限速传输:
1 | 如果要传输的文件很大,传输的过程会占满带宽,这样其他服务就不能使用了,所以可以先打成tar包,再传送过去,命令是: |
映射端口:
1 | ssh -fN -L2001:localhost:23 cwz@192.168.50.123 |
远程映射:
1 | ssh -fN -L2002:10.1.1.10:80 cwz@10.1.1.1 # 远程映射,可以将本地的端口映射到互联网上任何的IP的端口上 |
文件系统的挂载:
1 | sshfs cwz@172.16.247.128:/home/cwz/test a/ # 远程挂载目录 将172.16.247.128的test目录挂载到本机的a目录下 |
ssh管理多台服务器
当管理大量服务器时,每次都要输入服务器地址,很麻烦又记不住
这时可以在客户端上给每台服务器设置一个标签,方便管理
SSH客户端配置文件
1 | 客户端在./ssh下新建一个config配置文件 |
SSH防爆破
监测 连续10次输错密码的行为,可以判定为攻击者,把ip封杀掉
密码爆破防护
1 | sudo apt install fail2ban # 安装,fail2ban可以周期性的检查ssh登录的日志,登录成功、失败都会有记载,还可以记录ip地址,当有ip连续登录10次失败了,会把这个ip拿出来,利用系统防火墙把这个ip屏蔽掉 |
VNC
VNC(虚拟网络控制)
介绍
- 图形化界面
- 使用图形化界面及工具
- 是Linux系统最通用的远程图形管理工具,适用于windows
安装图形环境
1 | sudo apt install gnome-core xfce4 xfce4-goodies # 安装图形环境 |
重启计算机
运行配置
1 | vncserver # 默认会使用5900往后的端口 |
创建新的运行文件
1 | # 自己创建xstartup文件 |
客户端程序:https://www.realvnc.com/en/connect/download/viewer/linux/
puppet
介绍
被称为全生命周期的远程管理方案
可以不登录到目标服务器上获取shell,使用一种客户端服务器架构的方式
在被管理的服务器上安装一个agent程序,在另外一个服务器上安装一个puppet的服务端程序,
然后利用puppet的服务端程序去管理puppet的客户端程序。
比如说,我有500台服务器要安装apache服务,我就可以通过puppet服务器定制一个脚本,去管理500台服务器全部安装上apache。
- 软件安装部署
- 权限设置
- 账号管理
- 支持云平台
- 支持容器
- 适合大量服务器管理
安装
1 | # 准备步骤 先改主机名 ,再到hosts文件下给两台机器创建ip 域名解析关系 |
服务端配置-1
1 | cd /etc/puppet/ |
定义资源,然后选择给哪些服务器(puppet客户端)使用
服务端配置-2
1 | sudo vi /etc/puppet/manifests/site.pp |
客户端配置
1 | sudo vi /etc/default/puppet |
重启之后,客户端回向以puppet命名的服务器发起请求,申请证书。客户端会自己生成一个签名文件(就是一串字符串),发给服务端之后,服务端(使用自己的私钥)必须给这串字符串签名,客户端才会得到证书。
1 | # 客户端证书签名请求测试 |