山城淑敬.jp

Since:2002.05.02 連絡先: shukukei@mojizuri.jp

Sophos XG Firewall Home Edition 17.5 MR9の導入に挑戦してみた。(失敗編)

サーバ用に使っていたファンレスPCが空いたので、UTMの構築にチャレンジしてみました。

PCスペック(Shuttle DS47)
 CPU:Intel Celeron 847
 RAM:DDR3L-1600 SO-DIMM 4GB×2 (crucial CT51264BF160B)
 SSD:intel SSD 520 120GB (SSDSC2CW120A3)
 NIC:Realtek RTL8111G

しかし、通信速度が7Mbpsほどに低下してしまいました。

f:id:shukukei:20200907215621p:plain



原因を調べていたところ、NICを上手く認識出来ていないのか10MBps Half Duplexでの接続になっていました。

f:id:shukukei:20200907215654p:plain


原因の切り分け(ハードorソフト)の為、同じ環境にOPNsense 20.1をインストールしてみたところ、ちゃんと1000Mbpsで接続出来ましたのでソフトウェア側に問題があるようです。
それならば仮想化してみようとVMware vSphere Hypervisor (ESXi) 6.7 U3をインストールしてみたところ・・・そもそもNICを認識しませんでした。

ここで時間切れ。
次はHyper-V Serverで試してみようかなと思います。

pub-relayを立てようとした。(備忘録)

実際にpub-relayを設置してみることにしましたが、少しハマったポイントがあったので備忘録を残しておきます。
(現状は実験的取り組みのため、URLは非公開とさせていただきます。)

現状、日本語・英語ともに情報が少なく事前調査に苦労しましたが、以下の記事を参考にさせていただきました。
・pub-relayを立ててみたい方へ
https://qiita.com/noellabo/items/5510f85648b5fa6506bb



・サーバ
サーバは、IDCFクラウドさんのLight.S1プラン(0.4円/h, 200円/月)に、ディスク容量はとりあえず8GB(1GBあたり 0.04円/h, 20円/月)で、合計360円/月という構成です。

・OS
とりあえずUbuntu 18.04.1を使用しました。
ISOイメージ( http://cdimage.ubuntu.com/releases/18.04/release/ubuntu-18.04.1-server-amd64.iso )からインストールを実行。

・パーティション構成
redisが重要になりそうですのでボリュームを分けてみました。
マウントポイント サイズ オプション
Reserved BIOS boot area 1.0 MB
/ 5.5 GB
/var/lib/redis 2.0 GB noatime nodiratime noexec
swap max

・OSインストール後に実施したこと
注)実験環境の為、rootユーザで実行していますがsudoを利用することをお勧めします。

IDCFクラウドさんの環境に最適化するために「open-vm-tools」をインストールします。
# apt install open-vm-tools

OSをアップデートします。
# apt update
# apt upgrade

ファイアウォールの設定やSSHサーバの設定、カーネルパラメータの設定を行います。
<セキュリティ上の理由により非公開>

Redisをインストール
# apt install redis-server redis-tools
# vi /etc/redis/redis.conf
# systemctl restart redis-server

Crystalをインストール
参考:https://crystal-lang.org/docs/installation/on_debian_and_ubuntu.html
# apt install curl screen
# curl -sSL https://dist.crystal-lang.org/apt/setup.sh | sudo bash
# apt install crystal libxml2-dev libgmp-dev libyaml-dev libssl-dev libreadline-dev

pub-relayをインストール
# adduser pubrelay
# su pubrelay
$ screen
$ cd
$ git clone https://source.joinmastodon.org/mastodon/pub-relay.git pubrelay
$ cd pubrelay
$ shards update
$ shards build --release

ここで少しハマってしまったのですが、以下のようなエラーが出てしまい先に進めませんでした。
$ shards
Failed to raise an exception: END_OF_STACK
[0x7fdcbf885826] ???
[0x7fdcbf8298a3] ???
[0x7fdcbf82a4b8] ???
[0x7fdcbf82c6d3] ???
[0x7fdcbf84d8c2] ???
[0x7fdcbf82b8fd] ???
[0x7fdcbfad29a5] ???


エラーメッセージで検索してみるものの解決策は見つけられず。
原因を調べるために以下のコマンドを実行。
$ strace shards
実行結果は省略しますが「open("/dev/pts/0", O_RDWR) = -1 EACCES (Permission denied)」が原因のようでしたので、とりあえずscreenを実行することで解決しました。

このあと各種設定とSystemdの設定を行うのですが・・・ドキュメント類が無いため、まずはここまで。

Misskeyインスタンスを立ててみた。(備忘録)

実際にMisskeyインスタンスを設置してみることにしました。
(現状は実験的取り組みのため、URLは非公開とさせていただきます。)
次に構築する時に備えて、以下に備忘録を残しておきます。



・サーバ
サーバは、IDCFクラウドさんのLight.S1プラン(0.4円/h, 200円/月)に、ディスク容量はとりあえず20GB(1GBあたり 0.04円/h, 20円/月)で、合計600円/月という構成です。

・OS
とりあえずUbuntu 18.04.1を使用しました。
ISOイメージ( http://cdimage.ubuntu.com/releases/18.04/release/ubuntu-18.04.1-server-amd64.iso )からインストールを実行。

・パーティション構成
マウントポイント サイズ オプション
Reserved BIOS boot area 1.0 MB
/boot 0.5 GB
/ 10.0 GB
/var/lib/mongodb 10.0 GB noatime nodiratime
swap max
・OSインストール後に実施したこと
注)実験環境の為、rootユーザで実行していますがsudoを利用することをお勧めします。

IDCFクラウドさんの環境に最適化するために「open-vm-tools」をインストールします。
# apt install open-vm-tools

OSをアップデートします。
# apt update
# apt upgrade

ファイアウォールの設定やSSHサーバの設定、カーネルパラメータの設定を行います。
<セキュリティ上の理由により非公開>

・MongoDB
データベースの管理者を設定します。
$ mongo
> use admin
> db.createUser({user: "admin", pwd: "passw0rd", roles: [{role: "userAdminAnyDatabase", db: "admin"}]})
> exit

mongodを再起動して適用。
$ sudo systemctl restart mongod

Misskeyで使用するデータベースとユーザを作成します。
$ mongo
> use admin
> db.auth("admin", "passw0rd")
> use misskey_database
> db.createUser({user: "misskey", pwd: "pa22word", roles: [{role: "readWrite", db: "misskey_database"}]})
> exit

・Misskey
Node.jsとRedisをインストールします。
$ sudo su
# apt install curl gnupg
# curl -sL https://deb.nodesource.com/setup_10.x | bash -
# apt install nodejs redis-server redis-tools git build-essential
# vi /etc/redis/redis.conf

実際にMisskeyを動かすユーザを作成します。
# adduser misskey

Misskeyをインストールしますが、node-gypを使用しない方式ではnpm run buildが上手くいかなかったのでnode-gypを使用します。(要追加検証)
# npm install -g node-gyp web-push
# su misskey
$ cd
$ git clone https://github.com/syuilo/misskey.git misskey
$ cd misskey
$ git checkout 10.33.0
各種設定を行います。
$ cp .config/example.yml .config/default.yml
$ vi .config/default.yml
ビルドを行う前にproductionにしておきましょう。
$ export NODE_ENV=production
$ npm install
$ npm install gulp-imagemin
$ node-gyp configure
$ node-gyp build
$ npm run build
これでインストールは完了です。

・Systemd
$ sudo su
# vi /etc/systemd/system/misskey.service
[Unit]
Description=Misskey daemon
After=network.target
[Service]
Type=simple
User=misskey
Environment="NODE_ENV=production"
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/misskey
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always
[Install]
WantedBy=multi-user.target


# systemctl enable /etc/systemd/system/misskey.service
# systemctl daemon-reload
# systemctl start misskey.service

これでMisskeyが動きました。

Pleromaインスタンスを立ててみた。(備忘録)

少し気になっていたので実際にPleromaインスタンスを設置してみることにしました。
(現状は実験的取り組みのため、URLは非公開とさせていただきます。)
次に構築する時に備えて、以下に備忘録を残しておきます。



・サーバ
サーバは、IDCFクラウドさんのLight.S1プラン(0.4円/h, 200円/月)に、ディスク容量はとりあえず20GB(1GBあたり 0.04円/h, 20円/月)で、合計600円/月という構成です。

・OS
とりあえずUbuntu 18.04.1を使用しました。
ISOイメージ( http://cdimage.ubuntu.com/releases/18.04/release/ubuntu-18.04.1-server-amd64.iso )からインストールを実行。

・パーティション構成
マウントポイント サイズ オプション
Reserved BIOS boot area 1.0 MB
/boot 0.5 GB
/ 10.0 GB
/var/lib/postgresql 10.0 GB noatime nodiratime
swap max
・OSインストール後に実施したこと
注)実験環境の為、rootユーザで実行していますがsudoを利用することをお勧めします。

IDCFクラウドさんの環境に最適化するために「open-vm-tools」をインストールします。
# apt install open-vm-tools

OSをアップデートします。
# apt update
# apt upgrade

ファイアウォールの設定やSSHサーバの設定、カーネルパラメータの設定を行います。
<セキュリティ上の理由により非公開>

PostgreSQLをインストールして、データページチェックサムを有効にします。
# apt install postgresql postgresql-contrib
# systemctl stop postgresql
# su postgres
$ cd
$ rm -rf /var/lib/postgresql/10/main
$ /usr/lib/postgresql/10/bin/initdb --no-locale -E UTF-8 -D /var/lib/postgresql/10/main -k
$ exit

パフォーマンスチューニングを実施。
# vi /etc/postgresql/10/main/postgresql.conf

権限を設定。
# vi /etc/postgresq/10/main/pg_hba.conf

PostgreSQLを起動して、ユーザとデータベースを作成します。
# systemctl start postgresql.service
# su postgres
$ cd
$ psql
CREATE USER pleroma_testuser PASSWORD 'passw0rd';
create database pleroma_testdb owner pleroma_testuser;
\q
# apt install apache2 git build-essential openssl imagemagick
# wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
# dpkg -i erlang-solutions_1.0_all.deb
# apt update
# apt install elixir erlang-dev erlang-parsetools erlang-xmerl erlang-tools

ユーザを追加してPleromaをインストールします。
(Wikiを参考に作業を進めました。 https://git.pleroma.social/pleroma/pleroma/wikis/home
# adduser pleroma_testuser
# su pleroma_testuser
$ cd
$ git config --global user.email "メールアドレス"
$ git clone https://git.pleroma.social/pleroma/pleroma.git pleroma
<使用したバージョンは https://git.pleroma.social/pleroma/pleroma/commit/4f03bb22998b9713d84dc8e81a3d63bb60c5b648 です。>
$ cd ~/pleroma
$ mix deps.get
Shall I install Hex ? Y
$ mix generate_config
Shall I install rebar3 ? Y
$ cd config
$ mv generated_config.exs prod.secret.exs

設定を調整します。
(/config/config.exsがサンプルファイルなのでこれを見ながら設定しました。)
$ vi prod_secret.exs
<ここでオブジェクトストレージを使用する設定を行いますが上手くいきませんでした。>
IDCFクラウドさんのオブジェクトストレージ(S3互換)とは上手くつながりませんでした。
おそらく現バージョンのPleromaはv4にしか対応しておらず、現在のIDCFクラウドさんのオブジェクトストレージはv2のため互換性が無い。
次にConoHaのオブジェクトストレージ(Openstack Swift)への接続を試しましたが、こちらも上手くつながりませんでした。

$ exit
# su postgres -c 'psql -f config/setup_db.psql'
# su pleroma_testuser
$ MIX_ENV=prod mix ecto.migrate

systemdの設定を行います。
(/installation/pleroma.serviceがサンプルファイルなのでこれを見ながら設定しました。)
# vi /etc/systemd/system/pleroma-test.service
[Unit]
Description=Pleroma social network
After=network.target postgresql.service
[Service]
User=pleroma_testuser
WorkingDirectory=/home/pleroma_testuser/pleroma
Environment="HOME=/home/pleroma_testuser"
Environment="MIX_ENV=prod"
ExecStart=/usr/local/bin/mix phx.server
ExecReload=/bin/kill $MAINPID
KillMode=process
TimeoutSec=15
Restart=on-failure
[Install]
WantedBy=multi-user.target

# systemctl daemon-reload
# systemctl enable /etc/systemd/system/pleroma-test.service
# systemctl start pleroma-test.service

稼働状況をチェックします。
# journalctl -fu pleroma-test.service

・感想
インストール作業は手順通りに進めていけば特に難しい点もなくあっさり動いてくれました。
メモリ消費量も少なくて済むので安価なVPSでもサクサク動作してくれますし、configファイルで設定が行える点や、シンプルなWebUIなどとても気に入っているのですが、管理用のWebUIが欲しいなぁ・・・と思いました。

MastodonインスタンスをMinioを使うように構築しなおした。(備忘録)

MastodonインスタンスをAmazon S3互換オブジェクトストレージサーバのMinioを使うように再構築しました。
※動かすまでに手間取って週末二回分くらいかかってしまったので備忘録を兼ねて書き記しておきます。



当初は「さくらのクラウド」の「オブジェクトストレージ」を利用する方向で検討を進めておりましたが、リトアニアにTime4VPSという格安サーバが有ると訊いたので自前でS3互換サーバを立ち上げることにしました。

ストレージVPSプランは、バックアップ無し(RAID6のみ)という条件ながらも2年契約で1TBサーバが2.99ユーロ/月と確かに格安です。

f:id:shukukei:20200907214737p:plain



OSは、apt-getからautosshをインストール出来る&長期サポートがあるUbuntu 16.04(LTS)を選択。
契約後すぐにsshが使えるようになりますので、サクサクと作業を進めていきます。


# chmod 700 iptables.sh
# ./iptables.sh
 (あらかじめiptables.shを準備しておく)

# adduser adminuser
# su adminuser

$ mkdir /home/adminuser/.ssh
$ chmod 700 /home/adminuser/.ssh
$ touch /home/adminuser/.ssh/authorized_keys
$ chmod 600 /home/adminuser/.ssh/authorized_keys
$ vi /home/adminuser/.ssh/authorized_keys
$ exit

# visudo

# vi /etc/ssh/sshd_config
 (鍵認証のみを許可するように設定)
# /etc/init.d/ssh restart

# apt-get update
# apt-get purge apache2 apache2-bin apache2-data apache2-doc apache2-utils postfix sasl2-bin
# apt-get install iptables-persistent autossh nginx-light
# apt-get upgrade
# dpkg-reconfigure tzdata
 (Mastodonが稼働しているサーバと同じタイムゾーンを選択します、不一致の場合はMastodonからS3サーバへの接続でエラーが出ます。)
 (ホストサーバはJSTですが、Docker環境はUTCで動作していましたのでUTCを選択しました。)

# vi /etc/nginx/nginx.conf
 (内容はhttps://docs.minio.io/docs/setup-nginx-proxy-with-minioを参考に、以下のような設定を行いました。)
 location / {
   proxy_buffering off;
   proxy_set_header Host $http_host;
   proxy_pass http://127.0.0.1:9000;
 
   expires 1d;
 }

# mkdir /etc/nginx/ssl
# cd /etc/nginx/ssl
# wget https://support.cloudflare.com/hc/en-us/article_attachments/201243967/origin-pull-ca.pem
# openssl dhparam 2048 -out ./dhparam.pem
# vi cloudflare.pem
# vi cloudflare.key
# chmod 400 ./*

# adduser miniouser
# su miniouser

$ cd
$ wget https://dl.minio.io/server/minio/release/linux-amd64/minio
$ chmod +x minio

$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ touch mastodon-server-user.key
$ vi mastodon-server-user.key

$ ssh user@mastodon-server.○○○○.jp -i /home/miniouser/.ssh/mastodon-server-user.key -R 9000:127.0.0.1:9000 -C -N
 (known_hostsファイルを生成させるため、一度ssh接続しておく。)

$ cd
$ vi start.sh
 (内容は以下のようにしました。)
 #!/bin/bash
 export MINIO_ACCESS_KEY=
 export MINIO_SECRET_KEY=
 export MINIO_REGION="eu-lithuania"
 export MINIO_BROWSER=on
 
 cd /home/minio/
 screen -AmdS minioscr ./minio server --address 127.0.0.1:9000 /home/miniouser/files
 autossh user@mastodon-server.○○○○.jp -i /home/miniouser/.ssh/mastodon-server-user.key -R 9000:127.0.0.1:9000 -C -N -f
 
$ exit
# vi /etc/rc.local
 (最終行に以下の1行を追加)
 /usr/bin/sudo -u miniouser /home/miniouser/start.sh
# reboot

サーバにブラウザでアクセスするとMinioのログイン画面が表示されますので、<アクセスキー>と<シークレットキー>を使ってログインします。
ログイン後、以下のような画面が表示されますので、右下の+ボタンをクリック。

f:id:shukukei:20200907214811p:plain



Create bucketをクリックして、バケットを作成します。(画面ではmastodon)

f:id:shukukei:20200907214913p:plain



画面左側に作成したバケットが表示されますので、マウスカーソルを乗せると「・・・」表示が出てきますのでクリック。

f:id:shukukei:20200907214944p:plain



Bucket Policyを設定します。
「Prefix」は空欄のまま「Read Only」で「Add」をクリックします。

f:id:shukukei:20200907215025p:plain



Bucket Policyが設定されました。
この設定を行わなかった場合、MastodonからS3サーバにアクセスは出来るもののブラウザから画像ファイルを読み込めない状態になります・・・

f:id:shukukei:20200907215109p:plain



ここまででMinioサーバの構築は完了です、Mastodonサーバの構築に移りましょう。
前回の構築からの差分は以下の通りです。


 (SiteGuard Liteのインストール方法が変わったので対応していきます。)
# yum install httpd openssl perl wget unzip make file java-1.8.0-openjdk mod_ssl policycoreutils-python
# rpm -Uvh siteguardlite-3.20-0.apache.x86_64.rpm

# semanage fcontext -a -t var_log_t "/opt/jp-secure/siteguardlite/logs(/.*)?"
# restorecon -RFv /opt/jp-secure/siteguardlite/logs
(SELinux環境では、この設定を行わないと上手くログローテートされませんでした。)
# cp /opt/jp-secure/siteguardlite/misc/logrotate.siteguardlite /etc/logrotate.d/siteguardlite
# restorecon -RFv /etc/logrotate.d/siteguardlite

# cd /opt/jp-secure/siteguardlite/
 (さくらインターネット様のマニュアルに記載の設定を行う)
# ./setup.sh
 (Webインターフェースから各種設定を行う。)
# ./setup.sh
 (メモリを空けたいので、Webインターフェースを無効にする。)

# vi /etc/yum.repos.d/nginx.repo
(ファイルの内容は以下の通り記載しました。)
 [nginx]
 name=nginx repo
 baseurl=http://nginx.org/packages/centos/7/$basearch/
 gpgcheck=1
 enabled=1

# rpm --import https://nginx.org/keys/nginx_signing.key
# yum install nginx
# vi /etc/nginx/nginx.conf
 (以下のような感じに設定しました。)
 server {
   listen 172.17.0.1:80;
   server_name 172.17.0.1;
   
   location / {
     allow 172.0.0.0/11;
     deny all;
     
     proxy_buffering off;
     proxy_set_header Host $http_host;
     proxy_pass http://127.0.0.1:9000;
   }
 }

# systemctl start nginx.service
# systemctl enable nginx.service

# yum install yum-utils
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum makecache fast
# yum install docker-ce docker-ce-selinux
# systemctl start docker.service
# systemctl enable docker.service

# curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

# semanage port -a -t http_cache_port_t -p tcp 3000
# semanage port -a -t http_cache_port_t -p tcp 4000
# setsebool -P httpd_can_network_relay on

# firewall-cmd --add-service=https --zone=public --permanent
# firewall-cmd --reload

# yum install git

# adduser mastodon
# su mastodon

$ cd /home/mastodon
$ git clone https://github.com/tootsuite/mastodon.git /home/mastodon/mastodon
$ cd mastodon
$ git fetch
$ git checkout v1.4.7
$ vi docker-compose.yml
 (永続化設定のみ実施)

$ cp .env.production.sample .env.production
$ vi .env.production
 (各種設定を行います、特筆すべき点は以下の通り。)
 SMTP_SERVER=smtp.sendgrid.net
 SMTP_PORT=587
 SMTP_LOGIN=apikey
 SMTP_PASSWORD=<パスワード>
 SMTP_FROM_ADDRESS=sendonly@○○○○.jp
 SMTP_DOMAIN= # defaults to LOCAL_DOMAIN
 #SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail
 SMTP_AUTH_METHOD=plain
 SMTP_CA_FILE=/mastodon/config/environments/gd_bundle-g2-g1.crt
 SMTP_OPENSSL_VERIFY_MODE=peer
 SMTP_ENABLE_STARTTLS_AUTO=true
 
 S3_ENABLED=true
 S3_BUCKET=mastodon
 AWS_ACCESS_KEY_ID=<アクセスキー>
 AWS_SECRET_ACCESS_KEY=<シークレットアクセスキー>
 S3_REGION=eu-lithuania
 S3_PROTOCOL=https
 S3_HOSTNAME=xn--xz1a.○○○○.jp
 S3_ENDPOINT=http://172.17.0.1
 S3_SIGNATURE_VERSION=v4

$ cd config/environments
$ wget https://certs.godaddy.com/repository/gd_bundle-g2-g1.crt
$ exit

# cd /home/mastodon/mastodon
# /usr/local/bin/docker-compose build
# /usr/local/bin/docker-compose run --rm web rake secret
# vi .env.production
# /usr/local/bin/docker-compose run --rm web rake secret
# vi .env.production
# /usr/local/bin/docker-compose run --rm web rake secret
# vi .env.production
# /usr/local/bin/docker-compose build
# /usr/local/bin/docker-compose run --rm web rails db:migrate
# /usr/local/bin/docker-compose run --rm web rails assets:precompile
# /usr/local/bin/docker-compose up -d

# crontab -e
 (デイリーのメンテナンスタスクを登録。)
 00 03 * * * cd /home/mastodon/mastodon && /usr/local/bin/docker-compose run --rm web rake mastodon:daily

# semanage fcontext -a -t httpd_sys_content_t "/home/mastodon/mastodon/public(/.*)?"
# restorecon -R -v /home/mastodon/mastodon/public

このほか、記載しておりませんがセキュリティ関係の設定等を行いました。

SSL証明書をECDSAで取得してみた。

ECDSAなSSL証明書を取得してみることにします。



まずは先例にならって使用可能なリストを確認します。

$ openssl ecparam -list_curves
  secp384r1 : NIST/SECG curve over a 384 bit prime field
  secp521r1 : NIST/SECG curve over a 521 bit prime field
  prime256v1: X9.62/SECG curve over a 256 bit prime field


今回はsecp384r1を選択して、秘密鍵とCSRを生成します。

$ openssl ecparam -out .key -name secp384r1 -genkey
$ openssl req -new -sha384 -key .key -out .csr


CSRが意図通り作成されているか確認します。

$ openssl req -in .csr -text

f:id:shukukei:20200907214349p:plain



作成したcsrをコピーアンドペーストで、申請。(今回はCOMODOさんのPositiveSSLで申請)
数分後、送られてきたサーバ証明書と中間証明書をサーバにインストールして完了。

f:id:shukukei:20200907214421p:plain




Perfect Forward Secrecyにしたいので、SSLCipherSuiteに設定できる値を調べてみる。

$ openssl ciphers -v 'EECDH+AESGCM:AES256+EECDH:AES128+EECDH'
  ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
  ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
  ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
  ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
  ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
  ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
  ECDHE-RSA-AES256-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
  ECDHE-ECDSA-AES256-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1
  ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256
  ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256
  ECDHE-RSA-AES128-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA1
  ECDHE-ECDSA-AES128-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA1


実験のために一つに絞る形で以下のように設定してみました。

SSLProtocol -all +TLSv1.2
SSLHonorCipherOrder on
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384
SSLCompression off

# OCSP Stapling
SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/run/httpd/ocsp(128000)


Header always set Strict-Transport-Security "max-age=15768000"



上手く動いてくれているようです。

f:id:shukukei:20200907214502p:plain


f:id:shukukei:20200907214533p:plain

Mastodonインスタンスを立ててみた。(備忘録)

サーバのお勉強を兼ねて、Mastodonのインスタンスを立ててみました。

構成は下図のようなイメージとなっております。

f:id:shukukei:20200907214142p:plain



追記部分に構築時のメモを残しておきますので、ご興味が御座いましたらご参考ください。



●パーティション構成
biosboot1.0 MiB
/boot0.5 GiB
/8.0 GiB
/home1.0 GiB
/var10 GiB
/var/lib/docker8.0 GiB
/mastodon70 GiB
swapmax
※CentOS 7.3.1611(Minimal)のインストーラに「inst.gpt」を与えて、明示的にGPTパーティションとしています。

OSインストールはVNCコンソールから行いましたが、以後の設定は全てSSH接続で行います。

●gccをインストールします。
Minimalインストールした場合gccが入っておりません・・・
また、後々インストールしようとすると依存関係が解消できずにハマったので最初に入れておきます。

$ sudo su
# yum install gcc screen


●一度抜けてscreenを使用します。
これで通信障害に見舞われた場合でも最悪の事態は回避出来ます。

# exit
$ screen
# sudo su


●ファイアウォール設定は最小限にします。
DHCPは使っていないので、ファイアウォールから削除します。

# firewall-cmd --remove-service=dhcpv6-client --zone=public --permanent
# firewall-cmd --reload


●ファイアウォール設定は最小限にします。
SSH接続出来るドメインを制限しておきます。
1.hosts.allowの最終行に「sshd: ●●.△△.jp」を追加。
2.hosts.denyの最終行に「ALL: ALL」を追加。

# vi /etc/hosts.allow
# vi /etc/hosts.deny


●sshdの設定変更を行います。
特定のユーザのみ(AllowUsers)、かつ、鍵認証でのみ接続出来るように設定ファイルを変更します。

# vi /etc/ssh/sshd_config

ホストキーを作り直しておきます。

# ssh-keygen -t dsa -b 1024 -f /etc/ssh/ssh_host_dsa_key -N ''
# ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N ''
# ssh-keygen -t ecdsa -b 521 -f /etc/ssh/ssh_host_ecdsa_key -N ''
# ssh-keygen -t ed25519 -b 256 -f /etc/ssh/ssh_host_ed25519_key -N ''

鍵認証用のファイルを作成。

$ mkdir /home/ユーザ/.ssh
$ chmod 700 /home/ユーザ/.ssh
$ touch /home/ユーザ/.ssh/authorized_keys
$ chmod 600 /home/ユーザ/.ssh/authorized_keys
$ vi /home/ユーザ/.ssh/authorized_keys

sshdを再起動。

$ sudo su
# systemctl restart sshd.service


●suできるユーザを限定しておきます。

# vi /etc/pam.d/su


●chronyd(ntpd)の設定を変更します。
※以下のサーバに設定しています。
server ntp1.sakura.ad.jp
server ntp1.v6.mfeed.ad.jp
server ntp2.v6.mfeed.ad.jp
server ntp3.v6.mfeed.ad.jp

# vi /etc/chrony.conf
# systemctl restart chronyd.service
# chronyc sources


●アップデートを実施して再起動します。

# yum update
# reboot


●メールの転送設定を行います。
※例えば「root: shukukei@mojizuri.jp」のように設定しています。

$ screen
$ sudo su
# vi /etc/aliases
# newaliases


●Postfixの設定を行います。
直接送るのではなく、外部のメールサーバを経由して送信するように設定しています。

# yum install cyrus-sasl-plain
# vi /etc/postfix/main.cf

今回はSendGridさんを経由して送信したいので、以下の設定を記述しました。

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = static:apikey:
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
header_size_limit = 4096000
relayhost = [smtp.sendgrid.net]:587

たとえばGmailさんを経由して送信する場合は、以下のような設定で送信出来ます。

smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = static:メールアドレス:パスワード
smtp_sasl_tls_security_options = noanonymous
smtp_tls_security_level = encrypt
relayhost = [smtp.gmail.com]:587

Postfixを再起動します。

# systemctl restart postfix.service



ここからがMastodon v1.2.2のインストールとなります。



●Dockerをインストールします。

# yum install yum-utils
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum makecache fast
# yum install docker-ce docker-ce-selinux
# systemctl start docker.service
# docker run hello-world

# useradd mastodon
# usermod -aG docker mastodon

# systemctl restart docker.service

# su mastodon
$ docker run hello-world
$ exit

# systemctl enable docker.service


●GitとDocker Composeをインストールします。

# yum install git
# curl -L https://github.com/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

# chown mastodon.mastodon /mastodon
# semanage fcontext -a -t user_home_dir_t "/mastodon(/.*)?"
# restorecon -R -v /mastodon


●Mastodonをインストールします。
※masterではなく、タグ付けされたバージョンを追いかけることにしました。

# su mastodon

$ cd /mastodon
$ git clone https://github.com/tootsuite/mastodon.git /mastodon
$ git checkout $(git describe --tags `git rev-list --tags --max-count=1`)

永続化設定(2行×2カ所、4行をコメント解除)と、sidekiqを4つに分けました。

$ vi docker-compose.yml

執筆時点でのsidekiq設定値は以下の通り。
default:14
mailers:2
pull:2
push:2

数を変えたい場合は、docker-compose.ymlを編集後に以下を実行すればよいらしい。(未検証)

$/usr/local/bin/docker-compose down --remove-orphan
$/usr/local/bin/docker-compose up -d

設定を行います。

$ cp .env.production.sample .env.production
$ vi .env.production

具体的には以下の変更を行いました。

DB_POOL=20

~中略~

LOCAL_DOMAIN=○○○○.jp
LOCAL_HTTPS=true

~中略~

DEFAULT_LOCALE=ja

~中略~

SMTP_SERVER=smtp.sendgrid.net
SMTP_PORT=587
SMTP_LOGIN=apikey
SMTP_PASSWORD=
SMTP_FROM_ADDRESS=sendonly@○○○○.jp
SMTP_DOMAIN= # defaults to LOCAL_DOMAIN
#SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail
SMTP_AUTH_METHOD=plain
SMTP_OPENSSL_VERIFY_MODE=peer
SMTP_ENABLE_STARTTLS_AUTO=true


SendGridさんでメールを送りたいので、追加で以下の設定を行いました。

$ cd config/environments
$ vi production.rb
 :ca_file => File.expand_path(File.dirname(__FILE__)) + '/gd_bundle-g2-g1.crt',
$ wget https://certs.godaddy.com/repository/gd_bundle-g2-g1.crt
※以下のウェブサイトを参考にさせていただきました。
Mastodon+SendGridでSMTP_OPENSSL_VERIFY_MODEをpeerで動作させる - Qiita

シークレットを生成します。

$ cd /mastodon
$ /usr/local/bin/docker-compose build
$ /usr/local/bin/docker-compose run --rm web rake secret
$ vi .env.production
$ /usr/local/bin/docker-compose run --rm web rake secret
$ vi .env.production
$ /usr/local/bin/docker-compose run --rm web rake secret
$ vi .env.production

データベースとアセットを準備して立ち上げます。

$ /usr/local/bin/docker-compose run --rm web rails db:migrate
$ /usr/local/bin/docker-compose run --rm web rails assets:precompile
$ /usr/local/bin/docker-compose up -d

定期的なメンテナンスを実施するようにcron設定を行います。

$ crontab -e

具体的には以下の2行を追加しました。

00 3 * * * cd /mastodon && /usr/local/bin/docker-compose run --rm web rake mastodon:daily
00 3 * * 5 cd /mastodon && /usr/local/bin/docker-compose run --rm web rake mastodon:media:remove_remote


●Apacheの設定を行います。

$ exit
# vi /etc/httpd/conf.d/ssl.conf

証明書等の設定の他に、以下のような設定を行いました。

DocumentRoot "/mastodon/public"
ServerName ○○○○.jp:443


        Require all granted


ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"
ProxyPass /500.html !
ProxyPass /oops.png !
ProxyPass /api/v1/streaming/ ws://localhost:4000/
ProxyPassReverse /api/v1/streaming/ ws://localhost:4000/
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/

ErrorDocument 500 /500.html
ErrorDocument 501 /500.html
ErrorDocument 502 /500.html
ErrorDocument 503 /500.html
ErrorDocument 504 /500.html


●SELinuxの設定を行います。

# semanage fcontext -a -t httpd_sys_content_t "/mastodon/public(/.*)?"
# restorecon -R -v /mastodon/public

# semanage port -a -t http_cache_port_t -p tcp 3000
# semanage port -a -t http_cache_port_t -p tcp 4000
# setsebool -P httpd_can_network_relay on

最後にhttpdを再起動して、ファイアウォールの設定を行えば完了です。

# systemctl restart httpd.service
# firewall-cmd --add-service=https --zone=public --permanent
# firewall-cmd --reload


コマンドラインでも実施出来るようですが、
面倒だったので動作確認も兼ねてブラウザでサーバにアクセスし、管理者用とするユーザを作成します。
ユーザ作成後、以下のコマンドで管理者権限を付与します。

# su mastodon
$ /usr/local/bin/docker-compose run --rm web rails mastodon:make_admin USERNAME=ユーザ名
$ exit


メモリとディスクの消費量は以下のような感じです。
※SiteGuard Liteのメモリ消費量も含んでいます。

f:id:shukukei:20200907214233p:plain




●さらに追加で以下の設定を行いました。(検証中)


/etc/httpd/conf.d/autoindex.conf
→全行コメントアウト。

/etc/httpd/conf.d/welcome.conf
→全行コメントアウト。
(削除すると再生成されるため削除してはいけないらしい)

/etc/httpd/conf.modules.d/00-base.conf

#
# This file loads most of the modules included with the Apache HTTP
# Server itself.
#

LoadModule access_compat_module modules/mod_access_compat.so
#LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
#LoadModule allowmethods_module modules/mod_allowmethods.so
#LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_core_module modules/mod_authn_core.so
#LoadModule authn_dbd_module modules/mod_authn_dbd.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_socache_module modules/mod_authn_socache.so
LoadModule authz_core_module modules/mod_authz_core.so
#LoadModule authz_dbd_module modules/mod_authz_dbd.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
#LoadModule authz_host_module modules/mod_authz_host.so
#LoadModule authz_owner_module modules/mod_authz_owner.so
#LoadModule authz_user_module modules/mod_authz_user.so
#LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule cache_module modules/mod_cache.so
#LoadModule cache_disk_module modules/mod_cache_disk.so
#LoadModule data_module modules/mod_data.so
#LoadModule dbd_module modules/mod_dbd.so
#LoadModule deflate_module modules/mod_deflate.so
LoadModule dir_module modules/mod_dir.so
#LoadModule dumpio_module modules/mod_dumpio.so
#LoadModule echo_module modules/mod_echo.so
#LoadModule env_module modules/mod_env.so
LoadModule expires_module modules/mod_expires.so
#LoadModule ext_filter_module modules/mod_ext_filter.so
#LoadModule filter_module modules/mod_filter.so
LoadModule headers_module modules/mod_headers.so
#LoadModule include_module modules/mod_include.so
#LoadModule info_module modules/mod_info.so
LoadModule log_config_module modules/mod_log_config.so
#LoadModule logio_module modules/mod_logio.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule mime_module modules/mod_mime.so
#LoadModule negotiation_module modules/mod_negotiation.so
LoadModule remoteip_module modules/mod_remoteip.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
#LoadModule slotmem_plain_module modules/mod_slotmem_plain.so
#LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
#LoadModule socache_dbm_module modules/mod_socache_dbm.so
#LoadModule socache_memcache_module modules/mod_socache_memcache.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#LoadModule status_module modules/mod_status.so
#LoadModule substitute_module modules/mod_substitute.so
#LoadModule suexec_module modules/mod_suexec.so
LoadModule unique_id_module modules/mod_unique_id.so
LoadModule unixd_module modules/mod_unixd.so
#LoadModule userdir_module modules/mod_userdir.so
#LoadModule version_module modules/mod_version.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so

#LoadModule buffer_module modules/mod_buffer.so
#LoadModule watchdog_module modules/mod_watchdog.so
#LoadModule heartbeat_module modules/mod_heartbeat.so
#LoadModule heartmonitor_module modules/mod_heartmonitor.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule dialup_module modules/mod_dialup.so
#LoadModule charset_lite_module modules/mod_charset_lite.so
#LoadModule log_debug_module modules/mod_log_debug.so
#LoadModule ratelimit_module modules/mod_ratelimit.so
#LoadModule reflector_module modules/mod_reflector.so
#LoadModule request_module modules/mod_request.so
#LoadModule sed_module modules/mod_sed.so
#LoadModule speling_module modules/mod_speling.so

/etc/httpd/conf.modules.d/00-lua.conf

#LoadModule lua_module modules/mod_lua.so

/etc/httpd/conf.modules.d/00-proxy.conf

# This file configures all the proxy modules:
LoadModule proxy_module modules/mod_proxy.so
#LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
#LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
#LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_express_module modules/mod_proxy_express.so
#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
#LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so

/etc/httpd/conf.modules.d/00-dav.conf

#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_lock_module modules/mod_dav_lock.so

/etc/sysctl.conf

net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_sack = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

net.core.somaxconn = 4096
net.core.netdev_max_backlog = 4096

kernel.sysrq = 0
kernel.panic = 120
#vm.swappiness = 0

/etc/rc.local
※「# chmod +x /etc/rc.local」を実行すること。

/sbin/ip link set dev eth0 txqueuelen 60000
/sbin/ethtool -K eth0 tx off sg off tso off gso off gro off
/sbin/ip link set dev eth1 txqueuelen 60000
/sbin/ethtool -K eth1 tx off sg off tso off gso off gro off
/sbin/ip link set dev eth2 txqueuelen 60000
/sbin/ethtool -K eth2 tx off sg off tso off gso off gro off


いつもはDebian GNU/Linuxとnginxを使っており、CentOSとApacheの組み合わせに手間取りましたので備忘録としてこの記事を残しておきます。