

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 安全性 AWS ParallelCluster
<a name="security"></a>

云安全 AWS 是重中之重。作为 AWS 客户，您可以受益于专为满足最安全敏感的组织的要求而构建的数据中心和网络架构。

安全是双方共同承担 AWS 的责任。[责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/) 将其描述为云*的*安全性和云*中*的安全性：
+ **云安全** — AWS 负责保护在 AWS 云中运行 AWS 服务的基础架构。 AWS 还为您提供可以安全使用的服务。作为[AWS 合规计划合规计划合规计划合](https://aws.amazon.com/compliance/programs/)的一部分，第三方审计师定期测试和验证我们安全的有效性。要了解适用的合规计划 AWS ParallelCluster，请参阅按合规计划划分的[范围内的AWSAWS 服务按合规计划](https://aws.amazon.com/compliance/services-in-scope/)。
+ **云端安全**-您的责任由您使用的特定 AWS 服务或服务决定。您还需要对多种其它相关因素负责，包括您的数据的敏感性、您公司的要求以及适用的法律法规。

本文档介绍在使用时应如何应用分担责任模型 AWS ParallelCluster。以下主题向您介绍如何进行配置 AWS ParallelCluster 以满足您的安全和合规性目标。您还将学习如何 AWS ParallelCluster 以一种有助于监控和保护 AWS 资源的方式使用。

**Topics**
+ [所用服务的安全信息 AWS ParallelCluster](#security-seealso)
+ [中的数据保护 AWS ParallelCluster](data-protection.md)
+ [Identity and Access Management AWS ParallelCluster](security-iam.md)
+ [合规性验证 AWS ParallelCluster](security-compliance-validation.md)
+ [强制实施最低版本 TLS 1.2](security-enforcing-tls.md)
+ [为受限环境配置安全组](security-groups-configuration.md)

## 所用服务的安全信息 AWS ParallelCluster
<a name="security-seealso"></a>
+ [Amazon EC2 中的安全性](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security.html)
+ [Amazon API Gateway 中的安全性](https://docs.aws.amazon.com/apigateway/latest/developerguide/security.html)
+ [安全性 AWS Batch](https://docs.aws.amazon.com/batch/latest/userguide/security.html)
+ [CloudFormation中的安全性](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security.html)
+ [Amazon 的安全 CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/security.html)
+ [AWS CodeBuild中的安全性](https://docs.aws.amazon.com/codebuild/latest/userguide/security.html)
+ [Amazon DynamoDB 中的安全性](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/security.html)
+ [Amazon ECR 中的安全性](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security.html)
+ [Amazon ECS 中的安全性](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security.html)
+ [Amazon EFS 中的安全性](https://docs.aws.amazon.com/efs/latest/ug/security-considerations.html)
+ [Lustr FSx e 的安全保障](https://docs.aws.amazon.com/fsx/latest/LustreGuide/security.html)
+ [AWS Identity and Access Management (IAM) 中的安全性](https://docs.aws.amazon.com/IAM/latest/UserGuide/security.html)
+ [EC2 Image Builder 中的安全性](https://docs.aws.amazon.com/imagebuilder/latest/userguide/image-builder-security.html)
+ [安全性 AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-security.html)
+ [Amazon Route 53 中的安全性](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/security.html)
+ [Amazon SNS 中的安全性](https://docs.aws.amazon.com/sns/latest/dg/sns-security.html)
+ [亚马逊 SQS 中的安全性（适用于 2. AWS ParallelCluster x 版）](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-security.html)
+ [Amazon S3 中的安全性](https://docs.aws.amazon.com/AmazonS3/latest/dev/security.html)
+ [Amazon VPC 中的安全性](https://docs.aws.amazon.com/vpc/latest/userguide/security.html)

# 中的数据保护 AWS ParallelCluster
<a name="data-protection"></a>

分 AWS [担责任模型](https://aws.amazon.com/compliance/shared-responsibility-model/)适用于中的数据保护。如本模型所述 AWS ，负责保护运行所有内容的全球基础架构 AWS 云。您负责维护对托管在此基础结构上的内容的控制。您还负责您所使用的 AWS 服务 的安全配置和管理任务。有关数据隐私的更多信息，请参阅[数据隐私常见问题](https://aws.amazon.com/compliance/data-privacy-faq/)。有关欧洲数据保护的信息，请参阅 *AWS Security Blog* 上的 [AWS Shared Responsibility Model and GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 博客文章。

出于数据保护目的，我们建议您保护 AWS 账户 凭证并使用 AWS IAM Identity Center 或 AWS Identity and Access Management (IAM) 设置个人用户。这样，每个用户只获得履行其工作职责所需的权限。还建议您通过以下方式保护数据：
+ 对每个账户使用多重身份验证（MFA）。
+ 用于 SSL/TLS 与 AWS 资源通信。我们要求使用 TLS 1.2，建议使用 TLS 1.3。
+ 使用设置 API 和用户活动日志 AWS CloudTrail。有关使用 CloudTrail 跟踪捕获 AWS 活动的信息，请参阅《*AWS CloudTrail 用户指南》*中的[使用跟 CloudTrail 踪](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html)。
+ 使用 AWS 加密解决方案以及其中的所有默认安全控件 AWS 服务。
+ 使用高级托管安全服务（例如 Amazon Macie），它有助于发现和保护存储在 Amazon S3 中的敏感数据。
+ 如果您在 AWS 通过命令行界面或 API 进行访问时需要经过 FIPS 140-3 验证的加密模块，请使用 FIPS 端点。有关可用的 FIPS 端点的更多信息，请参阅《美国联邦信息处理标准（FIPS）第 140-3 版》[https://aws.amazon.com/compliance/fips/](https://aws.amazon.com/compliance/fips/)。

强烈建议您切勿将机密信息或敏感信息（如您客户的电子邮件地址）放入标签或自由格式文本字段（如**名称**字段）。这包括您使用控制台、API 或以其他 AWS 服务 方式使用控制台 AWS CLI、API 或时 AWS SDKs。在用于名称的标签或自由格式文本字段中输入的任何数据都可能会用于计费或诊断日志。如果您向外部服务器提供 URL，强烈建议您不要在网址中包含凭证信息来验证对该服务器的请求。

## 数据加密
<a name="data-encryption"></a>

所有安全服务均具有一项重要功能，即信息在未处于活动使用状态时都会加密。

### 静态加密
<a name="encryption-rest"></a>

AWS ParallelCluster 除了代表用户与 AWS 服务进行交互所需的凭据外，它本身不存储任何客户数据。

对于集群中节点上的数据，可以对数据进行静态加密。

对于 Amazon EBS 卷，使用 [`EbsSettings`](SharedStorage-v3.md#SharedStorage-v3-EbsSettings) 部分中的 [`EbsSettings`](SharedStorage-v3.md#SharedStorage-v3-EbsSettings)/`Encrypted` 和 [`EbsSettings`](SharedStorage-v3.md#SharedStorage-v3-EbsSettings)/`KmsKeyId` 设置来配置加密。有关更多信息，请参阅《Amazon EC2 用户指南》中的 [Amazon EBS 加密](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html)。

对于 Amazon EFS 卷，使用 [`EfsSettings`](SharedStorage-v3.md#SharedStorage-v3-EfsSettings) 部分中的 [`EfsSettings`](SharedStorage-v3.md#SharedStorage-v3-EfsSettings)/`Encrypted` 和 [`EfsSettings`](SharedStorage-v3.md#SharedStorage-v3-EfsSettings)/`KmsKeyId` 设置来配置加密。有关更多信息，请参阅 *Amazon Elastic File System User Guide* 中的 [How encryption at rest works](https://docs.aws.amazon.com/efs/latest/ug/encryption-at-rest.html#howencrypt)。

对 FSx 于 Lustre 文件系统，创建 Amazon FSx 文件系统时会自动启用静态数据加密。有关更多信息，请参阅 *Amazon for Lustre 用户指南 FSx *[中的加密静态数据](https://docs.aws.amazon.com/fsx/latest/LustreGuide/encryption-at-rest.html)。

对于带有 NVMe 卷的实例类型， NVMe 实例存储卷上的数据使用在实例的硬件模块上实现的 XTS-AES-256 密码进行加密。加密密钥使用硬件模块生成，并且对于每个 NVMe 实例存储设备都是唯一的。当实例停止或终止并且无法恢复时，将销毁所有加密密钥。无法禁用此加密，并且无法提供自己的加密密钥。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[静态加密](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/data-protection.html#encryption-rest)。

如果您使用 AWS ParallelCluster 调用将客户数据传输到本地计算机进行存储的 AWS 服务，请参阅该服务的《用户指南》中的 “安全与合规性” 一章，了解如何存储、保护和加密这些数据的信息。

### 传输中加密
<a name="encryption-transit"></a>

默认情况下，从正在运行的客户端计算机 AWS ParallelCluster 和 AWS 服务端点传输的所有数据都通过 HTTPS/TLS 连接发送所有数据进行加密。可以自动加密集群中节点之间的流量，具体取决于所选的实例类型。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[传输中加密](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/data-protection.html#encryption-transit)。

## 另请参阅
<a name="security-data-protection-seealso"></a>
+ [Amazon EC2 中的数据保护](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/data-protection.html)
+ [EC2 Image Builder 中的数据保护](https://docs.aws.amazon.com/imagebuilder/latest/userguide/data-protection.html)
+ [中的数据保护 CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security-data-protection.html)
+ [Amazon EFS 中的数据保护](https://docs.aws.amazon.com/efs/latest/ug/efs-backup-solutions.html)
+ [Amazon S3 中的数据保护](https://docs.aws.amazon.com/AmazonS3/latest/dev/DataDurability.html)
+ [ FSx 为 Lustre 提供数据保护](https://docs.aws.amazon.com/fsx/latest/LustreGuide/data-protection.html)

# Identity and Access Management AWS ParallelCluster
<a name="security-iam"></a>

AWS ParallelCluster 使用角色来访问您的 AWS 资源及其服务。 AWS ParallelCluster 用于授予权限的实例和用户策略记录在中[AWS Identity and Access Management 中的权限 AWS ParallelCluster](iam-roles-in-parallelcluster-v3.md)。

唯一的主要区别在于使用标准用户和长期凭证时如何进行身份验证。尽管用户需要密码才能访问 AWS 服务的控制台，但该用户需要访问密钥对才能使用执行相同的操作 AWS ParallelCluster。所有其他短期凭证的使用方式与在控制台中使用时相同。

使用的凭证存储 AWS ParallelCluster 在纯文本文件中，***未***加密。
+ 该`$HOME/.aws/credentials`文件存储访问您的 AWS 资源所需的长期证书。这包括访问密钥 ID 和秘密访问密钥。
+ 短期凭证（例如您承担的角色或用于 AWS IAM Identity Center 服务的角色的凭证）也存储在 `$HOME/.aws/cli/cache` 和 `$HOME/.aws/sso/cache` 文件夹中。

**风险防范**
+ 我们强烈建议您在 `$HOME/.aws` 文件夹及其子文件夹和文件上配置文件系统权限，仅限授权用户访问。
+ 尽可能使用具有临时凭证的角色，以减少凭证泄露时造成损坏的机会。仅使用长期凭证来请求和刷新短期角色凭证。

# 合规性验证 AWS ParallelCluster
<a name="security-compliance-validation"></a>

作为多个合规计划的一部分，第三方审计师评估 AWS 服务的安全 AWS 性和合规性。使用 AWS ParallelCluster 访问服务不会改变该服务的合规性。

有关特定合规计划范围内的 AWS 服务列表，请参阅AWS 按合规计划划分[的范围内AWS 服务（按合](https://aws.amazon.com/compliance/services-in-scope/)分）。有关一般信息，请参阅[AWS 合规计划AWS](https://aws.amazon.com/compliance/programs/)。

您可以使用下载第三方审计报告 AWS Artifact。有关更多信息，请参阅[在 AWS Artifact中下载报告](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)。

您在使用 AWS ParallelCluster 时的合规责任取决于您的数据的敏感性、贵公司的合规目标以及适用的法律和法规。 AWS 提供了以下资源来帮助实现合规性：
+ [安全与合规性快速入门指南](https://aws.amazon.com/quickstart/?awsf.quickstart-homepage-filter=categories%23security-identity-compliance) — 这些部署指南讨论了架构注意事项，并提供了在上面部署以安全性和合规性为重点的基准环境的步骤。 AWS
+ 在 A@@ [mazon Web Services 上构建 HIPAA 安全与合规架构 AWS 白皮书 — 本白皮书](https://docs.aws.amazon.com/pdfs/whitepapers/latest/architecting-hipaa-security-and-compliance-on-aws/architecting-hipaa-security-and-compliance-on-aws.pdf)描述了各公司如何使用来 AWS 创建符合 HIPAA 标准的应用程序。
+ [AWS 合AWS 规资源](https://aws.amazon.com/compliance/resources/) — 此工作簿和指南集合可能适用于您的行业和所在地区。
+ [使用*AWS Config 开发人员指南*中的规则评估资源](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config.html) — 该 AWS Config 服务评估您的资源配置在多大程度上符合内部实践、行业准则和法规。
+ [AWS Security Hub CSPM](https://docs.aws.amazon.com/securityhub/latest/userguide/what-is-securityhub.html)— 此 AWS 服务可全面了解您的安全状态 AWS ，帮助您检查是否符合安全行业标准和最佳实践。

# 强制实施最低版本 TLS 1.2
<a name="security-enforcing-tls"></a>

为了提高与 AWS 服务通信时的安全性，应将您的配置 AWS ParallelCluster 为使用 TLS 1.2 或更高版本。当你使用时 AWS ParallelCluster，Python 用于设置 TLS 版本。

为了确保不 AWS ParallelCluster 使用早于 TLS 1.2 的 TLS 版本，您可能需要重新编译 OpenSSL 以强制执行此最低限度，然后重新编译 Python 以使用新构建的 OpenSSL。

## 确定当前支持的协议
<a name="enforcing-tls-supported"></a>

首先，使用 OpenSSL 创建一个自签名证书，以用于测试服务器和 Python 开发工具包。

```
$ openssl req -subj '/CN=localhost' -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.pem -days 365
```

然后，使用 OpenSSL 启动测试服务器。

```
$ openssl s_server -key key.pem -cert cert.pem -www
```

在新的终端窗口中，创建虚拟环境并安装 Python 开发工具包。

```
$ python3 -m venv test-env
source test-env/bin/activate
pip install botocore
```

创建一个名为 `check.py` 的新 Python 脚本，该脚本使用此开发工具包的底层 HTTP 库。

```
$ import urllib3
URL = 'https://localhost:4433/'

http = urllib3.PoolManager(
ca_certs='cert.pem',
cert_reqs='CERT_REQUIRED',
)
r = http.request('GET', URL)
print(r.data.decode('utf-8'))
```

运行您的新脚本。

```
$ python check.py
```

这将显示有关所建立的连接的详细信息。在输出中搜索“协议：”。如果输出为 “TLSv1.2” 或更高版本，则软件开发工具包默认为 TLS v1.2 或更高版本。如果它是较早的版本，则需要重新编译 OpenSSL 并重新编译 Python。

但是，即使 Python 的安装默认为 TLS v1.2 或更高版本，如果服务器不支持 TLS v1.2 或更高版本，则 Python 仍可能重新协商到 TLS v1.2 之前的版本。要检查 Python 是否不会自动重新协商到较早版本，请使用以下命令重新启动测试服务器。

```
$ openssl s_server -key key.pem -cert cert.pem -no_tls1_3 -no_tls1_2 -www
```

如果您使用的是较早版本的 OpenSSL，则可能没有可用的 `-no_tls_3` 标志。如果是这种情况，请删除该标志，因为您使用的 OpenSSL 版本不支持 TLS v1.3。然后，运行 Python 脚本。

```
$ python check.py
```

如果您正确安装了 Python 但未针对 TLS 1.2 之前的版本进行重新协商，则应收到 SSL 错误。

```
$ urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='localhost', port=4433): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: UNSUPPORTED_PROTOCOL] unsupported protocol (_ssl.c:1108)')))
```

如果您能够建立连接，则需要重新编译 OpenSSL 和 Python 以禁用对早于 TLS v1.2 的协议进行协商。

## 编译 OpenSSL 和 Python
<a name="enforcing-tls-compile"></a>

为了确保在 TLS 1.2 之前的版本中 AWS ParallelCluster 不会进行协商，你需要重新编译 OpenSSL 和 Python。要执行此操作，请复制以下内容以创建脚本并运行脚本。

```
#!/usr/bin/env bash
set -e

OPENSSL_VERSION="1.1.1d"
OPENSSL_PREFIX="/opt/openssl-with-min-tls1_2"
PYTHON_VERSION="3.8.1"
PYTHON_PREFIX="/opt/python-with-min-tls1_2"


curl -O "https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz"
tar -xzf "openssl-$OPENSSL_VERSION.tar.gz"
cd openssl-$OPENSSL_VERSION
./config --prefix=$OPENSSL_PREFIX no-ssl3 no-tls1 no-tls1_1 no-shared
make > /dev/null
sudo make install_sw > /dev/null


cd /tmp
curl -O "https://www.python.org/ftp/python/$PYTHON_VERSION/Python-$PYTHON_VERSION.tgz"
tar -xzf "Python-$PYTHON_VERSION.tgz"
cd Python-$PYTHON_VERSION
./configure --prefix=$PYTHON_PREFIX --with-openssl=$OPENSSL_PREFIX --disable-shared > /dev/null
make > /dev/null
sudo make install > /dev/null
```

这会编译具有静态链接的 OpenSSL 的 Python 版本，该版本不会自动协商早于 TLS 1.2 的任何版本。这也会在 `/opt/openssl-with-min-tls1_2` 目录中安装 OpenSSL，并在 `/opt/python-with-min-tls1_2` 目录中安装 Python。运行此脚本后，请确认安装新版本的 Python。

```
$ /opt/python-with-min-tls1_2/bin/python3 --version
```

这应该打印出以下内容。

```
Python 3.8.1
```

要确认此新版本的 Python 不协商早于 TLS 1.2 的版本，请使用新安装的 Python 版本（即 `/opt/python-with-min-tls1_2/bin/python3`）重新运行 [确定当前支持的协议](#enforcing-tls-supported) 中的步骤。

# 为受限环境配置安全组
<a name="security-groups-configuration"></a>

默认情况下， AWS ParallelCluster 创建和配置允许集群节点之间的所有流量的安全组。在高度受限的环境中，您可能需要将网络访问限制为仅限集群操作所需的端口。本节介绍如何为您的 AWS ParallelCluster 部署配置具有受限访问权限的自定义安全组。

## 安全组概述
<a name="security-groups-configuration-overview"></a>

AWS ParallelCluster 使用安全组控制头节点、计算节点和登录节点（如果已配置）之间的网络流量。默认情况下，在 AWS ParallelCluster 创建集群时，它会创建允许集群内节点之间的所有流量的安全组。在安全要求严格的环境中，您可以提供自定义安全组，将流量限制为仅限必要的端口。

可以在集群配置的以下部分中配置安全组：
+ [`HeadNode`/`Networking`](HeadNode-v3.md#HeadNode-v3-Networking)-控制对头节点的访问和访问
+ [`Scheduling`/`SlurmQueues`/`Networking`](Scheduling-v3.md#Scheduling-v3-SlurmQueues-Networking)-控制对计算节点的访问和访问权限
+ [`LoginNodes`](LoginNodes-v3.md)-控制登录节点的访问和访问权限（如果已配置）

对于这些章节中的每一个部分，您可以指定：
+ `SecurityGroups`-替换 AWS ParallelCluster 将创建的默认安全组
+ `AdditionalSecurityGroups`-除了由创建的默认安全组外，还添加了安全组 AWS ParallelCluster

## 集群操作所需的端口
<a name="security-groups-configuration-required-ports"></a>

配置自定义安全组时，必须确保在相应节点之间打开以下端口：


**头节点所需的端口**  

| 端口 | 协议 | Direction | 用途 | 
| --- | --- | --- | --- | 
| 22 | TCP | 入站 | 通过 SSH 访问头节点（来自允许的 IP 范围） | 
| 6817-6819 | TCP | 入站 | Slurm 控制器端口（来自计算和登录节点） | 
| 6817-6819 | TCP | 出站 | Slurm 控制器端口（用于计算和登录节点） | 
| 8443 | TCP | 入站 | NICE DCV（如果启用，则来自允许的 IP 范围） | 
| 111、2049 | TCP/UDP | 入站 | NFS（如果使用 NFS 作为共享存储，则来自计算和登录节点） | 
| 443 | TCP | 出站 | 通过 HTTPS 访问 AWS 服务（如果不使用 VPC 终端节点） | 


**计算节点所需的端口**  

| 端口 | 协议 | Direction | 用途 | 
| --- | --- | --- | --- | 
| 22 | TCP | 入站 | SSH 访问（从头节点和登录节点） | 
| 6818 | TCP | 入站 | Slurm 守护程序端口（来自头节点） | 
| 6817-6819 | TCP | 出站 | Slurm 控制器端口（到头节点） | 
| 111、2049 | TCP/UDP | 出站 | NFS（如果使用 NFS 作为共享存储，则用于头节点） | 
| 443 | TCP | 出站 | 通过 HTTPS 访问 AWS 服务（如果不使用 VPC 终端节点） | 

如果您使用的是 EFA（弹性结构适配器），则还必须允许启用 EFA 的计算节点之间的所有流量：
+ 使用 EFA 的计算节点之间的所有 TCP 和 UDP 流量
+ 使用 EFA 的计算节点之间的 EFA 设备上的所有流量

**注意**  
如果您使用共享存储系统（ FSx 例如 Lustre、Amazon EFS 或其他存储解决方案），则还需要确保为这些服务开放相应的端口。

## 创建自定义安全组
<a name="security-groups-configuration-custom"></a>

要为您的 AWS ParallelCluster 部署创建自定义安全组，请执行以下步骤：

1. 使用 AWS 管理控制台、 AWS CLI 或，为头节点、计算节点和登录节点（如果适用）创建安全组 AWS CloudFormation。

1. 按照上一节所述，将安全组规则配置为仅允许必要的流量。

1. 在集群配置文件中引用这些安全组。

以下是如何使用 AWS CLI 创建安全组的示例：

```
# Create security group for head node
aws ec2 create-security-group \
  --group-name pcluster-head-node-sg \
  --description "Security group for ParallelCluster head node" \
  --vpc-id vpc-12345678

# Create security group for compute nodes
aws ec2 create-security-group \
  --group-name pcluster-compute-node-sg \
  --description "Security group for ParallelCluster compute nodes" \
  --vpc-id vpc-12345678

# Add rules to allow necessary traffic between head and compute nodes
# (Add specific rules based on the required ports listed above)
```

## 在集群配置中配置安全组
<a name="security-groups-configuration-cluster-config"></a>

创建自定义安全组后，可以在集群配置文件中引用它们：

```
# Example cluster configuration with custom security groups
HeadNode:
  ...
  Networking:
    SubnetId: subnet-12345678
    SecurityGroups:
      - sg-headnode12345  # Custom security group for head node
    # Or use AdditionalSecurityGroups if you want to keep the default security groups
    # AdditionalSecurityGroups:
    #   - sg-additional12345
  ...

Scheduling:
  Scheduler: slurm
  SlurmQueues:
    - Name: queue1
      ...
      Networking:
        SubnetIds:
          - subnet-12345678
        SecurityGroups:
          - sg-computenode12345  # Custom security group for compute nodes
        # Or use AdditionalSecurityGroups if you want to keep the default security groups
        # AdditionalSecurityGroups:
        #   - sg-additional12345
      ...

# If using login nodes
LoginNodes:
  Pools:
    - Name: login-pool
      ...
      Networking:
        SubnetIds:
          - subnet-12345678
        SecurityGroups:
          - sg-loginnode12345  # Custom security group for login nodes
        # Or use AdditionalSecurityGroups if you want to keep the default security groups
        # AdditionalSecurityGroups:
        #   - sg-additional12345
      ...
```

使用时`SecurityGroups`， AWS ParallelCluster 将仅使用您指定的安全组，取代默认安全组。使用时`AdditionalSecurityGroups`， AWS ParallelCluster 将同时使用它创建的默认安全组和您指定的其他安全组。

**警告**  
如果您为计算实例启用 Ela [stic Fabric Adapter (](Scheduling-v3.md#yaml-Scheduling-SlurmQueues-ComputeResources-Efa)EFA)，请确保您的启用 EFA 的实例是允许所有入站和出站流量进入自身的安全组的成员。这是 EFA 正常运行所必需的。

## 在受限环境中使用 VPC 终端节点
<a name="security-groups-configuration-vpc-endpoints"></a>

在高度受限的环境中，您可能需要 AWS ParallelCluster 在没有互联网访问权限的子网中进行部署。在这种情况下，您需要配置 VPC 终端节点以允许集群与 AWS 服务通信。有关详细说明，请参阅[AWS ParallelCluster 在无法访问互联网的单个子网中](aws-parallelcluster-in-a-single-public-subnet-no-internet-v3.md)。

使用 VPC 终端节点时，请确保您的安全组允许进出 VPC 终端节点的流量。为此，您可以将与 VPC 终端节点关联的安全组添加到头节点和计算节点的`AdditionalSecurityGroups`配置中。

```
HeadNode:
  ...
  Networking:
    SubnetId: subnet-1234567890abcdef0
    AdditionalSecurityGroups:
      - sg-abcdef01234567890  # Security group that enables communication with VPC endpoints
  ...

Scheduling:
  Scheduler: slurm
  SlurmQueues:
    - ...
      Networking:
        SubnetIds:
          - subnet-1234567890abcdef0
        AdditionalSecurityGroups:
          - sg-1abcdef01234567890  # Security group that enables communication with VPC endpoints
```

## 安全组配置最佳实践
<a name="security-groups-configuration-best-practices"></a>

 AWS ParallelCluster 在受限环境中为其配置安全组时，请考虑以下最佳实践：
+ **最低权限原则**：仅打开集群操作所需的端口。
+ **使用安全组引用**：如果可能，请使用安全组引用（允许来自其他安全组的流量）而不是 CIDR 块来限制集群组件之间的流量。
+ **限制 SSH 访问**：使用 [`HeadNode`/`Ssh`/`AllowedIps`](HeadNode-v3.md#yaml-HeadNode-Ssh-AllowedIps)配置将对头节点的 SSH 访问限制为仅需要它的 IP 范围。
+ **限制 DCV 访问**：如果使用 NICE DCV，请使用 [`HeadNode``Dcv`//`AllowedIps`](HeadNode-v3.md#yaml-HeadNode-Dcv-AllowedIps)配置将访问限制为仅需要访问的 IP 范围。
+ **彻底测试**：配置自定义安全组后，彻底测试所有集群功能，确保所有必需的通信路径均正常运行。
+ **记录您的配置**：保留安全组配置的文档，包括哪些端口已打开以及为什么需要这些端口。

## 对安全组问题进行故障排除
<a name="security-groups-configuration-troubleshooting"></a>

如果您在配置自定义安全组后遇到问题，请考虑以下故障排除步骤：
+ **检查集群日志**：在 “日志” 中查看集群 CloudWatch 日志中是否存在任何连接错误。
+ **验证安全组规则**：确保在相应节点之间打开所有必需的端口。
+ **测试连接**：使用`telnet`或之类的工具`nc`来测试特定端口上节点之间的连通性。
+ **临时扩展规则**：如果您在确定需要哪些端口时遇到问题，请暂时允许集群节点之间的所有流量，然后在确定所需端口时逐渐对其进行限制。
+ **检查 VPC 终端节点配置**：如果您使用的是 VPC 终端节点，请确保它们配置正确，并且安全组允许进出它们的流量。

如果您继续遇到问题，则可以通过从集群配置文件中删除`SecurityGroups`配置来恢复使用创建的默认安全组。 AWS ParallelCluster 