TailscaleとBitwarden(Vaultwarden)でお気楽パスワード管理(VMで予行演習編)
現状
パスワード管理はKeePassのファイルをDropboxで同期して各デバイスから利用している。数年前からBitwardenには興味があったものの、ファイルを添付する機能が有料だということで移行に躊躇していた。
BitwardenをRustで書き直したオープンソースのVaultwardenを自己ホストすれば有料機能も使えるということでいっちょやってみるかと思い立った。
鍵の保管庫の入口をインターネットに公開するのはドキドキしちゃうので、Tailscaleを利用したVPN(tailnet)からのみ利用する形にしたい。
参考:https://blog.izurina.dev/post/tailwarden/
最初はNAS(AsustorのAS3304T)のApps(TailscaleもVaultwardenもある)を使って実現できないかとあれこれ試行錯誤したのだが、Docker上で動いているTailscaleでHTTPSの証明書を有効にする手段が分からなかったので断念した(Webブラウザからは利用できるものの、スマホアプリからだと証明書関連のエラーが出て使えない状況だった)。
RaspberryPiにVaultwardenをインストールしてもよいのだろうが、鍵の保管場所が耐久性の怪しいSDカードというのも心許ない。(バックアップとればいいんだけど)
最近はIntel N100のミニPCがコスパよいらしいので、自宅サーバーとして買ってみたい欲求が…(物欲ドリブン)。しかし買ったところで当初の目的を果たせませんでしたでは話にならないので、事前に予行演習をすることにした。
やること
WindowsのHyper-V上にUbuntuの仮想マシンを立て、TailscaleとVaultwardenを利用して自分だけが利用できるパスワード保管庫を作る。
VMの準備
Hyper-Vの有効化
UEFIでCPUの仮想化機能を有効にしたうえで、「Windowsの機能の有効化または無効化」からHyper-Vを有効にする。WindowsはProライセンスが必要。
仮想スイッチの作成
Hyper-Vマネージャーを起動し、仮想スイッチマネージャーで仮想スイッチを作っておく。今回は「外部ネットワーク+管理オペレーティングシステムにネットワークアダプタの共有を許可する」の設定で作成。適当な名前を付ける。
参考:https://qiita.com/kit/items/56916c4285f353e89ea0
仮想マシンの作成
Hyper-Vマネージャーを起動し、[操作]-[新規]-[仮想マシン]を選択。
名前と場所の指定:よしなに
世代の指定:Ubuntu Desktop 64bitをインストールするので第2世代を指定
メモリの割り当て:お試しなので8GBもあれば十分でしょう
ネットワークの構成:先に作っておいた仮想スイッチを選択
仮想ハードディスクの接続:サイズは適当に
インストールオプションでUbuntuのイメージファイルを指定しておいて起動時にインストールできるようにする。
完了したら、起動する前に作った仮想マシンを右クリックして[設定]から追加の設定をする。
セキュアブートのテンプレートを「Microsoft UEFI 証明機関」に変更
統合サービスのゲストサービスを有効にする
参考:https://qiita.com/mfunaki/items/65ab01b1db116280550a
VMの起動とUbuntuのインストール
Hyper-Vマネージャーから[起動]し[接続]する
Try or Install Ubuntuを選択
Englishでインストールして後で日本語UIに切り替える
参考:
キーボードレイアウトはJapaneseを選択
ミニマルインストレーションを選択
サードパーティソフトウェアのインストールはチェックしない
InstallationTypeはnoneでよし
再起動して完了
Ubuntuを使えるようにする
ifconfigも使えないのでnet-toolsをインストール
sudo apt install net-tools
リモートデスクトップを利用できるようにする
VNCで繋げるようにする。
[設定]-[共有]でSharingをオン
リモートデスクトップをオンにする
パスワード要求にして、認証のパスワードを任意のものに変更する(最初は自動設定されたパスワードになっている)
VNCではなくRDPでつながる(VNCはなぜか不安定)
→https://zenn.dev/fuku_senta/articles/abfecde4d7a097
クライアント側でPictureQualityをAutomatic以外にしたら直った。
参考:https://gihyo.jp/admin/serial/01/ubuntu-recipe/0713
sudo apt install xrdp
sudo systemctl enable xrdp
XRDPも一応インストールしておくがあまり意味がないかもしれない。
デスクトップが落ちないように設定
RDPとVNCのパスワードが毎回更新されてしまう問題に対処するため、ダミーのキーリングを作成する
参考:https://askubuntu.com/questions/1403943/22-04-remote-desktop-sharing-authentication-password-changes-every-reboot
ユーティリティのパスワードと鍵を開き
クレデンシャルを削除する
新しいキーリングを作成する→パスワードを入力せずエンター
このキーリングをデフォルトに指定する
パスワードと鍵を閉じ、リモートデスクトップの設定画面で任意のパスワードを設定する
パスワードと鍵を開き、先ほど作成したキーリングにクレデンシャルが追加されているのを確認したら、Loginをデフォルトに指定しなおす。
SSHを利用できるようにする
Ubuntuを最小インストールしたため、OpenSSHも入っていないのでインストールする。
sudo apt install openssh-server
他のPCからSSHできることを確認
ssh [IPアドレス] -l [ユーザー名]
自動起動を有効化
sudo systemctl enable ssh
コンフィグファイルをバックアップ
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
コンフィグファイルを編集
sudo nano /etc/ssh/sshd_config
# nanoが立ち上がる
PermitRootLogin no
PermitEmptyPasswords no
# Ctrl+Oで保存
本来ならクライアント側で公開鍵を作って、公開鍵をサーバーに送って認証するべきなんだろうけど、VPNからしかアクセスできないようにするのでここらへんはちょっと甘め。
SSHを再起動
sudo systemctl restart ssh
https://www.miraiserver.ne.jp/column/about_ubuntu-ssh/
ファイアウォールを設定する
ufwはインストール済み(inactive)
gufwはUbuntuSoftwareからインストールできる
sudo ufw default deny
sudo ufw allow from 192.168.1.0/24
sudo ufw allow from 100.64.0.0/10
sudo ufw allow from fe80::/10
sudo ufw allow from fc00::/7
sudo ufw allow from 240b:abcd:efgh:ijkl::/64
# 設定の確認
sudo ufw status
sudo ufw enable
TailscaleはCGNATのIPアドレスを使うので100.64.0.0/10を許可しておく
参考:
自動更新するようにする
sudo crontab -e
0 3 * * * sudo apt-get update && sudo apt-get -y dist-upgrade && sudo apt-get -y autoremove && sudo apt-get autoclean
スクリプトの中ではaptではなくapt-getを使う
Hyper-VのゲストOSが自動起動するようにする
Tailscaleを使えるようにする
curl -fsSL https://tailscale.com/install.sh | sh
https://tailscale.com/download/linux/rpi
上のラインを使えるようにするためにCurlをインストール
sudo snap install curl
Tailscaleの開始
sudo tailscale up
出てきたURLをOpen Linkで開いてログイン
(optional)Exit NodeとしてAdvertise
sudo nano /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
# 編集したらCtrl+Oで保存
sudo sysctl -p
# sysctl.confを再読み込み
sudo tailscale up --advertise-exit-node
Dockerを使えるようにする
sudo apt install docker-compose
これでDockerもあわせて入る。
(optional)PortainerCEを使えるようにする
sudo docker volume create portainer_data
sudo docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always\
-v /var/run/docker.sock:/var/run/docker.sock\
-v portainer_data:/data portainer/portainer-ce:latest
https://localhost:9443で管理画面に入れる
タイムアウトした時は
sudo docker restart portainer
Vaultwardenを使えるようにする
ディレクトリを作る
mkdir /home/<username>/vw-data
Dockerを実行
sudo docker run -d --name vaultwarden\
-v /home/<username>/vw-data/:/data/\
-p 127.0.0.1:8080:80 --restart unless-stopped\
vaultwarden/server:latest
sudo tailscale serve --bg 127.0.0.1:8080
https://<machinename>.<tailnet-name>.ts.netでアクセスできれば完了。
Windows用クライアントソフトとAndroidアプリからも問題なく利用可能になった。iOSはまだ確かめてないけど多分大丈夫でしょう。