发布于: Oct 10, 2022

如何打造安全云存储系统,我们已经介绍了利用安全组可以对访问文件系统的 EC2 实例进行访问控制,如果需要进一步控制访问权限,如读写权限,能否以 Root 用户访问等,则可以结合 IAM 服务来进行更细粒度的控制。
通过 Amazon Identity and Access Management (IAM) 可以安全地管理对 Amazon Web Services 服务和资源的访问。可以使用 IAM 创建和管理 Amazon Web Services 用户和组,并使用各种权限来允许或拒绝他们对 Amazon Web Services 资源的访问。同时,EFS 的文件系统也提供了文件系统策略,可以设置针对文件系统的相应权限。

EFS 文件系统创建出来后,默认的文件系统策略是全放通,即任何 NFS 客户端均可以对其完全访问。用户可以通过设置文件系统策略,来进一步对文件系统权限进行控制。这些权限包括:

  • elasticfilesystem:ClientMount : 允许客户端以只读方式挂载文件系统
  • elasticfilesystem:ClientWrite : 允许客户端对文件系统进行写入
  • elasticfilesystem:ClientRootAccess : 允许客户端以 Root 用户进行访问
比如我们希望文件系统给予所有用户只读权限,则可以配置如下的文件系统策略:
{
    "Version": "2012-10-17",
    "Id": "efs-policy-wizard-f37947df-cdbb-40c9-8fe2-fb38bedd362e",
    "Statement": [
        {
            "Sid": "efs-statement-204c3f1d-6499-4a4f-9fa5-86592173888e",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "elasticfilesystem:ClientMount",
            "Resource": "arn:aws-cn:elasticfilesystem:cn-northwest-1:402202783068:file-system/fs-57789eb2"
        }
    ]
}

JSON

接下来我们可以挂载这个文件系统进行读写测试:

$ sudo mount -t efs fs-57789eb2 /mnt/efs
$ touch /mnt/efs/test
touch: cannot touch '/mnt/efs/test': Read-only file system

Console

可以看到客户端挂载后就是一个只读的文件系统,无法进行修改,也无法以 Root 用户访问。这是一个典型的基于资源( Resource-based )的 IAM 策略,通过进一步修改这个 IAM 策略(即指定 Principal )我们还可以为某个特定的用户设置允许或拒绝相应的权限。
注意到 NFS 客户端发起 EFS 文件系统挂载命令时,这个操作会被 CloudTrail 服务所记录下来,EventName 为 “NewClientConnection”,从 CloudTrail 详细日志的 “userIdentity” 和 ”serviceEventDetail” 中我们可以看到详细的IAM权限检查结果

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AWSAccount",
        "principalId": "",
        "accountId": "ANONYMOUS_PRINCIPAL"
        
...中间省略...

    "serviceEventDetails": {
        "permissions": {
            "ClientRootAccess": false,
            "ClientMount": true,
            "ClientWrite": false
        },
        "sourceIpAddress": "172.31.44.108"
    }
}

JSON

从这个记录可以看到,这个挂载操作是匿名用户发起,EFS 根据文件系统权限,给予 NFS 客户端只读的权限。

如果我们希望某个 EC2 实例做为管理节点,具有文件系统的读写权限,那应该如何配置呢?其中一种可行的方式是创建一个 IAM 角色(本示例中该角色命为 FSWrite),并为这个角色配置具有文件系统写权限的策略,通过将这个 IAM 角色附加给管理节点的 EC2 实例,从而使该实例上运行的程序具有对文件系统的写操作权限,如下是相应的策略的示例:

{
    "Version": "2012-10-17",
    "Id": "efsid",
    "Statement": [
        {
            "Sid": "efssid",
            "Effect": "Allow",
            "Action": [
                "elasticfilesystem:ClientWrite",
                "elasticfilesystem:ClientRootAccess"
            ],
            "Resource": "arn:aws-cn:elasticfilesystem:cn-northwest-1:402202783068:file-system/fs-57789eb2"
        }
    ]
}

JSON

在这个管理节点的 EC2 上面进行挂载时,如果直接使用 mount 命令并用默认参数进行挂载的话,并不会去使用 EC2 所附加的角色权限,因此需要使用如下命令及参数进行挂载:

$ sudo mount -t efs fs-57789eb2:/ -o tls,iam /mnt/efs

Console

其中:

  •  tls: NFS 客户端与 EFS 之间的通信需要使用 TLS1.2 进行加密,
  • iam: 使用 mount 程序所运行环境的 IAM 权限,这个例子中使用的是附加到 EC2 的角色。使用 iam 选项时需要同时启用 tls 选项
    检查 CloudTrail 中的日志,可以看到 IAM 权限检查的结果: 
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAV3JJHNVOITSOOW6BF:i-04e69fb201d65ce6e",
        "arn": "arn:aws-cn:sts::402202783068:assumed-role/FSWrite/i-04e69fb201d65ce6e",

...中间省略...

    "serviceEventDetails": {
        "permissions": {
            "ClientRootAccess": true,
            "ClientMount": true,
            "ClientWrite": true
        },
        "sourceIpAddress": "172.31.44.108"
    }
}

JSON

从这个记录可以看到,这个挂载操作使用了 FSWrite 这个角色,EFS 根据角色权限,给予 NFS 客户端写入的权限和 Root 访问的权限。

相关文章