Tailscale 的 ACL 簡易指南

前言廢話

前篇文章 我們介紹了 Tailscale 的新手入門,應該對這個東西稍微有了一定的了解。但你可曾想過,當你把一堆你的裝置加入 Tailscale 上,方便是方便了,但是會不會出現一些資安的問題?

舉例來說,你在你的電腦上安裝了他,也在你的虛擬機上安裝了他。但是你的虛擬機上出現了一些病毒,有沒有可能藉由 Tailscale 被傳送到你的電腦上?又或者是,你在 Tailscale 上分享裝置給他人,但你無從得知他人的電腦狀況,甚至有意攻擊你?

這個時候,Tailscale 的 ACL 就能派上用場啦!沒錯,就是那個你在很多路由器看到甚至是 PaaS 平台上的功能。ACL 可以控制每個裝置能連到的地方,甚至是 Port。當你理解了 ACL,你就可以很簡單的解決上述我舉例出來的問題!

簡易介紹

在 Tailscale 的控制介面中,你可以點選上面的 Access controls,他就是 ACL,打開可以看到這樣的畫面。

001.jpg

基本上他就是類似一個 JSON 格式,這裡 有官方的介紹。其中包含了幾種欄位,這邊我介紹幾種比較常用到的。

groups

定義一個群組的用戶,你可以在每個組別加入很多使用者,這樣之後再寫 ACL 的時候,就不用重複再寫這麼多用戶了。

{
  "groups": {
      "group:example": ["alice@example.com", "bob@example.com"],
  }
}

hosts

一個簡易取代 IP 位址的方式。例如在此範例中我們定義了 test1 等於 100.100.100.1,之後我們在配置 ACL 時,就可以直接使用 test1 就好,而無須輸入整段 IP 位址,那樣很累。

{
    "hosts": {
        "test1": "100.100.100.1",
        "test2": "100.100.100.2",
    },
}

tagOwners

他就是標籤,我們可以在這邊定義這個標籤是屬於哪個用戶擁有的。之後配發權限以及配置 ACL 就會更加容易。

{
    "tagOwners": {
        "tag:example": ["autogroup:admin"],
    }
}

acls

這裡就是整個 ACL 最重要的段落。他可以控制特定用戶只能連向哪裡。在你還沒更改 acls 內容之前,他會直接添加下面範例的內容,這句話就是指 允許任何人連往任何地方

注意:Tailscale 是白名單機制,他預設不允許任何人連往任何地方的,因此只需要在此段落添加允許清單。

{    
    "acls": [
        {"action": "accept", "src": [""], "dst": [":*"]},
    ],
}

ssh

Tailscale 有內建他自己的 SSH,他可以在這邊設定訪問權限。更多有關於 Tailscale SSH 的用途,請參考 這裡。但我是沒在使用啦哈哈,所以我是拿掉的。

{
    "ssh": [
        {
            "action": "check",
            "src":    ["autogroup:members"],
            "dst":    ["autogroup:self"],
            "users":  ["autogroup:nonroot", "root"],
        },
    ],
}

tests

tests 是用來檢查錯誤用的,他將每次都會執行。你可以在此定義一些規則,例如:誰可以連往這台主機。那當你在上方的其他欄位不小心設定的錯誤的權限,導致不是你預期的結果,那他就會告訴你你設定有誤。

{
    "tests": [
        {
            "src": "alice@example.com",
            "accept": ["tag:example"],
            "deny": ["100.101.102.103:443"],
        },
    ],
}

上手實作

說了這麼多,我們就來動手做吧。我們先來假設一個環境,並把他實作出來。

先說:實現方式有很多種,沒有什麼標準答案,這篇僅簡易的讓人理解運作方式而已。

模擬環境

我們有三台主機 pc1proxy1server1,分別做以下的事情。

主機 用途
pc1 筆者自己用的電腦,要允許連到任何地方。
proxy1 代理伺服器,只能碰到 server1Port 80,不允許碰到其他地方。
server1 主要伺服器,他只能被連線,不能碰到任何地方。

新增 Tag 標籤

我們到 ACL 的 tagOwners 中,新增以下內容。

{
    "tagOwners": {
        "tag:server": ["cre0809@github"],
        "tag:proxy": ["cre0809@github"],
    }
}

回到 Machines 中,我們就可以點選後面的三個點,選擇 Edit ACL Tags,他將會打開一個介面。

002.jpg

我們為 proxy1server1 分別添加專屬於他們的 Tag 標籤。

003.jpg

定義 Hosts 區塊

為了讓待會 acls 區塊的可讀性更高,我們先定義 hosts,分別將主機的名稱以及對應的 IP 位址填入 hosts 區塊中。

{
    "hosts": {
        "pc1"     : "100.68.36.13",
        "proxy1"  : "100.71.116.59",
        "server1" : "100.73.176.127",
    },
}

新增 Acls 規則

接著新增最重要的 Acls 規則。

{
    "acls": [
        // 允許 pc1 連往任何地方
        {
            "action": "accept",
            "src":    ["pc1"],
            "dst":    ["*:*"],
        },
        // 允許 tag:proxy 的主機 連往 server1 的 Port 80
        {
            "action": "accept",
            "src":    ["tag:proxy"],
            "dst":    ["server1:80"],
        },
    ],
}

驗收成果

以上大概就是 ACL 的設定過程,現在我們就來看看結果吧!

首先是筆者的電腦,我可以訪問 server1 的網頁,也可以 Ping 到 server1proxy1

004.jpg

再來是 proxy1 這台主機,我可以成功訪問 server1 的網頁(Port 80),也可以 Ping 到 server1,但沒辦法 Ping 到筆者的電腦 pc1

005.jpg

最後是 server1,他沒辦法 Ping 到任何裝置。

006.jpg

這就是這次模擬的成果啦!

結語

這就是這次簡易的介紹 Tailscale ACL 的強大功能,這也是為什麼我正在將很多的設備都從傳統的 Wireguard 轉向 Tailscale,因為實在太好用了。

而下一篇文章會教如何架設一個自己的 Tailscale,將會使用開源的 headscale 哦!