> For the complete documentation index, see [llms.txt](https://bohans.gitbook.io/ji-chu/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bohans.gitbook.io/ji-chu/spring/group-1/spring-cloud/securing/guan-yu-wei-fu-wu-an-quan-xing-de-yi-xie-jian-yi.md).

# 关于微服务安全性的一些建议

在生产环境中使用微服务时，还应该围绕以下建议构建微服务安全性：

1. **对所有服务的通信，使用HTTPS/安全套接字层（SSL）**
2. **对所有服务的调用，使用API网关**
3. **将服务划分为不同的区域（例如，公共API和私有API）**
4. **通过禁用多余的网络端口来限制微服务的攻击面**

下图展示了这些不同部分如何相互配合：

<figure><img src="https://3484936666-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fkc3qks6b4rvNPb2C0khl%2Fuploads%2FVQMpLxK2KSi1DGeD3Akl%2Fimage.png?alt=media&amp;token=b22ccf87-b290-44a8-8852-dc41c9e15ecd" alt=""><figcaption></figcaption></figure>

## **对所有服务的通信，使用HTTPS/安全套接字层（SSL）**

<mark style="color:orange;">**在生产环境中，微服务应仅通过HTTPS和SSL提供的加密通道进行通信。**</mark>

> **请注意，通过DevOps脚本可以自动化HTTPS的配置和设置。**

## **对所有服务的调用，使用API网关**

* **各个服务器、服务端点和端口不应直接对客户端开放**。相反，**使用服务网关作为服务调用的入口和守门人。**
* **在运行微服务的操作系统或容器上配置网络层，只允许来自服务网关的流量。**

> 服务网关可以充当策略执行点（PEP），可以在所有服务中强制执行。通过服务网关进行服务调用有助于确保在保护和审计服务方面的一致性。
>
> 服务网关还能够限制要向外部世界暴露的端口和端点。

## 将服务分成公共API和私有API两个区域

总的来说，**安全性主要是**<mark style="color:blue;">**建立访问层次**</mark>**并**<mark style="color:blue;">**执行最小特权原则**</mark>**的概念**。<mark style="color:blue;">**最小特权原则意味着用户应该只具有执行日常工作所需的最低网络访问权限**</mark>。为此，应该通过**将服务分为两个明确的区域来实施最小特权原则：公共区域和私有区域**。

* **公共区域包含所有将被客户端使用的公共API**。
  * 公共API微服务应执行狭窄的、与工作流相关的任务。
  * 这些微服务通常是服务聚合器，从多个服务中提取数据并执行跨多个服务的任务。
  * 公共微服务还应该位于其自己的服务网关后面，并拥有用于执行身份认证和授权的专用身份认证服务。
  * 客户端应用程序对公共服务的访问应通过由服务网关保护的单一路径。
  * 此外，公共区域应该有自己的身份认证服务。
* **私有区域充当保护核心应用程序功能和数据的屏障。**
  * 它只能通过一个众所周知的端口进行访问，并且只接受来自私有服务运行的网络子网的网络流量。
  * 私有区域应该有其自己的网关和身份认证服务。
  * 公共API服务应通过私有区域的身份认证服务进行身份认证。
  * 所有应用程序数据至少应位于私有区域的网络子网中，并且只能由驻留在私有区域的微服务访问。

## **禁用多余的网络端口，减少微服务的攻击面**

* 配置运行服务的操作系统，只允许对**服务所需的端口**或**基础设施**进行入站和出站访问（例如监控、日志聚合）。
* 不要只专注于入站访问端口。很多开发人员会忽视锁定他们的出站端口。**锁定出站端口可以防止在攻击者已经入侵了服务本身的情况下，数据泄漏出服务。**
* 此外，请确保查看公共和私有API区域中的网络端口访问。
