三条市のLINE WORKS業務利用に関する提案 ②

2021-04-18IT,合理化docker,docker-compose,localhost.run,RocketChat,三条市

三条市のLINE WORKS運用ガイドラインが公開されています

公開ページ

ガイドライン本文

公開されたガイドラインを読みますと、

  1. 職員同士の連絡手段としてチャットを使う
  2. カレンダー機能も使う。会議室の予約ができる。
  3. 出先でも使用できるようにクラウドサービスを選択した。職員の私物での利用も条件付きでできる。

ということでした。

前回の記事で機密情報の定義が緩いのではと指摘しましたので多くは語りません。

とはいえ、3についてはお花畑だなぁと思わざるを得ません。

職員の私物に対するセキュリティ対策はどうするんでしょうか。

安全側で考えるなら乗っ取られていると判断せざるを得ない私物スマホですが、これが接続されているチャット上でどれほど有益な情報交換が行えるのでしょうか。

「○○してはならない」系のガイドラインはただのアリバイ作り

全員に守らせるためには物理的に制限をかけるしかない

誰かの行動制限するのに、言い聞かせるだけではだめなのです。

公務所であろうと私企業であろうとマンション管理組合や町内会であろうと、ある組織でルールを定め、それを誰かに守らせようとする時、

  • ルール違反者がないか監視役を置く(上司や監査役)
  • ルールが守られている状況を証明できる情報を公開する

という手法に集約されます。

これ以上の仕組みを人類は発明できていないのです。

組織のメンバー構成というのは変化しますし、人間は時間が経つと忘れてしまう生き物ですので、ルールを守らないというより「守れない」という特徴を持っているのです。

よって、ルールを定める時は、

× ルールを定める、守らせる方法を考える

〇 物理的な制限をかける、制限について明文化する

という順番で考えることが正解だと思います。

物理的に制限をかけられないルールは守られないのでそのルールは設定できない、と考えなくてはいけません。

よって守られないことが分かっているルール設定は、統治する側の言い訳のためのものに過ぎない、アリバイ作りであると言わざるを得ないのです。

そして、守られないルールは組織のモラルを低下させます。

割れ窓理論のようにルール破りが常態化し、さらに大きなルール破りを引き起こします。

守ることができないのであれば、ルールはむしろない方がいいのです。

オンプレミス(「現実に自分でサーバを運用」)なら制限を減らせるよ

前回の記事でRocket.Chatを提案した理由がまさにこれなのですが、情報共有ツールは自前で運用するに限るのです。

人材の確保というとても大きな手間やお金がかかってしまいますが、情報流出防止の優先順位を高く設定せざるを得ない現代では、もうこれしかないと思います。

幸い、工夫すれば余った機材でどうとでもなる案件ばかりなのです。

仕様を作れる人材の確保が課題ですが、年々状況は良くなっています。

Rocket.Chatを余った機材で運用する方法(windows編)

必要なもの

  1. wsl2が使えること
  2. DockerDesktopが使えること

以上です。要は最新のアップデート完了したwindows10(HOME可)が動いているPCがあればOKです。

1 wsl2の有効化

公式のドキュメント(説明書みたいなもの)を見ましょう。

要約すると以下のとおりですが、結果が同じであれば他の方法で構いません。

コマンドなどのやること行う場所目的
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestartPowerShell(管理権限)wsl機能の有効化
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestartPowerShell(管理権限)仮想マシンプラットフォーム機能の有効化
再起動windows
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
をダウンロードして実行しインストールする。(要管理権限)
ブラウザWSL用LINUXカーネルを更新する
wsl --set-default-version 2PowerShellWSL1ではなく2を常に使用する設定
再起動windows
wsl –set-version Ubuntu-20.04 2PowershellWSL2用OSとしてUbuntu20.04を導入する
wsl Ubuntu-20.04
(起動後)
IDとパスワードを設定する
PowershellUbuntu20.04の初回起動をすませておく

2 Docker Desktopの導入

Rocket.Chat公式ドキュメントではDocker Desktopというソフトを基盤にRocket.Chatコンテナを動かす方法が紹介されています。

が、これは情報が古いので、2021年4月現在の状況をふまえてまとめますと、

コマンドなどのやること行う場所目的
DockerDesktop公式ページからインストーラーを入手し、インストールする適当なブラウザ
DockerDesktopを起動する(要管理者権限)
任意の場所に新しいテキストファイルを作成する。
作成したテキストファイルの名前を拡張子ごと変更し、docker-compose.ymlとする。
docker-compose.ymlをメモ帳などのソフトで編集し、下記をコピペする。なお、以下の内容は公式がgithubで公開している内容です。
ーーーーーこの行を含まず以下をコピペする—–
version: '2’



services:

rocketchat:

image: rocketchat/rocket.chat:latest

command: >

bash -c

“for i in `seq 1 30`; do

node main.js &&

s=$$? && break || s=$$?;

echo \"Tried $$i times. Waiting 5 secs…\";

sleep 5;

done; (exit $$s)"

restart: unless-stopped

volumes:

– ./uploads:/app/uploads

environment:

– PORT=3000

– ROOT_URL=http://localhost:3000

– MONGO_URL=mongodb://mongo:27017/rocketchat

– MONGO_OPLOG_URL=mongodb://mongo:27017/local

– MAIL_URL=smtp://smtp.email

# – HTTP_PROXY=http://proxy.domain.com

# – HTTPS_PROXY=http://proxy.domain.com

depends_on:

– mongo

ports:

– 3000:3000

labels:

– “traefik.backend=rocketchat"

– “traefik.frontend.rule=Host: your.domain.tld"



mongo:

image: mongo:4.0

restart: unless-stopped

volumes:

– ./data/db:/data/db

#- ./data/dump:/dump

command: mongod –smallfiles –oplogSize 128 –replSet rs0 –storageEngine=mmapv1

labels:

– “traefik.enable=false"



# this container’s job is just run the command to initialize the replica set.

# it will run the command and remove himself (it will not stay running)

mongo-init-replica:

image: mongo:4.0

command: >

bash -c

“for i in `seq 1 30`; do

mongo mongo/rocketchat –eval \"

rs.initiate({

_id: 'rs0’,

members: [ { _id: 0, host: 'localhost:27017’ } ]})\" &&

s=$$? && break || s=$$?;

echo \"Tried $$i times. Waiting 5 secs…\";

sleep 5;

done; (exit $$s)"

depends_on:

– mongo



# hubot, the popular chatbot (add the bot user first and change the password before starting this image)

hubot:

image: rocketchat/hubot-rocketchat:latest

restart: unless-stopped

environment:

– ROCKETCHAT_URL=rocketchat:3000

– ROCKETCHAT_ROOM=GENERAL

– ROCKETCHAT_USER=bot

– ROCKETCHAT_PASSWORD=botpassword

– BOT_NAME=bot

# you can add more scripts as you’d like here, they need to be installable by npm

– EXTERNAL_SCRIPTS=hubot-help,hubot-seen,hubot-links,hubot-diagnostics

depends_on:

– rocketchat

labels:

– “traefik.enable=false"

volumes:

– ./scripts:/home/hubot/scripts

# this is used to expose the hubot port for notifications on the host on port 3001, e.g. for hubot-jenkins-notifier

ports:

– 3001:8080



#traefik:

# image: traefik:latest

# restart: unless-stopped

# command: >

# traefik

# –docker

# –acme=true

# –acme.domains=’your.domain.tld’

# –acme.email=’your@email.tld’

# –acme.entrypoint=https

# –acme.storagefile=acme.json

# –defaultentrypoints=http

# –defaultentrypoints=https

# –entryPoints=’Name:http Address::80 Redirect.EntryPoint:https’

# –entryPoints=’Name:https Address::443 TLS.Certificates:’

# ports:

# – 80:80

# – 443:443

# volumes:

# – /var/run/docker.sock:/var/run/docker.sock
—–この行を含まず上記をコピペする—–
とする。保存する時に文字コードをUTF-8とすること。
メモ帳などのテキストエディタdocker-composeというソフトの動作に必要な設計図を作成する
docker-compose.ymlファイルがあるフォルダを開き、URL欄をクリックし、フルパスを表示させコピーする。エクスプローラーフルパスの取得
cd [上記で取得したフルパス]powershell(管理者権限)
docker-compose.ymlがあるフォルダまで移動(cd)する
docker compose up
#dockerの最新バージョンではこのコマンドが有効
#古いバージョンでは使えないので注意
powershell(管理者権限)設計図に従ってコンテナを構築する
localhost:3000ブラウザのURL欄起動確認

「docker compose up」のあとは主に回線速度によって結構な時間待ちます。

最後の起動確認でRoketChatの画面が表示されれば成功です。

3 性能評価のための公開実験はlocalhost.runで

localhost.runとはなんぞや

管理しているサーバからSSHリモートポートフォワード接続することによって、面倒な設定をすっとばしてインターネット経由でサーバにアクセスできるようにしてくれるサービスです。通信は暗号化されますし、NAT越えもできます。実験中の限定的な公開にもってこいのサービスなのです。(リモートポートフォワード接続についてはここでは割愛します。)

海外サーバですので本番運用はできませんが、動作確認や上席への説明に使えます。

使い方

1.自分のサーバ上で鍵ペアを作成する。

コマンドや表示説明
ssh-keygen -t rsa下準備、公開鍵秘密鍵のペアを作成します。
Enter file in which to save the key (/root/.ssh/id_rsa):保存場所の選択、デフォルトでいい場合はこのままエンターキーを押しましょう。
Enter passphrase (empty for no passphrase):パスフレーズの入力、自分で考えた文字列を入力しましょう。メモしておくことを忘れずに。
Enter same passphrase again:同じパスフレーズを再度入力します。

※メモしたパスフレーズは、鍵ペアを今後使用する度に入力を求められます。

2.localhost.runのサーバに自分のサーバから接続する。

コマンドや表示説明
ssh -R 80:localhost:3000 localhost.runlocalhost.runのサーバの80番ポート宛の通信を、全てRocket.Chatが稼働している端末の3000番ポートへ転送するための設定

上記の操作によって、以下のように表示されます

コマンドや表示説明
Enter passphrase for key '/root/.ssh/id_rsa’:鍵ペアを使用するために先ほど設定したパスフレーズの入力を求められますので、入力します。
[ランダムな文字列].localhost.run tunneled with tls termination, https://[ランダムな文字列].localhost.runlocalhost.run側から「ランダムな文字列.localhost.run」というFQDNが与えられました。

FQDNというのはURLの「https://」のあとから次の「/」までの間のことを言います。

この与えられたFQDNをブラウザのURL欄に入力すると、localhost.runを経由して稼働中のRocket.chatへ通信できます。

3.ブラウザまたはスマホのRocketChatアプリから「ランダムな文字列.localhost.run」へアクセスする。

さて、順調にいけば以下のようなRocketChatのログイン画面になるはずです。

RocketChatログイン画面

ブラウザからhttpsでlocalhost.runへ、localhost.runからsshで通信が行われ、構築したRocket.Chatに通信が到達するわけですね。

また、スマホアプリ版RocketChatからも同じFQDNでアクセスすることができます。

しかし、筆者の環境では安定稼働しなかったので、稼働実験段階ではブラウザからアクセスすることをオススメします。

使い勝手はどんなもんかとか、サーバや回線の能力は足りているのかとか、思う存分テストしてください。

諸注意

今回紹介した方法は、

  • localhost.runを信用する必要がある。
  • 一定時間アクセスがないとlocalhost.runとサーバの接続が遮断される。

という大きな欠点がありますので、繰り返しになりますが、あくまでテストやプレゼン用と割り切って下さい。

所属している組織内部での説明用です。

とはいえ、

  • 一般家庭用光回線
  • 固定IPサービス

が最低限あれば、余っているノートパソコン程度の機材でも十分に10人程度の同時利用をさばくことができます。

遅延は発生しますがチャットの利用には大きく支障は生じないでしょう。

遅延が許されないような場面では電話を使いましょう。

追記

1 三条市ではLINE WORKSのカレンダー機能も使っているらしい件について

会議室の空きを確認したりしてるらしいです。予約もかな。

出先から使えれば、まあ便利なんでしょうが、チャットで在庁している人に依頼すればいいだけの話なのでは…?

主任 〇人で午後から使える会議室押さえてください。

係長 午後だと大会議室しか空きがないのですがいいですか。

主任 お願いします。

係長 予約しました。

みたいな感じです。

とりあえずチャットだけあれば他の機能は妥協できるのではないかと。

2 おまけ

この記事の初投稿バージョンは、色遣いや「てにおは」で読みづらい点が多かったので、修正を行いました。

初投稿時はウトウトしながらキーボードに向かっていたのですが、おかげでとても雑なことをしてしまいました。

がんばりすぎイクナイです。過労ダメゼッタイ。