
# 资产识别与管理
在函数的整个生命周期中，FunctionGraph提供安全的运行环境，用户需结合FunctionGraph提供的安全机制确保代码、依赖包及配置的安全。
#### 运行环境安全
FunctionGraph服务提供用户代码执行所需的计算节点和函数实例。该服务基于用户调用量综合评估后，提供有效的算力，同时确保节点的可用性和安全性。
#### 计算节点安全
计算节点提供以下华为云标准的安全防护能力，详情请参考[《华为云安全白皮书》](https://res-static.hc-cdn.cn/cloudbu-site/china/zh-cn/TrustCenter/WithePaper/SecurityWhitepaper_cn.pdf)。
- **多AZ** **多集群容灾**：一个region的计算节点部署在多个AZ（可用区）、多个集群，具备可用区容灾能力。
- **独立的VPC** **环境：**计算节点位于独立隔离的VPC中，用户无法直接访问计算节点。
- **主机安全防护：** 计算节点使用华为云[企业主机安全HSS服务](https://support.huaweicloud.com/productdesc-hss2.0/hss_01_0136.html)，提供漏洞检测，安全检测和防御，并与华为云安全部门协作，提供快速感知与处置能力。
- **漏洞修复或安全升级：**FunctionGraph负责计算节点的漏洞修复及安全升级，且升级过程对用户透明。当存在不兼容风险时，将以公告或短信形式通知客户并提供适配方案，确保用户业务平滑迁移。
 
#### 函数实例安全
函数实例提供函数级隔离能力，每个实例仅允许一个函数运行。
- **网络隔离：** 函数实例间及函数实例与节点间均不可直接访问。根据用户的[配置](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0222.html)，函数实例可选择是否访问公网或用户VPC网络。
- **函数实例冻结：**当检测到恶意租户攻击时，FunctionGraph可即时冻结并隔离恶意用户函数实例，确保运行环境安全。

- **漏洞修复和安全升级：**FunctionGraph负责函数实例的漏洞修复及安全升级，且升级过程对用户透明。当存在不兼容风险时，将以公告或短信形式通知客户并提供适配方案，确保用户业务平滑迁移。

- **运行时停止维护：**随社区停止维护，FunctionGraph提供的运行时将逐步进入淘汰流程，禁止用户使用已停止维护的运行时创建函数。建议客户尽快迁移现有函数至新运行时，FunctionGraph不保证已停止支持的运行时版本能够持续正常运行。
 
#### 用户代码安全
- **代码分享和下载：**FunctionGraph可以为用户提供临时代码及下载地址，并设置有效期，用户应避免临时下载地址泄露，以降低代码或库泄露的风险。
- **敏感信息防泄露：**用户应避免在代码或依赖包中明文记录敏感信息，例如访问密钥（AK）、安全密钥（SK）、数据库密码等；用户代码日志中应避免打印令牌（token）、密码等敏感信息，以防敏感信息泄露。
- **代码无漏洞：**用户需确保代码、库和依赖包安全性，及时识别、修复漏洞并更新函数。防止因用户代码漏洞引发攻击，从而影响业务安全。
华为云为FunctionGraph提供了多个安全云服务，可增强代码扫、威胁分析等安全能力。
表1华为云安全云服务说明 
| 华为云服务                                                                                                     | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
|:---|:---|
| [代码检查服务CodeArts Check](https://support.huaweicloud.com/bestpractice-codecheck/codeartscheck_14_1002.html) | 支持对FunctionGraph的代码进行多维度安全扫描，覆盖代码风格、质量及安全问题。其核心能力包括： - 自研检查引擎：支持C/C++、Java、Python等主流语言，可识别安全漏洞（如缓冲区溢出、未授权访问、加密问题）和代码规范问题。  - 安全标准支持：集成ISO 5055、CWE、OWASP TOP 10等标准，结合华为30年研发经验的内置规范（如《华为C/C++编程规范》），确保代码符合安全要求。  - 大规模扫描能力：日均百亿级扫描能力，支持弹性调度和容灾机制，适用于FunctionGraph的代码库全量检查。                                    |
| [安全云脑 SecMaster](https://support.huaweicloud.com/productdesc-secmaster/secmaster_01_0001.html)            | 安全云脑（SecMaster）是华为云原生的新一代安全运营中心，集华为云多年安全经验，基于云原生安全，提供云上资产管理、安全态势管理、安全信息和事件管理、安全编排与自动响应等能力，帮助您实现一体化、自动化安全运营管理，满足您的安全需求。 通过分析FunctionGraph相关云服务（如OBS、VPC）的日志数据，实时检测恶意行为。 - [多维度日志分析](https://support.huaweicloud.com/bestpractice-secmaster/secmaster_06_0006.html)：采集IAM、DNS、CTS等日志，利用AI引擎和威胁情报识别暴力破解和渗透攻击等威胁。  - 告警与响应：生成威胁告警并输出统计结果，帮助您及时处理潜在风险，保障服务稳定。   |
   
可结合CodeArts Check实现代码侧全流程防护，同时通过SecMaster监控运行时威胁，构建FunctionGraph的安全增强体系。
#### 用户配置安全
- **敏感信息保护：**当用户代码或配置中包含敏感信息时，强烈建议使用加密环境变量，以避免在用户界面或API返回结果中出现明文展示，从而预防敏感信息泄露。
- **委托权限最小化：**在配置触发器、VPC访问、自定义镜像、磁盘挂载等场景中，FunctionGraph需与其他云服务协同作业，需要创建云服务委托，确保FunctionGraph具备代表您执行部分资源运维工作的权限。配置委托时应遵循权限最小化原则，能够有效降低委托Token泄露时攻击的影响范围。
- **[使用KMS动态加解密](https://support.huaweicloud.com/bestpractice-functiongraph/functiongraph_05_1102.html)** （华为云密码安全中心DEW）：若需在函数运行时解密敏感数据（如数据库密码、API密钥），可通过KMS SDK动态操作密钥。用户可以将加解密密钥托管在KMS，并在IAM服务为函数创建委托授权FunctionGraph访问KMS（授权满足最小化使用原则），授权策略如下所示：
  ```
  {
   "Version": "2012-10-17",
   "Statement": [
   {
   "Effect": "Allow",
   "Action": "kms:Decrypt",
   "Resource": "arn:huaweicloud:kms:REGION:ACCOUNT_ID:keyring/kms-ring-123456/key/kms-key-123456"
   }
   ]
   }
  ```
  然后在代码中添加KMS SDK代码片段以获取密钥，从而对敏感数据进行加解密操作。如下以python代码片段为例。
  ```
  from huaweicloudsdkkms import KmsClient, models
   def decrypt_data():
   # 初始化KMS客户端
   kms_client = KmsClient(
   secret_id=os.getenv('KMS_SECRET_ID'),
   secret_key=os.getenv('KMS_SECRET_KEY'),
   region_name="cn-north-4"
   )
   # 解密数据
   decrypt_request = models.DecryptRequest(
   key_id="kms-key-123456",
   ciphertext=b"encrypted_data_base64",
   encryption_algorithm="AES_256_CBC"
   )
   response = kms_client.decrypt(decrypt_request)
   return response.plaintext.decode('utf-8')
  ```
  
 
