MeshCentralのすすめ

# はじめに
社内で運用しているサーバの管理方法は会社によって様々な方法があると思います。
作業の効率性、セキュリティ対策、アカウント管理方法など懸念しないといけない観点が多くサーバの管理者は悩みの種が絶えないのではないかと思います。(私もその一人です)
弊社ではAWSをメインに使用しておりますが、サーバにアクセスする手間・IAMユーザーの権限と死活管理などコンソールだけでは管理しにくい要素がありまとめて管理できるツールがあるといいな～と思っていました。

そんな折にMeshCentralというオープンソースの存在があることを知りました。
「リモート管理やデバイスの制御を行うためのオープンソースのプラットフォーム」ということみたいなのですが、物は試しということで使ってみると非常に便利でした。
サーバ運用で同じ悩みを抱えている方にツールを紹介したいと思い記事に起こしました。
サーバの管理者の方に運用・管理体制構築の一助となれば幸いです。

# MeshCentralとは
## 製品概要
MeshCentralってどんなツールなのかを一言でいうと、「多くのデバイスを一元管理し、リモートからの操作やサポートを提供する」ツールです。
もう少し具体的な機能についてはChatGPTの力を借りてみます。

1. **リモートデスクトップアクセス**:
MeshCentralを使うと、管理者はリモートデバイスのデスクトップにアクセスし、直接操作を行うことができます。
これにより、問題解決や設定変更を迅速に行えます。

1. **リモートファイル管理**
リモートデバイス上のファイルを管理、アップロード、ダウンロード、削除する機能があり、効率的なファイル操作が可能です。
1. **リモートターミナル**
コマンドラインインターフェース（CLI）を通じてリモートデバイスに接続し、スクリプトの実行やシステムの設定を行うことができます。
1. **デバイスの監視と管理**
多数のデバイスを一元的に監視し、ステータスを確認したり、リモート操作を行ったりすることが可能です。
1. **セキュリティ機能**
通信はSSL/TLSで暗号化されており、ユーザー認証やアクセス制御も提供されます。また、ログやアクティビティトラッキングも行えます。
1. **柔軟なデプロイメント**
クラウド上やオンプレミスにインストールすることができ、カスタマイズも容易です。
弊社ではAWS上にMeshCentralを構築しております。

文字だけだとイメージしにくいので次項で実際の画面を基に紹介します。

## 利用イメージ
### リモートデスクトップアクセス
弊社の社内ロボサーバはAWSのEC2インスタンスを利用していますが、MeshCentralAgentをサーバにインストールすることでMeshCentralのコンソールからサーバにアクセスすることができます。
また、１度に複数人が同一のサーバにアクセスできます。[^1]
[^1]:マウスカーソルは競合してしまうので作業は１人しか行えません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/ff2d64f0-9339-916a-129b-51b3eac31408.png)

:::note
標準のRDPだと1つの接続にセッションが占有されるため、複数人で作業する際には有用な機能ですね
:::

### リモートファイル管理
サーバのファイルをMeshCentralのコンソール上から操作できるので、ローカルPCとサーバ間でファイルのやりとりが簡単にできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/ec9f9e52-3c73-464b-1c61-f43fa39dce37.png)

:::note
他の人がデスクトップを使用していてもファイル操作が可能です。
ローカルとサーバ間のファイル操作は苦労していたので助かっています。
:::

### CLIの利用
GUIだけでなくCLIからも操作が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/b8e47d19-d305-2b0e-2277-2b0f19eb525c.png)

### デバイスの管理
複数のデバイスを包括して管理することが可能です。
グループごとにMeshCentralAgentを発行できるので、サーバごとに必要なAgentをインストールすることでグループ毎に区分けして管理できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/8568f947-46ef-c4f1-a500-4e4036bd21b8.png)

:::note tips
Windowsデバイスを管理する場合は、以下の様にデバイスのデスクトップイメージが表示されるため、Dynamic接続設定のDAS端末の管理に利用した場合以下の管理が容易です。
・端末がログイン状態か否か
・ロボットが動いている最中かそうでないか
・動いていない場合には、正常終了しているか（デスクトップ上にウィンドウなし）
・異常終了しているか（デスクトップ上にウィンドウあり、エラーメッセージ在りなど）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/23be1c2b-3253-3339-e253-165ee9078b1f.png)
:::


### セキュリティ機能
サーバを利用したログが記録されるので、だれがいつ利用したか把握できます。[^2]
[^2]:サーバ内での操作はMeshCentralのログには残りません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/52b6ae26-ec18-f93a-af41-5ac18ba31c3e.png)

:::note
MeshCentralを利用しないとだれがいつサーバの操作をしたのか分からないのでトラブル発生時に役立ちます。
:::

# 社内の活用事例
MeshCentralでどんなことができるかざっくりイメージしていただけたかと思います。
本章では上記機能を弊社の運用上でどのように利用しているのか紹介します。

### 社内ロボのメンテナンス
弊社のBizRobo!のアーキテクチャはMC/RS/DAS/Kappletsのサーバがそれぞれ独立して存在しています。(参考記事は[こちら](https://qiita.com/ParakeetOnTheHead/items/c1d4d357d9d8c7581426))
毎月サーバのメンテナンスを実施しているのですが、各サーバへアクセスするために都度RDP接続するのは手間がかかるのでMeshCentralでサーバメンテナンスを実施しております。
また、MeshCentralはRDPポートを使用せずにサーバへアクセスできるのでセキュリティグループのインバウンドルールでRDPポートの許可を外すことでセキュリティの向上につなげています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/48443bc5-36c5-74e8-cdf3-ea1c5e290843.png)


### インターン生の研修
MeshCentralでは複数同時アクセスが可能なため、同じ画面を見ながら教えることができるので習熟度向上に役立っています。
また、不用意にIAMユーザーを作成する必要もないのでアカウント管理、権限設定が容易になりました。
この結果作業効率の向上と作業工数の削減につながりました。

# サーバ構築手順
これまでMeshCentralってどんなもの？という観点で紹介を進めてきましたが、実際に利用するために必要なサーバ構築手順を紹介します。
[公式の手順](https://meshcentral.com/docs/MeshCentral2InstallGuide.pdf)は英語の記述しかないのでChatGPTと組み合わせて記述します。
弊社の環境で利用しているOS(AmazonLinux)の手順になります。

## 1. インスタンスの用意
AmazonLinuxを利用したインスタンスを作成してください。
セキュリティグループの許可は以下を設定していただければ最低限問題ないです。(DBなどを利用する場合は適宜追加してください)
公式の資料ではすべてのアクセスを許可する設定になっていますが、社内のセキュリティポリシーに応じて書き換えてください。

|Type|Protocol|PortRange|Source|Description|
|:--:|:--:|:--:|:--:|:--:|
|SSH|TCP|22|Anywhere|SSH|
|HTTP| TCP |80| Anywhere |HTTP|
|HTTPS |TCP |443 |Anywhere |HTTPS|

## 2.Node.jsのインストール
まず、インスタンスを起動してSSHセッションを開始します。
LinuxではSSHを、WindowsではPuttyを使用してAWSインスタンスにログインできます。

長期サポート（LTS）バージョンのNode.jsをインストールします。
まず、Node Version Manager（nvm）をインストールし、それを有効にしてNode.js LTSをインストールします。


```bash
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
. ~/.nvm/nvm.sh
nvm install --lts
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/bcdc2a3f-8135-971e-06f0-189ab6913a0d.png)

インストールされているNode.jsのバージョンを確認するには、次のコマンドを使用します
```bash
node -v
```

```bash:コマンド実行の結果
$ node -v
v20.17.0
```


以上でNode.jsのインストールが完了です。

## 3.ポートの権限
Linuxでは、ポート番号1024未満は「root」ユーザーに予約されていますが、MeshCentralがポート80と443を利用できる必要があります。
これを許可するためには、Nodeがポート1024未満を利用できるようにLinuxの設定をする必要があります。
次の手順で設定します。
①nodeバイナリの場所を特定します。
```bash
whereis node
```

```bash:コマンド実行の結果
$ whereis node
node:  /home/ec2-user/.nvm/versions/node/v20.17.0/bin/node
```

②「setcap」コマンドを使ってNodeに権限を追加します。
「whereis」で得られたパスを「setcap」コマンドに入力します。
```bash
sudo setcap cap_net_bind_service=+ep /home/ec2-user/.nvm/versions/node/v20.17.0/bin/node
```

③ポートの権限が付与されたことを確認するには、getcap コマンドを使用します。
このコマンドは指定したバイナリに付与された権限を表示します。
```bash
getcap /home/ec2-user/.nvm/versions/node/v20.17.0/bin/node
```

```bash:コマンド実行の結果
$ getcap /home/ec2-user/.nvm/versions/node/v20.17.0/bin/node
/home/ec2-user/.nvm/versions/node/v20.17.0/bin/node cap_net_bind_service=ep
```

このコマンドの出力に`cap_net_bind_service=ep`が含まれていれば、Node.js にポート1024以下をバインドする権限が正しく付与されています。

以上でポートの権限設定は完了です。

## 4.MeshCentralのインストール
Nodeパッケージマネージャー（NPM）を使用してMeshCentralをインストールします。
```bash
npm install meshcentral
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/0214accf-f7f9-e788-da19-48d26fdf9f7b.png)

その後、MeshCentralを初めて実行します。
WAN専用モードで実行したいので、同じローカルネットワーク上のコンピュータを管理しません。
また、AWSインスタンスの名前と同じ証明書名でサーバーを作成します。
そのため、「--wanonly」と「--cert [name]」の引数を使ってサーバーを起動します。[^3]
[^3]:本記事はサーバのIPを指定していますがDNS名を登録することも可能です。

```bash
node ./node_modules/meshcentral --wanonly --cert 18.183.248.236  
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/a7796a1c-80db-73ec-867c-6d4302751db0.png)

runningになっている状態でipアドレスをブラウザで開けばMeshCentralにアクセスできます。
```
https://18.183.248.236/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/db2189b6-700d-e6d0-93d0-874d4be7e3f1.png)

最初の立ち上げ時にはアカウントは存在しないので「一つ作る」から作成すればログインすることができます。

以上でMeshCentralの起動が完了です。利用しない場合はCtrl+Cでシステムを停止しましょう。
今の状態では手動でシステムを起動している間しか使えないので自動起動する設定を行います。

## 5.自動起動設定
Amazon Linux 2はsystemdをサポートしているため、これを使ってMeshCentralをバックグラウンドで自動的に起動させます。
まず、ユーザー名とグループを確認する必要があります。
「ls -l」コマンドを実行すると、以下のような結果が得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/58d3b21d-bb9e-6e4a-1a77-7f64aabba358.png)

この例では、ユーザー名とグループ名が「ec2-user」になっています。
この情報は、システムサービスの説明ファイルを作成する際に必要です。
このファイルを作成するには、次のコマンドを入力します。

```bash
sudo nano /etc/systemd/system/meshcentral.service
```
次に以下の内容を入力します。
```ini
[Unit]
Description=MeshCentral Server

[Service]
Type=simple
LimitNOFILE=1000000
ExecStart=/home/ec2-user/.nvm/versions/node/v20.17.0/bin/node /home/ec2-user/node_modules/meshcentral
WorkingDirectory=/home/ec2-user
Environment=NODE_ENV=production
User=ec2-user
Group=ec2-user
Restart=always
# Restart service after 10 seconds if node service crashes
RestartSec=10
# Set port permissions capability
AmbientCapabilities=cap_net_bind_service

[Install]
WantedBy=multi-user.target
```
ユーザー名とグループ名の値は、実際の状況に応じて正しく設定する必要があります。
また、ExecStart と WorkingDirectory の行には、ユーザーのホームフォルダーへのパスが含まれており、その中にユーザー名が含まれています。
(今回nodeのバージョンは20.17.0でしたが、ご利用のバージョンに合せて書き換えてください。)
これらが正しく設定されていることを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/a983532d-67af-d22e-3fd2-50e521a85df1.png)

設定値が正しく変更できればCtrl+Oで保存して、Ctrl+Xでnanoエディタを閉じてください。

これが完了したら、以下のコマンドでサービスの自動起動設定と開始ができます。
```bash
sudo systemctl enable meshcentral.service
sudo systemctl start meshcentral.service
```

```bash:コマンド実行の結果
$ sudo systemctl enable meshcentral.service
Created symlink /etc/systemd/system/multi-user.target.wants/meshcentral.service → /etc/systemd/system/meshcentral.service.
$ sudo systemctl start meshcentral.service
```


サービスの自動起動設定が完了したらsystemd の設定を再読み込みし、サービスを再起動をして設定を反映させます。
また、statusを確認してactiveになっていれば設定が正常に完了しています。
```bash
sudo systemctl daemon-reload
sudo systemctl restart meshcentral.service
sudo systemctl status meshcentral.service
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/0d59d41a-de3e-668a-e71b-6d09e5654a3f.png)

以上で、MeshCentralの基本的な構築は完了です。

# まとめ
私はMeshCentralを使い始めてからサーバの運用コストが下げられたと感じています。
今までAWSコンソール上でいかによい運用方法がないかを模索していましたが、痒い所に手の届く機能がMeshCentralには多く存在していると思っています。
タグ付での管理やLambdaを用いた自動化も十分効率はいいのですが、構築コストや死活管理などの見えないコストは発生するので包括して管理ができる機能は非常に助かっています。
ただ、MeshCentralを導入することでAgentの設定やアカウント管理は発生するので運用方法を考えないと二重のコストがかかる危険性もありえます。

まだ私のチームでもMeshCentral利用し始めたばかりですので、より効率の良い活用方法を見出していきたいと思っています。
まずは他チームを巻き込んだ運用を直近の目標とし、最終的にはIAMユーザーの数を最小限に減らしたいと考えています。

本記事がサーバ管理者にとって作業効率向上の一助となれれば幸いです。