前言廢話
在 前篇文章 我們介紹了 Tailscale 的新手入門,應該對這個東西稍微有了一定的了解。但你可曾想過,當你把一堆你的裝置加入 Tailscale 上,方便是方便了,但是會不會出現一些資安的問題?
舉例來說,你在你的電腦上安裝了他,也在你的虛擬機上安裝了他。但是你的虛擬機上出現了一些病毒,有沒有可能藉由 Tailscale 被傳送到你的電腦上?又或者是,你在 Tailscale 上分享裝置給他人,但你無從得知他人的電腦狀況,甚至有意攻擊你?
這個時候,Tailscale 的 ACL 就能派上用場啦!沒錯,就是那個你在很多路由器看到甚至是 PaaS 平台上的功能。ACL 可以控制每個裝置能連到的地方,甚至是 Port。當你理解了 ACL,你就可以很簡單的解決上述我舉例出來的問題!
簡易介紹
在 Tailscale 的控制介面中,你可以點選上面的 Access controls
,他就是 ACL,打開可以看到這樣的畫面。
基本上他就是類似一個 JSON 格式,這裡 有官方的介紹。其中包含了幾種欄位,這邊我介紹幾種比較常用到的。
groups
定義一個群組的用戶,你可以在每個組別加入很多使用者,這樣之後再寫 ACL 的時候,就不用重複再寫這麼多用戶了。
{
"groups": {
"group:example": ["[email protected]", "[email protected]"],
}
}
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": "[email protected]",
"accept": ["tag:example"],
"deny": ["100.101.102.103:443"],
},
],
}
上手實作
說了這麼多,我們就來動手做吧。我們先來假設一個環境,並把他實作出來。
先說:實現方式有很多種,沒有什麼標準答案,這篇僅簡易的讓人理解運作方式而已。
模擬環境
我們有三台主機 pc1
、proxy1
及 server1
,分別做以下的事情。
主機 | 用途 |
---|---|
pc1 | 筆者自己用的電腦,要允許連到任何地方。 |
proxy1 | 代理伺服器,只能碰到 server1 的 Port 80 ,不允許碰到其他地方。 |
server1 | 主要伺服器,他只能被連線,不能碰到任何地方。 |
新增 Tag 標籤
我們到 ACL 的 tagOwners
中,新增以下內容。
{
"tagOwners": {
"tag:server": ["cre0809@github"],
"tag:proxy": ["cre0809@github"],
}
}
回到 Machines 中,我們就可以點選後面的三個點,選擇 Edit ACL Tags
,他將會打開一個介面。
我們為 proxy1
及 server1
分別添加專屬於他們的 Tag 標籤。
定義 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 到 server1
及 proxy1
。
再來是 proxy1
這台主機,我可以成功訪問 server1
的網頁(Port 80),也可以 Ping 到 server1
,但沒辦法 Ping 到筆者的電腦 pc1
。
最後是 server1
,他沒辦法 Ping 到任何裝置。
這就是這次模擬的成果啦!
結語
這就是這次簡易的介紹 Tailscale ACL 的強大功能,這也是為什麼我正在將很多的設備都從傳統的 Wireguard 轉向 Tailscale,因為實在太好用了。
而下一篇文章會教如何架設一個自己的 Tailscale,將會使用開源的 headscale 哦!