リモートホスト設定・開発環境

パソコンなどのローカル環境から外部サーバー(ここ:さくらVPSなど)に接続して各種設定を行う場合は、基本的にはSSHなどターミナル接続を行い、サーバー上のエディタなどを用いて設定ファイルなどの編集を行っている。

当方の場合は、ローカルのWindowsマシンよりPuttyを使用してSSH接続を行っている。サーバー側もSSHの設定を行いしっかりと鍵ペア認証による接続を行うことで安全性を保っている。ちなみにファイルのコピーには同じ鍵を用いたWinSCPを使用している。

サーバー上での設定ファイルの編集などは、当方ではEmacsを用いている。昔はワークステーション上でも重量級のエディタという印象だったので、チョットしたファイルの編集には不向きということで、専らVi系の軽いエディタを使用していた。まぁ昨今になるとマシンパワーのおかげでそれほど気にするレベルでも無いと言うことで、何となく惰性で使用している。しかし昔ほど気合いの入った設定とかは行う事無くほぼほぼインストールしたままで使用しているのでした。

ただし一点だけ、こだわりではないが、バックアップファイルの自動生成について、デフォルトの設定では、編集してセーブを行うと、元ファイルと同じディレクトリに「(元ファイル名)~」という「~」(チルダ)付きのバックアップファイルが大量発生して何とも見苦しい。その為、バックアップファイルは編集したユーザーのホームの「.saves」ディレクトリにバックアップファイルを世代付きで保存する方式に変更している。

編集対象ファイル例):/home/user-name/project/hogehoge/Readme.md
⇒バックアップファイル:/home/user-name/.saves/!home!user-name!project!hogehoge!Readme.md.~1~

のように元のパス情報を含めたファイル名で世代管理の番号を付けた状態で保存される。下記の設定を

(setq auto-save-default nil)
(setq backup-directory-alist `(("." . "~/.saves")))
(setq backup-by-copying t)
(setq delete-old-versions  t
      kept-ner-versions 6
      kept-old-versions 2
      version-control t)

各ユーザーの設定ファイル(.emacs)に記載しておく、当方の場合は自分以外に使用する人もいないという理由もあって/usr/shara/emacs/下のdefault.elに記載とか乱暴なことをやっている(汗)

続きを読む…

ブロックリスト自動生成(素人のサーバー管理)

自宅あるPCを使っている分には外部からの攻撃とかあまり気にしないけど、さくらVPSなど外部に配置したサーバーだと、攻撃とは言わないまでも手当たり次第にピンポンダッシュしてくる輩の多いこと・・・。

ここでいうピンポンダッシュとは言うまでも無く、ポートスキャンや不正ログイン試行のことで(不正ログインはピンポンダッシュと言うよりドアガチャのイメージかな)、ログを見てても気持ちの良いものではない。そんなに見ていただく内容もない自己満足のサーバーなだけに、こう言うのだけでアクセスが増えるのも何とも困ったものだ。

そこで、ファイヤーウォールのお世話になることになる。何も用事が無ければ全ポート閉じてしまうのが一番安全だけど、何のためのサーバーぞやということで、WEBサーバーもやりたいしメールサーバーも動かしたい。SSHも当然開けておかないと意味がないし。。。

SSHに関しては自分が使うだけなので、ポート番号を変更して鍵のないアカウントからはログイン出来ないようにすればとりあえず安心。WEBサーバーもそれほどいたずらされる心配も無いと思うが、一番怖いのは多分メールサーバーで25番からポート変更するわけにも行かないし、設定不備で世間に迷惑をかけることになりかねない。

引越前のサーバーだが、下のようなログが1日に何百何千と残ることがある

May  2 15:41:32 marocha postfix/smtpd[810548]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
May  2 15:41:32 marocha postfix/smtpd[810542]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:41:42 marocha postfix/smtpd[810542]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: Connection lost to authentication server
May  2 15:41:43 marocha postfix/smtpd[810559]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:41:54 marocha postfix/smtpd[810559]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: Connection lost to authentication server
May  2 15:41:54 marocha postfix/smtpd[810568]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:41:58 marocha postfix/smtpd[810568]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
May  2 15:41:58 marocha postfix/smtpd[810570]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:42:07 marocha postfix/smtpd[810570]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
May  2 15:42:07 marocha postfix/smtpd[810588]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:42:20 marocha postfix/smtpd[810588]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
May  2 15:42:20 marocha postfix/smtpd[810589]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:42:30 marocha postfix/smtpd[810589]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: Connection lost to authentication server
May  2 15:42:31 marocha postfix/smtpd[810590]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:42:41 marocha postfix/smtpd[810590]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: Connection lost to authentication server
May  2 15:42:42 marocha postfix/smtpd[810591]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:42:46 marocha postfix/smtpd[810591]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
May  2 15:42:46 marocha postfix/smtpd[810592]: connect from unknown[xxx.xxx.xxx.xxx]
May  2 15:43:15 marocha postfix/smtpd[810592]: warning: unknown[xxx.xxx.xxx.xxx]: SASL LOGIN authentication failed: UGFzc3dvcmQ6
続きを読む…

データベース移植作業

ユーザーの作成

移動先のデータベースにも同じユーザーを作成しておきました(パスワードも同じにしておく)

データベースのバックアップ

root@xxxxx:~# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1094
Server version: 8.0.25-0ubuntu0.20.04.1 (Ubuntu)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| xxxxxxxx           |
| yyyyyyyy           |
| information_schema |
| mysql              |
| AAAAAAAA           |
| performance_schema |
| sys                |
| webdata            |
+--------------------+
8 rows in set (0.00 sec)

mysql>

バックアップするマシンのmysqlにrootユーザー(mysqlの)でログインし、データベースの一覧を確認する

同様にバックアップ先のマシンのデータベースを確認し、バックアップ先にないものをバックアップします。コマンドは mysqldumpを使用しました。とりあえず移植と言うことで深く考えずにバックアップ先にないものを個別にバックアップしました。

root@xxxxx:~#  mysqldump --lock-all-tables -u root -p --databases xxxxxxxx > xxxxxxxx

全てのデータベースを一度にバックアップする方法もありますが、システム用のデータベースも一緒になってしまい、バックアップ先で競合するのを避けるため、個別としました。

次にバックアップ先のマシンでリストアします。

user@yyyy:~$ mysql -u root -p < xxxxxxxxx

全てのデータベースをリストアして無事終了

サーバー引越完了の件

昨日メールサーバーの移行を終了したところで、DNSの参照先を新サーバーに切り替え、旧マシンの全ポートを閉じることで、全機能の引越を完了しました。

基本的にはServer World – ネットワークサーバー構築 (server-world.info)のサイトにある各OS毎(CentOS8、Ubuntu20.04LTS)の設定を参考に、新たにUbuntuサーバーを立ち上げつつ、データのみを移植する形で行いました。

作業内容は下記になります。

  • mysql データベースの内容移植
  • WEBサイトの移植
    • /var/www 以下の移植
    • /etd/httpd → /etc/apache2 への移植(基本的にコピーで良いが微調整は必要)
    • Letsencriptの鍵情報移植
      • /etc/letsencript をそのままコピー
    • 仮想ホストごとにDNS参照を切り替えて動作を確認
  • メーサーバーの移行
    • 新サーバーにて個別にメールサーバーを立ち上げ、DNS参照先を切り替えて動作確認
    • 旧サーバから各ユーザーのメールデータをコピー
  • 新サーバー機能のインストール(旧サーバーでは運用していなかった機能追加)
    • NextCloud(ownCloud後継のクラウドサービス)
    • Rainloop(WEBメールサービス:過去にはSquirrelで運用していたが、動作が不安定だった)

次回以降、個々の作業内容について覚書きついでに投稿していきます。

個人的な話ですが、最近早期退職と言うことで仕事を辞めました。コロナ時期と関係ありそうですが、とくにそのようではなく、以前から希望していた退職願いが、仕事も一段落したところで漸く受け入れられたという経緯からなります。先のことはまだ決めていませんが、少し休みながら好きなことをして、これからの自分に何が出来るかなど、今後のことを考えていきたいと思っています。
それの一環として、独り言に使っていたこのブログサイトも色々活用していけたら、と考えています。まぁ、いまどき個人サーバーでブログなんて誰も見ていない自己満足日記サイトにしかならないと思いますが、こういうのも続けていければ何かに繋がるのではと期待して。。

WEBサーバー引越完了

見た目は全く変らないが、ここ数日でサーバーの引越を行なっておりWEBサーバーの引越が完了したのでテスト投稿です。

引越理由は運用していたサーバーのOS(CentOS8)が2021年末にサポート終了するとのことで、これを機会にUbuntu(20.04 LTS)サーバーに変更することにしました。

引越といってもRHELベースのCentOSからDebianベースのUbuntuへの引越なので、完全に新規インストールしてデータのみを移行して同じ環境を再構築するような流れとなります。

移行に関しては事故に備えて、現行サーバー(さくらVPS<V3>)をそのまま残して、新規サーバー(さくらVPS<V5>)を別に契約し、無理の無いようにデータ移行を行ない移行完了したサービスから順にDNS参照を変えて、すべてのサービスの移行後、旧サーバーを停止・解約とすることとしています。

現在WEBサーバーの移行が終了したので、あとはメールサーバー(各ユーザーのメールボックス)が残っているので完全移行はもう少し先となる予定です。

djangoサイト立ち上げメモ①

Django によるポータルサイトを公開したので、今後のメンテのためにメモを残しておきます。

まずは最初にPyhon環境から構築します。

Pythonはバージョン依存が大きい所もあるので、仮想環境を作ります。

当サイトではWEBアクセス用アカウントを使用しているので、そちらにsuして作業。

先に python 用 virtualenv をインストールします

$ python -m pip install virtualenv

djangoプロジェクトを作成する仮想環境を作成します。(WEBアクセス用アカウントで)

場所は適当で、python3.8 の環境にしてみました

$ virtualenv -p python3.8 venv
以降ドラフト

ポータルサイトは完成しているので、思い出しメモ代わりに追々と続けます。ただ殆どの内容は他サイト情報のコピペに近いものになるので、実際にこのサイトを構築するのに自分がやったことが中心に出来ればと思います。

→ はじめてのDjangoアプリ作成

  • 仮想環境に各種ライブラリをインストール(mysql用ライブラリも含む)
  • 公開サイトのプロジェクトを作成
  • アプリケーション作成(top)
  • ビュー作成
  • モデル作成・データベース接続
  • ビュー修正、テンプレート作成
  • Apache環境へのデプロイ(https仮想サーバ設定)

Django と Letsencrypt

まろ茶ネットの公開WEBサーバーをSSL化するに当たってLeysencryptを導入しましたが、現在作成中のポータルサイトで採用しているDjango WEBアプリでは -webrootによるサイト登録がうまく行かない問題がありました。(現在はテスト用仮想サーバにて動作確認中)

certbot-auto で登録するサイトのwebroot(DocumentRoot?)に一時的な静的ファイルを作成して、登録URLからアクセスできるかどうかを確認しているようですが、DjangoではDocumentRootに静的ファイルを作成しても、WEBアプリのエンジンによりURLからアクセスできないようになっている感じ。

そこで、urls.py などを細工して、Letsencryptの静的ファイルにアクセスできるように誘導する必要がありました。

<project>/settings.py

# for Letsencrypt certification 
CERT_ROOT = os.path.join(BASE_DIR, '.well-known') 
CERT_URL = '/.well-known'

注).well-known はcertbot-autoが作成する静的ファイル

<project>/urls.py

urlpatterns = [ 
    path('admin/', admin.site.urls),
    path('', include('top.urls')), 
    path('tinymce/', include('tinymce.urls')),
] 
urlpatterns += static(settings.CERT_URL, document_root=settings.CERT_ROOT)

urlpatterns はリストに直接入れても良いような気がするが、上記のようにしないとうまく行きませんでした。

これでDjangoアプリサイトをLetsencryptに登録出来るようになりました。

下記サイトを参考にしました(と言いますか、まんまの情報です)

SSL証明書の取得(無料版letsencrypt)

https://www.server-world.info/query?os=CentOS_8&p=ssl&f=2

CentOS8へのインストール

# dnf module -y install python36
# dnf -y install gcc mod_ssl python3-virtualenv redhat-rpm-config augeas-libs libffi-devel openssl-devel
# curl -O https://dl.eff.org/certbot-auto [root@marocha ~]# mv certbot-auto /usr/local/bin/
# chmod 700 /usr/local/bin/certbot-auto

登録コマンド

# certbot-auto certonly --webroot -w /var/www/html -d www.marochanet.org

バーチャルホストのサイトは並べて登録するか、続けて登録

更新コマンド(複数のバーチャルホストは一度に更新可能)

# certbot-auto renew
ということで、こちらブログサイトも無事SSL化となりました。
 

メールサーバー顛末(SMTP-Auth)

今回のメールサーバーの目的は、現在使っているプロバイダ系のEメールをプロバイダからPOPして保存、IMAPサーバーとしてクライアントに公開するという物で、PCとか携帯、タブレットどれからでもメールが読み書き出来るようななるというWEBメールに近い環境が実現できるという物です。家サーバーの時はfetchmailコマンドを使って、プロバイダからPOPで落として来たが、専用サーバーということで、プロバイダからメール転送をかけることにした。これによりタイムラグ無くメールを読むことが出来るようになった(fetchmailだとポーリング間隔だけタイムラグが出来てしまう)。

imap環境は家サーバーのubuntuの時と同様にpostfixとdovecotの設定のみ。旧メールフォルダを家サーバーからtarしてscpしてtarしてVPSに転送、ついでにバックアップ。こちらを参考に取得したSSL証明書などもバッチリ反映させておけばSSLでアクセス可能。

SMTPでメール送信機能を持たせるのは家サーバーではやっていなかった事なので、後回しにします(一発ぶっつけでうまく動かなかった)。

せっかくなので、Webmail機能を持たせようと、SquirrelMailを導入したが、うまく動かない。ubuntuの時は何の問題も無くあっさり動いた物だが、パスワード認証のあと「このページにアクセスするにはアカウントが必要です。」というエラーメッセージが、httpdのログには何も載っていなかったので、不思議と思いググってみた所、どうも /var/lib/php/session の書き込み権限がないとか、、、ああ、思い当たった!家サーバーの時と条件を合わせるため、apacheの実行ユーザーをデフォルトと変えていたのでした。ubuntu と CentOSでは実行ユーザーが異なるため、同じ設定ではアクセスが出来ないということ。ということで、該当ディレクトリの所有者を変更して、書き込み可能にすることで無事解決。

SMTP Authの設定は基本的にはimapの設定の時と同じページを参考に薦めればOKでした。最後の最後までうまく動かず悩ませた理由は単純なtypoでした。。。これは気をつけないといけない。

メールサーバーの機能はこれで必要な分一通り完了。メールアカウント一杯作れます。悪用禁止w

 

WordPress 移植メモ

サーバー移動にあたって、WEBデータの移動が大きな問題の一つでした。

家サーバーがubuntu8.10のまま長らく放置されていたのも、データベース移動がうまく行くかどうかに不安があったからだ、それに加えてPC自体の調子の悪さも相まって、「光学ドライブが動かない」「USBポートが不安定」などの理由でそのままにせざるを得なかったというのもありました。

今回の場合は、完全に引越であるので、失敗しても何度でもやり直せるということで、色々試してみた。

まず、WEBサーバーにインストールしたphpMyAdminを用いてバックアップ/リストアを行う方法。

全データを対象に行ったが、読み込みファイルサイズに制限があったので、あらかじめFTP転送しておいたバックアップファイルをリストアしようとしたが、rootですら書き込み権限が無いとかで失敗。どうもinformation_schemaというデータベースが問題であろうという所までは分かったが、放置。

mysqlのコマンドラインツールで全バックアップ/リストア

結局は上記理由で失敗。information_schemaは内部的な利用のための物で書き込むことは出来ないらしい・・・じゃなんでバックアップ/リストアの対象になっとんねん?って思ってしまうが、そういうわけで地味に最後の手段。

コマンドラインでちまちまデータベース一つずつバックアップ/リストア

結局はこれ。information_schema以外のデータベースをmysqldumpでちまちまバックアップ取って、リストア先で

mysql> create database wp-data default character set utf8

$ mysql  -u wpdata -p xxxx < backup.sql

でな感じであらかじめ(wpdata)というユーザー権限でデータベース(ここではwp-data)を作っておいて、バックアップデータである*sqlファイルを読み込みます。※ここのwpdataというユーザー名とwp-dataというデータベース名はバックアップ元に準じます。

あとは、htmlディレクトリを構造毎ファイル所有者に注意して複製して終わり。

ただ、この方法ではうまくいかず、ページのリンク関係がボロボロ。そりゃそうです。トップページのURLが変わったのだから、当然直リンしている所は破綻するわけで、ここを直さないといけない。幸いバックアップした*.sqlファイルはテキストなので、ここはsedを使って置き換えてしまいます。

$ sed -e ‘s/old url/new url/g’ backup.sql > backup1.sql

出来上がったデータで置き換えます(もちろんデータベースは一旦消して作り直します)。またコピーしたhtmlディレクトリの中にも旧URLを直接参照している所があるはずなので、これも出来る限り書き換えます。

grep ‘old url’ */* などして探して手動で書き換えられる程度の作業なので大したことはありませんでした。

これで、無事データ移植完了。

同じような感じで xoops も移植できました。