tailscaleで管理者とユーザーを分離する

ラズパイ5のluantiサーバーの管理者とユーザーは少なくとも別のメールアカウントにしないと、サーバー含めた管理者エリアへのアクセスができてしまうので現実運用に即した多少のアップデート

つまり管理者エリアとユーザエリアはメールアカウントを別にして、ユーザアカウントの管理画面には最悪アクセスできても管理者エリアの管理画面へのアクセスは禁止する設定

ユーザデバイスは以下のuser@gmail.com(仮想のアドレスです)の配下に登録、管理者デバイスはadmin@gmail.comの配下に登録します

	"groups": {
		"group:admin":   ["admin@gmail.com"],
		"group:players": ["admin@gmail.com", "user@gmail.com"],
	},
	// Define the tags which can be applied to devices and by which users.
	// "tagOwners": {
	//  	"tag:example": ["autogroup:admin"],
	// },
	"tagOwners": {
		"tag:luanti-server": ["group:admin"],
	},
	// Define grants that govern access for users, groups, autogroups, tags,
	// Tailscale IP addresses, and subnet ranges.

	"acls": [
		{
			"action": "accept",
			"src":    ["group:players"],
			"dst": [
				"tag:luanti-server:30000-30010",
				"tag:luanti-server:22",
        "tag:luanti-server:5900",
				"tag:luanti-server:5901",
			],
		},
	],

user@gmail.com側のドメインではACL設定はできないので、user@gmail.com側の相互ユーザ分離はできないですが、それは通常のWi-Fi環境下と大差はないだろうから現実的運用では、管理者エリアとユーザエリアを分離だけでも相当にセキュアだろうと思う

P.S. 2026/2/21

"tag:luanti-server:5900",
"tag:luanti-server:5901",

5900 portも通過許容に変更、そうしないとVNCがtailscale経由では通らない

 

admin

 

tailscaleのセキュリティ設定

tailscale自体はtailnet以外からのアクセスに対しては強固ですが、前の記事で述べた通りいくつか考慮すべきポイントがあります

その中でもクライアント同士(特にユーザクライアントから管理クライアント)でアクセスできてしまうというのは避けなければいけない項目でしょう

そのための設定がACLです、tailscaleの管理画面で、”Access controls”のjsonファイルに以下のように書き込んで、クライアントからサーバーへのアクセスだけ許可します、ここで許可した以外は全部deny扱いなのでクライアント間は完全分離です

	"groups": {
		"group:admin":   ["user@gmail.com"],
		"group:players": ["user@gmail.com"],
	},
	// Define the tags which can be applied to devices and by which users.
	// "tagOwners": {
	//  	"tag:example": ["autogroup:admin"],
	// },
	"tagOwners": {
		"tag:luanti-server": ["group:admin"],
	},
	// Define grants that govern access for users, groups, autogroups, tags,
	// Tailscale IP addresses, and subnet ranges.
	"acls": [
		{
			"action": "accept",
			"src":    ["group:players"],
			"dst": [
				"tag:luanti-server:30000-30010",
				"tag:luanti-server:22",
				"tag:luanti-server:5901",
			],
		},
	],

jsonファイルを編集してセーブすると、Machinesの選択メニューでEdit ACL tagsが現れて、これを選択するとデバイスにタグ付できます

タグ付すると、

のようにmachinesのデバイス名の下にtag表示されるようになりますから、このタグがACL設定の"tag:luanti-server": ["group:admin"]と合致してアクセス(フロー)制御が実行できます

ラズパイ5のufw設定(使うポートだけ許可する)と、unattended-upgradesを使った自動セキュリティアップデートも追加しておきます

tailscaleのfree版だとアクセスの権限制限設定できないけれども、身内の運用ならばあえて管理画面のことは伝えずに運用だね

 

admin

Luantiの遠隔サーバー化

ラズパイ5なら軽量なLuantiサーバーなら動かせるのですが、リモートでどうやるかだったのですが、VPNを使えば良いと

ラズパイ5(Luanti service)- VPN ~~~~~~~ VPN – client

<VPN : tailscale>

VPNは今は第二世代とでもいうべき時代で、WireGuardと言われる最新のVPNプロトコルを使った無償で使えるVPN製品(カーネル空間動作で高速、軽量、最新の暗号化技術でセキュア)が注目で中でもtailscaleは広く使われているようです

特徴は中央集権型のサービスで、アカウントログオンしてクラウド側にデバイスを登録すると、登録したデバイス間でセキュアな通信が確保され、さらにMagicDNSという仕組みでそれぞれの登録デバイスにDNS情報が転送されるので、その情報を使って登録デバイス間の接続にはIPアドレスの意識さえ不要という優れもの

# tailscale起動、以下のコマンドでログイン画面のURLが出てくるからブラウザログイン
$ sudo tailscale up

# 以降の起動時には自動起動するように、以下を実行する
$ sudo systemctl enable minetest-server

# IPアドレスラズパイ側の確認(Magic DNS使うからIPアドレスを触る必要はない)
$ tailscale ip -4
100.83.206.1

% tailscale status

100.88.161.30  macbookpro  login_account@  macOS  -
100.83.206.1   rasp5       login_account@  linux  -

クライアントにはtailscaleのサイトからプラットフォーム対応のpkgを引っ張ってきてインストールして、起動時に同時にラズパイログオンアカウントと同じアカウントでログインすればマシンが追加されます、その後に例えばsshならば、

$ ssh usr@rasp5

でログオンできます、rasp5はMagic DNSの登録名です

Luantiならば、

こんな感じでアクセス

公開にあたってのセキュリティ運用対応、VPNそのものは信頼度高いのでtailscaleのログイン情報の保護に尽きる

1. 管理者アカウントを1個に固定

→ 「新しい端末を追加できるのは管理者だけ」

2. デバイス承認をON(超重要)

管理画面 → Settings → Device approval

これONにすると:

新しい端末がログインしても
管理者が承認しないと通信不可

3. キーは使わない(人力ログインのみ)

Tailscale自体は:

パスワードを持たない設計

全部:
Google / GitHub / Microsoft
の認証に丸投げ。

4. 不要端末の自動削除

Settings → Key Expiry

180日(default)に設定。

5. Subnet / Exit Node は使わない

デフォルトはOFFになってる

6. デフォルトユーザーpiのパスワードは安全性の高いものに安全性の高いものに変える

 

<Debain版のLunatic serverのインストール>

snap版では不都合あったので、ヘッドレス版(Debian公式の minetest-server デーモン)を入れる

% sudo apt install minetest-server

# サービスの自動起動enableと一時的な起動
% sudo systemctl enable minetest-server
% sudo systemctl start minetest-server

 

<ユーザーの追加と別ワールドの作成>

・指針:ユーザーは当然限定アクセスだけでroot権限は与えない

・ワールド:プレイ用の30000(dafult)ポート以外に編集や個人用のワールドは例えば30001ポートで起動するようにして環境は分離する

・手順:ユーザーluanti1を作ってサーバー起動

$ sudo adduser luanti1
$ su - luanti1

$ mkdir -p ~/.minetest/worlds/test		// 編集用のdirectory(test)を作る
$ /usr/lib/minetest/minetestserver   --world ~/.minetest/worlds/luanti1   --port 30001   --quiet   --logfile ""

複数のlunatiサーバー立ち上げても、元が軽量だからラズパイ5では今のところ余裕です

 

admin

Open WebUIでRAG化してみた

VS codeのCursorからRAG機能の呼び出しうまくいかなかったので、Open WebUIから呼び出しているollamaで動作するLocal LLMにRAG機能を追加してみた

Open WebUIを使えば完全にノーコードでRAG機能が追加できます、でも無論ハルシネーションもでるだろうけど、数年前の知識しかないLocal LLMから見れば大きな進歩だろうと思う

実はOpen WebUIには、ベクターDBもWebクローラー機能(実は内部ではfirecrawlとパイプラインでつながってるとのこと)も実装されてるから実現できるわけですが、チームでの使用とかには荷が重いと思いますが個人で使うならこれで当面は間に合うんじゃないかと思う

以下のイメージはチャットモードで作成済みのLocal LLM qwen2.5-coder:14B + RAGのモデル(Qwen2.5)がモデル選択メニューから見えてるとこ

 

で、このモデルの作り方は、ワークスペースを選択するとこの画面(モデル名はQwenにリネーム前)になります、今現在入力しているのは「モデル」と「ナレッジベース」だけ、プロンプトとツールは必要になった時点で追加します、モデルそのものは画面右上のNew Modelボタンを押して作成します

これはすでに作成したナレッジベースですが、

ナレッジの追加は、コレクションの追加メニューで右上の+ボタンを押すと種々の方法で追加できます、ここではwebpageから内部的にはおそらくmarkdown形式で取り込まれてます、これらはgithubから取り込んだmarkdownファイルですね

チャット画面で、投げたプロンプトに対して、回答の下部に(1 Source)というのが参考にされたナレッジになります

その部分の拡大は、以下のとおりでmarkdownからの抽出になってますね

しばらくはこの環境でパーソナルエージェント的な使い方をやってみます、違うエージェントが必要になればその時はモデル追加すれば良い、自分が持っているいろんなファイルをぶち込んでしまいたいと思う

P.S. 2026/2/10

Local LLMも分野特化してきていて、例えばqwen2.5-coder:14Bは英語は全くダメ、qwen2.5:14Bはちゃんと使えるから、用途ごとに専門家用意しとく感覚だね

 

admin

ollamaのモデルを変えてみた

昨日はとりあえずのcodeサポート用のモデルを入れてみたけど、結構重量級だったので同等性能でも負荷が軽いモデルに、同時に編集時のtab補完してくれる軽量モデルを設定してみた

% ollama list
NAME                 ID              SIZE      MODIFIED
qwen2.5-coder:14B    9ec8897f747e    9.0 GB    28 minutes ago
qwen2.5-coder:7b     dae161e27b0e    4.7 GB    44 minutes ago

Continueのconfig.jsonファイルの設定

tabAutocompleteModel:このブロックがタブ補完時のLLM指定

{
  "models":[
   {
      "title": "Main Coder (14B)",
      "provider": "ollama",
      "model": "qwen2.5-coder:14b"
     }
    ],
  "tabAutocompleteModel": {
    "title": "Tab Autocomplete",
    "provider": "ollama",
    "model": "qwen2.5-coder:7b"
  }
}

qwen2.5-coder:14b:メモリ使用量がmaxでも24GB程度で収まるようになったので、こちらにしよう

しかしLocal LLMは特にプログラム言語系の変化の早い領域ではRAG使うようにしないと実質的には使えないね、次はRAG使えるようにしよう

-> 2026/2/3:やってみたけどできなかった(@rag search “hello”が通らない)、まだ流動的なところが多そうだからしばしサスペンド

 

admin

ContinueでVScodeのA.I補完

VScodeでcopilotというは安定してるけど、無償だと限度があるから補完的にLocal LLMを使ってみる

<環境>

M4 MacBook Pro/32GB

<手順>

deepseek-coder-v2:latestがそこそこらしいからollamaに追加する

% ollama list
NAME                         ID              SIZE      MODIFIED
deepseek-coder-v2:latest     63fb193b3a9b    8.9 GB    5 hours ago

動かすとメモリは30GB程度消費するからyellow markレベルだけど動作はできる

・ブラウザからの使用

Docker経由が環境を汚染しないからそのやり方で、8080はDcoker内部のportで外部にはport 3000で公開される

% docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

Dockerでの見え方

・VScodeからの使用

① 拡張機能 Continueをインストールする

② Continueのための設定ファイルを作る

% mkdir -p ~/.continue
code ~/.continue/config.json

VScodeのエディタが起動するので、以下を入力

{
  "models": [
    {
      "title": "DeepSeek Local",
      "provider": "ollama",
      "model": "deepseek-coder-v2:latest"
    }
  ],
  "defaultModel": "DeepSeek Local"
}

設定を保存してVScodeを再起動すると、codeの選択 -> 右クリックでContinueのchat/edit起動ができる、Continue自体のwindowsは左側に開く

感覚、まあまあ使えるかなと思う、Rustの組み込みとかはまだ学習レベルが低い感じはあるけどね

 

admin