2022年2月のサーバ構築(独自ドメイン移行)

2022-02-27 14:29:40 +09:00 Post Comments

少し前に独自ドメインを取得したので、そこに移行することにしました。 今回は設定変更なので、 OSの設定までは前回2020年末に設定したときに行った 内容のままです。 設定手順 Webサーバ 他のWebサーバが流行ってきている中nginxというのもいい加減どうなんだという感がありますが、 次のハードウェアに移行するときに考えます。 インストール ubuntu@raspiu:/etc$ sudo apt install nginx (略) 続行しますか? [Y/n] 〈Enter〉 nginxの設定 Debian系では、バーチャルホストを使うことを前提に次のようなディレクトリ構成で nginxの初期設定が作ってある。 /etc/nginx nginx.conf # メインの設定ファイル modules-available/ # nginxのモジュールの設定 # パッケージによってここにファイルが置かれる sites-available/ # バーチャルホスト設定をこの下に作る {sites,modules}-enabled/ # 有効になっている設定ファイルの置き場 # -availableの設定を使う場合は、以下のようにしてリンクを張る # ln -s ../sites-available/<ファイル名> \ # /etc/nginx/sites-enabled/ snippets/ # nginxと連携させて使うパッケージを実際に連携させるための設定 conf.d/ # その他の設定はここにファイルとして置く(今回は使用しない) # 以降nginx標準の付属設定ファイル uwsgi_params # uWSGI(動的Webページの方式)の設定 # 他いくつか(今回は使わない) sites-availableにサイトの設定を書き、sites-enabledからリンクを張って有効化する サーバそのものの設定はconf.dに書く 他のファイルは書き換えない この構造に従わずにnginx.confを直に書き換えても動くが、 アップデートの際に面倒なことになったりするので普通に乗っかっておく。 サイトの設定を作成 ubuntu@raspiu:~ $ sudo vi /etc/nginx/sites-available/〈ドメイン名〉 内容 server { listen 80; listen [::]:80; location ~ ^/isso/img { return 404; } location ~ ^/isso/(.

2020年末のサーバ構築その2

2020-12-31 11:23:30 +09:00 Post Comments

2日前にサーバ構築の記事を書いたばかりですが、 結局やり直しです。 メールが受け取れない環境で公開すると、 内容に責任を持てないのではないかと感じたためです。 (しかし、まだメールサーバは復旧していません。) 環境 ハードウェア:Raspberry Pi 4 Model Bを使用します。 月に1MBも転送しないサイトなので、あまり強いハードウェアは用いません。 安定性に問題があれば別の方法を検討します。 OS:Ubuntu Server 20.04.1 設定手順 ディスク書き込み 今回は、microSDカードの制限を逃れるため、 USBマスストレージデバイスからの起動を使うことにしました。 手順はRaspberry Pi 4 Model B で USB ブート(1) - Qiita を参考にしました。 EEPROMのバージョンを確認(Raspberry Pi上で) raspbianで起動した状態で確認したところ既にSep 3 2020版になっていました。 イメージの取得(PC上で) Install Ubuntu on a Raspberry Pi 2, 3 or 4 | Ubuntu より、Raspberry Pi 4の64-bitと書かれたイメージをダウンロードしました。 書き込み(PC上で) ダウンロードしたファイルはxz圧縮されているので、伸張 sakai@myPC ~ % xz -kd ubuntu-20.04.1-preinstalled-server-arm64+raspi.img.xz 伸張したファイルを書き込み sakai@myPC ~ % cat ubuntu-20.04.1-preinstalled-server-arm64+raspi.img | sudo dd of=/dev/disk5 bs=134217728 macOSなので、/dev/disknになっていたりbs=に接頭辞が使えなかったりしましたが、 適当に補正しました。 disknの数字は「ディスクユーティリティ」でドライブの「情報を見」て、 「BSD装置ノード」の欄を見ることで確認できます。 ディスク内容の補正(Raspberry Pi上で) 引き続きRaspberry Pi 4 Model B で USB ブート(1) - Qiita を参考にしています。 ext4ファイルシステムを安全に拡張するために、Linuxマシンが必要です。 (macOSでさえなければいけるかもしれない) 手元にLinux端末がRaspberry Piしかなかったのでこれを使いました。 ディスクはまだ準備ができていないので、一旦raspbianで起動して作業を行います。 ディスクをRaspberry PiにUSB接続 パーティションをいじる( ディスクパーティションとファイルシステムの拡張 - Qiita を参考にしました。) パーティションマップの変更 pi@raspberrypi:~ $ sudo parted /dev/sda (parted) unit s # セクタ単位に変更 (parted) resizepart 2 -1s # 2番目のパーティションを最大サイズに拡張 (parted) quit Raspberry Piのディスクは大抵USB接続したディスクだけ (メモリーカードはディスクとは別扱い)なので、 繋いだディスクは大抵/dev/sdaになります。 しかし、ディスクの取り違えを防ぐため、 (parted)print などとして正しいディスクを操作しているか確認しましょう。 ファイルシステムの拡張 pi@raspberrypi:~ $ sudo e2fsck -f /dev/sda2 pi@raspberrypi:~ $ sudo resize2fs /dev/sda2 マウント pi@raspberrypi:~ $ mkdir /tmp/hdd_boot pi@raspberrypi:~ $ mkdir /tmp/hdd_root pi@raspberrypi:~ $ sudo mount /dev/sda1 /tmp/hdd_boot pi@raspberrypi:~ $ sudo mount /dev/sda2 /tmp/hdd_root vmlinuzを伸張 pi@raspberrypi:~ $ cd /tmp/hdd_boot pi@raspberrypi:/tmp/hdd_boot $ zcat vmlinuz | sudo dd of=vmlinux これを使うように設定 pi@raspberrypi:/tmp/hdd_boot $ sudo vi config.

2020年末のサーバ構築

2020-12-29 17:38:00 +09:00 Post Comments

サーバにしていたマシンが故障し、 その影響で当サイトは3週間ほどアクセス不能になりました。 現在、マシンを替えて仮復旧させております。 なお、現在コメントが表示されておりません。 データは存在しますが、 コメント欄用のプログラムの再設定ができていないためです。 後ほど復旧方法を検討します。 環境 ハードウェア:Raspberry Pi 4 Model Bを使用します。 月に1MBも転送しないサイトなので、あまり強いハードウェアは用いません。 安定性に問題があれば別の方法を検討します。 OS:標準のOSであるRaspbian Liteを使用します。 設定手順 SSH接続まで NOOBS でインストールしたところから始めます。 まず、設定をまともに行うために、キーボードを設定します。 raspberrypi Login: pi Password: 〈入力しても見えない〉raspberry pi@raspberrypi:~ $ sudo raspi-config メニューで5 Localisation Options→L3 Keyboardと進んで、設定 パスワードを設定します。 pi@raspberrypi:~ $ passwd Current Password: 〈入力しても見えない〉raspberry New Password: (新しいパスワードを入力) Retype Password: (新しいパスワードを入力) SSHサーバを起動します。 pi@raspberrypi:~ $ sudo raspi-config メニューで3 Interface Options→P2 SSHと進んで、設定 IPアドレスを調べておきます pi@raspberrypi:~ $ ip addr 〈略〉 3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 〈略〉 brd ff:ff:ff:ff:ff:ff inet 〈略〉.

アクセス不能状態について

2019-04-20 20:02:46 +09:00 Post Comments

諸事情によりサーバのインターネットアクセスを維持できなくなったため、 2月の末から4月19日ごろにかけて、 このウェブサイトの公開を停止しておりました。 現在は復旧済みです。

awallによるファイアウォール

2018-10-06 12:54:52 +09:00 Post Comments

9月27日ごろから始まった世界的なSYN floodは, WWWの辺境としか言いようのない当サイトまで標的としていました. SYN cookiesを利用することで サーバが機能停止に至ることはありませんでした. しかし,サーバを無線LANの先に設置していたため, このネットワークの接続速度がかなり損なわれてしまいました. SYN floodでは送信元IPアドレスは偽装されているため IPアドレスによるアクセス拒絶は無効であると言われています. しかし,今回についていえば,送信元として書かれたIPアドレスが 海外の,日本人は使わないであろう ホスティング業者が保有するものとなっていました. ここからのアクセスを拒絶したとしても, どうでもいいマイナーなクローラーが 当サイトをクロールできなくなるだけと考えられるため, 今回は練習も兼ねてIPアドレスによる拒絶をやってみることにしました. 当サイトではこれまでサーバにファイアウォールを設定していませんでした. それは,このサーバがルータの配下に静的NATで配置されており, 必要なポート以外にはもともとアクセスできなかったからです. しかし,今回はIPアドレスによるアクセス拒否数十件という, ルータに設定するのは難しいアクセス設定が必要でした. そこでサーバのVM上でファイアウォールを設定することにしました. サーバのOSがAlpine Linuxですから,「alpine linux firewall」で検索して awall (Alpine wall)を使用することにしました. 手順 インストールはapkコマンドを利用して行いました. apk add -u awall このソフトウェアはiptableによって動くらしいので,iptableを起動しました. modprobe ip_tables rc-update add iptables 設定ファイルはいまひとつ似た設定を行う例がなかったので Zero-To-Awallと Alpine Wall User’s Guideを 参考に次のようなファイルを作成しました. /etc/awall/optional/main.json { "description": "Main firewall", "import": [ "base" ] } /etc/awall/private/base.json { "description": "Base zones and policies", "zone": { "WAN": { "iface": "eth0" }, "LAN": { "iface": "eth0", "addr": ["192.

最近の攻撃的アクセス

2018-03-03 20:27:58 +09:00 Post Comments

このサイトを公開してから攻撃的なリクエストが届いています. HTTPサーバへの攻撃などいちいち顧みることでもないのですが, なんとなく,ここにそれをまとめてみようと思います. ここに紹介するのは2月にあったアクセスです. まずBad Access(400)となったものです. /x / * /, /xはURL以外の部分が不正だったのでしょうか.きちんと実装されていないHTTPサーバを狙ったもののようですが, 一体どれだけそんなものがあるのでしょう. 以降は404となったものです.何種類かあるので分けてみていきます. まず,こんなものがありました. / このサイトは,名前ベースバーチャルホストmiimou.mydns.jpとして公開しています. そのためHTTP/1.1対応のまともなWebブラウザでHost: miimou.mydns.jpをつけない場合, 404が帰ります. とても多いのがphpMyAdmin狙いの攻撃です. /phpmyadmin/scripts/setup.php /scripts/setup.php /myadmin/scripts/setup.php /phpMyAdmin/scripts/setup.php /pma/scripts/setup.php /mysql/scripts/setup.php /admin/scripts/setup.php /dbadmin/scripts/setup.php /phpMyAdmin2/scripts/setup.php /MyAdmin/scripts/setup.php /PhpMyAdmin/scripts/setup.php /php-my-admin/scripts/setup.php /mysqladmin/scripts/setup.php /db/scripts/setup.php /admindb/scripts/setup.php /_phpmyadmin/scripts/setup.php /phpmyadmin/scripts/_setup.php /phpMyAdmin/scripts/_setup.php /phpmyadmin/scripts/Setup.php /phpmyadmin_/scripts/setup.php /admin/phpmyadmin/scripts/setup.php /phpMyAdmin/scripts.setup.php /phpMyAdmin/scripts/Setup.php /sql/scripts/setup.php /phpmyadmin2/scripts/setup.php /phpMyAdmin/scripts/setup0.php /_phpMyAdmin/scripts/setup.php /PMA/scripts/setup.php /PHPMYADMIN/scripts/setup.php /phpMyAdmin_/scripts/setup.php /phpMyAdmin/scripts/setup1.php /phpmyadmin/scripts/setup1.php /admin/phpMyAdmin/scripts/setup.php //phpMyAdmin/scripts/setup.php //phpmyadmin/scripts/setup.php //pma/scripts/setup.php /phpMyAdmin1/scripts/setup.php /phpmyadmin/_scripts/setup.php /phpMyAdmin/_scripts/setup.php http://<本サーバIPアドレス>:80/admin/web/ http://<本サーバIPアドレス>:80/PMA2013/ http://<本サーバIPアドレス>:80/db/websql/ http://<本サーバIPアドレス>:80/pma2016/ http://<本サーバIPアドレス>:80/pma2018/ http://<本サーバIPアドレス>:80/pma2012/ http://<本サーバIPアドレス>:80/mysqladmin/ http://<本サーバIPアドレス>:80/db/dbweb/ http://<本サーバIPアドレス>:80/MyAdmin/ http://<本サーバIPアドレス>:80/pma2014/ http://<本サーバIPアドレス>:80/PMA2015/ http://<本サーバIPアドレス>:80/administrator/phpmyadmin/ http://<本サーバIPアドレス>:80/admin/sqladmin/ http://<本サーバIPアドレス>:80/phpmyadmin2/ http://<本サーバIPアドレス>:80/admin/pMA/ http://<本サーバIPアドレス>:80/phpmyAdmin/ http://<本サーバIPアドレス>:80/phpmy-admin/ http://<本サーバIPアドレス>:80/PMA2016/ http://<本サーバIPアドレス>:80/sql/sql/ http://<本サーバIPアドレス>:80/db/myadmin/ http://<本サーバIPアドレス>:80/database/ http://<本サーバIPアドレス>:80/pma2011/ http://<本サーバIPアドレス>:80/administrator/phpMyAdmin/ http://<本サーバIPアドレス>:80/sql/phpmyadmin2/ http://<本サーバIPアドレス>:80/sql/sql-admin/ http://<本サーバIPアドレス>:80/db/webadmin/ http://<本サーバIPアドレス>:80/mysql/db/ http://<本サーバIPアドレス>:80/mysql/dbadmin/ http://<本サーバIPアドレス>:80/phpmyadmin2013/ http://<本サーバIPアドレス>:80/phpMyAdmin/ http://<本サーバIPアドレス>:80/pma/ http://<本サーバIPアドレス>:80/mysql/pMA/ http://<本サーバIPアドレス>:80/phpmyadmin2014/ http://<本サーバIPアドレス>:80/db/webdb/ http://<本サーバIPアドレス>:80/phpmyadmin3/ http://<本サーバIPアドレス>:80/pma2013/ http://<本サーバIPアドレス>:80/PMA2017/ http://<本サーバIPアドレス>:80/2phpmyadmin/ http://<本サーバIPアドレス>:80/php-myadmin/ http://<本サーバIPアドレス>:80/administrator/admin/ http://<本サーバIPアドレス>:80/db/phpMyAdmin3/ http://<本サーバIPアドレス>:80/db/dbadmin/ http://<本サーバIPアドレス>:80/dbadmin/ http://<本サーバIPアドレス>:80/sql/webdb/ http://<本サーバIPアドレス>:80/pma2017/ http://<本サーバIPアドレス>:80/sql/sqladmin/ http://<本サーバIPアドレス>:80/administrator/PMA/ http://<本サーバIPアドレス>:80/administrator/db/ http://<本サーバIPアドレス>:80/phpmy/ http://<本サーバIPアドレス>:80/sql/phpmanager/ http://<本サーバIPアドレス>:80/PMA/ http://<本サーバIPアドレス>:80/mysql/ http://<本サーバIPアドレス>:80/db/ http://<本サーバIPアドレス>:80/sql/websql/ http://<本サーバIPアドレス>:80/sql/php-myadmin/ http://<本サーバIPアドレス>:80/mysql/pma/ http://<本サーバIPアドレス>:80/admin/ http://<本サーバIPアドレス>:80/admin/sysadmin/ http://<本サーバIPアドレス>:80/db/phpmyadmin/ http://<本サーバIPアドレス>:80/phpmyadmin4/ http://<本サーバIPアドレス>:80/db/phpMyAdmin/ http://<本サーバIPアドレス>:80/myadmin/ http://<本サーバIPアドレス>:80/sql/sqlweb/ http://<本サーバIPアドレス>:80/PMA2012/ http://<本サーバIPアドレス>:80/sql/phpmy-admin/ http://<本サーバIPアドレス>:80/phpmyadmin2012/ http://<本サーバIPアドレス>:80/phppma/ http://<本サーバIPアドレス>:80/sqlmanager/ http://<本サーバIPアドレス>:80/admin/db/ http://<本サーバIPアドレス>:80/mysql/mysqlmanager/ http://<本サーバIPアドレス>:80/db/phpMyAdmin-3/ http://<本サーバIPアドレス>:80/mysql/web/ http://<本サーバIPアドレス>:80/php-my-admin/ http://<本サーバIPアドレス>:80/administrator/pma/ http://<本サーバIPアドレス>:80/phpmyadmin2016/ http://<本サーバIPアドレス>:80/phpMyAdmin4/ http://<本サーバIPアドレス>:80/admin/phpMyAdmin/ http://<本サーバIPアドレス>:80/db/phpmyadmin3/ http://<本サーバIPアドレス>:80/mysql/sqlmanager/ http://<本サーバIPアドレス>:80/phpMyAdmin-3/ http://<本サーバIPアドレス>:80/sql/phpMyAdmin2/ http://<本サーバIPアドレス>:80/phpmyadmin2017/ http://<本サーバIPアドレス>:80/phpMyadmin/ http://<本サーバIPアドレス>:80/phpmyadmin2018/ http://<本サーバIPアドレス>:80/sql/myadmin/ http://<本サーバIPアドレス>:80/mysqlmanager/ http://<本サーバIPアドレス>:80/db/db-admin/ http://<本サーバIPアドレス>:80/pma2015/ /phpMyAdmin/scripts/db_setup.

記事の英訳

2018-03-03 19:51:09 +09:00 Post Comments

このサイトは作成ソフト(Hugo)が対応しているからというだけの理由で, 記事に英語版を作成できるようにしてあります. そして,語学学習のためにたまには英訳をしようと思っていますが, 技術記事は英語にしないことにしています. それにはいくつか理由があります. 一つ目の理由は,速報性が損なわれることです. 技術記事は基本的に早くかけてこそです. どうしても翻訳が必要なら機械翻訳でも使うことでしょう. 二つ目の理由は,正確性が損なわれることです. 私には英語の作法に詳しくありません. それでなんとか意訳をするわけですが, それが技術記事に重要な正確性を損ねると思うのです. 三つ目の理由は英語情報にノイズを加えたくないことです. 私は日本語で欲しい情報が見つからない時に英語で検索します. ところがサーバ構築については日本語情報を訳したサイトというのがでてくる事がありました. あれは私にとってノイズでしかありませんでした. 私が書ける範囲のことに英語情報がないことなどありません. 私が英語で記事を書けば,そこに冗長で誤りを含んだノイズを加えることになってしまいます. だから,私は技術的な話を英語にしてこのサイトに書くことをしません.

2018年のサーバー構築

2018-01-16 20:50:07 +09:00 Post Comments

本サイトは2018年1月12日〜14日ごろに、3代目の機体(5代目くらいの構築)で公開を再開しました。 本記事はその記録です。 基本方針 今回の再構築では次の基本方針を掲げました。 壊れにくい ソフトウェアの更新などによるサービスの停止を起こしにくい 攻撃を食らっても被害をサービス停止までに止める 再構築しやすい 機体の更新などで再構築する場合にも,できる限り短い時間で作業ができる このサイトはアップデート失敗などで停止し、 再構築に手間取ることによって長期間に渡って公開停止になることを、 繰り返してきました。 再発を防ぐために、壊れにくく直しやすい作りが必要でした。 これらを実現するための方法として、VMを利用して軽量OSを動作させ、 その上でそのOSのやり方に沿ってサイトを構築することとしました。 (いまどき自宅サーバでやっています。 あんまりネットワークに負荷をかけると、 私とはなんの関係もない近隣住民に被害が発生します。 私が気に入らない場合はコメントでお願いします。) 使用ソフトウェア OS周り VM環境: VirtualBox VM OS: Alpine Linux Virtual版 ウェブサーバ HTTP サーバ: nginx コンテンツ管理(VMホスト側で実行): Hugo コメントサーバ: Isso コメントサーバ実行環境: uWSGI メールサーバ MTA: Postfix MDA: Dovecot 2 迷惑メール対策: Rspamd ウイルススキャン: ClamAV DNSサーバ(サーバ間連携用) DNSサーバ: Dnsmasq 設定内容 OS周り 各サーバ共通で以下の様な設定をしました。 VM作成時のオプションとしては OS: 「Linux 2.6以降」 適当なサイズのストレージを設定 ネットワークは「ブリッジアダプター」 インストーラを普通に使う Login: root # インストールCDはrootにパスワードなしで入れる様になっている setup-alpine communityリポジトリを有効化 vi /etc/apk/repositories 次の通り編集 http://.