Serverless 架构下的系统安全问题

阅读时长 10 分钟读完

Serverless 架构是一种新型的应用架构方式,它提供了许多优秀的优点,例如弹性、强大的 scaling 能力、降低操作和维护成本等。虽然 Serverless 架构很受欢迎,但是在这样的环境下也会带来一些安全问题。这篇文章将介绍 Serverless 架构下的安全问题,并提供一些可能的解决方案。

Serverless 架构概述

在 Serverless 架构下,应用程序被分解为更小、独立的功能块,以便更灵活地管理和扩展。每个功能块都是一个微服务,它们是无状态的,即它们不会保留任何会话或状态信息。

Serverless 无服务器架构的运行环境主要是云计算平台,例如 AWS Lambda、Azure Functions、Google Cloud Functions 等。不同于传统的部分或整个服务器被租用的计算机环境,这些 Serverless 平台是事件驱动的,系统通常会自动扩展实例以适应流量。

在此方案下,开发者无需考虑硬件资源,仅仅关注自己的业务逻辑和代码实现,通过事件进行触发,并自动扩展、自动管理。这带来了极大的便捷,也让开发者能够专注于核心业务逻辑的实现。

但同时,Serverless 也存在于许多安全问题。

Serverless 架构中存在的安全问题

Serverless 架构下的系统安全问题主要有以下几种:

1. 功能安全

拥有完善的功能安全机制能够有效防范攻击,主要需要从代码层面上考虑。

在 Serverless 架构下,每个功能被拆成一个微服务,如果每个服务都对应一个 Lambda 函数,那么相当于对于每个微服务,攻击者都需要独立地找到攻击入口,就算其中某一个服务受到攻击,整个系统也不会被影响太多。相比于传统的单体架构,这种多服务的架构方式能够大大减小风险。

但仍然不应该松懈,建议在代码最开始的时候,提前设定好权限控制,设定好执行者机制,限制访问流量,以防止攻击者访问到不应该获得的资源。并且,在声明 Lambda 函数前,可以指定只有某些特定的执行者才能触发该函数。这一点在 AWS Lambda 上的实现是很简单的:在创建 Lambda 函数的时候,创建对应的 API Gateway,之后权限控制、访问流量控制均在 API Gateway 上进行。

2. 数据安全

Serverless 架构需要保证数据传输的安全性,数据传输是指在应用程序之间或与远程服务之间传输的数据。

在 Serverless 架构下,一般会使用 HTTPS 协议传输数据,以保证通信的加密和身份识别。同时,应该确保系统内部所有应用程序之间使用的协议也是加密的。这些措施能够有效防止中间人攻击和数据泄漏。

3. 数据库安全

Serverless 架构中通常使用反向代理或独立的数据存储服务来存储数据。

在存储数据时,我们需要保证数据库是安全可靠的,这意味着必须配置好权限认证、安全性协议等基本的安全措施,尽量避免 SQL 注入攻击。在使用数据库的过程中,需要保证 SQL 语句以及其他查询和操作是明确且安全的。其次,对于所有服务器应用程序,需要确保数据库应用程序使用远程接口的身份验证和加密传输,以保证安全性。

4. 认证和授权安全

在 Serverless 架构中,我们需要保证有足够的控制和权限管理,以避免攻击者越权操作,访问敏感的系统资源。

例如,我们需要确保用户可以访问系统的特定部分而不受到限制,系统管理员可以配置帐户权限并监控攻击行为,只有特定角色的用户才能访问敏感数据等。这些都是需要关注的问题。

Serverless 架构下的安全解决方案

1. 实施访问控制

对于 Serverless 架构中的 Lambda 函数,我们建议执行 Select Minimally Privileged Methodology (SMPM) 原则,即功能能访问的资源是严格限定的。

例如,您可能只需要让某些 Lambda 函数访问 S3 存储桶、RDS 数据库或 DynamoDB 表等资源。所以,您需要为每个函数分配适当的IAM(Identity and Access Management) 角色和权限,以限制访问,降低并发请求或某些请求不被信任的角色或实体使用。

2. 使用安全加密的协议

为了保证安全性,我们必须使用安全加密的协议(例如 SSL / TLS)来对数据通信,并对于所有应用程序之间的通信都使用 HTTPS 协议,这些措施能够有效防止中间人攻击和数据泄漏。

3. 实施防火墙

防火墙与访问控制的概念相似,都是需要实现保护网络、应用程序和客户端的安全性,减少入侵风险。

我们应该优先考虑使用安全团队配置的防火墙,以便保护本地资产、应用程序和数据存储。随着线上服务器的运行,请配置 AWS Security Groups 和 Network ACLs,以逐步制定更严格的规则,并监控部署后的流量和其他安全事件。

4. 实现强密码策略

密码策略是保证实施强密码,只有受信任的用户才能访问系统的另一种方法。

避免太过于信任某个用户在使用弱密码,这容易成为攻击者的目标。除此之外,还需要定义强身份验证策略,例如多因素身份验证,以加强用户名和密码的访问限制,在保护负载均衡器、代理和网络应用程序过程中,可以添加内置身份验证,并在应用程序层面使用 OAuth2。

示例代码:

Node.js 代码示例

AWS Lambda 示例

-- -------------------- ---- -------
----- --- - -------------------

--------------- - ----- ------- -------- -- -
  --- -
    ----- -- - --- ---------
    ----- ---------- - ------------
    ----- -------- - --------------
    ----- ---- - ----- --------------
      ------- -----------
      ---- --------
    -------------
    ----- ---- - ---------------------
    ------ -----
  - ----- --- -
    ---------------
    ------ -
      ----------- ----
      ----- --- ----- -------- ----- ---------- ---- ---- ----
    --
  -
--

Azure Functions 示例

-- -------------------- ---- -------
-------------- - ----- -------- --------- ---- -
  ----------------------- ---- ------- -------- --------- - -----------

  ----- ---- - --------------- -- --------- -- ----------------
  ----- --------------- - ----
    - ------- - - ---- - -- ---- ---- --------- -------- -------- --------------
    - ----- ---- --------- -------- -------- ------------- ---- - ---- -- --- ----- ------ -- -- --- ------- ---- --- - ------------ -----------

  ----------- - -
    -- ------- ---- -- -------- -- --- --
    ----- ---------------
  --
-

Go 代码示例

AWS Lambda 示例

-- -------------------- ---- -------
------- ----

------ -
----------
----------------

--------------------------------------
--------------------------------------
-

---- ------- ------ -
---------- ------ -------------------
---------  ------ ------------------
-

---- -------- ------ -
-------- ------ ----------------
-

---- ----------- ---------------- ------- ------------------------------ -------------------------------- ------ -
---- --- -------
---- -- ------------------------------------ -----
--- --- -- --- -
-------- ------------------------------------------ ----- ---
--

--- ------------- -- -- -- ------------ -- -- -
-------- ------------------------------------------ ----- ------------------- ------- --------------
--

----- -- ----------------- ------- - - ------------- - - - - ------------ - ----
---------- --- -- ------------------
--- --- -- --- -
-------- ------------------------------------------ ----- ---
--

------- -------------------------------
------------- ----
----------    --------------------------------- --------------------
-------       -----------------
--- ---
-

---- ------ -
----------------------
-

Azure Functions 示例

-- -------------------- ---- -------
------- ----

------ -
-----------

---------------------------
-

---- ------- ------ -
---------- ------ -------------------
---------  ------ ------------------
-

---- -------- ------ -
-------- ------ ----------------
-

---- ------ -
-- -- -------------
----------------- ------ ------------- -
----- --- -------
---- --- -- ----------------------- --- -- --- -
-------------------------------- -------------- -------- ----------
---------
---

---- ------------- -- -- -- ------------ -- -- -
-------------------------------- -------------- -------- ------- ---------------
---------
---

------ -- ----------------- ------- - - ------------- - - - - ------------ - ----
----------------------- -----
---

--------
-

总结

在 Serverless 架构环境下,安全问题仍然是至关重要的。因此,我们应该确保系统拥有完善的安全措施和详细的记录来收集、监控和解决各种安全问题,关闭不必要的端口、禁用访问控制表和使用安全套接字等措施,以免被攻击者利用系统漏洞进行恶意攻击。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6453760e968c7c53b07d73ff

纠错
反馈