Managed Lustre 通过 root squash 功能提供基于 IP 的访问权限控制。
根用户权限压制是一项安全功能,可防止客户端虚拟机上的根用户获取受管 Lustre 文件系统的根特权。当根用户访问 Managed Lustre 文件系统时,其权限会被“压缩”为权限较低的用户的权限。
您可以为新的 Managed Lustre 实例或现有实例配置 root squash。您可以将默认的 root squash 设置应用于所有客户端,也可以为特定客户端指定自定义规则。
默认情况下,系统不会在代管式 Lustre 实例上配置 root squash。
安全限制和建议
限制客户端虚拟机上的 root 访问权限
限制 root 访问权限的最佳机制是首先禁止用户成为 root 用户。向用户授予对虚拟机的 root 权限可能会导致持久性风险:用户可能会滥用这些权限来创建新用户账号或安装后门,以便持续访问虚拟机。如需了解如何限制 root 访问权限,请参阅控制 SSH 登录访问权限的最佳实践。
如果您无法阻止用户在虚拟机上拥有根权限,则 Managed Lustre 基于 IP 的访问权限控制功能可以在访问 Managed Lustre 实例时限制根用户权限。不过,这些访问权限检查只是尽力而为,此功能并非旨在提供安全保障。您应将 VPC 防火墙规则作为主要安全边界,并确保只有使用可信虚拟机映像的可信客户端虚拟机才能通过网络访问您的托管式 Lustre 实例。如需了解详情,请参阅 Google Cloud 安全最佳实践。
停用 IP 转发
默认 Compute Engine 配置允许实例启用 IP 转发。为防止用户通过模拟其他来源 IP 地址来规避 root squash 政策,您应使用 constraints/compute.vmCanIpForward 组织政策停用 IP 转发。如需了解相关说明,请参阅创建和管理组织政策。
配置默认的 root squash
如需将根用户废除应用于连接到实例的所有客户端,请指定默认的废除 UID 和 GID,并将废除模式设置为 ROOT_SQUASH。UID 和 GID 的常用值为 65534,对应于 nobody 用户。
请注意,默认情况下,nobody 用户仅限于读取和执行访问权限。只有 root 用户和 Owner 群组的成员拥有对文件系统的写入权限。
创建实例
如需创建具有默认 root squash 的实例,请执行以下操作:
gcloud
使用 --default-squash-mode、--default-squash-uid 和 --default-squash-gid 标志设置默认值:
gcloud lustre instances create INSTANCE_NAME \
--project=PROJECT_ID \
--location=LOCATION \
--network=NETWORK_NAME \
--per-unit-storage-throughput=PER_UNIT_STORAGE_THROUGHPUT \
--capacity-gib=CAPACITY \
--filesystem=FS_NAME \
--default-squash-mode=ROOT_SQUASH \
--default-squash-uid=UID \
--default-squash-gid=GID
其中:
--default-squash-mode是ROOT_SQUASH。--default-squash-uid和--default-squash-gid用于指定要将 root 用户转换为的默认 ID。
如需查看创建实例时可用字段的完整列表和说明,请参阅 gcloud lustre instances create 参考文档。
REST
如需使用 REST API 创建实例,请向以下端点发送请求并包含 accessRulesOptions 对象:
POST https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/ZONE/instances?instanceId=INSTANCE_NAME
Authorization: Bearer AUTH_TOKEN
{
"filesystem": "FS_NAME",
"perUnitStorageThroughput": "PER_UNIT_STORAGE_THROUGHPUT",
"capacityGib": "CAPACITY_GIB",
"network": "NETWORK",
"accessRulesOptions": {
"defaultSquashMode": "SQUASH_MODE",
"defaultSquashUid": UID,
"defaultSquashGid": GID
}
}
其中:
defaultSquashMode是ROOT_SQUASH。defaultSquashUid和defaultSquashGid是要将 root 用户转换为的用户 ID 和群组 ID 值。
如需详细了解如何使用 REST API 创建实例,请参阅 projects.locations.instances.create API 参考。
Google Cloud 控制台
无法使用 Google Cloud 控制台配置 root squash。
更新实例
如需更新现有实例以使用默认的 root squash,请执行以下操作:
gcloud
使用 --default-squash-mode、--default-squash-uid 和 --default-squash-gid 标志设置默认值:
gcloud lustre instances update INSTANCE_NAME \
--project=PROJECT_ID \
--location=LOCATION \
--default-squash-mode=ROOT_SQUASH \
--default-squash-uid=UID \
--default-squash-gid=GID
其中:
--default-squash-mode是ROOT_SQUASH。--default-squash-uid和--default-squash-gid用于指定要将根用户压缩到的默认 ID。
REST
如需使用 REST API 更新实例,请向其特定端点发送 PATCH 请求。您必须在 updateMask 中指定 accessRulesOptions:
PATCH https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/ZONE/instances/INSTANCE_NAME?updateMask=accessRulesOptions
Authorization: Bearer AUTH_TOKEN
{
"accessRulesOptions": {
"defaultSquashMode": "ROOT_SQUASH",
"defaultSquashUid": UID,
"defaultSquashGid": GID
}
}
其中:
defaultSquashMode是ROOT_SQUASH。defaultSquashUid和defaultSquashGid是要将根用户转换为的用户和群组 ID 值。
如需详细了解如何更新实例,请参阅管理实例。
Google Cloud 控制台
无法使用 Google Cloud 控制台配置 root squash。
配置根 squash,但有例外情况
如需将根用户废除应用于除一组特定受信任客户端之外的所有客户端,请指定访问规则。此规则指定了要将 root 用户压缩到的默认 UID 和 GID,以及一条根据客户端的 IP 地址或地址范围免除压缩的规则。
squash UID 和 GID 的常用值为 65534,这表示 nobody 用户。请注意,nobody 用户没有文件系统的写入权限。只有 root 用户和 Owner 群组的成员拥有读取、写入和执行权限。其他用户只能读取和执行。
创建实例
gcloud
要创建实例,请执行以下操作:
gcloud lustre instances create INSTANCE_NAME \
--project=PROJECT_ID \
--location=LOCATION \
--network=NETWORK_NAME \
--per-unit-storage-throughput=PER_UNIT_STORAGE_THROUGHPUT \
--capacity-gib=CAPACITY \
--filesystem=FS_NAME \
--default-squash-mode=ROOT_SQUASH \
--default-squash-uid=UID \
--default-squash-gid=GID \
--access-rules=name="ACCESS_RULE_NAME",ipAddressRanges="IP_ADDRESS_OR_CIDR_RANGE",squashMode=NO_SQUASH
其中:
--default-squash-mode是ROOT_SQUASH。--default-squash-uid和--default-squash-gid用于指定要将根用户压缩到的默认 ID。--access-rules指定 root squash 的例外情况。必须指定以下值:name是相应访问规则的名称。ipAddressRanges是一个或多个不重叠的 IP 地址或 CIDR 范围的列表(以英文逗号分隔)。范围采用以下格式指定:192.168.0.0/24。squashMode必须为NO_SQUASH。
如需查看可用字段的完整列表和说明,请参阅创建 Managed Lustre 实例。
REST
如需使用 REST API 创建实例,请向以下端点发送请求并包含 accessRulesOptions 对象:
POST https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/ZONE/instances?instanceId=INSTANCE_NAME
Authorization: Bearer AUTH_TOKEN
{
"filesystem": "FS_NAME",
"perUnitStorageThroughput": "PER_UNIT_STORAGE_THROUGHPUT",
"capacityGib": "CAPACITY_GIB",
"network": "NETWORK",
"accessRulesOptions": {
"accessRules": [
{
"name": "ACCESS_RULE_NAME",
"ipAddressRanges": [
"IP_ADDRESS_OR_CIDR_RANGE_1",
"IP_ADDRESS_OR_CIDR_RANGE_2"
],
"squashMode": "NO_SQUASH"
}
],
"defaultSquashMode": "SQUASH_MODE",
"defaultSquashUid": UID,
"defaultSquashGid": GID
}
}
设置特定访问权限规则时,需要提供以下字段:
name是此规则的用户定义名称。它只能使用字母数字字符和下划线 (_),且不得超过 16 个字符。ipAddressRanges是一个包含一个或多个不重叠的 IP 地址或 CIDR 范围的列表。范围采用以下格式指定:192.168.0.0/24。squashMode始终为NO_SQUASH。defaultSquashMode是ROOT_SQUASH。defaultSquashUid和defaultSquashGid是用户和群组 ID 值,用于转换不符合任何特定访问规则的 root 用户。
例如,如需设置默认的 root squash,但允许来自特定 IP 地址范围和特定 IP 地址的 root 用户例外,accessRulesOptions 对象应如下所示:
{
"accessRulesOptions": {
"accessRules": [
{
"name": "dont_squash",
"ipAddressRanges": [
"192.100.1.10",
"192.168.0.0/24"
],
"squashMode": "NO_SQUASH"
}
],
"defaultSquashMode": "ROOT_SQUASH",
"defaultSquashUid": 65534,
"defaultSquashGid": 65534
}
}
如需详细了解如何使用 REST API 创建实例,请参阅创建受管 Lustre 实例。
Google Cloud 控制台
无法使用 Google Cloud 控制台配置 root squash。
更新实例
gcloud
如需更新实例,请执行以下操作:
gcloud lustre instances update INSTANCE_NAME \
--project=PROJECT_ID \
--location=LOCATION \
--default-squash-mode=ROOT_SQUASH \
--default-squash-uid=UID \
--default-squash-gid=GID \
--access-rules=name="ACCESS_RULE_NAME",ipAddressRanges="IP_ADDRESS_OR_CIDR_RANGE",squashMode=NO_SQUASH
其中:
--default-squash-mode是ROOT_SQUASH。--default-squash-uid和--default-squash-gid用于指定要将根用户压缩到的默认 ID。--access-rules指定 root squash 的例外情况。必须指定以下值:name是相应访问规则的名称。ipAddressRanges是一个或多个不重叠的 IP 地址或 CIDR 范围的列表(以英文逗号分隔)。范围采用以下格式指定:192.168.0.0/24。squashMode必须为NO_SQUASH。
如需详细了解如何更新实例,请参阅管理实例。
REST
如需使用 REST API 更新实例,请向其特定端点发送 PATCH 请求。您必须在端点网址中将 accessRulesOptions 指定为 updateMask 的值:
PATCH https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/ZONE/instances/INSTANCE_NAME?updateMask=accessRulesOptions
Authorization: Bearer AUTH_TOKEN
{
"accessRulesOptions": {
"accessRules": [
{
"name": "ACCESS_RULE_NAME",
"ipAddressRanges": [
"IP_ADDRESS_OR_CIDR_RANGE_1",
"IP_ADDRESS_OR_CIDR_RANGE_2"
],
"squashMode": "NO_SQUASH"
}
],
"defaultSquashMode": "SQUASH_MODE",
"defaultSquashUid": UID,
"defaultSquashGid": GID
}
}
如需详细了解如何更新实例,请参阅管理实例。
Google Cloud 控制台
无法使用 Google Cloud 控制台配置 root squash。
从实例中移除根 squash
如需从实例中移除所有根用户废除设置,请更新实例以清除访问权限规则,并将默认模式设置为 NO_SQUASH。
gcloud
gcloud lustre instances update INSTANCE_NAME \
--project=PROJECT_ID \
--location=LOCATION \
--default-squash-mode=NO_SQUASH \
--clear-access-rules \
--default-squash-uid=0 --default-squash-gid=0
REST
PATCH https://lustre.googleapis.com/v1/projects/PROJECT_ID/locations/ZONE/instances/INSTANCE_NAME?updateMask=accessRulesOptions
Authorization: Bearer AUTH_TOKEN
{
"accessRulesOptions": {
"defaultSquashMode": "NO_SQUASH"
}
}
Google Cloud 控制台
无法使用 Google Cloud 控制台配置 root squash。