How to design an enterprise policy

Summary

Chrome exposes a different set of configurations to administrators. These configurations are called policies and they give administrators more advanced controls than the standard users. With different device management tools, an administrator can deliver these policies to many users. Here is the help center article that talks about Chrome policy and its deployment.

This doc focus on how to design a new policy. More details about policy development can be found in the Chromium doc.

Do I need a policy

Not every single Chrome update needs to be guarded with a policy. In some cases, enterprise users can accept new features just like consumer users. However, consider adding new policy if

  • Your feature will break an existing CUJ (Critical User Journey).
  • Your feature will introduce changes in some critical areas like security, networking.
  • Your feature can be configured by end users.
  • Your feature has compliance requirements, e.g. upload data to Google owned servers.
  • You are removing an existing feature from Chrome.

And if you are not sure, don’t hesitate to contact the Chrome enterprise team).

Design a new policy

Before Starting

Similar to the switches on the chrome://settings page, enterprise policies are designed to provide options to our users to customize Chrome’s behaviors.

In some cases, a simple kill switch is a good starting point. It allows admins to force a feature they really need or block one that they can’t have due to privacy or security concerns. However, a boolean won’t always provide enough flexibility and may turn enterprise users away. In other words, providing granular control would be a better approach here. It allows enterprise users access to a feature while administrators can still meet all compatibility requirements. Sometimes, a policy can even be used to provide an enhanced version of the feature to enterprise users.

For example, ExtensionSettings allows admins to block extensions based on their permissions or update URLs while still giving users the ability to install extensions that they like and admins are comfortable with.

Another example is BrowserSignin policy which provides an additional force-sign-in feature which is not available for consumer users.

Think about CUJ(Critical User Journey), collect information to understand how administrators and enterprise users will use this feature. They can help you to design a policy.

Define a policy

Each Chrome policy must be defined in the Chromium code base which contains all metadata of a policy.

Name

Policy name is a short phrase that briefly describes what the policy does.

  • Choose a name that is consistent with the existing naming scheme. Prefer “XxxEnabled” over “EnableXxx” because the former is more glanceable and sorts better.
  • Do NOT use negative words like Disabled or Disallowed. It will lead to double negatives and confuse people. Instead, prefer a policy name like FooEnabled (which can be set to false in cases where a feature should be disabled).
  • Avoid long policy names. Policy names don't have to cover everything. There is a documentation section for all the details.
  • Avoid internal keywords and project names. Policy names are public information. Make sure keywords can be searched and understood by external people.
  • Consider the foreseeable future and try to avoid conflicts with possible future extensions or use cases.
  • If the policy name has an acronym, only the first letter should be upper camel case. For example, you should use “Api” and not “API”.

Searching for a similar pattern from existing policies list is always a good strategy to find a good name. However, be careful about some ancient policies that were added a long time ago. We may already abandon those naming patterns, but keep the policies only because of backward compatibility. For example, SyncDisabled was added in Chrome 8, but we keep its name even though Disabled is banned.

Type

There are 6 major types of policies, listed below.

Boolean

This is the simplest policy type that defines 3 states: enabled, disabled and not set. Not-set should have the same behavior as consumer users.

Example: CloudReportingEnabled

Enum

A policy type provides more than 3 states for the admin to choose from.

Example: BrowserSignin

If multiple options can be chosen at the same time, use string-enum-list type.

Example: ExtensionAllowedTypes

Integer

A policy that accepts any integer as input. It can be used to define a period of time or size of a folder. The integer can't be negative and must be less than 2^32.

In most cases, there are two things to consider.

  • Choose a proper interval.
  • Choose a proper unit.

Unit:

The enterprise team used to use the minimum unit for policy to give enterprise more flexibility. However, that may require admin to put an unnecessary large number for certain policies which is error-prone.

Now we ask people to choose more proper units. For example, instead of milliseconds, hours may be a better choice, if most people won’t care about the differences between 1 hour and 59 minutes.

Example: CloudReportingUploadFrequency and DiskCacheSize

String

A policy that accepts any string as input.

Starting from this type, admin can put anything as policy input and error handling become more important.

  • If a policy input is partially invalid, can we still process the good part?
  • Presenting good error messages to help admins fix the issues.

Note that setting an empty string must be treated as not setting the policy due to the limitation of policy delivery mechanisms on some platforms.

Example HomepageLocation

List

A policy that accepts a list of strings as input.

Similar to string policy

  • Empty list must be treated as not set.
  • User input validation needs to be handled properly.

In addition to that, depending on the policy implementation, setting a limitation is necessary when having too many list entries could cause performance issues. As an example, URLBlocklist policy only accepts 1000 URLs because we need to scan the list for every navigation request.

However, sometimes admins may want to set values more than what we can afford. In those cases, we will need to redesign the input format. For example, supporting wildcard characters is a common solution.

Example: URLBlocklist, ExtensionInstallAllowlist

URL list

URL list is a common format of list policy. It allows admins to apply policy only to certain websites or URLs.

Other than normal list policy, a few more considerations:

  • In many cases, URL matching is not necessary. Domain or hostname matching may be good enough and much easier to maintain.
  • Choose URL matching algorithm:
    • Exact match
    • Content settings for content settings
    • URLBlocklist style with basic wildcard support.
    • Define your own. Avoid this option if possible. If you have to, make sure all edge cases are addressed.
Allowlist vs Blocklist

Another common format of list policies. It allows the admin to set exceptions for certain situations. Usually, we can create them as:

  • A standalone allowlist/blocklist policy.
  • An on/off boolean policy as default option with another allowlist/blocklist policy as exception.
  • Allowlist and blocklist policies pair.

If more than one policy is defined for the same feature, please find a proper solution to resolve the conflict cases.

Dictionary

A policy that accepts a complex structure as input. Depending on the platforms, it could be a JSON string or XML files.

This is the most powerful and complicated policy format. A complicated dictionary policy may be hard for admins to understand and maintain. In many cases, splitting a dictionary configuration into multiple simple policies is a better approach.

Same as String and List policy, an empty dictionary must be treated as not setting the policy.

Also, a complicated dictionary policy may also contain conflict configurations. Make sure those cases are handled properly.

Example: ExtensionSettings

Default Value

The default value defines Chrome’s behavior when policy is not set.

Supported Platforms

Always support as many platforms as possible. And unless there are good reasons, please launch a policy on all platforms at the same time.

Feature

  • Dynamic refresh - When set to true, modifying the policy does not require relaunching the browser. Support this feature whenever possible.
  • Per profile - When set to true, policy value can be applied to only one particular profile. Support this feature whenever possible.
  • Hidden policies - In some cases, you would like to hide the policies from most admins. There is no perfect solution as admins can always check the source code of Chromium. But we still can hide a policy as much as we can. Talk with the Enterprise team for more details.
  • Recommended vs mandatory - Recommended policies mean the admin only sets the initial value of the policy, but allows users to modify them later. Most policies are mandatory only, but having a recommended support is encouraged. However, make sure the user can actually modify that settings. (e.g. Having a UI or an extension API)
  • Device policy - A special policy that controls ChromeOS hardware or sign in page. If a policy needs to control both browser and ChromeOS device, split it into two policies. For example, MetricsReportingEnabled vs DeviceMetricsReportingEnabled. Device policies’ name always begin with the “Device” prefix.

More Policy Details

Chrome UI

If a setting is controlled by policy and UI at the same time, please make sure the UI is disabled when the policy is set with a proper message or UI element which tells end users that the option is controlled by their administrator.

Alert: There might be multiple UI entries, make sure all of them are covered.

Admin Console UI

Most of the time, there is no need to worry about the admin console UI. However, cover this section if your policy is complicated. Talk with the server team for more details. (Internal link, Googlers only)

A group of policies

If multiple policies are added at the same time or there are existing policies for the same feature, make sure all those policies won’t break each other.

  • One policy may provide conflicting settings with another one.
  • One policy may have different behavior depending on another one.

Also, if multiple policies are created for the same topic, creating a new policy group can help admins find all related policies.

Migrating existing policies

In some cases, we would like to replace one policy with a more powerful one. The old policy will be deprecated in this case. However, for the sake of backward compatibility, we still need to support the old one.

On the other hand, it’s always nice to think about future expansion when designing a policy. For example, if there is a chance we want to add more options to a policy, then enum type will be better than boolean.

Privacy & Security

Policy is a very powerful configuration tool that may bring additional security and privacy concerns. Talk with the Chrome privacy and Chrome security ahead of time if there is any concern.

Security

Will bad actors be interested in your policy? The Enterprise team can provide additional management checks for the policy by marking it sensitive. But it may block admins from small companies which didn’t pay for expensive management systems. In other cases, limiting the ability of policy may also help.

Privacy

We would like to protect end users’ privacy as much as we can while fulfilling admins’ requests. Another area that may need careful balance.

Launch Policy

One major difference between policy launching and other features is that rollout control via experimental is not always an option. Majority of admins want their policies settings to apply to all devices they control.

Usually, policy must be ready and launched before the feature it controls rolls out.

In other cases, we can use trusted testers to test the policies for a small number of enterprise customers first. Talk with the Enterprise team for more details.