コンテンツにスキップ
EFS ファイルシステム

EFS ファイルシステム

検証日: 2026-04-05 / リージョン: ap-northeast-1

概要

IAM Access Analyzer が EFS ファイルシステムの外部アクセスをどのように検出するかを検証する。

EFS ファイルシステムはファイルシステムポリシー(リソースベースポリシー)により IAM レベルでの外部アクセスを制御できる。デフォルトではファイルシステムポリシーが存在せず、IAM 認証は使用されない。この状態ではアクセス制御はセキュリティグループ(ネットワークレベル)に依存する。IAM Access Analyzer はリソースベースポリシーの到達可能性を分析するため、ポリシーが存在しない状態では finding は生成されない。ファイルシステムポリシーに Principal: "*"(Condition なし)を設定するとパブリックアクセスとして検出され、特定の外部アカウントを設定するとクロスアカウントアクセスとして検出される。

EFS ファイルシステムの外部アクセス制御レイヤー

レイヤーEFS ファイルシステムの状況
デフォルト保護なし(Block Public Access なし)※
予防(SCP / RCP)Control Tower 予防コントロールなし
Security Hub CSPM外部アクセスチェックなし
IAM Access Analyzerパブリック + クロスアカウントの到達可能性を分析

※ EFS にはファイルシステムポリシーが「パブリック」と判定された場合に AWS Transfer Family 経由のクロスアカウントアクセスをブロックする仕組みがあるが、S3 のようなアカウントレベルの Block Public Access トグルは存在しない

結果

  • デフォルト保護: EFS ファイルシステムはデフォルトではファイルシステムポリシーが存在せず、IAM 認証は使用されない。アクセス制御はセキュリティグループ(ネットワークレベル)に依存する。IAM Access Analyzer は分析対象のポリシーがないため finding を生成しない
  • パブリックアクセスの検出: ファイルシステムポリシーに Principal: "*"(Condition なし)を設定すると isPublic: true の finding が生成された。action は elasticfilesystem:ClientMount, elasticfilesystem:ClientWrite
  • クロスアカウントアクセスの検出: 組織外アカウント ID をファイルシステムポリシーに設定すると isPublic: false の finding が生成された。principal に組織外アカウント ID が特定された
  • resourceControlPolicyRestriction: EFS に対応する RCP 型予防コントロールは存在しないため、すべて NOT_APPLICABLE
  • ポリシー削除による finding の解消: delete-file-system-policy でファイルシステムポリシーを削除すると finding は RESOLVED になった
  • 組織外からの実アクセス確認: EFS のファイルシステムポリシーは NFS クライアントアクション(elasticfilesystem:ClientMount 等)のみを制御するため、組織外アカウントから API レベルで実アクセスを確認する方法はない。NFS マウントによる確認にはマウントターゲットと VPC ピアリング等が必要

検証環境

検証環境の構成図

本記事のコマンドは、--profile 指定がない場合は Workload アカウントで実行する。IAM Access Analyzer の finding 確認は Audit アカウントで実行する。

検証の流れ

    flowchart LR
    A[1. 既存 finding の<br>確認] --> B[2. デフォルト設定<br>の確認]
    B --> C[3. テスト用<br>ファイルシステム設定]
    C --> D[4. パブリックアクセス<br>の検出]
    D --> E[5. クロスアカウント<br>アクセスの検出]
    E --> F[6. クリーンアップ]
  

1. 既存 finding の確認

テスト用ファイルシステムを作成する前に、既存の EFS ファイルシステム finding を確認する。

aws accessanalyzer list-findings-v2 \
  --analyzer-arn arn:aws:access-analyzer:ap-northeast-1:<Audit アカウント ID>:analyzer/org-access-analyzer \
  --filter '{"status": {"eq": ["ACTIVE"]}, "resourceType": {"eq": ["AWS::EFS::FileSystem"]}}' \
  --query 'findings[].{id:id,resource:resource,status:status}' \
  --region ap-northeast-1 \
  --profile Audit
[]

2. デフォルト設定の確認

EFS ファイルシステムはデフォルトではファイルシステムポリシーが存在しない。テスト用ファイルシステムを作成し、デフォルト状態を確認する。

テスト用ファイルシステムの作成

aws efs create-file-system \
  --tags Key=Name,Value=iaa-efs-public-test \
  --query '{FileSystemId:FileSystemId,LifeCycleState:LifeCycleState}'
{
    "FileSystemId": "<パブリック検証用ファイルシステム ID>",
    "LifeCycleState": "creating"
}

デフォルトのファイルシステムポリシー

ポリシーが設定されていない場合、describe-file-system-policyPolicyNotFound エラーを返す。

aws efs describe-file-system-policy \
  --file-system-id <パブリック検証用ファイルシステム ID>
An error occurred (PolicyNotFound) when calling the DescribeFileSystemPolicy operation: None

デフォルトではファイルシステムポリシーが存在しない。この状態では IAM 認証は使用されず、マウントターゲット経由で接続できる匿名クライアントにフルアクセスが許可される。

3. テスト用ファイルシステムの設定

外部プリンシパルへのアクセスを許可するファイルシステムポリシーを設定する。検証目的のみで行い、ステップ 6 で削除する。

ステップ 2 で作成した iaa-efs-public-test に加え、クロスアカウント用のファイルシステムを作成する。

aws efs create-file-system \
  --tags Key=Name,Value=iaa-efs-crossaccount-test \
  --query '{FileSystemId:FileSystemId,LifeCycleState:LifeCycleState}'
{
    "FileSystemId": "<クロスアカウント検証用ファイルシステム ID>",
    "LifeCycleState": "creating"
}

パブリックアクセスを許可するファイルシステムポリシーを設定する。

aws efs put-file-system-policy \
  --file-system-id <パブリック検証用ファイルシステム ID> \
  --policy '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Sid": "PublicAccess",
        "Effect": "Allow",
        "Principal": {"AWS": "*"},
        "Action": [
          "elasticfilesystem:ClientMount",
          "elasticfilesystem:ClientWrite"
        ]
      }
    ]
  }'
{
    "FileSystemId": "<パブリック検証用ファイルシステム ID>",
    "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"PublicAccess\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"*\"},\"Action\":[\"elasticfilesystem:ClientMount\",\"elasticfilesystem:ClientWrite\"],\"Resource\":\"arn:aws:elasticfilesystem:ap-northeast-1:<Workload アカウント ID>:file-system/<パブリック検証用ファイルシステム ID>\"}]}"
}

クロスアカウントアクセスを許可するファイルシステムポリシーを設定する。

aws efs put-file-system-policy \
  --file-system-id <クロスアカウント検証用ファイルシステム ID> \
  --policy '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Sid": "CrossAccountAccess",
        "Effect": "Allow",
        "Principal": {"AWS": "<組織外アカウント ID>"},
        "Action": [
          "elasticfilesystem:ClientMount",
          "elasticfilesystem:ClientWrite"
        ]
      }
    ]
  }'
{
    "FileSystemId": "<クロスアカウント検証用ファイルシステム ID>",
    "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"CrossAccountAccess\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"<組織外アカウント ID>\"},\"Action\":[\"elasticfilesystem:ClientMount\",\"elasticfilesystem:ClientWrite\"],\"Resource\":\"arn:aws:elasticfilesystem:ap-northeast-1:<Workload アカウント ID>:file-system/<クロスアカウント検証用ファイルシステム ID>\"}]}"
}

4. パブリックアクセスの検出

ポリシー変更後、IAM Access Analyzer が finding を生成・更新するまで最大 30 分かかる場合がある。
EFS のファイルシステムポリシーは NFS クライアントアクション(elasticfilesystem:ClientMount 等)のみを制御する。describe-file-systems 等の管理 API はファイルシステムポリシーの対象外であり、組織外アカウントからは API レベルで実アクセスを確認できない。NFS マウントによる確認にはマウントターゲットと VPC ピアリング等が必要なため、本記事では組織外からの実アクセス確認は省略する。

パブリック検証用ファイルシステムの finding を確認する。

aws accessanalyzer list-findings-v2 \
  --analyzer-arn arn:aws:access-analyzer:ap-northeast-1:<Audit アカウント ID>:analyzer/org-access-analyzer \
  --filter '{"status": {"eq": ["ACTIVE"]}, "resource": {"contains": ["<パブリック検証用ファイルシステム ID>"]}}' \
  --query 'findings[].{id:id,resource:resource,resourceType:resourceType,status:status}' \
  --region ap-northeast-1 \
  --profile Audit
[
    {
        "id": "<パブリック finding ID>",
        "resource": "arn:aws:elasticfilesystem:ap-northeast-1:<Workload アカウント ID>:file-system/<パブリック検証用ファイルシステム ID>",
        "resourceType": "AWS::EFS::FileSystem",
        "status": "ACTIVE"
    }
]

finding の詳細を確認する。

aws accessanalyzer get-finding-v2 \
  --analyzer-arn arn:aws:access-analyzer:ap-northeast-1:<Audit アカウント ID>:analyzer/org-access-analyzer \
  --id <パブリック finding ID> \
  --region ap-northeast-1 \
  --profile Audit
{
    "findingDetails": [
        {
            "externalAccessDetails": {
                "action": [
                    "elasticfilesystem:ClientMount",
                    "elasticfilesystem:ClientWrite"
                ],
                "condition": {},
                "isPublic": true,
                "principal": {"AWS": "*"},
                "resourceControlPolicyRestriction": "NOT_APPLICABLE"
            }
        }
    ],
    "resource": "arn:aws:elasticfilesystem:ap-northeast-1:<Workload アカウント ID>:file-system/<パブリック検証用ファイルシステム ID>",
    "status": "ACTIVE",
    "error": null,
    "createdAt": "<finding 作成日時>",
    "resourceType": "AWS::EFS::FileSystem",
    "findingType": "ExternalAccess",
    "resourceOwnerAccount": "<Workload アカウント ID>",
    "analyzedAt": "<分析日時>",
    "id": "<パブリック finding ID>",
    "updatedAt": "<finding 更新日時>"
}

以下を確認する。

  • isPublictrue
  • principal{"AWS": "*"}
  • actionelasticfilesystem:ClientMount, elasticfilesystem:ClientWrite が含まれる
  • resourceControlPolicyRestrictionNOT_APPLICABLE

5. クロスアカウントアクセスの検出

クロスアカウント検証用ファイルシステムの finding を確認する。

aws accessanalyzer list-findings-v2 \
  --analyzer-arn arn:aws:access-analyzer:ap-northeast-1:<Audit アカウント ID>:analyzer/org-access-analyzer \
  --filter '{"status": {"eq": ["ACTIVE"]}, "resource": {"contains": ["<クロスアカウント検証用ファイルシステム ID>"]}}' \
  --query 'findings[].{id:id,resource:resource,resourceType:resourceType,status:status}' \
  --region ap-northeast-1 \
  --profile Audit
[
    {
        "id": "<クロスアカウント finding ID>",
        "resource": "arn:aws:elasticfilesystem:ap-northeast-1:<Workload アカウント ID>:file-system/<クロスアカウント検証用ファイルシステム ID>",
        "resourceType": "AWS::EFS::FileSystem",
        "status": "ACTIVE"
    }
]

finding の詳細を確認する。

aws accessanalyzer get-finding-v2 \
  --analyzer-arn arn:aws:access-analyzer:ap-northeast-1:<Audit アカウント ID>:analyzer/org-access-analyzer \
  --id <クロスアカウント finding ID> \
  --region ap-northeast-1 \
  --profile Audit
{
    "findingDetails": [
        {
            "externalAccessDetails": {
                "action": [
                    "elasticfilesystem:ClientMount",
                    "elasticfilesystem:ClientWrite"
                ],
                "condition": {},
                "isPublic": false,
                "principal": {"AWS": "<組織外アカウント ID>"},
                "resourceControlPolicyRestriction": "NOT_APPLICABLE"
            }
        }
    ],
    "resource": "arn:aws:elasticfilesystem:ap-northeast-1:<Workload アカウント ID>:file-system/<クロスアカウント検証用ファイルシステム ID>",
    "status": "ACTIVE",
    "error": null,
    "createdAt": "<finding 作成日時>",
    "resourceType": "AWS::EFS::FileSystem",
    "findingType": "ExternalAccess",
    "resourceOwnerAccount": "<Workload アカウント ID>",
    "analyzedAt": "<分析日時>",
    "id": "<クロスアカウント finding ID>",
    "updatedAt": "<finding 更新日時>"
}

以下を確認する。

  • isPublicfalse
  • principal に組織外アカウント ID が特定されている
  • actionelasticfilesystem:ClientMount, elasticfilesystem:ClientWrite が含まれる
  • resourceControlPolicyRestrictionNOT_APPLICABLE

6. クリーンアップ

ファイルシステムポリシーの削除

aws efs delete-file-system-policy \
  --file-system-id <パブリック検証用ファイルシステム ID>
(出力なし)
aws efs delete-file-system-policy \
  --file-system-id <クロスアカウント検証用ファイルシステム ID>
(出力なし)

finding の確認

ポリシー削除後、finding が RESOLVED になることを確認する。

aws accessanalyzer list-findings-v2 \
  --analyzer-arn arn:aws:access-analyzer:ap-northeast-1:<Audit アカウント ID>:analyzer/org-access-analyzer \
  --filter '{"status": {"eq": ["ACTIVE"]}, "resourceType": {"eq": ["AWS::EFS::FileSystem"]}}' \
  --query 'findings[].{id:id,resource:resource,status:status}' \
  --region ap-northeast-1 \
  --profile Audit
[]

テスト用ファイルシステムの削除

aws efs delete-file-system \
  --file-system-id <パブリック検証用ファイルシステム ID>
(出力なし)
aws efs delete-file-system \
  --file-system-id <クロスアカウント検証用ファイルシステム ID>
(出力なし)

Amazonアソシエイトリンク