
# 元数据安全最佳实践
#### 禁用实例元数据（购买BMS时）
当BMS应用不需要访问元数据时，可通过禁用元数据避免不必要的安全风险。
1. 登录[控制台](https://console.huaweicloud.com/ecm/?#/bms/manager/bmsInfo/vmList)，进入[购买裸金属服务器](https://console.huaweicloud.com/ecm/?locale=zh-cn#/bms/createBMS)页面。
2. 在"高级配置"中，设置"元数据访问"为"禁用"。
   图1禁用元数据访问   
   ![](https://support.huaweicloud.com/usermanual-bms/zh-cn_image_0000002534249175.png "点击放大") 
3. 确认参数并单击"下一步：确认配置"，完成裸金属服务器的创建。
 
#### 禁用实例元数据（使用BMS时）
当BMS应用不需要访问元数据时，可通过禁用元数据避免不必要的安全风险。
1. 登录[控制台](https://console.huaweicloud.com/ecm/?#/bms/manager/bmsInfo/vmList)，进入[购买裸金属服务器](https://console.huaweicloud.com/ecm/?locale=zh-cn#/bms/createBMS)页面。
2. 单击裸金属服务器名称，进入"基本信息"页面。
3. 单击"元数据访问"参数。
   图2元数据访问   
   ![](https://support.huaweicloud.com/usermanual-bms/zh-cn_image_0000002534169125.png "点击放大") 
4. 在"禁用元数据访问"对话框，输入"YES"并单击"确定"，禁用实例的元数据访问。
   图3禁用元数据访问   
   ![](https://support.huaweicloud.com/usermanual-bms/zh-cn_image_0000002502289298.png "点击放大") 
 
#### 限制委托配置范围
BMS可通过配置委托实现通过元数据获取临时凭证，详细操作，请参见[在ECS上通过委托的临时访问密钥访问其他云服务](https://support.huaweicloud.com/bestpractice-iam/iam_0511.html)。
由于凭证泄露会导致安全风险，需要严格控制委托的配置范围：
- 当业务不需要获取临时凭证时，不配置实例委托。
- 当业务有获取临时凭证的诉求时，遵循权限最小化原则，对委托只配置必要的权限。
 
#### 使用V2加固模式访问元数据
V2加固模式有助于预防绝大多数SSRF攻击元数据的场景。
但是由于此种模式下传统模式会被拒绝访问，所以需要按照实例粒度开启此能力：
- 操作系统内访问元数据的服务或应用，需要修改为适配V2加固模式的调用方式。
- 参考[配置实例元数据选项](https://support.huaweicloud.com/usermanual-bms/bms_01_0540.html)，切换实例的"元数据访问方式"为"仅V2（Token）"。
 
#### BMS操作系统使用防火墙限制应用访问元数据
如果元数据中包含了敏感数据，您可以通过使用本地防火墙规则，以操作系统用户粒度实现对实例元数据的访问限制。
防火墙配置示例如下所示：
- Windows 如果您不希望管理员之外的用户访问实例自定义数据，请以管理员身份开启防火墙后，在PowerShell中执行下面的命令，限制非管理员用户访问实例自定义数据：
  **PS C:\\\>$RejectPrincipal = New-Object -TypeName System.Security.Principal.NTAccount ("Everyone")**
  **PS C:\\\>$RejectPrincipalSID = $RejectPrincipal.Translate(\[System.Security.Principal.SecurityIdentifier\]).Value**
  **PS C:\\\>$ExceptPrincipal = New-Object -TypeName System.Security.Principal.NTAccount ("Administrator")**
  **PS C:\\\>$ExceptPrincipalSID = $ExceptPrincipal.Translate(\[System.Security.Principal.SecurityIdentifier\]).Value**
  **PS C:\\\>$PrincipalSDDL = "O:LSD:(D;;CC;;;$ExceptPrincipalSID)(A;;CC;;;$RejectPrincipalSID)"**
  **PS C:\\\>New-NetFirewallRule -DisplayName "Reject metadata service for $($RejectPrincipal.Value), exception: $($ExceptPrincipal.Value)" -Action block -Direction out -Protocol TCP -RemoteAddress 169.254.169.254 -LocalUser $PrincipalSDDL**
  
- Linux 如果您不希望root之外的用户访问自定义实例自定义数据，请以root用户权限执行下面的命令，限制非root用户访问自定义实例自定义数据：
  **iptables --append OUTPUT --proto tcp --destination 169.254.169.254 --match owner ! --uid-owner root --jump REJECT**
  
 
