如何安全地使用公有云2--IAM,身份认证与访问管理

2024-07-15 07:56   北京  


什么是IAM?

IAM是"Identity and Access Management"的缩写,中文意思是"身份认证与访问管理"。它是一种安全策略,用于控制谁可以访问网络资源以及他们可以访问哪些资源。IAM系统通常包括以下几个关键功能:
身份认证(Authentication):验证用户或设备的身份,确保他们是谁声称的那样。
访问控制(Authorization):确定用户或设备在身份认证后可以访问哪些资源和执行哪些操作。
用户账户管理:创建、修改和删除用户账户,以及管理账户的权限。
密码(凭据)管理:确保密码的安全性,包括密码策略和密码重置功能。
审计和监控:跟踪和记录用户的活动,以便进行安全审计和监控潜在的不当行为。
IAM解决方案可以帮助组织保护其资源免受未授权访问,同时确保合规性和满足业务需求。随着云计算和移动设备的普及,IAM变得越来越重要,因为它们需要管理来自不同设备和位置的访问请求。

无论哪个组织,哪个系统,权限管理都是个极其挑战的问题。统一身份认证(Identity and Access Management,简称IAM)是云提供权限管理的基础服务,可以帮助您安全地控制云服务和资源的访问权限。

IAM通过对用户,用户组,策略等相关资源的管理,可以使租户完整的控制对云资源的访问,包括谁(主体)在特定条件下(Attribution) 对某资源(客体)的访问是否被允许(Action)。IAM是云的最基本组件,是云上权限管理的基础,公有云基本都实现了基于RBAC或ABAC的访问控制,并支持第三方IAM的扩展。正确理解和配置IAM,是云上安全的前提。


常见访问控制模型


在业界,访问控制经过多年的发展,模型有多种,主要包括DAC,MAC,RBAC,ABAC等。

自主访问控制(Discretionary Access Control,DAC)是一种接入控制服务,通过执行基于系统实体身份及其到系统资源的接入授权。DAC常见于文件系统,LINUX,UNIX、WindowsNT版本的操作系统都提供DAC的支持。在实现上,先对用户鉴权,然后根据控制列表(ACL)决定用户能否访问资源。用户控制权限的修改通常由特权用户或者管理员组实现。DAC最大缺陷就是对权限控制比较分散,比如无法简单地将一组文件设置统一的权限开放给指定的一群用户。主体的权限太大,无意间就可能泄露信息。

强制访问控制(Mandatory Access Control,MAC)在计算机安全领域指一种由操作系统约束的存取控制,目标是限制主体或发起者访问或对对象或目标执行某种操作的能力。在实践中,主体通常是一个进程或线程,对象可能是文件、目录、TCP/UDP端口、共享内存段、I/O设备等。主体和对象各自具有一组安全属性。每当主体尝试访问对象时,都会由操作系统内核强制施行授权规则——检查安全属性并决定是否可进行访问。任何主体对任何物件的任何操作都将根据一组授权规则(也称策略)进行测试,决定操作是否允许。MAC属于强访问控制,很难绕过。象Linux的Selinux就是MAC的典型实现。

DAC和MAC适合小规模的系统,随着用户数的增加,策略管理会越来越复杂。为了提升管理效率和准确性,基于角色的访问控制(Role Based Access Control,RBAC)应运而生。RBAC是一种用于控制用户在公司 IT 系统中能够执行的操作的方法。RBAC的核心是角色(Role),在这个模型中,访问权限是由为每个个体分配角色的人预先隐式定义的,但最终由客体属主在确定角色权限时明确。一个角色拥有一个权限组,可以执行一定操作。新增或改变一个成员,只需要将其赋予某一个角色就行。比如,财务部员工都有A B C三个权限,先把ABC的权限赋予给一个角色(财务部普通员工),这时候财务部增加一个员工,只需要将这个员工分配为财务部普通员工的角色,即自动拥有ABC三个权限。如果要让财务部普通员工增加或减少权限,只需要在角色中增加或减少权限,即自动应用到财务部所有普通员工上,非常高效和准确。

但RBAC仍然有局限性,一是随着组织的增大,角色越来越多,会越来越难管理。另外,随着技术的发展,我们需要更灵活的管理方式。比如,有些权限只能在公司用,远程接入公司不能用,或者有些权限只能在上班时间用,下班时间不能用等等,这些在传统的RBAC模型里无法实现,为了应对这种更灵活的需求,基于属性的访问控制(ABAC)开始发展。

2014年,Nist 800-162(Guide to Attribute Based Access Control (ABAC) Definition and Considerations )正式发布,对ABAC做出了准确的定义和描述。

ABAC 是一种逻辑访问控制方法,其中执行一组操作的授权是通过评估与主体、客体、请求的操作相关的属性来确定的,在某些情况下,对于给定的一组属性,还根据描述允许操作的策略、规则或关系来评估环境条件是否允许访问。

属性是主体、客体或环境条件的特征。属性信息以“名称-值”对的形式定义。

一个典型ABAC的系统如下图

说明:图中Subject 是主体,Object是客体,ABAC Access Control Mechanism(ACM)是策略控制机制,Access Control Policy(ACP)是预定义策略,Environment,Subject,Object均有属性特征,可用于ACM的判断。对于主体对客体的每一次访问要求,ACM是根据预定义策略(ACP)和主体属性、客体属性,环境属性综合判断,该访问是否允许。

在ABAC中,策略定义及策略执行可以根据主体属性,客体属性,环境条件等要素。显然,这种定义和实现非常灵活。如果把角色(Role)也作为主体属性之一的话,可以认为,ABAC对RBAC是有兼容能力的,ABAC是对RBAC的扩展。

简单举个例子,RBAC是有权限就可以执行,没权限就拒绝。但在ABAC中,每一次允许或拒绝是根据一系列的条件来决定的,比如,公司内部办公可以访问绝密级文件,但远程办公可以访问机密级文件。财务部的员工可以访问财务部的绝密级文件,行政部的员工可以访问财务部的普通文件。上述内容可以定义为策略,按这个策略,行政部的员工无论什么条件下无法访问财务部的绝密文件,财务部的员工在公司内工作可以访问绝密级文件,但如果居家办公,远程访问则只能查阅机密级文件。以上规则的定义远比RBAC在灵活得多。

目前看, 各云厂商基本采用以RBAC为主体,可以添加访问控制条件的策略方式,可以认为是ABAC的访问控制模型。


IAM功能介绍

访问控制模型是比较抽象的概念,在一个访问控制系统实现的时候,一般通过4A(帐号 Account,授权Authorization,鉴权Authentication,审计Audit)的形式呈现,我们从这四个纬度展开分析IAM。


帐号(Account)

当您首次使用华为云时注册的帐号,该帐号是您的华为云资源归属、资源使用计费的主体,对其所拥有的资源及云服务具有完全的访问权限,可以重置用户密码、分配用户权限等。帐号统一接收所有IAM用户进行资源操作时产生的费用账单。

帐号不能在IAM中修改和删除,您可以在帐号中心修改帐号信息,如果您需要删除帐号,可以在帐号中心进行注销。帐号相当于超级管理员,且兼具计费能力,一般应避免在业务中使用。

帐号在登录后,右上角的帐号信息中可以找到

IAM用户(IAM Users)

由帐号在IAM中创建的用户,是云服务的使用人员,具有独立的身份凭证(密码和访问密钥),根据帐号授予的权限使用资源。这个相当于RBAC中的用户。用户组则相当于RBAC里的Role。

IAM用户和用户组可以从IAM服务中找到。在控制台选IAM服务:

IAM 用户组(IAM Group)

用户组是用户的集合,IAM可以通过用户组功能实现用户的授权。您创建的IAM用户,加入特定用户组后,将具备对应用户组的权限。当某个用户加入多个用户组时,此用户同时拥有多个用户组的权限,即多个用户组权限的全集。(若多个组有权限冲突,以最先执行到的策略为准),这个相当于RBAC中的角色。

身份凭证

身份凭证是识别用户身份的依据,您通过控制台或者API访问华为云时,需要使用身份凭证来通过系统的鉴权认证。身份凭证包括密码和访问密钥,您可以在IAM中管理自己以及帐号中IAM用户的身份凭证。密码:常见的身份凭证,密码可以用来登录控制台,还可以调用API接口。访问密钥:即AK/SK(Access Key ID/Secret Access Key),调用API接口的身份凭证,不能登录控制台。访问密钥中具有验证身份的签名,通过加密签名验证可以确保机密性、完整性和请求双方身份的正确性。


授权Authorization

    1. 权限

    权限是由策略定义的。策略是IAM提供的一种细粒度授权的能力,可以精确到具体操作、资源、条件等。使用基于策略的授权是一种更加灵活地授权方式,能够满足企业对权限最小化的安全管控要求。例如:针对ECS服务,管理员能够控制IAM用户仅能对某一类(批)云服务器的资源进行指定的管理操作。策略包含系统策略和自定义策略。云服务在根据客户需求及常见使用方式,为方便客户使用,在IAM预置了常用授权项,称为系统策略。如果系统策略无法满足授权要求,管理员可以根据各服务支持的授权项,创建自定义策略,并通过给用户组授予自定义策略来进行精细的访问控制,自定义策略是对系统策略的扩展和补充。目前基本都支持可视化视图、JSON视图两种自定义策略配置方式。

    以OBS为例,IAM预置了四种系统权限:

    在obsAdmin用户组中编辑权限,增加上图中OBS Administrator权限,由该组用户即拥有OBS的完整控制权限。将userA加入到obsAdmin用户组中,则userA具备OBS的完整控制权限。

    同理,可以将OBSReadOnlyAccess权限加入到obsMonitor用户组中,把userB加入到obsMonitor用户组中,则userB只拥有OBS查看的相关权限。

    细粒度授权

    上述授权是对所有对象的操作,且操作内容均已定义好,如果需要更精细的权限管理,可以选择自定义策略,自定义策略可以实现更细粒度授权。

    在IAM中选择权限管理—权限—创建自定义策略,可以从资源(某个桶),权限(Action), 允许/拒绝,请求条件等来定义一条策略。

    比如,我们允许某一个用户只能在桶上路径/userpost有上传权限,可以只选择上传权限(object.PutObject),并指定资源 OBS:*.*:object:/userpost。这个策略不限制哪个桶,只限制桶下的目录。


    如果需要增加更多属性限制,可以在特定条件中添加。用策略文件可以表示如下

    上述策略保存,然后赋予某些组或用户,就可以实现权限控制。

    由于可见,ABAC实现的细粒度权限管理非常灵活。

    鉴权Authentication

    IAM的策略解析,鉴权的过程均由其内部实现,租户不需要干预。

    需要了解的是,基于API的鉴权方法。

    API鉴权的使用

    相对传统数据中心部署,云的最大优点是自动化能力,所有的操作不仅可以通过console实现,还可以通过API实现自动化。比如创建删除虚拟机,网络,OBS桶等,console上几乎所有操作,都可以编程实现。以创建ECS为例,可以通过CreateServers实现。

    详见 https://console.huaweicloud.com/apiexplorer/#/apidoc/ECS/CreateServers,上边有非常多的例子,支持各种编程语言,使用非常简单。文后有个例子。

    鉴权都支持AK、SK的方法,鉴权还支持用户名/密码取token的方式,但推荐还是AK/SK的方式。AK/SK可以在 控制台--我的凭据 中下载。

    从例子代码可以看到,AK/SK会出现在代码中,或者配置文件中,无论哪种方式,都非常容易泄露,事实上也发生过多次AK/SK在github等网站上泄露的问题。AK/SK的泄露相当于密码的泄露,如果有人拿到,可以用来做任何该AK/SK权限内的事情,是云安全的TOP风险之一。

    解决这个问题有两个办法:

    1. AK/SK定期轮转。密码类凭据丢失问题,解决的最好的办法是快速轮转,让密码在尽可能短的时间内失效,这样,即使丢失,造成的损失也会尽可能的小。Ak/sk的轮转可以通过api来实现。

    CreatePermanentAccessKey可以创建一个新的AK/SK. DeletePermanentAccessKey则可以删除一组AK/SK。UpdatePermanentAccessKey则可以让一组ak/sk失效或重新生效。

    详情及代码可以参见

    https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IAM&api=CreatePermanentAccessKey

    2.使用临时凭据

    使用ECS委托获取临时凭据

    既然AK/SK容易丢失,且轮转是解决问题的办法,那有没有更好的办法来确保安全?答案是使用ECS委托获得临时凭据。

    元数据MetaData

    云上有一个特殊的IP,169.254.169.254,这个IP全网的虚拟机都可以访问,并通过访问这个IP取得本虚拟机的元数据。比如,如果一个虚拟机配置弹性IP,直接使用操作系统的命令并不能查到弹性IP的地址,但是可以通过169.254.169.254来获取,方法很简单

    curl http://169.254.169.254/latest/meta-data/public-ipv4

    返回的就是该虚拟机的弹性IP。通过这个IP可以查询的元数据有很多,详见

    https://support.huaweicloud.com/usermanual-ecs/ecs_03_0166.html#section7

    委托

    委托就是将一个用户/帐号(委托方)的部分权限,资源,委托给另一个用户/账号(被委托方),使被委托方可以使用委托方授权范围内,使用委托方的权限,对委托方的资源进行管理。

    如果你想把运维外包给第三方服务,使用委托做权限管理是个非常合理的方法。

    华为云还提供了一种委托,叫做弹性云服务器(ECS)委托,可以把某个权限直接委托给一台或一组ECS,让ECS直接具备权限,这个方法可以非常好的规避凭据丢失的风险。

    它的原理和流程如下:






    然后在ECS里设置使用委托

    授权完成后,可以在虚拟机里查看

    curl http://169.254.169.254/openstack/latest/securitykey

    会返回AK,SK,Token等相关信息。类似

    此种方法获得的临时凭据有效期短,需要定期刷新,但丢失风险小,同时免了存盘等相关操作,安全性非常高。


    更详细的信息,可以参考 https://support.huaweicloud.com/bestpractice-iam/iam_0511.html


    审计 Audit

    系统所有的审计信息均保存在云审计服务CTS里。(详见第六章 合规与审计)



    推荐安全配置方法

    由于公有云的特点,管理员有最高权限,全球随时可访问,导致管理员的密码,访问凭据丢失等带来的风险会非常大,所以,相关安全配置至关重要。基于此,有以下安全建议:


    1. 设置强密码策略,要求密码复杂度。密码最好包括大小写字母,数字等,同时密码长度至少为8,并要求定期修改密码。

    2. 确保管理员帐号启用MFA 。多因素认证是解决密码丢失的好办法,即使密码丢失,有第二验证手段,会有效地防止权限失控。

    3. 管理员帐号禁用 AK/SK 。AK/SK是API权限入口,所有的API操作都不应该使用管理员,应该使用IAM用户并对每种使用API的应用做严格的访问控制。

    4. 创建非管理员权限的 IAM 用户。日常工作应该尽量避免使用管理员帐号,相关的操作建立IAM用户和用户组,以确保权限最小化。

    5. 启用登录保护。IAM可以设置会话超时策略,帐号锁定策略,帐号停用策略,最近登录提示等,相关策略有助于确保登录安全。


    以上设置可以在 帐号-安全设置 中设置。



    END



    附:创建虚拟机的GO代码例子

    package main

    import (
      "fmt"
      "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic"
        ecs "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ecs/v2"
      "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ecs/v2/model"
        region "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ecs/v2/region"
    )

    func main() {
        // The AK and SK used for authentication are hard-coded or stored in plaintext, which has great security risks. It is recommended that the AK and SK be stored in ciphertext in configuration files or environment variables and decrypted during use to ensure security.
        // In this example, AK and SK are stored in environment variables for authentication. Before running this example, set environment variables CLOUD_SDK_AK and CLOUD_SDK_SK in the local environment
        ak := os.Getenv("CLOUD_SDK_AK")
        sk := os.Getenv("CLOUD_SDK_SK")

        auth := basic.NewCredentialsBuilder().
            WithAk(ak).
            WithSk(sk).
            Build()

        client := ecs.NewEcsClient(
            ecs.EcsClientBuilder().
                WithRegion(region.ValueOf("af-south-1")).
                WithCredential(auth).
                Build())

        request := &model.CreateServersRequest{}
      request.Body = &model.CreateServersRequestBody{
      }
      response, err := client.CreateServers(request)
      if err == nil {
            fmt.Printf("%+v\n", response)
        } else {
            fmt.Println(err)
        }
    }


    AI与安全
    理清逻辑,找到规律,看清趋势。作者前华为云高级安全专家,现为独立顾问。
     最新文章