This episode covers Access Control Lists: controlling who can access what resources through the ACL file in the admin console, allow and deny rules, a basic policy example, and the use of tags and groups for managed policies.

Up to episode 5, every node in the tailnet could reach every other. That's convenient for experimenting, but dangerous for production. Imagine your home NAS suddenly accessible from a coworker's laptop just because they're on the same tailnet. This is the problem solved by ACLs (Access Control Lists).
Episode 6 covers Tailscale's core security system: the ACL file in the admin console, the concept of allow rules, the default-deny principle, plus tags and groups for building managed policies. After this episode, you'll be able to design a secure tailnet from the start.
An ACL in Tailscale is a HuJSON file (JSON with comments) managed in the admin console under Access Controls. This file determines who can access what — packets, ports, and features. The most basic rule has the form src → dst:
{
"acls": [
{ "action": "accept",
"src": ["*"],
"dst": ["*:*"] }
]
}The rule above allows every user to access every node on every port. This is the default when a new tailnet is created.
Tailscale doesn't allow anything unless the ACL explicitly states it. So the ACL file is a list of exceptions to default deny. Every rule has three parts:
accept to allow.{
"acls": [
{ "action": "accept",
"src": ["user1@example.com"],
"dst": ["server-prod:22"] }
]
}The rule src: user1@example.com, dst: server-prod:22 allows only that user to access port 22 of the server-prod node.
For automated devices (servers, CI, containers), user-based login doesn't fit — devices don't have human accounts. Tags move authorization from users to device categories. Tags always start with tag: and are managed by admins in the ACL file.
sudo tailscale up --advertise-tags=tag:serverThe sudo tailscale up --advertise-tags=tag:server command requests the tag:server tag from the admin. Tag approval is controlled by the tagOwners block in the ACL.
Only admins can grant tags. The tagOwners rule determines who is allowed to assign a specific tag:
{
"tagOwners": {
"tag:server": ["group:devops"],
"tag:workstation": ["user1@example.com"]
},
"acls": [
{ "action": "accept",
"src": ["tag:server"],
"dst": ["tag:workstation:22"] }
]
}In the block above, tag:server can only be assigned by members of group:devops, and all nodes tagged server may access port 22 of nodes tagged workstation.
Besides tags, ACLs can use groups — a set of users from an identity provider (Google Workspace, Entra ID, GitHub). For example, group:engineering uses the provider's definition rather than a manual list. This keeps policies consistent with your organization.
{
"acls": [
{ "action": "accept",
"src": ["group:devops"],
"dst": ["tag:server:*"] },
{ "action": "accept",
"src": ["user1@example.com"],
"dst": ["nas-home:22,80,443"] }
],
"ssh": [
{ "action": "accept",
"src": ["group:devops"],
"dst": ["tag:server"],
"users": ["autogroup:nonroot", "root"] }
]
}Notice the details:
src: ["group:devops"], dst: ["tag:server:*"] gives all devops members full access to all server nodes.ssh block sets Tailscale SSH policy separately — we cover it in episode 7.Every ACL change takes effect immediately. Always save and test from both sides: run tailscale ping from a source node to a destination node, and make sure nodes that aren't allowed are actually denied. Check the effect quickly with:
tailscale ping nas-home
tailscale status*:*, for sensitive services.Episode 6 introduced Tailscale's first and most important security layer: ACLs. You can control who accesses what, use tags for automated devices, groups for humans, and assemble managed policies.
Key takeaways:
tag:server) are for automated devices, managed via tagOwners.In the next episode, episode 7, we'll cover Tailscale SSH — enabling tailnet-identity-based SSH with tailscale up --ssh and tailscale ssh <host>, eliminating password and SSH key management, and configuring per-user and per-group SSH access through the ssh block in the ACL.