Get hands-on experience with 20+ free Google Cloud products and $300 in free credit for new customers.

Bigquery tables get data API returning Access Denied

Not able to get the BQ get table data API work with row level policies.

Trying to make a HTTP API call to:

https://bigquery.googleapis.com/bigquery/v2/projects/<project-name>/datasets/<dataset-name>/tables/<table-name>/data

I have authenticated using a OAuth2 access token.

I am getting error: 

Access Denied: Table <table-name>: User does not have full access for table <table-name> due to row access policies

Row level security policy have been defined for my user on the table. How can I make the above API call work with row level security?

 

0 3 2,525
3 REPLIES 3

When you encounter an "Access Denied" error in Google Cloud BigQuery, it indicates that the standard bigquery.tables.getData permission, necessary for reading data, does not allow you to bypass BigQuery's row-level security (RLS) policies. These policies are designed to dynamically restrict row visibility based on the user's identity and predefined criteria, ensuring data access is securely controlled.

How BigQuery Handles RLS and Permissions

  • Integrated RLS Handling: BigQuery seamlessly integrates RLS within the bigquery.tables.getData permission, without the need for a separate bigquery.rowAccessPolicies.getFilteredData permission.
  • RLS Enforcement: For tables with RLS policies:
    • Users or service accounts require a role granting the bigquery.tables.getData permission, such as roles/bigquery.dataViewer.
    • BigQuery automatically applies RLS policies during queries or API calls, ensuring users only access authorized data.

Resolving the Issue

  • Assign Appropriate IAM Role: Ensure the user or service account making the API call is assigned a role with the bigquery.tables.getData permission. The roles/bigquery.dataViewer role is typically suitable for broad data access needs.

    To assign a role, you can use the Google Cloud Console or the gcloud command-line tool. For example:

     
    gcloud projects add-iam-policy-binding PROJECT_ID --member='user:USER_EMAIL' --role='roles/bigquery.dataViewer'
  • Ensure Proper Authentication: Use the OAuth2 access token of the authorized user or service account in your API call.

Important Considerations

  • Security Implications: Granting broad data access roles may impact the effectiveness of RLS policies. Apply roles judiciously, especially with sensitive data.
  • Alternatives:
    • SQL Queries: Direct SQL queries against the table respect RLS policies automatically.
    • Server-side Filtering: Apply additional filtering within your application after fetching data, adhering to RLS constraints.

Best Practices

  • Principle of Least Privilege: Grant only the necessary permissions to perform a task, minimizing potential security risks.
  • Consult Official Documentation: For the most current information on RLS, IAM roles, and permissions, refer to the Google Cloud BigQuery documentation.

I have provided the `bigquery.tables.getData` permission. But still getting `Access Denied` error for https://cloud.google.com/bigquery/docs/reference/rest/v2/tabledata/list
 API endpoint. 

If you've already provided the bigquery.tables.getData permission and are still encountering an "Access Denied" error when using the BigQuery API endpoint for listing table data, there are several potential reasons and steps you can take to troubleshoot and resolve the issue:

1. Verify the Scope of Permissions

  • Direct Assignment: Ensure the permission is directly assigned to the user or service account making the request. Permissions can be granted directly or inherited through roles. The roles/bigquery.dataViewer role includes this permission and is commonly used.

  • Project-Level vs. Dataset-Level: Verify that the permissions are granted at the appropriate level. If you've granted permissions at the dataset level, ensure the dataset contains the table you're querying. Project-level permissions cover all datasets within the project.

2. Check for Row-Level Security Policies

  • If the table has row-level security (RLS) policies applied, ensure that the query complies with these policies. RLS policies restrict access to rows based on the user's identity or row attributes. Even with bigquery.tables.getData, access to specific rows may be denied if they don't meet the policy criteria.

3. Review IAM Policy Propagation Time

  • Propagation Delay: After updating IAM policies or roles, there can be a short delay before changes take effect. If you've just modified permissions, wait a few minutes and try again.

4. Examine the API Request

  • Correct API Endpoint: Double-check the API request URL and parameters to ensure they are correct. Mistakes in the dataset name, table name, or project ID can lead to access errors.

  • Authentication Token: Verify that the OAuth2 access token used for authentication is valid and has not expired. Ensure the token is associated with the correct user or service account with the necessary permissions.

5. Use Google Cloud Console or bq Command-Line Tool

  • As a diagnostic step, try accessing the table data using the Google Cloud Console or the bq command-line tool with the same user or service account. This can help determine if the issue is with the API request or the permissions setup.

     
    bq query --use_legacy_sql=false 'SELECT * FROM `project.dataset.table` LIMIT 10'

If you're unable to resolve the issue, consider reaching out to Google Cloud Support for assistance. They can provide more detailed guidance based on your specific project and settings.