.JPドメインのWhois公開代行設定のためにレジストラを「お名前.com」から「value-domain」へ移管した話

ドメイン移管のキッカケ

.JPドメインはWhois公開代行設定ができないルールになっていたのだが、お名前.comから「.JPドメインの公開代行設定」ができる旨のダイレクトメール(スパムメール)が届いた。

以前から.JPドメインだけ所有者の氏名が晒される状態になっているので、Whois公開代行で氏名を非公開にできるのかどうか調査した。

.jpドメインを「お名前.com」のレジストラで運用する場合の注意点

  • お名前.comでも「whois公開代行設定」が可能で、.jpドメインにも適用可能なのだが、住所と連絡先だけ公開代行業者(お名前.com)に設定されて氏名はWhois情報に公開されてしまう

  • .jpドメイン以外の「whois公開代行設定」であれば、氏名も含めて公開代行業者(お名前.com)の情報で公開され、登録者の氏名は公開されない

  • お名前.comの「Whois公開代行設定」はドメイン登録時のみ無料で設定できるが、登録時に「Whois公開代行設定」を設定しなかったり、解除してしまうと、途中から「公開代行設定」にすると1年間あたり1078円の料金がかかる。(※ドメイン料金も別途かかる)

  • 「お名前.com」は新規登録の価格ばかり強調されていて2年目以降の更新料金が分かり辛い
    特に.jpドメインは他社と比べて料金も割高なので、比較検討してレジストラを決めた方がいい

    ※ 「お名前.com」の更新料金は一覧が分かりづらいので、独自にRSS情報にまとめている⇩

    https://blog.hidenori.biz/feed/onamae.xml

「お名前.com」以外のレジストラでのWhois公開代行設定

  • .jpドメインでも氏名を公開せずに「Whois公開代行」を設定できるレジストラがある

  • スタードメイン、エックスドメイン、バリュードメインは「whois公開代行」で氏名を公開しない設定が可能らしい

「お名前.com」から「value-domain」へ.JPドメインの移管手続きをする

サービスで利用する.jpドメインは所有者名を非公開にしたいので、「お名前.com」から「value-domain」へ.JPドメインの移管手続きをすることにした

移管先「value-domain」 にアカウントを作成する

アカウントの作成はメールアドレスだけがあれば問題ない。ドメインの登録や更新時に決済手段が必要になるが、Amazon決済が利用できるので「value-domain」へクレジットカードを登録しなくても決済は可能になる。

「value-domain」で .JPドメイン用の移管手続きを登録する

(2021/12/26までは無料で移管できたのだが、12/27から1年間の更新手数料が必須になっている)

https://www.value-domain.com/hjp.php?action=DomainTransferRequestFree1

但し、移管元の設定を変更せずに移管申請すると却下される場合がある

変更元業者に拒否される場合は変更できない

「お名前.com」からドメイン移管(転出)する場合の条件がわかりづらい。
自分の場合は3回却下されたので、承認されるための条件を下記する

https://www.onamae.com/guide/p/80

※「お名前.com」の該当ドメインで以下のオプションが設定されていたら無効化する

  • 「ドメイン移転ロック」
  • 「Whois公開代行」
  • 「自動更新」

    ※ Whois公開代行を無効化すると住所氏名まで公開されてしまうので、早急に移管手続きを進めた方がいい

その他にも移管に失敗する条件があるので、以下の条件を満たしているか確認する

https://www.value-domain.com/transfer.php?action=notes

  • 移行するドメインが取得後に60日以上経過している
  • 有効期限が14日以上ある
  • 有効期間が9年を超えていない
  • 管理業者によってドメインがロックされていないか(※前述のオプションが設定されていると事業者側で移管が拒否される)
  • .JPドメイン以外の場合は「AuthCode」を移管元から取得して移管先に登録する必要がある

お名前.com側で、「ドメイン移転ロック」「Whois公開代行」「自動更新」を解除

解除したことを確認してから、「value-domain」の.JPドメイン用の移管手続きを登録する

https://www.value-domain.com/hjp.php?action=DomainTransferRequestFree1

設定上の問題がなければドメイン移管先事業者(今回の例はvalue-domain)による審査が開始される。

  • 移管の審査には15日程度かかる場合がある。
  • 設定等に不備がなければ営業時間外でも速やかに承認される
  • 移管申請中はwhois情報で個人情報が丸見えになるので注意が必要

移管元が「お名前.com」の場合、移管申請の確認メールが届く。これを見落としていると移管手続きが進まない

  • お名前.comに登録したメールアドレスへ「【重要】トランスファー申請に関する確認のご連絡」という表題のメールが届いている
    (※お名前.comはスパムメールを大量に配信することで悪名高い事業者なので、メールが埋没していないか注意が必要)

  • メール内にドメイン移管を承認するURLが記載されているので、お名前.comへログインして「承認」をクリックする

  • メールを見落としていると7日後に移管元「お名前.com」側で移管申請が却下される

  • 移管が完了するとvalue-domain側に設定した「移管先登録者番号」の登録者名がwhoisに公開される

  • 移管後にvalue-domain側で「Whois情報公開代行」を設定する

    • 料金は無料で、設定手順は以下にある

    https://www.value-domain.com/userguide/manual/whoisproxy_on

    • 登録者名は任意の氏名を登録する必要があって、氏名は公開される
    • 登録者名は氏名でなくてもドメイン名を登録すればよい(value-domainの設定ページに注釈で書かれている)
    • 登録者の氏名以外(住所・電話番号等)はvalue-domainの情報が公開される

.jpドメインを「value-domain」で運用する場合の注意点

  • 取り扱いドメインが「お名前.com」のように豊富ではない(お名前.comだと殆ど全てのドメインを取り扱っている)

  • ドメイン価格は「お名前.com」と同程度だが、異常に安いキャンペーン料金は殆どない
    更新料金は「value-domain」のほうが安い場合も多い。

今回のドメイン移管まとめ

  • これまでは .JPドメインで「whois公開代行設定」を設定しても、氏名だけは公開されてしまうルールになっていた

  • 現在の規定では、.jpドメインの「whois公開代行」の仕様はドメインレジストラに依存しており、レジストラによっては氏名を公開しなくても良い場合がある

  • スタードメイン、エックスドメイン、バリュードメインの登録事業者であれば、.jpドメインでも「whois公開代行設定」で氏名を非公開にすることができる

  • 「Value-Domain」は他社からの移管費用も無料で、.JPドメインの公開代行設定も無料で設定ができる

  • 「お名前.com」も「Value-domain」もどちらもGMOグループなので、信頼性はあまり変わらない。「お名前.com」は取り扱いドメインが豊富で競合他社よりも価格が安いが営業が悪質で、「Value-domain」は取り扱いドメインが限られているが価格はお名前.comと殆ど変わらない安さで管理画面が使い易い。

  • 料金だけで比較するとcloudflareのドメイン更新料金が最も安価だが、cloudflareでは.JPドメインを取り扱っていない。

  • .JPドメイン以外のドメイン移管の場合は所有を証明するための「AuthCode」が必要になる。
    但し、.JPドメインは所有を証明するための「AuthCode」が存在しない

  • 実際に.jpドメインを「お名前.com」から「value-domain」へ移管して、管理者名を非公開にすることができた

ActiveRecord::Base.establish_connection 周りのエラーと対策の備忘録

2021年にruby2.5がEOLになったのでツールをメンテすることに

  • 安定していた2.5系が2021年4月5日でEOLに
  • rbenvで2.6系, 2.7系, 3.0系をインストールして動作確認をする

備忘録として注意点や具体的な対策等をブログに残します。

2.6,2.7よりも3.0系以上の方がいいらしい

理由は後述するが、バグや脆弱性対策を考慮すると2.6,2.7系よりも3.0以降を利用したほうが良い。
但し、3.0以降は破壊的変更が多数あるので、gemの依存関係で動かない場合は2.7系の最新版を使った方が良い場合もある。
今回はRuby 3.0.3を利用して Gemfile のうち以下つをバージョン指定にすると正常にインストールができた。

  • Gemfileの例(Ruby 3.0.3利用)
    gem 'psych', '~> 4.0'
    gem 'bigdecimal', '1.4.2'
    gem 'psych', '~> 4.0'
    gem 'mysql2', '~>0.4.9'
    

上のgem以外は個別にバージョン指定が必要なコンポーネントを調べて、
"gem update”でバージョンに合致するgemにアップデートすればいい。

YAML周りの謎のエラー

  • YAML.load_fileが非推奨化で、なぜかYAML.unsafe_loadが代替

  • YAML.unsafe_loadだとデータが空っぽで読み込まれる

  • エラーが意味不明

    undefined method `[]' for nil:NilClass (NoMethodError)
    

    上記は、YAML.unsafe_loadでデータを読み込んだけど中身が空っぽだったので接続情報(establish_connection)に渡した内容(Class)もNilになっているという意味らしい。

  • YAML周りのエラーと仕様変更について

    • YAML.load_file(Psych.load)の処理ではRCEの脆弱性が含まれていて、既存の仕様では対策ができないので廃止になったらしい
    • RCE脆弱性といえばlog4jで大騒ぎになったアレだが、RubyのYAML周りの処理もclass変換される仕様なので、yml処理がハックされると同様の危険性がある
    • 脆弱性に対応した YAML.load_file が提供される予定は今のところ発表されていない
      https://zenn.dev/ooooooo_q/books/rails_deserialize/viewer/yaml

これまでYAML.load_fileで対処できていたDBの初期化は、自前でyamlなりjsonを読み込んで実装する必要がある。

ActiveRecord::Migration 周りでエラーが発生した場合

Rails5以降にアップデートしてMigrationしたコードの場合は自動生成されるのだが、
単体でActiverecordを利用している場合は、Migrationメソッドにバージョン番号を付与しなければならない仕様が追加されている。

  • 旧来のMigrationコード

    class CreateRssTable < ActiveRecord::Migration
    
  • Rails5以降のMigrationコード

    class CreateRssTable < ActiveRecord::Migration[7.0]
    

手っ取り早くMySQL周りを動作確認する

  • 旧来の接続処理を外す

単体でactiverecordを使う場合は、以下のような初期化処理を使うことが多いと思うのだが、
旧来の処理はコメントアウトする。

#config = YAML.load_file('./database.yml')
#ActiveRecord::Base.establish_connection(config["db"]["development"])

代わりに以下のようにestablish_connectionへ接続情報を付与する。
ハードコードになってしまうが、動作確認して問題がなければ、外部読込みに置換えればいい。

ActiveRecord::Base.establish_connection(
:adapter => "mysql2",
:host => "localhost",
:database => "db_name",
:user => "db_user",
:password => "db_password"
)

対策した感想

脆弱性の背景を知れば「仕方がない」とも思えるが、
YAML.load_fileのような基本的な処理が突然使えなくなると「Rubyを使うのをやめよう」と思う人も多いような気がする。
自分もあまりRubyを使わなくなってしまったが、日本製のプログラム言語として頑張ってほしい。

Pythonでの _ctype の依存関係エラー対策の備忘録 / ModuleNotFoundError: No module named _ctypes 対策

不具合対策の備忘録です

概要

pyenv/venvで構築したpython環境で、
pythonのパッケージインストール(pip等)した場合に_ctype エラー(ModuleNotFoundError: No module named _ctypes)が解消しない場合は、
pyenv uninstall で該当のPythonバージョンを消して、
pyenv install をやり直す必要がある。

具体的な例と対策手順

pyenv/venvで正常に環境構築できているPython環境でも

pip install mysqlclient
pip install requests
pip install django
pip install selenium

等でctypeの依存関係エラーが発生する場合がある。

ModuleNotFoundError: No module named _ctypes

上のエラーを解決するには、
該当のPythonバージョンを削除して、依存関係のパッケージをインストールしてから、Pythonを再インストール(rebuild)する必要がある。

※ 該当のPythonバージョンは一度アンインストールする(リビルドが必要)

※ 2022年追記:アンインストール前に現在のパッケージ一覧を保存しておくと良いです

pip freeze > require_`date "+%Y%m%d".`txt
  • pyenv で 特定のパッケージバージョンをアンインストールする例
pyenv uninstall 3.8.9
pyenv uninstall 3.8.12

※ 以下からはUbuntu前提の例です

関連するOSパッケージをインストールする

sudo apt install python3-dev build-essential default-libmysqlclient-dev
sudo apt install libncursesw5-dev libgdbm-dev libc6-dev libctypes-ocaml-dev zlib1g-dev libsqlite3-dev tk-dev 
sudo apt install libssl1.1 libssl1.1=1.1.1f-1ubuntu2 libssl-dev libmysqlclient-dev
sudo apt install librust-libsodium-sys-dev

パッケージの依存関係が分かるなら、python3-パッケージ名もインストールする。

sudo apt install python3-*

※依存関係でインストールできないパッケージが表示された場合は、パッケージを選択してインストールする

pyenvでpythonバージョンをインストール

※3.8.12をインストールする場合

pyenv install 3.8.12
pyenv local 3.8.12
pyenv global 3.8.12

pythonのパッケージを再インストールする

pip install mysqlclient
pip install requests
pip install django
pip install selenium

※ 必要であれば、保存したパッケージ一覧を再インストールする

pip install -r require_`date "+%Y%m%d".`txt

エラーが表示されなければOK.

_ctypeエラーが続く場合は、もう一度Pythonをアンインストールして、必要なパッケージを入れ直してから再インストールする。

  • pyenv-winを利用している場合

_c_typeエラー等が含まれていると、WindowsではPythonをリビルドしてパッケージの依存関係を解消することが難しい。だから、WindowsではWin用のバイナリパッケージが提供されているバージョンを利用するか、WSLを利用したほうがいい。
(※pacman等のパッケージマネージャで依存関係を解消できるかもしれないですが、未検証です)

AmazonLinux2で運用しているdotnet core3.1環境をアップデートしたら502エラーになった症状と対策の備忘録

不具合の発生状況

  • .NET core 3.1環境で運用しているWebシステムを.NET6対応にパッケージをアップデートすると、再起動後に502エラーになってしまった。

不具合発生時の影響

  • パッケージアップデート以外にシステム設定に変更なし
  • nginx にもエラーなし
  • パッケージアップデート後も再起動までは正常に動作していた
  • ログを調査してもdotnetを呼び出すサービスが失敗しているだけで「502エラー」以外に不具合がない

不具合の原因と対処方法

原因

  • systemdでデーモン化していたので、その起動コマンドが失敗していた
  • 古いバージョンは /usr/bin/dotnet コマンドだったのだが、
    新しいバージョンは /usr/local/bin/dotnet にコマンドのパスが変わっている
  • 通常のコマンド実行ではPATH環境変数に含まれるので問題は起きないが、
    デーモン化している場合はフルパスでコマンドを指定する必要があるため、パス環境が変わっているとコケる

対処方法

  • systemdのサービスの dotnetコマンドのパスを変更する
  • もしくは、/usr/bin/dotnet にシンボリックリンクを作成する

※後者は恒久的にシステムに影響するので、できるかぎり前者対応したほうがいい。

調査した類似の不具合

ありえそうな事例なのに、stackoverflowを探しても同じ事例が見つからなかった。

1つ参考になったのは「.NET coreをLinuxに構築したのだが、ブラウズしようとすると502 Bad gateawayと表示される」という質問に対して

https://stackoverflow.com/questions/59949388/502-bad-gateway-on-asp-net-core-3-0-hosted-in-ubuntu-18-04-tls-with-nginx

「コンソールで立ち上げてみて動作するかどうか確認してはどうか?」
という回答

dotnet run --urls http://0.0.0.0:5000

上の例は単純にdotnetコマンドを設定していなかったエラーなのだが、結果的に参考になった。

.NET以外でもsystemdでデーモン化したファイルがシステムアップデートでPATHが変わると影響するので、今後の備忘録として役に立てば幸いです。

NextcloudをアップデートするとNextcloudMailでメールを送信できなくなった。※原因と対処方法まとめ

表題のとおり、Nextcloudをアップデートするとメール送信ができなくなったので、調査内容と原因、対処方法を備忘録に残しておく。


調査内容

  • Nextcloudのメールログにも、メールサーバのログにも異常はない
  • 他のメールクライアントからは正常に送信可能
  • 不具合の発生しているNextcloudMailでもメール受信は正常にできる
  • nginxのログにupstreamエラーを発見
upstream timed out (110: Connection timed out) while reading response header from upstream


原因(推測)

  • phpのメール送信時のバッファ処理が不足している?
  • アップデートによって適切なバッファサイズでの通信ができなくなった?
  • NextcloudMailのバグ?


対処方法

エラー以外でもUIの挙動が重くなっているのが気になったのでnginxの設定を見直し、
nginxのserverディレクティブ内のproxy_buffers値を以下のように設定する。

※設定例

server {
proxy_busy_buffers_size   512k;
proxy_buffers  8 512k;
proxy_buffer_size   512k;
## ~省略
}

※デフォルト値はそれぞれ4~16kで設定されている。
※メモリが少ない環境の場合は128k程度でもOK。


Nextcloudの活用

Nextcloudは上手く運用すれば、Microsoft系のクラウドOfficeサービスやGoogle Workspace関連のコストを大幅に削減できます。ある程度の知識があるエンジニアがいれば中小企業でも数百人単位の中堅企業でも安価に導入・運用が可能です。

コスト以外でも、Zoom相当のビデオ会議を無料で構築できる「Nextcloud talk」は社内外のビデオミーティングに活用できます。情報が傍受されているLINEやZoomを業務で使わせないためのソリューションとしても有用です。


参考記事

Redmine から full_text_search プラグインをアンインストールする手順

Redmine から full_text_search プラグインをアンインストールする手順

目的

apt upgrade に失敗するようになった復旧対応

  • エラー内容

Redmineのプラグインが原因で apt = dpkg が壊れることがある

dpkg: error processing package python-pkg-resources (--remove):
dependency problems - not removing
Errors were encountered while processing:
gyp
python-pkg-resources

上記のエラーでaptアップデートに失敗する場合は、mroonga関連のパッケージとRedmineのmroongaプラグインを削除後に、再度アップデート(apt update / apt upgrade)すれば解決した。

インターネットで検索してもアンインストール手順が纏められた情報がなかったので、備忘録としてブログにしておく。

※ ubuntu のパッケージで Redmine インストールした前提の手順です

sudo 権限のあるユーザーでログイン

ubuntuの場合は 「ubuntu」ユーザー等の sudo権限のあるユーザーでログインしている前提とする。

Redmineはデフォルトのインストール場所 /usr/share/redmine に格納されている前提とする

cd /usr/share/redmine

bundle exec 実行

依存関係を更新する。

sudo bundle exec rake redmine:plugins:migrate NAME=full_text_search VERSION=0 RAILS_ENV=production

pluginのファイルをディレクトリごと移動する

不具合が発生したときに戻せるように、下記はHOMEディレクトリにバックアップする。

cd plugins
mkdir -p ~/backup/redmine-plugins
sudo mv full_text_search ~/backup/redmine-plugins

Mroongaを継続利用する場合は再インストール

  • Mroonga

Mroonga のインストール手順は公式等で公開されている

https://mroonga.org/ja/blog/

  • full_text_search プラグイン公式

https://www.redmine.org/plugins/full_text_search

追記:Mroongaのインデックスが生成されたテーブルをSelectやmysqldumpで出力するとエラーになる場合の対策

Mroongaをアンインストールした後も、既存のテーブルがMroongaで印デックスされているとSelectやmysqldumpでテーブル参照(射影)ができなくなる場合がある。

対策

  • テーブルに登録されたEngine(Mroonga)を、AlterやUpdateで強制的に上書きしてもエラーは修復できない
  • Mroongaを再インストールすると再度テーブル参照できるようになる
  • mysqldumpで対象のDBを出力してから、mysql(or mariadb)をアンインストールして、データディレクトリ(/var/lib/mysql等)を物理削除してから、mysqlを再インストールする

mysql5.7系のRDSをVPS上のmysql8へリプレイスした備忘録

目的

MySQL5系のシステムをMySQL8系へ移行する

後述するが、MySQL8は5.7から大幅に仕様が変更されていて、特にリモート接続で利用するときに従来にない追加の設定が必要になる。

これまでMySQL5.7を採用して運用してきたが、MySQL8がRedhat/CentOS系やDebian/Ubuntu系でサポートされて接続アダプタも対応しはじめてきたので、MySQL8を検証して問題がなければ本番環境も移行する。

セキュリティと性能が確保できればRDSをVPS上のMySQLへ置き換える

私的なサービスでAWSのAmazonRDSを利用しているのだが、コストパフォーマンスが悪く、カタログスペック以上に性能が低い。このRDSで運用しているMySQLをAWS外のMySQLへ置き換える事を検討している。
MySQL8からリモート接続の仕様がSSL通信がデフォルトに、かつ認証アダプタがsha2のハッシュ暗号化になり、リモート接続時のレスポンス低下を回避しながらセキュリティが大幅に向上している。

対象 CPU メモリ ストレージ 料金 VPC Firewall 経路暗号化 ハッシュ化
RDS Micro 1core 1GB 40GB 約5000円 あり あり なし なし
VPS 2core 2GB 40GB 699円 なし あり TLS SHA2

具体的施策

事前検証

開発環境&ステージング環境でMySQL8へアップグレードして検証

MySQL5.7からMySQL8への接続はデフォルトの認証アダプタが異なるため接続できない等の問題点が多いので、開発環境やステージング環境をMySQL8へアップグレードして検証してから、更に本番環境でもMySQL8を検証する。

MySQL接続アダプタ mysql.data.dll / mysql.data.jar 等の検証

アダプタがMySQL8以降のデフォルトになった認証アダプタ caching_sha2_password をサポートしているかどうかの情報が少ない。

利用するアダプタと同じバージョンのmysql.data.dll や mysql.data.jar を使ってmysqlclientで接続テストをしておく。

具体的な設定

MySQL8用のssl鍵を作成する

mkdir ssltmp
cd ssltmp
vim gen-mysqlsql.sh

SSL/TSL鍵の生成スクリプト

#!/bin/bash
## etc
datadir=/etc/mysql/ssl
if [ ! -d $datadir ]; then
sudo mkdir -p $datadir
sudo chown mysql: $datadir -Rf
fi
# Generate certs if needed
if [ ! -e "${datadir}/server-key.pem" ] ; then
echo mysql_ssl_rsa_setup
sudo mysql_ssl_rsa_setup --datadir="$datadir" --uid=mysql
fi

実効権限を付与してスクリプト実行

chmod +x ./gen-mysqlsql.sh
./gen-mysqlsql.sh

my.cnf相当の設定ファイルのmysqldセクションへpemを登録

  • ubuntu20.x系だと/etc/mysql/mysql.conf.d/mysqld.cnf
  • Centos8.x系だと /etc/my.cnf.d/mysql-server.cnf
tls_version=TLSv1.2,TLSv1.3
ssl-ca=/etc/mysql/ssl/ca.pem
ssl-cert=/etc/mysql/ssl/server-cert.pem
ssl-key=/etc/mysql/ssl/server-key.pem

MySQL8へ対象のDBとユーザーを登録する

  • mysql8以降はcreate userから設定する、grantだけではユーザー設定ができない。
create user '$username'@'$hostname' identified with caching_sha2_password by '$mypassword';
  • grantは疎通設定のために設定する
grant all on '$targetdb'.* to '$username'@'$hostname';
  • alterでssl使用のあり/なしとcaching_sha2_passwordの認証を付与する

※ 明示的に権限付与しないとリモートから接続できない

alter user '$username'@'$hostname' identified with caching_sha2_password require ssl;

パスワード仕様も厳格化されて、英数+記号2文字以上を含める20文字以上を設定する必要がある。mysql5系までの回避策だったglobal variables変数の上書き対策も、変数名が変更されていたり、うまく反映できない事があるので色々と面倒が発生するので、素直にデフォルトのパスワードポリシーに従った方が良い。

mysqlclientを使ってMySQL8へリモート接続する時のパラメータ

mysql -P 3306 --default-character-set=utf8mb4 --host="$hostname" -u "$username" -p"$mypassword" --ssl-mode=REQUIRED  --get-server-public-key "$targetdb"
オプション 概要
-P ポート番号は3306の場合は省略してOKだが、リモート接続でポートを変更している場合は明示的にPオプションで指定する
–default-character-set mysql8ではデフォルトがutf8mb4なので外部からの接続はutf8mb4を指定したほうがいい
–host 接続先のIPアドレスorホスト名を指定する。省略するとlocalhostになる。rootユーザーのログインにはsudo権限が必要で、root以外のユーザーだとssl接続の設定、もしくは明示的なssl無視の設定が必要になる
-u 接続ユーザーIDの指定で、リモート接続の場合はID+接続元の指定が必要 例:"testuser@12.34.56.78"
-p パスワードの記述は従来通り
–ssl-mode SSL接続必須=Required
SSL接続を無視=Disabled
CA鍵を使う=VerifyCA
CA鍵とホスト認証=VerifyFull
サーバー設定に依存=Preferred
–get-server-public-key 公開鍵をServerから取得する設定。サーバー側で鍵を渡さない場合は"–server-public-key-path"オプションでクライアント側に保存した鍵を指定する。

検証して判明した問題

MySQL5.7以前の設定を引き継ぐと動作しないオプション

  • クエリキャッシュが廃止されている
    MySQL5.7以前まで重要なカスタマイズ項目だったクエリキャッシュの設定が残っていると動かない。地味に面倒くさいが起動時のエラーを追えば解決できる。

  • root接続にsudo権限が必須
    MySQL5.7でも同じ仕様が課せられているが、8へアップグレードした後で再度有効になってしまう。ローカル環境では素直に "sudo mysql -u root -p" のように起動すればいい。

  • パスワード強度が必須化されていてconfでパスワード強度設定ができない
    5.7以前の設定でパスワード強度の変数を変更していても、8にアップグレードした後で認証に失敗する。alterやupdateで強制的に権限を上書きする事もできるが、8以降のポリシーに準拠させておいた方がいい。

  • リモート接続にssl接続が必須
    リモート接続の場合はデフォルトでsslが必須になっているので、ssl鍵の作成も必要になる。(※SSLを無視する設定にすることも可能)

  • 認証アダプタのデフォルトが caching_sha2_password になった
    ユーザーを作成すると caching_sha2_password の認証がデフォルトになる。従来の認証方式 mysql_native_password を利用する場合は、ユーザー権限を明示的に書き換えて再設定する必要がある。

インターネット上では、従来の mysql_native_password を使う情報が目立つ

セキュリティ強化のために caching_sha2_password が標準になったのだが、Webの情報では mysql_native_password で認証する手順のほうが見つけやすい。

Amazon RDS では MySQL8以降も mysql_native_password がデフォルト

本来は caching_sha2_password のほうがセキュリティ向上が見込めるのだが、AWSのAmazon RDSでは MySQL8以降も mysql_native_password をデフォルトになっている。

しかし、RDS以外のMySQL8では caching_sha2_password が認証プラグインの標準設定で、mysql_native_password にするためには権限を更新しなくてはいけないので注意が必要。


データ移行時の問題

mysqldump での "Couldn’t execute" エラー

mysql8系のmysqldumpでmysql5.7のDBをダンプしようとすると "Couldn’t execute" と表示される謎のエラーで難儀した。

  • 対策1
    mysqldumpのオプションに "–column-statistics=0" と "–set-gtid-purged=OFF" を付与する。自分の場合はこれで正常に動作した。
    MySQLの仕様変更が原因らしいので、詳細はリファレンスを参照。
mysqldump --column-statistics=0 --set-gtid-purged=OFF ※以下略

RDS上のMySQL5.7でも、通常のMySQL5.7でもどちらもmysqldumpが正常に動作した。

  • 対策2
    "–skip-column-statistics" オプションを付与することでANALYZE TABLEステートメントを無効化してエラー回避できるらしいのだが。自分は試していない。(自己責任で試してください)
mysqldump --skip-column-statistics ※以下略

Amazon S3へのDBスナップショットデータのエクスポート

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ExportSnapshot.html

Amazon RDSにはS3へスナップショットをエクスポートできる便利な機能があるので、その機能も使ってみた

  • 事前準備にKMSの管理者権限を持つIAM設定と対象鍵の生成が必要になる
  • スナップショットをエクスポートする設定は簡単だが、前述のKMS権限がないとエラーが頻発してエラー内容が分かりづらいので苦労する
  • 1度設定すれば、実行するのは簡単(定期実行も簡単)だが、メンテナンス時間まで待つかマニュアル実行する必要がある
  • RDSのMicroのような遅いインスタンスだと20GB程度のバックアップでも数時間かかる
  • RDS専用のスナップショットなので、RDSを再開させたい場合には1オペレーションで普及ができて便利(DBが破損しない限り殆ど使わない機能だと思うが)
  • KMSで暗号化されているので、仮にデータが流出してもスナップショットを元に復元することはできない

mysqldumpでエクスポートしてAmazon S3へ保存

  • 同じRDSインスタンスの20GBのDBを対象に、mysqldumpでバックアップgzip等で圧縮すれば5分程度でdumpが終わる。S3へのアップロードは(回線速度に依存するが)数分で終わる。
  • RDS以外のMySQLでもデータ移行が可能だが、ダンプが流出したときは丸ごとデータ漏洩になる。当然だが、圧縮ファイルにパスワードを設定したり、非公開のストレージに保存した方がいい。

データアダプタの設定項目

https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-configuration-properties.html

インターネット上にもMySQL8のデータアダプタの情報は殆ど見つからないのだが、mysql.data のコード補完(intelli-sense)と照らし合わせて、プロパティを探れば必要な設定が推測できる。

※接続の検証はmysql.data version 8.024で確認している

C#での実装例

  • MySqlConnection の設定には、MySqlConnectionStringBuilderを使うと便利
string server="12.34.56.78";
string dbname="mydatabase";
string username="dbuser";
string password="mypassword";
var builder = new MySqlConnectionStringBuilder
{
Server = server,
Database = dbname,
UserID = username,
Port = 3306,
Password = password,
CharacterSet = @"utf8mb4",
SslMode = MySqlSslMode.Required,
AllowPublicKeyRetrieval = true,
ConvertZeroDateTime=true,
AllowZeroDateTime =true,
Pooling = false
};
string connector_str = builder.ConnectionString;
MySqlConnection cn = new MySqlConnection(connector_str);

接続できない場合は

  • AWSやVPSのベンダ提供のFirewallが適切に設定されているかどうか
    AWSの場合はSecurity Groupの設定、VPSの場合はベンダ提供の管理画面からFirewallの疎通設定が必要になる。標準のポート番号だと3306がWebサーバーのIPから疎通設定されているかどうか確認する。

  • iptablesが有効になっていないかどうか?
    iptablesが不要であれば無効化する。
    有効化させたまま運用する場合は、適切なポートを開放する。

  • インスタンス上のFirewallの設定を確認する
    ubuntu系はufw, centos系はfirewalldの設定を確認する。
    必要がなければサービスを無効化、必要であれば適切なポートを開放する。

  • mysqlclientで接続できているかどうか?
    mysqlclient=mysqlコマンドで接続できない場合は、サーバー側の疎通設定に問題があるので、適切に設定をやりなおす。

  • mysqlclientで正常に接続できている場合は
    接続アダプタ(mysql.data.dll, mysql.data.jar 等)が正しく設定できていないので、プログラムの設定を見直す。


成果

  • コストが1/8以下になった
    RDSでは月額6000円(税込)以上かかっていた費用が
    ➡ 699円(税込)にコストダウン

    ※月額349円からのVPS NTT-Indigo


    ※さくらVPS(ストレージの大容量プランが割安)


  • パフォーマンス向上
    1GBのメモリで1CPU、CPUのバーストも殆ど効果がない(実質1コアの20~30%しか使えない)最小規模のRDSだったが、
    ➡ 2CPU/2GBメモリでCPUが100%利用できるデータベースになり体感速度も向上

  • 経路のセキュリティ向上
    VPCとセキュリティグループに依存したセキュリティをMySQL準拠のTLS通信へ
    ➡ TLSの暗号化通信に対応

  • VPCのセキュリティを廃止してFirewallのセキュリティへ統一
    VPC内の経路のセキュリティ(Endpointx2は別料金、NATGWx2も別料金)を廃止
    ➡ Firewallのセキュリティへ統一
    ※予算に余裕があれば、VPC内のルーティングとAZ,Subnet,Endpoint,NATGW,ALB,RDSを冗長化して設計したほうが良い

「Python」にバッファオーバーフローの脆弱性 ~サポート終了の「Python 2」にも影響 ← CentOS7への対策が結構面倒くさい

「Python」にバッファオーバーフローの脆弱性 ~サポート終了の「Python2」にも影響

https://forest.watch.impress.co.jp/docs/news/1305125.html

Pythonを使っていない人にも影響がある

実害のあるアプリケーションは少ないと思うが、
"すでにサポート終了の「Python 2」にも影響がある"
影響範囲を考慮して対策を検討した方が良い。

なぜなら、Linux系のOSはpythonを利用したパッケージマネージャが必須環境になっており、特にRedhat系、ユーザーが多いCentOS7は現行でpython2が利用されている環境が多く、放置していると公開された脆弱性を悪用する攻撃が増え続けることになる。

OSから削除できないPython2

  • CentOS6以前
    パッケージマネージャのyumがpython2.7に依存しているので、python2を削除できない。
    【対策】既にサポート切れなので早急にOSをアップグレード or リプレイスしましょう。

  • CentOS7
    CentOS7のパッケージマネージャのyumはpython2.7でしか動かない。
    yumの代わりになるdnfも提供されているが、CentOS7用のdnfはpython2.7が必須。
    【対策】暫定対策として、python2を残したまま、pyenvやvirtualenvを利用してpython2が参照されないようにするとよい。
    python2系を使わないように恒久対策するには、CentOS8へアップグレードする必要があるのだが、python2を削除するには参照しているパッケージも整理する必要がある。

  • CentOS8, CentOS8 stream
    CentOS8のパッケージマネージャのdnfはpython3だけで実行可能で、python2がインストールされていない環境でも問題ない。
    但し、CentOS8は2021年でサポートを終了するため、CentOS8 streamへ移行する等の対策も必要になる。

  • Ubuntu16.04 以前
    Ubuntu16のパッケージマネージャapt-getもpython2系に依存しているのでpython2を削除することができない。
    【対策】既にサポート切れなので早急にOSをアップグレード or リプレイスしましょう。

  • Ubuntu18.04 以降
    Ubuntu18.04~20.04 のパッケージマネージャaptはpython3だけで実行可能。python2は削除しても問題ない。
    【対策】python3をインストールした後にdnfをインストール、dnfがpython3で動作することを確認してからpython2をremoveする。

そもそもpythonは脆弱性スキャナで評価すると、python2だけでなく必須コンポーネントのpyevn,venv等もずっと未修整の脆弱性が含まれている扱いになっている。
オンプレでもクラウドでも脆弱性は避けられないので、基本的なセキュリティリスクと対策を知っておいた方がいい。

WordPressで運用している複数のサイトを静的サイト化(Serverless JAMStack化)した

WordPressを静的サイト化した理由

  • WordPressを5.5系から5.6にアップグレード後に、AMPが出力されなくなった
  • WordPerssのメモリ制約が厳しくなった
  • 運用コストの削減

WordPress5.6 へアップグレード後にAMPが出力されなくなった

  • AMP出力はWordPress公式プラグインを利用していたが、5.5系で正常に動作していた標準のAMPテーマが動かなくなった(※環境依存の事象だがバグの疑いが強い)

    不具合を確認後、管理画面からAMPを再出力しようとしたが、原因不明のエラーで出力できず。原因はnginxの書式と、WordPressのAMPテーマの相性だったのだが、WPのバグにしか思えない事象だったので全サイトの静的サイト化を決めた。

WordPerssのメモリの稼働条件が厳しくなった

メモリ512MBでは足りない?

  • MySQL5.6以降のキャッシュメモリ消費が大きい(バグ説あり)
  • GutenbergやElementorのようなGUIのエディタのメモリ消費が大きい
  • WordPressのプラグインによるメモリ消費
  • テーマやAMPがGUIで編集する前提になったので、その管理画面でのメモリ消費が大きい
  • メモリ不足の対策で、メモリ上限を制限したりSWAPで補強するとシステムの調整に手間がかかる

    課題への具体的対策(候補)

  • インスタンス単位のメモリ容量を増やす
    • 最も簡単な対策だが、月額コストが台数分増加して、管理コストが現状のまま負担になる
  • メモリは現状のまま増やさず、記事を公開するだけのサーバとして運用する
    • 機能が制限されて、メモリ管理の運用コストが大きい
  • 静的サイト化してJAMStackで管理を一元化する
    • 後述するが、今のところ大量の記事を静的サイト化する手段がない
  • WordPressのクラウドサービスやWordPress以外のサービスへ移行する
    • コスト的には大きな差はないが、自前サービスとの連携や運用ノウハウの蓄積が難しくなる

運用コストの削減

静的サイト化を実現するための懸念点

  • 既存のプラグインやサービスでは、大量のページの静的サイト化が難しい
    OSSのプラグイン「WP2static」が便利だったので過去にブログでネタにしていたのだが、MySQLのメモリ消費が激しい上CPU負荷も大きい、細かな設定ができない、記事数が多いと出力に失敗する等の制限がある

https://blog.hidenori.biz/862

  • WordPressで記事を1つ追加すると「インデックス」と「AMP」と「タグ+カテゴリ」の更新が必要になる
    例えば、記事数が100件のWordPressを静的サイトに出力すると3~4倍のファイル数の出力が必要になる
    ※ 記事100件あたり(タグやカテゴリ数は記事によって増減する)

    • 記事本体 x 100件
    • 一覧ページ x 10件
    • AMPページ x 100件
    • タグ(タグ一覧) x 10件
    • カテゴリ(カテゴリ一覧) x 10件
    • 記事の画像 x 100件
      ※ 例えば、100件のWordPress記事を静的ページへ出力すると、500前後のファイル出力が必要になる
  • PHPを利用して静的サイトを出力すると、前述のメモリ不足の制約が大きい

  • WordPressの記事数が100件を超えたあたりから静的サイトの出力が厳しくなる

  • WP2staticを利用する例だと、3000件の記事の出力(=15000個前後のファイル出力)に2~3時間掛かった(1CPUメモリ1GBのVPS=Lightsail,PHP7,MySQL5.7を利用)

  • MySQLのキャッシュが開放されないので、2回目以降の記事出力では更にメモリ制約が厳しくなる

  • AWSの小規模インスタンスを利用すると、CPUクレジットの消費が大きいので更に時間がかかる

    プラグインだと遅い&制約が多いので、独自ツールの開発を決定

    前置き・ツール制作前に環境整備

  • MySQL5系は5.6以降に修正されていないバグが多いのでMySQL8を使う

  • セキュリティ対策を優先してWordPressのAPIは使わない(wp-api.php, xmlrpc.php, wp-json等は無効化)

  • 問い合わせフォーム等はJAMStackで提供

  • WordPressのプラグインとして動作させると遅くなるので独立したツールを、Python or C# or Java を候補に構築する(C#を採用)

    ツール構築の成果

  • WP2staticでは2~3時間掛かっていた3600件以上の投稿(15556件のhtml出力)が、約20分で生成できるようになった

  • WP2staticでは過負荷でMySQLが落ちることがあったが、独自ツールではMySQLの停止が発生しなくなった

  • 3台のVPS(メモリ512MBx1台+メモリ1GBx2台)で運用していたWordPressをVPS1台(CPUx2メモリ2GB)に統合、月額費用は50%削減

  • 統合したVPSサーバーはステージング環境として運用し、本番環境はS3+CloudFrontへデプロイする構成に変更。セキュリティリスクを最小に、可用性と信頼性が最大になった

  • Javascriptのスクレイピングにも対応したが、今のところWordPressでは必要がないので将来の機能として保留

  • WordPressと独立したツールなので、HTMLの置換や整形等の独自処理も実装可能

  • ステージング用のサーバー1台に集約できたので、メンテナンスの手間が大幅に減った

    今後の課題

  • 問い合わせフォームは設置済みだが、コメント機能や記事検索をJAMStackで提供する方法を検討する

  • JAMSackは静的ページ内に組み込めるが、サーバーサイドレンダリング(SSR)が必要になった場合は別途設計を検討する必要がある

  • パーマリンクやカテゴリの親子構造にも対応したが、条件が無限に発生してしまうので、id表記とslug表記だけをサポート範囲として考えている

  • WebUI等で管理画面の対応も可能だが、WordPressを静的出力するためのシンプルなCLIツールとして目的を最優先に運用している

kichijoji.cloud サービス紹介

落ちないWordPressサイト構築・移転・セキュリティ検査・マーケティング支援

  • kichijoji.cloud
    既存WordPressからの転用が可能で、かつ、JAMStackが利用できる、安全でコストパフォーマンスの高いWordPress環境を提供します。

    https://kichijoji.cloud/about-us/wordpress




ShifterでWordPressのWebサイトを構築してみた | 長所・短所など感想まとめ

Shifterとは?

  • Shifterとは?今回検証したキッカケ

    • Shifterとは?
      ShifterはWordPress環境をサーバーレスで立ち上げ、静的なサイトを生成することができるサービスです。

    • 今回検証したキッカケ
      ClassmethodさんのブログでShifterが紹介されていたので、便乗してサービスを検証してみました。

    https://dev.classmethod.jp/solution/generate-faq-site-with-shifter/


  • Shifter公式の紹介文
    • Serverless Static WordPress Hosting
      Shifterは世界で一番使われているCMS「WordPress」を、超高速・安全・メンテフリーにするオンラインサービスです。サーバーレスによる全く新しいアプローチで、WordPressユーザーから伝統的なホスティングにつきものの、遅延・停止などソフトウェアやサーバー保守にかかる負担・セキュリティの不安を排除します。

記事の投稿

Shifterにアカウントを登録する

WordPressに記事を登録して公開する

  • WordPressを開始
    ShifterのDashboard(管理画面)にある"Start WordPress"のボタンをクリックしてWordPressが起動するのを待つ。

  • WordPressへ記事を登録
    WordPressが起動したら記事を登録して公開する。

Artifactを生成し、Shifter管理画面で公開する

  • Artifactを生成する
    WordPress管理画面の上部にShifterメニューがあるので、マウスカーソルをあわせると表示されるメニューから"Generate Artifact"を選択する。

  • ShifterのDashboardに戻ってArtifactを公開する
    WordPress管理画面の上部にあるShifterメニューから、Shifter Dashboardを選択する。

  • Artifactを公開する
    Artifactを生成するとArtifactの項目にGeneratingが表示されて、公開できるまでに数分~十分程度待つ必要がある。公開が可能になると「Ready」の表記と「Deploy」のボタンが表示されるので「Deploy」を選択して記事を公開する。

長所・短所

長所

  • 無料から利用できる
  • WordPress管理画面の自由度が高い(ほぼフルスペックのWordPressが利用できる)
  • Themes(テーマ)やPlugins(プラグイン)のインストールに制限がない。独自ThemeやPluginのアップロードも可能
  • SSLが標準で割当られている
  • デフォルトは英語だが、管理画面から日本語+日本語時間に変更可能
  • ‘Generate Artifact’を選択することで静的ページで公開できるので、通常のWordPressよりも安全に公開できる(所謂JAMStack)
  • ‘Generate Artifact’で作成される静的ページはCloudFrontに配置されるので、公開用のURLは高速に表示できる
  • /wp-login.phpが公開されているため不正アクセスのリスクがあるが、管理画面を使い終わったらWordPressを終了させる事ができる(放置しても一定時間で終了する)ので、標準でも十分なセキュリティ対策が施されている
  • 無料プランがよくできているので、アンテナサイトやアフィリエイト用のブログの試作・パイロット版等の作成に都合がよい
  • 無料プランでも’Generate Artifact’で生成した静的ファイルをダウンロードできるので、自分で静的ページの素材を活用することも可能

短所

  • WordPressの管理画面が遅い
  • デフォルト設定が英語環境でUTC時間
  • Themes(テーマ)やPlugins(プラグイン)を手軽にインストールできるが、’Generate Artifact’で反映できない条件がある。
  • Themes(テーマ)としてCocoonを登録して有効化し、記事を投稿するとWordPress管理画面では正常に表示されたが、Generate Artifactするとブランクページが生成された。
  • 静的ページ(Artifact)で生成したページはWordPressのコメント機能や検索機能が使えない。
  • 静的ページで検索機能等を追加するためには、Shifter側でサポートのない静的ページの汎用プラグインを使う必要があるのだが、記事数が多くなると動作しなかったり不具合が発生する恐れがある。
  • 自動的に割当られる公開ページのドメイン(URL)が選択できない(覚えにくいランダムな文字列のドメインになる)
  • WordPress管理画面では追加ユーザーも作成可能、しかし、shifterのWordPress管理画面で作成したユーザーでは記事投稿ができない
  • WordPress管理画面のログイン用URL /wp-login.php から通常のwordpress用ログインができるが、shifterで作成された初期ユーザー以外では設定や記事投稿ができない
  • /wp-login.php はセキュリティ対策されていないので、管理画面のURLがバレると攻撃の標的となる可能性がある
  • /wp-login.php よりもShifterのパスワードログインのほうが不正アクセスの標的になる可能性が高い
  • 無料プランがよくできているので、スパムサイトが大量に作成される可能性がある
  • 無料プラン(FREE TIER)はが7日しか利用できないので、無料で継続的に運用することは難しい
  • 無料プランだとストレージ容量が少ないので、ブログで集客するためには有料プランを検討することになりそう
  • 短所が多すぎるので、kishijoji.cloud で提供されている「落ちないWordPressサイト構築・移転・セキュリティ検査・マーケティング支援」サービスを利用したほうが良い
    https://kichijoji.cloud/about-us/wordpress

kichijoji.cloud サービス紹介

落ちないWordPressサイト構築・移転・セキュリティ検査・マーケティング支援

  • kichijoji.cloud
    Shifterと同等以上のJAMStackが利用できて、安全でコストパフォーマンスの高いWordPressメディアを構築できるサービスを https://kichijoji.cloud/ でも提供しています。

    https://kichijoji.cloud/about-us/wordpress

  • デモサイト「ねこ動画」まとめブログ
    kichijoji.cloud のWordPress構築サービスを利用して作成されたデモサイト(サービスのサンプル)で、運用は自動化されており1日に数回更新されている猫の動画を紹介しています。
    掲載数は1950記事を超えていて、全てが静的ページ(JAMStack)で公開されているため高速でセキュリティも強固です。

    https://blog.nekovideo.net/




just simple dialy

モバイルバージョンを終了