# 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](https://support.google.com/chrome/a/?p=policy_order)
that talks about Chrome policy and its deployment.
## 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.
**To read more about best practices for shipping enterprise friendly features
read [this article](https://www.chromium.org/developers/enterprise-changes/).**
**To learn more about policy implementation details, please read [add_new_policy.md](./add_new_policy.md)**.
And if you are not sure, don’t hesitate to contact the [Chrome enterprise team](mailto:[email protected])).
## 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](https://chromeenterprise.google/policies/#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](https://chromeenterprise.google/policies/#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](https://cs.chromium.org/chromium/src/components/policy/resources/templates/policy_definitions/)
which contains all metadata of a policy.
#### Name
Policy name is a short phrase that briefly describes what the policy does.
* 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 codewords. Policy names are public information. Make sure
keywords can be searched and understood by external people.
Searching for a similar pattern from existing [policies list](https://chromeenterprise.google/policies/)
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](https://chromeenterprise.google/policies/#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](https://chromeenterprise.google/policies/#CloudReportingEnabled)
##### Enum
A policy type provides more than 3 states for the admin to choose from.
Example: [BrowserSignin](https://chromeenterprise.google/policies/#BrowserSignin)
If multiple options can be chosen at the same time, use string-enum-list type.
Example: [ExtensionAllowedTypes](https://chromeenterprise.google/policies/#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](https://chromeenterprise.google/policies/#CloudReportingUploadFrequency)
and [DiskCacheSize](https://chromeenterprise.google/policies/#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](https://chromeenterprise.google/policies/#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](https://chromeenterprise.google/policies/#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](https://chromeenterprise.google/policies/#URLBlocklist),
[ExtensionInstallAllowlist](https://chromeenterprise.google/policies/#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](https://chromeenterprise.google/policies/url-patterns/)
for content settings
* [URLBlocklist](https://support.google.com/chrome/a?p=url_blocklist_filter_format)
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](https://chromeenterprise.google/policies/#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](https://chromeenterprise.google/policies/#MetricsReportingEnabled)
vs [DeviceMetricsReportingEnabled](https://chromeenterprise.google/policies/#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](https://docs.google.com/document/d/1QgDTWISgOE8DVwQSSz8x5oKrI3O_qAvOmPryE5DQPcw/edit#heading=h.py10m8dh4kvv)
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](https://source.chromium.org/chromium/chromium/src/+/main:components/policy/resources/new_policy_templates/.group.details.yaml)
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.