極北別世界通信
技術書典 10 開催と月次映画祭
日記的な
明日から技術書典開幕。
本は入稿済み&無料本を一応作成済み。
基本は夏コミに向けてになりますが、Fuchsia OS のGUIインストールに向けて、
NUCの購入も完了済み。
明日の夜は月イチのプライベート地味目映画祭開催日
そんなかんじ。
Todo覚書
・既存リモート環境にシングルサインオンの導入
→Rocketchatのみ完了 原稿化予定
・その他のシステム
→架空の会社の社内システムを全部OSSで作るという
試験を1年ほどかけてやろうと思っています。
なので普段使いしているApache Guacamoleとインフラ系のDNSとかを除いて
まるっと構築しなおそうと考えています。
・Dockerプライベートレジストリをjenkinsとgitlab使って構築
→ネタとして面白そうと思ったのですが、当方がDockerを普段使いしてないので
イマイチ着手に至っていません。
・Snipe IT使って資産管理システム
→どちらかというとシステムより実際の登録と運用が肝。
導入自体は割と容易だったのですが、今回の架空の会社システム構築の際に
やり直す予定
・Exmentの活用の具体例
→こちらも同上。設計の大切さが身に沁みますな
・Zabbixでの監視と、各種ログのとりまとめ、可視化
→監視自体は設定してますが、細かい通知とかログのとりまとめはできてません。
ただそもそも監視に何を使うかの選定を優先する予定
(その上で架空の会社のシステム構築を行う方向)
・ヘルプデスクシステムをオープンソースで何とかする
→まだまだ調査段階。3つくらい候補がありますが、これも架空の会社の
システム構築で対応する予定。
■その他
・というわけで、いまのところは現行で使ってるもののうち残すものと新しい企画のために
いったんまっさらにするものに分けて対応する予定です。
まぁ自分向けのTodoなんですが。
技術書典とコミックマーケットとエアコミケ
技術書典が12/26~1/6
エアコミケが12/30、31
コミケ99が2021年5/2~5/5
なかなかハードですな。
どこまで達成可能かわかりませんが一応、原稿は以下の方針で進めてます。
■技術書典
OSM 2nd Version3 マイナーOS駆け足レビュー
dabble in... Vol.3 KeyCloakで既存環境にSSO導入(のさわり)
■エアコミケ
多分同時期なので基本は技術書典と同じ。
dabble in... のExtra Editionは作ろうと思っています。
ネタはアセットマネジメントのSNIPE ITか多目的CMSのodooか…
■コミケ99
OSM 2nd Version4 いまさらOS/2 WARPをVirtual Boxで動かしてみる(仮)
dabble in... Vol.4 Docker+gitlab+jenkinsでプライベートDocker Hub構築(仮)
ただコミケ99のネタは少し前に検討したけど自身の環境でそれほどDockerを現状は使っていないのでどうなるか未定。
それ以外に「架空の会社の社内システムを全部OSSで作ってみる」という演習を1年間かけてやってみる予定なので、その途中経過とかの本になるかもしれません。
Windowsの特殊フォルダ
当方の自宅のマシンにはドライブが18個くらいあるんですが、うっかり特殊フォルダを移動したのを忘れていて、デフォルトフォルダがユーザーのTempフォルダにされる事件があったので、その解消法を簡単に。
当方が被害?にあったのはCapturesフォルダでした。マイナーOSの挙動をWindowsのデフォルトのキャプチャ機能でキャプチャしておこうとしたら、キャプチャデータがどっか行ってしまいました。
設定を見たら(スタート⇒設定⇒ゲーム⇒キャプチャ)、なぜかユーザーのTempフォルダになってる。はて?
こういう時はレジストリだ!というわけでregeditを起動。
Win+Rキーから「regedit」とタイプしてEnter。
コンピューター\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
に、たくさんフォルダに指定が並んでますが、Capturesフォルダが存在しなくなったドライブに指定されてました。
フォルダが見当たらないとユーザーのTempフォルダにされちゃうんですね。
なお、名前は
{EDC0FE71-98D8-4F4A-B920-C8DC133CB165}
で、データの値を移動したいフォルダにすると、そこがキャプチャフォルダになります。
スタート⇒設定⇒ゲーム⇒キャプチャ
のフォルダもちゃんとそこに変更されます。
でもこういうのは簡単に設定できるようにしてほしいなぁ。なんかこうブラックボックスにしたい意地?みたいのを感じますな。
仮想マシンイメージの変換
覚書に近いですが。
VirtualBoxのVBoxManageコマンドを使って実施します。対象ファイルは全部同フォルダ/ディレクトリにある前提です。
前提:C:\Program Files\Oracle\VirtualBox
を
「コントロールパネル」⇒「システム」⇒「システムの詳細設定」⇒「詳細設定」タブ⇒「環境変数」⇒「Path」に追加
※当方はユーザー環境変数に入れてますがお好みで。
sd★はもちろん例です。
■物理HDD ⇒ RAW
sudo dd if=/dev/sd★ of=./sd★.img ※Linuxでやるほうが楽なのでこうしてます。Windowsでもできるツールはあります
■RAW ⇒ VDI
VBoxManage convertfromraw sd★.img sd★.vdi --format VDI
■RAW ⇒ VMDK
VBoxManage convertfromraw sd★.img sd★.vmdk --format VMDK
■VDI ⇒ VMDK
VBoxManage clonehd sd★.vdi sd★.vmdk --format VMDK
■VMDK ⇒ VDI
VBoxManage clonehd sd★.vmdk sd★.vdi --format VDI
■VDI ⇒ RAW
VBoxManage clonehd sd★.vdi sd★.img --format RAW
■RAW ⇒ 物理HDD
sudo dd if=./sd★.img of=/dev/sd★ ※最初の物理 ⇒ RAWと同様Linuxで実施
主にダウンロードしたマイナーOSのHDDイメージを変換する際に利用してます。
覚書更新
・オープンソースHCI
→オール仮想マシンでやろうとして失敗中
・既存リモート環境にシングルサインオンの導入
→Rocketchatのみ完了
→NextCloudはできるらしいが若干不安あり
→その他はまだ厳しそう
・Dockerプライベートレジストリをjenkinsとgitlab使って構築 →未着手
・Snipe IT使って資産管理システム
→どちらかというとシステムより実際の登録と運用が肝。少しずつやってるがあまり進捗なし
・Exmentの活用の具体例
→わりと同上。インストールやら構築よりその先のほうが肝心
・Zabbixでの監視と、各種ログのとりまとめ、可視化
→進んでない。他の機能の方を優先してる感じ
・ヘルプデスクシステムをオープンソースで何とかする
→まだまだ調査段階
■その他
・GoogleのSearch consoleやらは放置しすぎてたのとodooで構築してたサイトが度々接続切れてたせいかGoogle八分食らってて草生える。ちゃんとしないと。
・コソコソいろんな仕事の対応したりしてたら異常にいそがしく
・技術書典10に申し込んだがなにやろう。
・とりあえず自分で使ってて最も有用なApacheGuacamoleは押し続けたい所存。ログ取りやら解析やらそのあたりももう少し踏み込んでやりたい
・今更シェルスクリプト書いたりしてるけどなんというかコードがきったねぇ。エレガントに?書く訓練もしとらんからあれだが
唐突にマインクラフトサーバ
そういや子供が以前からマインクラフトをやりたがっていたので、統合版のサーバをさっくり立ててみることにする。
以前調べた時は、統合版の発売前だったようで、PCからのJava版と他のプラットホームは共存できないという話だったと記憶してましたが、今回調べたら統合版というのが出てて、マルチプラットフォームが可能らしいのでちょいとサーバを立ててみることにしました。
OSごとに多少なり違いはありそうですが、潤沢な仮想マシンリソースを使ってとりあえず立ててみます。
■準備
OS:Ubuntu server 20.04 LTS
マインクラフトサーバ
オフィシャルサイトからダウンロードしますが、なんか、日本版のサイトだと2020年11月現在ダウンロードできないっぽい
なのでUSサイトからダウンロードします。
https://www.minecraft.net/en-us/download/server/bedrock
■手順
1 Ubuntuをインストール
ベースは別のUbuntu上のVirtualBox仮想マシン。8コア16GB割当。実際はもっと少なくてもいいはず。
なおインストール中に設定したほうが楽なのでIPアドレスとホスト名はちゃんと決めておきましょう
ダウンロードしたファイル内にあるhtmlファイルに詳細な情報が載ってるので、正直インストールとかは全然難しくないです。
2 unzipをインストール
最初のアップデートを実施後、unzipをインストールします
$ sudo apt -y install unzip
3 ダウンロードしたマインクラフトサーバソフトを任意のディレクトリに配置
他のファイルを置かない空のディレクトリ作成してそこに置くのが推奨のようです
今回は自身のホームディレクトリ配下に作成したディレクトリ内に展開するので以下のようにしています。
$~ mkdir bdc
$ cd bdc
$ unzip bedrock-server-1.16.40.02.zip
※上記は2020/11/17現在のバージョン
※余談
オフィシャルサイトからはwgetとかで持ってきてもいいですが、
Windowsでダウンロード→サーバにTera Termでsshログイン→Tera Term画面にD&D
でも事足ります。便利になりましたなぁ(じじいくさい)
4 screenのインストール
このまますぐに起動してしまってもいいんですが、screenを使って起動してあげるとサーバから抜けても稼働し続けてくれるので楽。
やり方はまぁ何でもいいですが、
$ LD_LIBRARY_PATH=. screen -dmS bds ./bedrock_server
とやって、dbsというスクリーン内で起動し、デタッチしてしまうのが割と楽かと。
コンソールからScreenにアクセスする(アタッチする Ubuntu→BDS)には
$ screen -r bds
Screenから抜けてコンソールに戻る)デタッチする BDS→Ubuntu)には
Ctrl+a d
※ctrlキーを押しながら a を押下し、続けて d を押下すると抜けます。
もちろんsystemctlに登録して自動起動するように設定したりもできますがまぁその辺はお好みで。
※もしちょっとしらべて登録したらまた追記するかもしれません。
…実はまだクライアント購入してないんで、購入したら子供に感想でも聞いてみます。
Apache GuacamoleをDockerで構築してLDAPバックエンドでリバースプロキシ(長い)
以前すでにいくつか書いていますが忘れないようにメモ。
まぁ。。なんも書かんよりはマシかな程度ですが。
■Apache Guacamole
ちょっとまえに構築して現状、自分の立てたやつではぶっちぎりで利用しているので簡単に書く。
なお、ネタとしては こちら でやられていることのほぼ丸パクリ+LDAP、あとはリバースプロキシ対応をしています。
1.仮想マシン
VirtualBoxにUbuntu 18.04をインストールしてベースにする。
SELinux、Firewallを外す
2.Docker、docker-composeのインストール
・Dockerのインストール
オフィシャルのスクリプトで行います。
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
dockerグループに操作ユーザーを加えて再ログイン
$ sudo usermod -aG docker $USER
・docker-composeをインストール
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
3.Guacamoleのインストール
・作業ユーザのディレクトリにguacamoleディレクトリを作成
$ mkdir guacamole
$ cd guacamole/
・docker-compose.yml を作成
なお、ファイル内の「guacamole_root_password」と「guacamole_user_password」は,適切なパスワードに変更する。
version: "3"
services:
guacd:
container_name: my-guacd
image: guacamole/guacd
restart: always
guacamole_db:
container_name: my-guacamole-db
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: guacamole_root_password # NEED TO CHANGE
MYSQL_DATABASE: guacamole_db
MYSQL_USER: guacamole_user
MYSQL_PASSWORD: guacamole_user_password # NEED TO CHANGE
volumes:
- ./dbdata:/var/lib/mysql
- ./dbinit:/docker-entrypoint-initdb.d
guacamole:
container_name: my-guacamole
image: jkbys/guacamole:1.1.0ja
#image: guacamole/guacamole
restart: always
environment:
GUACD_HOSTNAME: my-guacd
MYSQL_HOSTNAME: my-guacamole-db
MYSQL_DATABASE: guacamole_db
MYSQL_USER: guacamole_user
MYSQL_PASSWORD: guacamole_user_password # NEED TO CHANGE
GUACAMOLE_HOME: /guacamole-home
volumes:
- ./home:/guacamole-home
depends_on:
- guacamole_db
- guacd
ports:
- "8080:8080"
・必要なディレクトリを作成
$ mkdir -p dbdata dbinit home/extensions
・MySQLの初期化スクリプトを出力
$ docker run --rm jkbys/guacamole:1.1.0ja /opt/guacamole/bin/initdb.sh --mysql > ./dbinit/initdb.sql
・docker-composeを実行してGuacamoleを起動
$ docker-compose up -d
起動するまではちょっと時間がかかるので慌てず待つ。
この時点で、
http://【ServerIP】:8080/guacamole
にアクセスすることで、Guacamoleが使える状態になっています。guacadmin/guacadminでログイン可能(パスはすぐ変更すること)
4.LDAP利用の設定を行う
docker-compose.ymlに追記
LDAP_HOSTNAME: 192.168.1.xxx ※LDAPサーバのIPアドレス
LDAP_PORT: 389
LDAP_USER_BASE_DN: dc=xxx,dc=xxx
※ユーザー検索のベース
LDAP_SEARCH_BIND_DN: uid=admin,cn=ldapadmin,ou=Group,dc=xxx,dc=xxx
※検索する際にバインドするユーザーのDN
LDAP_SEARCH_BIND_PASSWORD: 【Pass】
※検索する際にバインドするユーザーのパスワード
SKIP_IF_UNAVAILABLE: ldap
※LDAPでのログインに失敗した際に無視する
→別にSQL Serverにアカウントが登録されてればそちらで、設定ファイルに
ユーザー登録があればそれを使うための設定
今回は公開されない範囲でやってますので平文で通信してますが、必要に応じてSSL対応とかやったほうがいいとは思います。
・LDAP認証のためのGuacamoleのエクステンションを持ってくる
$ wget http://apache.org/dyn/closer.cgi?action=download&filename=guacamole/1.1.0/binary/guacamole-auth-ldap-1.1.0.tar.gz
$ tat xzf guacamole-auth-ldap-1.1.0.tar.gz
・展開した中のldap接続エクステンションを、guacamoleが認識できるようにguacamole/home/extensions/ 配下に移動
$ cp -p guacamole-auth-ldap-1.0.0/guacamole-auth-ldap-1.1.0.jar guacamole/home/extensions/guacamole-auth-ldap-1.1.0.jar
・docker-compose.ymlを書き換えたので再起動
$ docker stop
$ docker-compose up -d
これでLDAPユーザーはログインできますが、現状何も設定していないので接続ができません。
管理者アカウントでログインし、LDAPの管理アカウント(LDAPの他のユーザーが全員見られるアカウント)に対して、Guacamoleの管理権限を与えます。
※元々あるGuacamoleアカウントは、LDAP側の権限がないので他のユーザー情報が見得ません。LDAP側で権限があるアカウントに、Guacamole側の権限を与えます。
あとはそのユーザーで接続に必要な情報を展開するなどの対応を行います。
5.リバースプロキシ対応
リバースプロキシ設定の際のTomcat側のserver.xml書き換え方法です。
Tomcat側に「この通信はリバースプロキシ経由だよ」というのを教えてあげないとCSRFと判断されてエラーになります。
通常の構築であればTomcatのインストールディレクトリを探せばいいですが、今回はDockerで導入しているので、コンテナ内のファイル強引に書き換えてます。
起動時にオプションで引数として設定ファイルを渡すなり、起動のタイミングで設定ファイルをコピーする方法もあるようですが、当方はDocker自体にそこまで詳しくないので、強引にコンテナ内のファイルを書き換えています。
・Dockerイメージ内の設定ファイルをコピー
$ sudo cp /var/lib/docker/overlay2/【docker-dir】/merged/usr/local/tomcat/conf/server.xml .
・Hostディレクティブ内に追記
$ vi server.xml
<Valve className="org.apache.catalina.valves.RemoteIpValve"
internalProxies="192.168.1.91"
remoteIpHeader="x-forwarded-for"
remoteIpProxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto" />
・Dockerイメージ内の設定ファイルを書き戻し
$ sudo cp server.xml /var/lib/docker/overlay2/【docker-dir】/merged/usr/local/tomcat/conf/
6.リバースプロキシ設定(nginx側)
別途nginxでのリバースプロキシは構築済みとします。
※時間が取れれば別途書きます。
なお、基本的にリバースプロキシをかましているのは、以前にもちょっと書いた気がしますが
・SSLを全部nginx側で終端する
・自宅サーバメインなので、ルータのポートをたくさん開放したり特殊なポートを開けたりしたくない
というような理由によります。
SSL(Let's Encrypt)設定は別途実施済みの前提で、プロキシ設定は以下のようにしています。
server{
server_name 【guacamoleの接続ホスト名】;
listen 443 ssl;
listen [::]:443 ssl;
~SSL設定省略~
location / {
proxy_pass http://192.168.1.xxx:8080/guacamole/;
proxy_buffering off;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
proxy_set_header X-Forwarded-Proto https;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_cookie_path /guacamole/ /;
}
gzip on;
}
※nginxでの各種SSL終端+リバースプロキシ設定はもしかしたら多少ニーズがあるかもしれないのでそのうち別途まとめて書きます。
シングルサインオン
ようやくKeycloakでのシングルサインオンに手を付けた。
とはいえインターネット経由で使えるようにするとなるとまたSSLの設定やらなんやら必要ですし中々面倒ですな。
まぁ構築後の面倒をさけるための構築なんだからしょうがないんですが。
ちなみにKeyCloakは、単にテスト用程度に構築する分には実はそれほど難しくありません。
JDKのインストール
# yum update -y
# yum install java-1.8.0-openjdk
keycloakのインストール
# cd /opt
# sudo wget https://downloads.jboss.org/keycloak/11.0.2/keycloak-11.0.2.tar.gz
# tar xfpz keycloak-11.0.2.tar.gz
# mv keycloak-11.0.2 keycloak
Keycloakの設定
構築内容や状況によってはほかにもいろいろ必要だが、下記はおそらく絶対必要な対応ではないかと。
# vi /opt/keycloak/standalone/configuration/standalone.xml
<interfaces>
<interface name="management">
<inet-address value="${jboss.bind.address.management:[KeycloakサーバーのIP]}"/>
</interface>
<interface name="public">
<inet-address value="${jboss.bind.address:[KeycloakサーバーのIP]}"/>
</interface>
</interfaces>
なお、実際の構築時にはいつも通りリバースプロキシを通すのでSSL化のために下記の太字部分を書き換えている
<subsystem xmlns="urn:jboss:domain:undertow:7.0" default-server="default-server" default-virtual-host="default-host" default-servlet-container="default" default-security-domain="other">
<buffer-cache name="default"/>
<server name="default-server">
- <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
+ <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true" proxy-address-forwarding="true"/>
<https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/>
<host name="default-host" alias="localhost">
<location name="/" handler="welcome-content"/>
<http-invoker security-realm="ApplicationRealm"/>
</host>
</server>
起動設定のためにサービスとして登録
# sudo vi /etc/systemd/system/keycloak.service
[Unit]
Description=Jboss Application Server
After=network.target
[Service]
Type=idle
Environment=JBOSS_HOME=/opt/keycloak
JBOSS_LOG_DIR=/var/log/keycloak/ "JAVA_OPTS=-Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true"
User=root
Group=root
ExecStart=/opt/keycloak/bin/standalone.sh -Djboss.http.port=80 -b 0.0.0.0
TimeoutStartSec=600
TimeoutStopSec=600
[Install]
WantedBy=multi-user.target
設定ファイルを再読み込みし、サービスとして登録、起動します。
# systemctl daemon-reload
# systemctl enable keycloak
# systemctl start keycloak
Keycloakでは管理者をあらかじめ登録しないとアクセスできませんので、管理ユーザーをコンソールから登録します。
ユーザー名とパスワードは任意のものを設定してください。
# /opt/keycloak/bin/add-user-keycloak.sh -r master -u 【ユーザー名】 -p 【パスワード】
これで一応構築は完了です。
ログインしての設定等はまた別途。