EFS ファイルシステム
概要
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-policy は PolicyNotFound エラーを返す。
aws efs describe-file-system-policy \
--file-system-id <パブリック検証用ファイルシステム ID>An error occurred (PolicyNotFound) when calling the DescribeFileSystemPolicy operation: Noneデフォルトではファイルシステムポリシーが存在しない。この状態では IAM 認証は使用されず、マウントターゲット経由で接続できる匿名クライアントにフルアクセスが許可される。
3. テスト用ファイルシステムの設定
ステップ 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. パブリックアクセスの検出
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 更新日時>"
}以下を確認する。
isPublicがtrueprincipalが{"AWS": "*"}actionにelasticfilesystem:ClientMount,elasticfilesystem:ClientWriteが含まれるresourceControlPolicyRestrictionがNOT_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 更新日時>"
}以下を確認する。
isPublicがfalseprincipalに組織外アカウント ID が特定されているactionにelasticfilesystem:ClientMount,elasticfilesystem:ClientWriteが含まれるresourceControlPolicyRestrictionがNOT_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>
(出力なし)