Accounts & Billing¶
today’s Princess Bride quote (adapted)
You told me to go back to the beginning. … So it’s the beginning, and I’m staying till I understand …
GCP’s Identity and Access Management (IAM) policies are a key component to issues around accounts and billing.
For all billing and organisation services.
GCP Resource Hierarchy¶
Principles to Secure By
InfoSec and data-management best practice dictate: only assign access to those that **must* have it*.
OR - the principle of least privilege
PoLP is vital because of the hierarchical nature of policy inheritance. Say you give a user Owner permissions at the project level, you CAN NOT restrict them to View permission by applying a more restrictive policy directly to a particular resource.
Constraints are restrictions on services. By constraining roles, the GCP determines, using lists or a boolean switch, who can do what – where.
The GCP applies the following resource hierarchy:
- Organisation (optional)
- Folder (only exists within an organisation)
- Project (required) linked with Project ID a uid
Google offers Identity as a Service (IDaaS). By using a Google identity through G Suite, you can create an organisation in your GCP hierarchy. If your company does not use G Suite, you can use Cloud Identity, Google’s other IDaaS offering.
All users are assigned project creator and billing account creator by default – i.e. every user may initiate a service that creates costs.
Further responsibility may be assigned, for example a super-user position would have the Organization Administrator IAM role assigned. These users can then assign that role to other selected users.
The constraints that GCP supports include:
- allow a set of values
- deny a set of values
- deny this and all the children of this
- allow all allowed values
- deny all values
Binding roles
With a top down hierarchy, roles can be assigned at a high-level and filter down. For example, let’s say you have a VPC set up and wish for someone within the organisation to have a set of administrator rights (compute.xpnAdmin) you could bind these to an organisation folder using their id, like so:
gcloud alpha resource-manager folders add-iam-policy-binding [FOLDER_ID] –member=’user:[EMAIL_ADDRESS]’ –role=”roles/compute.xpnAdmin
If you wanted that person to have that role in all the folders held by that organisation then go one level higher with:
Organisation¶
An Organization is the highest level of a collection of GCP services. Setting rights at the Organization level allows those rights to be applied at all levels below.
The Organization Administrator role allows users to:
- define the structure of resources
- define and apply IAM policies for other users
All projects and billing accounts are children of an organisation.
Folders¶
Folders sit under the Organisation level.
Organisation administrators may give users access to specific folders. A developer, for example, would need access to Dev, Test, Staging, and Production. A developer would not need access to Accounts, nor an accountant to Dev.
did you know?
A folder can contain another folder and/or project/s
Projects¶
All services and resources are associated with a project. A project can sit inside a folder, or directly below your organisation. The default IAM for all users is that they have the resourcemanager.projects.create role assigned, the big G is in it to make money after all.
Organisation Policies¶
Inheritance is key
Policies are inherited and cannot be disabled or overridden by objects lower in the hierarchy, an effective way to apply a policy across an entire organisation’s resources.
The organisation policy service works together with IAM. It allows super-users to specify limits on the ways that resources may be used.
Think of IAM as the control over who can do things. While the policies determine what can be done.
did you know?
that it is possible to apply multiple policies at multiple levels:
- organisation
- folder
- project
Roles¶
Manage Roles
Select project from drop-down on blue bar
You can add members/groups of members and roles to a project
A role is a collection of permissions.
A user has an identity such as ab1@gmail.com, which is how roles are assigned to Alice Babel (of ab1@gmail.com fame).
Roles may be
- primitive (Owner, Editor, Viewer)
- pre-defined
- custom
A user can be bound to a role, e.g. the pre-defined accessapproval.approver provides the user with the ability to view, and act on, access approval requests and view configurations.
Primitive roles affect all resources in a GCP project whereas predefined roles apply to a particular service in a project.
Warning
DRY
Use pre-defined roles before making your own custom role. Consider these 3 and how many more are out there:
1 | appengine.appAdmin |
Which grants identities the ability to read, write, and modify all application settings within App Engine (notice the role is confined to the service App Engine).
1 | appengine.ServiceAdmin |
which grants read-only access to application settings and write-level access to module-level and version-level settings.
1 | appengine.appViewer |
Which grants read-only access to applications.
Predefined roles are a fast way to provide users with group permissions that are typically required to carry out a set of tasks.
Primitive Role Descriptions¶
Primitive roles are coarse-grained and may provide a greater scope than you wish to assign a user. This is why permissions may be constrained using scopes.
There is a huge difference between assigning someone on your team a viewer role and the entire world a primitive viewer role.
The following open policy allows all users to see website content:
gsutil iam ch allUsers:objectViewer gs://{MY_BUCKET_NAME_1}
This is a granular policy that only applies to the named bucket. Users do not even need to exist on you Google domain to get viewer access. The primitive roles are broad policies that apply only to users that exist in your GSuite or Cloud Identity group/s.
Viewer¶
Permission for read-only actions that can not affect state, such as viewing (but not modifying) existing resources or data.
Editor¶
All viewer permissions & permissions for actions that modify states, such as changing existing resources.
Owner¶
All editor permissions & permissions for the following actions:
- Manage roles and permissions for a project and all resources within the project.
- Set up billing for a project.
Browser (still in beta)¶
Read access to browse the hierarchy for a project, including the folder, organization, and Cloud IAM policies. This role doesn’t include permission to view resources in the project.
Service Accounts¶
Typically we think of identities as belonging to users, that is a person. Sometimes we assign apps or VMs identities to utilise the same IAM system to determine what has access, rather than who.
A service account can be created and then given access permissions. Because they are linked to a what, such as a VM, they may be considered as assisting a resource. On the other hand they may be as abstracted as providing a user access to a database via a service account that is associated with an app – in this instance it is behaving like IAM acting for a person.
You may create up to 100 user-defined service accounts.
Service accounts are often created in the background. For example, if you create an App Engine app, then it is assigned a service account to control what it has access to. This service account will be assigned the editor roles for the project in which it is active.
So, same as a user, right?
Service accounts do not have passwords, so authentication can not take the same path as a user.
will generate a JSON key file for that service account. By providing the key, services can interact with secure systems inside and outside of the GCP.
A service account can be provided with keys for authentication when it is set up.
When a JSON key {credentials.json} is generated it can be uploaded into the Cloud Shell environment.
The following applies the key and authenticates the account:
gcloud auth activate-service-account --key-file credentials.json
Using Service Accounts¶
Create a service account from IAM & Admin:
- name
- identifier
- description
- assign roles
- assign the account to an instance (from CE> stopped VM)
Link a service account at creation
CLI IAM
As with the other functions, cloud shell supports CLI control of service accounts:
gcloud iam service-accounts create \
test-service-account2 \
--display-name "test-service-account2"
Of course, a service account is not much use unless it has permission to do something at least!
gcloud projects add-iam-policy-binding {GOOGLE_CLOUD_PROJECT} --member \
serviceAccount:test-service-account2@{GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com \
--role roles/viewer
Service accounts provide multiple functions, such as:
- enabling authentication between different components of GCP’s services
- Providing users with service account permissions
- Restricting what actions a resource (e.g. a VM) can do
Will let you recreate settings from say Development to Staging.
Scopes¶
A scope allows a permission to be granted to a VM to perform an operation managed by the GCP API methods. Scopes can be only modified when using Compute Engine’s default service account for the VM, because it is the service account that is assigned the access rights.
The scope is specified with a URL. Need a VM with rights to view data in Cloud Storage?:
If a conflict occurs between IAM and a scope then the most restrictive policy applies, e.g. let’s say the IAM is read only, but the scope for a bucket is write:
Then the VM will Not be able to write.
best practice for service accounts
Grant an instance full access to all the GCP APIs https://www.googleapis.com/auth/cloud-platform scope. Then set the service account’s IAM permissions, in this way the service account can only execute API methods that are allowed by both the access scope and the service account’s specific IAM roles.
Using Scopes¶
To alter scopes, the VM instance must be stopped. Edit the instance and an “Access Scopes” option is available. NB you can select “Allow Full Access” if you have IAM rules that limit what the instance can do.
Billing Accounts¶
These are associated with a Project, allowing an organisation to separate the financials for different activities.
Manage Billing Accounts
There are 2 types:
- Invoiced
- Self-serve (credit card)
IAM, of course, controls who may do what where, and so there are various pre-defined roles that entities who require access may be assigned:
- Billing Account Creator
- Billing Account Admin
- Billing Account User
- Billing Account Viewer
The super user will require account creation rights, whilst the accountant may require user and viewer roles.
Alerts¶
To change a billing account you must be:
- an owner of the project
- billing administrator on that account
Setup Alerts
There are 3 default alert positions for a budget:
- 50%
- 90%
- 100%
These may be amended.
Alerts may be by email or programatically through Pub/Sub
Export Billing Data
Data may be exported to BigQuery or Cloud Storage. This is managed through the Billing export wizard, with cloud storage called “File Export”, with .csv or JSON outputs available.
- Set the zone you want to work in:
gcloud config set compute/zone us-central1-a
Managing IAM roles¶
- Members
- You can view settings and filter by user. Primitive and predefined roles will be listed.
- Roles
- Or you can view members of IAM roles by role
Will return details of the policies set.
To add roles> IAM> Add. This provides a form:
- New Members > specify name of user or group
- Add roles from list
To see details of the role use the form or the CLI:
Setting IAM from the CLI
Auditing IAM roles¶
To simplify audits the console provides filters. For example, should you need to see which users were granted IAM roles for Cloud Functions you can filter the admin activity logs for Cloud Functions IAM roles.
Custom IAM Roles¶
The pre-built launch stages are alpha> beta> general availability, and disabled.
Add permissions lets you do just that, however, not all pre-defined permissions are available for inclusion in a custom role.
Useful Snippets¶
Always good to have a grasp of exactly what project you are using. The console does this in billing, or the CLI: