新锦江客服开户电话{微4766168}
随着云工程师和架构师开始采用容器化,确保安全通信变得至关重要。数据传输和访问控制是需要考虑的安全关键方面。SSH 隧道是一种可以帮助实现应用程序或解决方案不同组件之间安全通信的技术。SSH 隧道在现有 SSH 连接上创建加密通道,允许在本地计算机(SSH 客户端)和远程服务器(SSH 服务器)之间进行安全的数据传输。
在本文中,我们将展示如何在云中运行的容器之间建立 SSH 隧道,这些容器需要通过云虚拟机中托管的 SSH 服务器与下游资源进行通信。
SSH 隧道
在深入实现之前,让我们快速回顾一下 SSH 隧道。SSH 隧道也称为 SSH 端口转发,通过在现有 SSH 连接上创建加密隧道,允许两个端点之间进行安全通信。它使数据能够通过中间通道在本地计算机(SSH 客户端)和远程服务器(SSH 服务器)之间安全地传输。以下是可以使用 SSH 隧道的不同场景的概述:
1. 确保远程访问内部服务的安全: 出于安全原因,组织拥有内部服务(例如数据库、内部 Web 应用程序),这些服务不会暴露在公共互联网上。使用 SSH 隧道,员工可以从远程位置安全地连接到这些内部服务,而无需将服务暴露在互联网上。
2. 绕过防火墙限制: 开发人员需要访问企业防火墙后面的特定资源,但防火墙限制直接访问。通过设置 SSH 隧道,开发人员可以安全地通过防火墙转发流量,从而允许他们访问受限制的资源。
3. 保护传输中的敏感数据: 应用程序需要在不同组件或服务之间发送敏感数据,存在数据被拦截的风险。SSH 隧道可用于在数据在组件之间传输时对其进行加密,确保数据在传输过程中保持安全。
4. 安全访问远程数据库: 开发人员需要访问远程数据库服务器以进行维护或开发,但由于安全策略不允许直接访问。开发人员可以设置 SSH 隧道以安全地连接到远程数据库服务器,而无需将其暴露在公共互联网上。
5. 安全地使用不安全的协议: 应用程序使用不安全的协议(例如 FTP、HTTP)在不同服务之间进行通信。通过将不安全的协议包装在 SSH 隧道中,可以确保通信安全,从而保护数据不被拦截。
6. 远程调试: 开发人员需要调试在远程服务器上运行的应用程序,但对调试端口的直接访问受到限制。 SSH 隧道可用于将调试端口从远程服务器转发到本地计算机,从而使开发人员可以安全地调试应用程序。
7. 保护物联网设备通信: 物联网设备需要与中央服务器通信,但通信容易被拦截或篡改。通过在物联网设备和中央服务器之间建立 SSH 隧道,可以加密和保护通信,保护传输中的数据。
8. 安全文件传输: 文件需要在不同系统或位置之间安全地传输。SSH 隧道可用于通过加密隧道安全地传输文件,确保数据的机密性和完整性。
9. 访问远程服务: 用户需要安全地访问远程服务器上托管的服务或资源。通过设置 SSH 隧道,用户可以安全地访问远程服务,就像它们在本地运行一样,从而保护传输中的数据。
10. 保护网络流量: 通过不受信任的网络访问网站或网络应用程序时,需要保护网络流量。SSH 隧道可用于创建与远程服务器的安全连接,加密网络流量并保护其免遭窃听或拦截。
设想
对于本文,我们将实现以下场景:
架构组件
myInfraVNet:部署下游资源的虚拟网络。nginxVM:myInfraVNet 中运行 Nginx(Web 服务器或反向代理)的虚拟机。它被分配了一个私有 IP 地址,因此无法从互联网直接访问。nginxVM/NSG:与 nginxVM 关联的网络安全组,控制入站和出站流量。myAppVNet:部署容器应用程序的虚拟网络。容器应用环境:此环境托管两个容器化应用程序:mycontainerapp:一个简单的容器化 Python 应用程序,它从在 VM 上运行的 NGINX 服务器获取内容并将该内容与其他内容一起呈现。sshclientcontainerapp:另一个容器化应用程序,用于建立到其他资源的安全 SSH 隧道。容器注册表:存储可部署到容器应用的容器镜像。VNet Peering:允许 myAppVNet 和 myInfraVNet 中的资源相互通信。它本质上是两个 VNet 之间的桥梁,可实现低延迟、高带宽的互连。SSH 隧道:myAppVNet 中的 sshclientcontainerapp 建立到 myInfraVNet 中的 nginxVM 的 SSH 隧道,以实现容器化应用程序和 VM 之间的安全通信。网络安全组 (NSG):nginxVM/NSG 确保只有允许的流量才能到达 nginxVM。正确配置此 NSG 以允许来自 sshclientcontainerapp 的 SSH 流量并限制不必要的访问至关重要。
编写场景脚本
基于上述场景,我们现在将编写架构实现脚本。该脚本将创建必要的资源、配置 SSH 隧道并部署容器化应用程序。
先决条件
运行脚本之前,请确保您满足以下先决条件:
安装在本地计算机上的 Azure CLI。Docker 安装在您的本地机器上。有效的 Azure 订阅。对 Azure 容器应用、Azure 容器注册表和 Azure 虚拟网络有基本的了解。
参数
首先定义脚本中要使用的参数。这些参数包括资源组名称、位置、虚拟网络名称、子网名称、VM 名称、VM 映像、VM 大小、SSH 密钥、管理员用户名、管理员密码、容器应用环境名称、容器注册表名称、容器应用映像名称、SSH 客户端容器映像名称、SSH 端口和 NGINX 端口。将生成一个随机字符串并将其附加到资源组名称、容器应用环境名称和容器注册表名称,以确保唯一性。
random=$(echo $RANDOM | tr ‘[0-9]’ ‘[a-z]’)
echo “Random:” $random
export RESOURCE_GROUP=rg-ssh-$(echo $random)
echo “RESOURCE_GROUP:” $RESOURCE_GROUP
export LOCATION=”australiaeast”
export INFRA_VNET_NAME=”myInfraVNet”
export APP_VNET_NAME=”myAppVNet”
export INFRA_SUBNET_NAME=”mySubnet”
export APP_SUBNET_NAME=”acaSubnet”
export VM_NAME=”nginxVM”
export VM_IMAGE=”Ubuntu2204″
export VM_SIZE=”Standard_DS1_v2″
export VM_KEY=mykey$(echo $random)
export ADMIN_USERNAME=”azureuser”
export ADMIN_PASSWORD=”Password123$” # Replace with your actual password
export CONTAINER_APPS_ENV=sshacae$(echo $random)
export REGISTRY_NAME=sshacr$(echo $random)
export REGISTRY_SKU=”Basic”
export CONTAINER_APP_IMAGE=”mycontainerapp:latest”
export SSH_CLIENT_CONTAINER_IMAGE=”sshclientcontainer:latest”
export CONTAINER_APP_NAME=”mycontainerapp”
export SSH_CLIENT_CONTAINER_APP_NAME=”sshclientcontainerapp”
export SSH_PORT=22
export NGINX_PORT=80
随着云工程师和架构师开始采用容器化,确保安全通信变得至关重要。数据传输和访问控制是需要考虑的安全关键方面。SSH 隧道是一种可以帮助实现应用程序或解决方案不同组件之间安全通信的技术。SSH 隧道在现有 SSH 连接上创建加密通道,允许在本地计算机(SSH 客户端)和远程服务器(SSH 服务器)之间进行安全的数据传输。在本文中,我们将展示如何在云中运行的容器之间建立 SSH 隧道,这些容器需要通过云虚拟机中托管的 SSH 服务器与下游资源进行通信。 SSH 隧道在深入实现之前,让我们快速回顾一下 SSH 隧道。SSH 隧道也称为 SSH 端口转发,通过在现有 SSH 连接上创建加密隧道,允许两个端点之间进行安全通信。它使数据能够通过中间通道在本地计算机(SSH 客户端)和远程服务器(SSH 服务器)之间安全地传输。以下是可以使用 SSH 隧道的不同场景的概述: 1. 确保远程访问内部服务的安全: 出于安全原因,组织拥有内部服务(例如数据库、内部 Web 应用程序),这些服务不会暴露在公共互联网上。使用 SSH 隧道,员工可以从远程位置安全地连接到这些内部服务,而无需将服务暴露在互联网上。2. 绕过防火墙限制: 开发人员需要访问企业防火墙后面的特定资源,但防火墙限制直接访问。通过设置 SSH 隧道,开发人员可以安全地通过防火墙转发流量,从而允许他们访问受限制的资源。3. 保护传输中的敏感数据: 应用程序需要在不同组件或服务之间发送敏感数据,存在数据被拦截的风险。SSH 隧道可用于在数据在组件之间传输时对其进行加密,确保数据在传输过程中保持安全。4. 安全访问远程数据库: 开发人员需要访问远程数据库服务器以进行维护或开发,但由于安全策略不允许直接访问。开发人员可以设置 SSH 隧道以安全地连接到远程数据库服务器,而无需将其暴露在公共互联网上。5. 安全地使用不安全的协议: 应用程序使用不安全的协议(例如 FTP、HTTP)在不同服务之间进行通信。通过将不安全的协议包装在 SSH 隧道中,可以确保通信安全,从而保护数据不被拦截。6. 远程调试: 开发人员需要调试在远程服务器上运行的应用程序,但对调试端口的直接访问受到限制。 SSH 隧道可用于将调试端口从远程服务器转发到本地计算机,从而使开发人员可以安全地调试应用程序。7. 保护物联网设备通信: 物联网设备需要与中央服务器通信,但通信容易被拦截或篡改。通过在物联网设备和中央服务器之间建立 SSH 隧道,可以加密和保护通信,保护传输中的数据。8. 安全文件传输: 文件需要在不同系统或位置之间安全地传输。SSH 隧道可用于通过加密隧道安全地传输文件,确保数据的机密性和完整性。9. 访问远程服务: 用户需要安全地访问远程服务器上托管的服务或资源。通过设置 SSH 隧道,用户可以安全地访问远程服务,就像它们在本地运行一样,从而保护传输中的数据。10. 保护网络流量: 通过不受信任的网络访问网站或网络应用程序时,需要保护网络流量。SSH 隧道可用于创建与远程服务器的安全连接,加密网络流量并保护其免遭窃听或拦截。 设想对于本文,我们将实现以下场景: 架构组件myInfraVNet:部署下游资源的虚拟网络。nginxVM:myInfraVNet 中运行 Nginx(Web 服务器或反向代理)的虚拟机。它被分配了一个私有 IP 地址,因此无法从互联网直接访问。nginxVM/NSG:与 nginxVM 关联的网络安全组,控制入站和出站流量。myAppVNet:部署容器应用程序的虚拟网络。容器应用环境:此环境托管两个容器化应用程序:mycontainerapp:一个简单的容器化 Python 应用程序,它从在 VM 上运行的 NGINX 服务器获取内容并将该内容与其他内容一起呈现。sshclientcontainerapp:另一个容器化应用程序,用于建立到其他资源的安全 SSH 隧道。容器注册表:存储可部署到容器应用的容器镜像。VNet Peering:允许 myAppVNet 和 myInfraVNet 中的资源相互通信。它本质上是两个 VNet 之间的桥梁,可实现低延迟、高带宽的互连。SSH 隧道:myAppVNet 中的 sshclientcontainerapp 建立到 myInfraVNet 中的 nginxVM 的 SSH 隧道,以实现容器化应用程序和 VM 之间的安全通信。网络安全组 (NSG):nginxVM/NSG 确保只有允许的流量才能到达 nginxVM。正确配置此 NSG 以允许来自 sshclientcontainerapp 的 SSH 流量并限制不必要的访问至关重要。编写场景脚本基于上述场景,我们现在将编写架构实现脚本。该脚本将创建必要的资源、配置 SSH 隧道并部署容器化应用程序。 先决条件运行脚本之前,请确保您满足以下先决条件:安装在本地计算机上的 Azure CLI。Docker 安装在您的本地机器上。有效的 Azure 订阅。对 Azure 容器应用、Azure 容器注册表和 Azure 虚拟网络有基本的了解。参数首先定义脚本中要使用的参数。这些参数包括资源组名称、位置、虚拟网络名称、子网名称、VM 名称、VM 映像、VM 大小、SSH 密钥、管理员用户名、管理员密码、容器应用环境名称、容器注册表名称、容器应用映像名称、SSH 客户端容器映像名称、SSH 端口和 NGINX 端口。将生成一个随机字符串并将其附加到资源组名称、容器应用环境名称和容器注册表名称,以确保唯一性。 random=$(echo $RANDOM | tr ‘[0-9]’ ‘[a-z]’)
echo “Random:” $random
export RESOURCE_GROUP=rg-ssh-$(echo $random)
echo “RESOURCE_GROUP:” $RESOURCE_GROUP
export LOCATION=”australiaeast”
export INFRA_VNET_NAME=”myInfraVNet”
export APP_VNET_NAME=”myAppVNet”
export INFRA_SUBNET_NAME=”mySubnet”
export APP_SUBNET_NAME=”acaSubnet”
export VM_NAME=”nginxVM”
export VM_IMAGE=”Ubuntu2204″
export VM_SIZE=”Standard_DS1_v2″
export VM_KEY=mykey$(echo $random)
export ADMIN_USERNAME=”azureuser”
export ADMIN_PASSWORD=”Password123$” # Replace with your actual password
export CONTAINER_APPS_ENV=sshacae$(echo $random)
export REGISTRY_NAME=sshacr$(echo $random)
export REGISTRY_SKU=”Basic”
export CONTAINER_APP_IMAGE=”mycontainerapp:latest”
export SSH_CLIENT_CONTAINER_IMAGE=”sshclientcontainer:latest”
export CONTAINER_APP_NAME=”mycontainerapp”
export SSH_CLIENT_CONTAINER_APP_NAME=”sshclientcontainerapp”
export SSH_PORT=22
export NGINX_PORT=80 Read More