EFS access point root directories: the basics
Why an access point that defaults to `/` is a finding
An EFS access point is an application-specific door into a shared Elastic File System. Each access point can pin a POSIX user, a POSIX group, and — critically — a root directory. When you set that root directory to a subdirectory like /app1, every NFS client mounting through that access point sees /app1 as its / and physically cannot traverse up into the rest of the file system. Set it to / and you've created a door with no walls: the client gets the entire shared file system, every other tenant's data included.
Security Hub control EFS.3 checks exactly this. The control fails when the access point's Path is set to /, the default root directory of the file system. It's a Medium-severity control in the Protect > Secure access management category, mapped to NIST 800-53 AC-6(10) — the principle of least privilege. The check is change-triggered, so it re-evaluates whenever an access point is created or modified.
It's flagged because access points are usually created to scope access, and an access point left at / quietly defeats its own purpose. Teams add an access point thinking they've isolated an application, never set RootDirectory.Path, and end up with the isolation theatre of a named access point that grants exactly the same reach as mounting the raw file system. The finding exists to catch that gap before a misconfigured Lambda or container reads or writes data it was never meant to touch.
In this lesson you'll learn what an EFS access point actually enforces, why a root directory of / triggers Security Hub EFS.3, and how access points isolate tenants on shared storage. You'll see the CLI to find non-compliant access points and to create a properly scoped replacement, the under-the-hood detail of how the NFS chroot and CreationInfo auto-provisioning work, and why access points are immutable — meaning the fix is always create-new-then-migrate, never edit-in-place.
The access point that was a door to nowhere — and everywhere
EFS access points were launched in 2020 specifically to solve the multi-tenant problem: before them, every client mounting a file system saw the same root, and you enforced separation entirely through POSIX permissions and careful mount commands. The access point's root-directory enforcement is a true NFS chroot — the client literally cannot express a path outside its assigned subtree, because to that client the subtree is the root. The irony EFS.3 catches is that the one field that makes an access point worth having, RootDirectory.Path, is optional and defaults to /. So the most common misconfiguration is an access point that does everything except the one thing access points were invented for.
Scoping an access point in action
Devon, a platform engineer, gets a new Security Hub EFS.3 finding after a teammate added an access point to the shared analytics-fs file system for a new reporting service. The access point was created with a POSIX user set but no root directory, so its Path is / — the reporting Lambda can see every team's data on the file system, not just the /reports subtree it needs.
Devon can't just edit the access point — EFS access points are immutable; RootDirectory is fixed at creation. So the fix is to create a new access point scoped to /reports, point the reporting service's mount config at the new access point ID, verify the Lambda still reads and writes correctly, then delete the old /-rooted one. The CreationInfo block lets the new access point auto-create /reports with the right ownership if it doesn't already exist.
Ten minutes later the new access point is live, the Lambda's efs_config references the new ID, a smoke test confirms it reads /reports and gets permission-denied on a sibling path, and the old access point is gone. Next Security Hub evaluation, the finding clears. Devon adds the file system to the team's IaC module so future access points come with a non-root RootDirectory.Path by default.
First, list the access points on a file system and check each one's RootDirectory path. Anything showing / will fail EFS.3.
Any access point with a Path of / exposes the whole file system and trips the control.
Create a replacement access point scoped to a subdirectory. CreationInfo lets EFS provision the directory with the right ownership if it doesn't exist yet.
Create-new is the only path: access points are immutable, so you replace rather than edit.
EFS access points under the hooddeep dive
An EFS access point is a managed NFS entry point that the EFS service enforces server-side. When a client mounts through an access point, EFS applies three overrides on every request regardless of what the client asks for: it can override the POSIX user and group (PosixUser), and it presents the configured RootDirectory.Path as the client's filesystem root. That last one is a true chroot — the access point translates the client's / to the subdirectory, and there is no path expression the client can construct to escape it. This is why EFS.3 cares only about Path: when it's /, the chroot is to the file system root, which is no isolation at all.
The RootDirectory object has two fields. Path is the subdirectory the access point exposes as root. CreationInfo (OwnerUid, OwnerGid, Permissions) tells EFS to create that directory with the specified ownership and mode if it doesn't already exist when the access point is first used — without it, mounting fails if the path is missing. The control fails strictly on Path == "/"; any non-root path passes, which is why even a shallow /app is compliant.
The operational gotcha is immutability. Neither RootDirectory nor PosixUser can be modified after creation — there is no update-access-point API. Remediation is therefore always: create a new, correctly-scoped access point, repoint every consumer (Lambda FileSystemConfig, ECS volume authorizationConfig.accessPointId, EC2 mount helper accesspoint= option) at the new ID, validate, then delete-access-point on the old one. There's no in-place fix, so the IaC fix and the live fix are the same shape.
# Find every access point across the account that fails EFS.3 (Path == "/").
for fs in $(aws efs describe-file-systems --query 'FileSystems[].FileSystemId' --output text); do
aws efs describe-access-points --file-system-id "$fs" \
--query "AccessPoints[?RootDirectory.Path=='/'].[AccessPointId,FileSystemId]" \
--output text
done
# After repointing all consumers to the scoped replacement, remove the non-compliant one.
# (Access points are immutable — there is no update API; delete is the only retirement path.)
aws efs delete-access-point --access-point-id fsap-0reports11aa22 What is the impact of an unscoped EFS access point?
The direct impact is blast radius. An access point rooted at / gives whatever mounts through it visibility of the entire file system, not the subdirectory the application needs. On a shared file system holding data from multiple applications or tenants, that means one compromised or misconfigured consumer — a Lambda with an over-broad role, a container that got popped, a developer who copied a mount config — can read, and often write, across data it has no business touching.
Combined with the POSIX user override, the risk sharpens. If the access point also enforces a privileged UID (or no specific UID), a client reaching the root of the file system can manipulate other applications' files at the filesystem level. EFS.3 is mapped to NIST 800-53 AC-6(10), least privilege, precisely because the access point is supposed to be the enforcement point that confines an application to its own data — and an unscoped one is enforcement that enforces nothing.
There's a compliance and audit dimension too. Because the control is change-triggered, a single careless access point creation flips the control to FAILED almost immediately and it shows up on the next posture report. For organisations tracking a compliance framework, an open EFS.3 is a least-privilege control failure that has to be either remediated or formally accepted as an exception — neither of which is free in audit time, even though the fix itself is cheap.
Finally, there's the silent-isolation-failure cost. Teams create access points believing they've partitioned a shared file system. If those access points are rooted at /, the partitioning is illusory — the architecture diagram says "isolated tenants" while the runtime says "everyone sees everything." That gap between intended and actual isolation is exactly the kind of thing that surfaces at the worst possible moment, during an incident, when someone discovers the boundary they relied on was never there.
How do you remediate and prevent EFS.3?
Because access points are immutable, every fix is a replace-not-edit operation. The loop is: find the unscoped access points, create scoped replacements, repoint consumers, retire the old ones, and add a guardrail so it can't recur.
1. Inventory every access point rooted at /
Iterate every file system in every region and list access points where RootDirectory.Path == "/". These are your EFS.3 failures. Capture the access point ID, file system ID, and the PosixUser so the replacement matches the original's identity enforcement. Note which consumers reference each ID — Lambda functions, ECS task definitions, and EC2 mounts all bind to a specific access point ID, and you'll need that list to repoint cleanly.
2. Create a scoped replacement with CreationInfo
For each failing access point, create a new one with a non-root RootDirectory.Path (e.g. /app1) and a CreationInfo block specifying OwnerUid, OwnerGid, and Permissions so EFS provisions the subdirectory with correct ownership if it doesn't exist. Carry over the same PosixUser as the original. Any non-root path passes the control, but choose a path that genuinely scopes the application to its own data — the point is isolation, not just passing the check.
3. Repoint consumers, validate, then delete the old access point
Update every consumer's mount configuration to the new access point ID — Lambda FileSystemConfig.Arn, ECS volume authorizationConfig.accessPointId, or the EC2 mount helper's accesspoint= option. Run a smoke test that confirms the application can read and write its own subtree and gets permission-denied on a sibling path. Only after validation, run delete-access-point on the old /-rooted one. Never delete first — there's no rollback once it's gone, and consumers will fail their mounts.
4. Add a guardrail so it can't recur
Bake a non-root RootDirectory.Path into the IaC module every team uses to create access points, so the compliant configuration is the default. Back it with a preventive control — an SCP or IAM condition, or an AWS Config rule (efs-access-point-enforce-root-directory) wired to alerting — so an access point created at / is either blocked or flagged immediately rather than waiting for the next posture report. Prevention is what keeps the control green by construction.
# 1. Create the scoped replacement (matches the original PosixUser, adds CreationInfo).
NEW=$(aws efs create-access-point \
--file-system-id fs-0a1b2c3d4e5f67890 \
--posix-user Uid=1001,Gid=1001 \
--root-directory 'Path=/reports,CreationInfo={OwnerUid=1001,OwnerGid=1001,Permissions=0750}' \
--tags Key=Name,Value=reports-scoped \
--query 'AccessPointId' --output text)
echo "New access point: $NEW"
# 2. Repoint the Lambda consumer at the new access point, then validate before deleting.
aws lambda update-function-configuration \
--function-name reporting-svc \
--file-system-configs Arn=arn:aws:elasticfilesystem:us-east-1:111122223333:access-point/$NEW,LocalMountPath=/mnt/reports
# 3. Only after a successful read/write smoke test, retire the non-compliant access point.
aws efs delete-access-point --access-point-id fsap-0reports11aa22 Quick quiz
Question 1 of 5Security Hub flags an EFS access point with RootDirectory.Path set to /, used by one production Lambda. What's the correct remediation?
You scored
0 / 5
Keep learning
Dig deeper into EFS access points, the underlying control, and least-privilege design on shared storage.
- Working with Amazon EFS access points How access points enforce a root directory and POSIX identity, including the enforce-root-directory section EFS.3 points to.
- Security Hub control reference — Amazon EFS controls The authoritative definition of EFS.3 and its sibling EFS controls, including pass/fail criteria and severity.
- AWS Config rule: efs-access-point-enforce-root-directory The managed Config rule that backs the control — useful as a preventive/detective guardrail wired to alerting.
- CreateAccessPoint API reference The RootDirectory, Path, and CreationInfo fields you set when creating a scoped, compliant access point.
You've completed Enforce a root directory on EFS access points. You now know why an access point rooted at / defeats its own purpose, why Security Hub EFS.3 fails on exactly that condition, and the replace-not-edit remediation loop — inventory, create scoped replacement with CreationInfo, repoint consumers, delete the old one — plus the guardrail that keeps the control green. Next time EFS.3 lights up, you'll have a defensible path from flagged to resolved without an in-place edit that doesn't exist.