home / vps / sakura-ubuntu さくら de Ubuntu

サービス選定〜OSのインストール
サーバー類のインストール
nginx
>>> さくら de Ubuntu
サーバーの引越
バックアップ
Let's Encrypt
28 Sep 2020 システムが使うMUAbsd-mailxインストール時にpostfixがインストールされないようにする方法をequivsを使用したものに変更。
06 Nov 2018 qmail-smtpdに対するfail2banの設定を追加。 誤記の修正。
27 Oct 2018 新規作成。

 やっとこさサーバーのリプレースに手を出し始めました。 インストール手順の覚え書きページです。 必要な設定がgitのリポジトリに全部突っ込んであるので、このページ見ただけでは色々意味不明だと思います。 サーバーはさくらインターネットのVPS、石狩リージョン。 契約直後に北海道の胆振地方で地震があって、さくらインターネットから電力確保に関するお知らせが来ていました。 ずっと普通に使えていたのでメールが来るまで実体が北海道にあるってすっかり忘れてました。

 さくらの印象ですが、コントロールパネルに2段階認証が付いていたりと、さすがに充実してる印象。 ゴルゴ13でも出てきますが、サーバーのセキュリティを強化していくと、最終的に一番脆弱なのはコンソールになるのは今も昔も同じで。 契約は512プランなのでSSDで20GBしかありません。 メインサーバー(Ablenet)のバックアップは手元のHDDかなぁ。 代打とかつなぎの感は否めない。 Ablenet(50GB)の方はホームディレクトリを別パーティションにしてあるので、原理的にはバックアップせずにリプレースできるんですけどね。 転ばぬ先の杖。

 OSがOpenSUSEからUbuntuに変わるので、HDDのパーティション丸ごと再利用だとユーザーIDの整合性に気をつけないといけないから、tarしてtarし返す方が何も考えなくて楽といえば楽。 NFSとかsshfsならこの辺りはどうにでもなるんだけど。

 Ubuntuサーバーの印象ですが、「余計なものが何にも入ってない」感じでした。 非常に素直なシステム。 Apacheの設定ファイルはinclude多すぎて辟易したけど。 OpenSUSEがいい感じに色々入っていた反面、SuSE Firewall2とか調べないといけないことも多かったので。 Ubuntuサーバーは逆で、余計なことを覚えなくてもいい反面、何も入ってないです。 netstatが入ってないことに気づいたときはちょっとびっくりした。 単にさくらのインストールメディアがそうなってるだけかもしれませんが。 もっとも、最近はifconfigipnetstatssという流れらしいので、そっち使え、ということなのかもしれない。

 少し解説しておくと、うちのサーバーの設定は全部/usr/local/etcに集中させてあります。 ディストリ側は例えばnginxだったら/etc/nginxに設定があったりしますが、ファイルの本体は/usr/local/etc/nginx/nginx.confとかに置いて、/etc/nginxからシンボリックリンクを張るようにしています。 こうすると、/usr/local/etcだけバックアップしておけばぶっ飛んだときも楽に復旧できます。

 さらに、バージョン管理システムで管理しておくと、何かあったときに元に戻せて便利です。 この用途にはやっぱりgitが向いてるなぁ。 サーバーやOSを変えるときは、元のサーバーからcloneしてブランチ切っちゃえばいいのです。 そのままpushしておけばバックアップにもなるという。

 ただ、clone直後のパーミッションはroot:root 644/755になるので、qmailとか変態な所有者設定を要求するものは調整が必要です。 よくaliasで引っかかる。 とりあえず、newgrp wheel; umask 007とかにして調整していくというのもありかもしれない。 あぁそうそう、wheelはUbuntuにはないので注意。 私はシステム入れるとネットワークとsshの設定をとりあえずやって、次に古いシステムと新しいシステムのuser/groupをマージする作業をするので、この時点でwheelができあがるのですが。 FreeBSD時代からずっと持ってきてます。

home / vps / sakura-ubuntu 事前準備

home / vps / sakura-ubuntu インストールから初回ブートまで

 この時点でIPアドレスやDNSなど、ネットワークの基本的な設定は終わっています。

home / vps / sakura-ubuntu SSH

home / vps / sakura-ubuntu ユーザーとグループ

 古いホストからの移行の場合、古いホストにあるユーザーとグループが新しいホストに存在していないと、tarとかでファイルを持ってきたときに面倒なことになるので、なるべく早い時点でユーザーとグループをマージしておく必要がある。 実は一番最初にリプレース作業をやった(Linux → FreeBSDだったと思う)ときにハマった。 遠い昔の、若い頃の話(遠い目)。

 手作業でやると結構面倒だが、実はそのための簡単なツールが作ってあって、それでマージしている。 気が向いたらそのうちGitHubとかで公開するかも。 このツールを作ったときはスクリプト言語をほとんど知らなかったのでC++で書いている。 が、連想配列が使えるスクリプト言語で書いた方が絶対楽。 しかも、コンパイルしないと使えないので、ここでgitとGCCを入れることになる。

$ sudo apt install git-gui g++

 gitはgitkgit guiごとインストールしているが、このままだとsudo suしたときにXフォワードが効かなくなるのと、CygwinのXでgitkなんかを使ったときに日本語が化けらったするので、ついでに対応しておく。 Xはxauthまわりをごちゃごちゃいじる必要があるが、どうもXAUTHORITY環境変数をきちんと設定してexportしておけば済むみたい。 この辺もOpenSUSEでは気にしたことがなかった。

$ cd; echo export 'XAUTHORITY=~/.Xauthority' >> .bashrc
$ sudo apt install fonts-noto

 続けてツールをcloneしてきてビルド。

$ git clone user@server:/path/to/conf-tool
$ cd conf-tool
$ g++ -Wall -Wextra -O -o merge-group merge-group.cpp
$ g++ -Wall -Wextra -O -o merge-passwd merge-passwd.cpp

 passwdファイルにグループIDが含まれるため、必ずグループの方からマージすることになる。 古いホストからpasswdgroupを持ってきてマージを実行する。 本当はshadowも欲しいが、他のユーザーのパスワードは再設定ということにする(開き直り)。 いや、昔はsudo使ってなくて、どうせsshの公開鍵認証でしかログインしないから、自分のパスワードエントリは!で潰してあって、shadowを持ってくる必要がなかったんだよね。 sudoを使おうとすると、rootのパスワードがいらない代わりに、自分のパスワードがないといけない・・・。

 あと、実は以前passwdをマージしたときにmerge-passwdがばぎゅってて(今は直した)、ユーザーIDが重複してました。 実際にはそれを直してからマージしてます。

$ cd
$ mkdir priv
$ chmod 700 priv
$ cd priv
$ PATH=$PATH:~/conf-tool
$ scp user@oldhost:/etc/passwd passwd.old
$ scp user@oldhost:/etc/group group.old
$ check-id-dup.sh < passwd.old
$ check-id-dup.sh < group.old
$ merge-group -s 20010 group.old /etc/group > group.new
$ diff-id.sh group.old group.new
$ diff-id.sh /etc/group group.new
$ merge-passwd -s 20010 passwd.old /etc/passwd group.old group.new > passwd.new
$ diff-id.sh passwd.old passwd.new
$ diff-id.sh /etc/passwd passwd.new

 プログラムの中身がないから何をやってるかさっぱりだが、ポリシーとしては、

 マージが成功したら置き換えてシャドウを更新。

$ sudo cp passwd.new /etc/passwd
$ sudo cp group.new /etc/group
$ sudo grpconv
$ sudo pwconv

home / vps / sakura-ubuntu 基本的な設定

home / vps / sakura-ubuntu BIND9

$ sudo apt install bind9

 named -Vとすると、--sysconfdir=/etc/bindだということが分かる。 したがって、設定ファイルは/etc/bind/named.confになる。 のぞいてみると、include "/etc/bind/named.conf.options";となっており、named.conf.optionsdirectory "/var/cache/bind";と書いてあるので、元々持ってる設定ファイルのdirectoryを書き換えておく必要がある。 ここで/usr/local/etcをcloneしてブランチを切ることになる。

 当然rootでcloneするのだが、sudoはSSHの環境変数を引き継いでくれないのでエージェントフォワードが使えない。 この辺はOpenSUSEでは考えなくてよかった(CentOSとかもかな?)。 色々やってくれていたんだなぁ、と。 とりあえず、sudo -Eでしのぐ。 rootではまだ他のホストにログインしていないので、一度ログインしてknown_hostsを作る。 次いで設定ファイルをcloneして、ついでにsudoersを設定しておく。

$ sudo -E ssh user@server
$ cd /usr/local
$ sudo -E git clone user@server:/usr/local/etc
$ cd /etc/sudoers.d
$ sudo su
# ln -s /usr/local/etc/sudo/environ .
# ln -s /usr/local/etc/sudo/wheel .

ちなみに、environにはDefaults env_keep += "SSH_AUTH_SOCK"と書いてあります。 wheelには%wheel ALL=(ALL:ALL) ALLと書いてあります。 Ubuntuにはwheelがないので。 さっきマージしたときにwheelグループができあがってます。 sudoersは書き間違えるとsudoできなくなるので、rootでの作業が一切できなくなります。 できればsudo suしてから編集して、他の端末からsudoできることを確認してからsudo suしたシェルを終わった方がいいです。 やってもうた時はリカバリーメディアから起動するしかなくなります。

 で、BINDの設定。

$ cd /usr/local/etc/named
$ sudo git checkout -b newserver
$ sudo vi named.conf

directoryを書き換えます。 書き換えたらDNSデータベースへのシンボリックリンクを作っておかないと。

$ cd /var/cache/bind
$ sudo ln -s /usr/local/etc/named db

設定ファイルはシンボリックリンクを張る方法もありますが、systemdの設定ファイルでやってみた。 /lib/systemd/system/bind9.serviceを見ると、

EnvironmentFile=/etc/default/bind9
ExecStart=/usr/sbin/named -f $OPTIONS

となっているので、/etc/default/bind9をいぢればよい。 シンボリックリンクにしてもいいけど、わけが分からなくなりそうなので直接いぢる。 具体的にはOPTIONS環境変数に-c /usr/local/etc/named/named.confを書き加えておけばよい。

 これでBIND9自体の設定は終わりだが、実はこれだけでは起動しない。 起動するとこういうログが残る。

$ journalctl -b
...
named[634]: open: /usr/local/etc/named/named.conf: permission denied
kernel: audit: type=1400 audit(1536939276.534:11): apparmor="DENIED" operation="open" profile="/usr/sbin/named" name="/usr/local/etc/named/named.conf" pid=634 comm="isc-worker0000" requested_mask="r" denied_mask="r" fsuid=53 ouid=0
...

 最初、SELinuxかと思ったのだが、AppArmorだった。 AppArmorの設定は/etc/apparmor.dにあって、usr.sbin.namedというファイルがあるのでのぞいてみると、#include <local/usr.sbin.named>と書いてある。 /etc/apparmor.d/local/usr.sbin.namedは空なので、これを削除して/usr/local/etc/apparmorあたりに設定ファイルを作ってシンボリックリンクを張る。

$ cd /usr/local/etc
$ sudo mkdir apparmor
$ cd apparmor
$ sudo bash -c 'echo "/usr/local/etc/named/** r," > usr.sbin.named'
$ cd /etc/apparmor.d/local
$ sudo rm usr.sbin.named
$ sudo ln -s /usr/local/etc/apparmor/usr.sbin.named .
$ sudo systemctl relaod apparmor

あとはBIND9を再起動、動作を確認できたらファイアウォールに穴を開けておく。 必要ならgit commit; git pushしておく。

$ systemctl restart bind9
$ nslookup
...
> exit
$ sudo ufw allow domain

 なお、デフォルトでsystemdがローカルDNSキャッシュを立ち上げていてポート53を使っているが、loインターフェースのエイリアスとして127.0.0.53を作っていて、ローカルDNSキャッシュはこちらにバインドされている。

 あと、さくらのVPSはコントロールパネルから逆引き設定ができるので、正引きを設定し終わったら逆引きも設定しておくといいです。 Ablenetはサポートに連絡すると設定してくれます。 どちらも料金はかかりません。

home / vps / sakura-ubuntu qmail

 最近は色々面倒になって、構内のSMTPとPOP3は廃止している。 じゃぁどうやってメールを読み書きするのかというと、受け取ったメールはgmailに転送して、そっちで読んでたりする。 メールを送りたいときはsshで直接qmail-injectを実行している。 Cygwinからこんな感じで。

ssh-pageant ssh user@server "/var/qmail/bin/qmail-inject" < file-to-send

だから、家ではPCのメールクライアントは使ってない。 会社はOutlookを強制されて涙目なんだけど(ほんと検索がバカで使えない)。 したがって、使っているデーモンはqmail-sendとその仲間たち、あとは外からメールを受けるためのqmail-smtpdだけである。

 qmailは32ビットでビルドしたいのだが、TLSパッチを当てているせいでOpenSSLで引っかかる。 まずOpenSSLをビルドするところから。 ここでmakeが必要になる。 また、32ビットのビルド環境がないので、それも入れる必要がある。 コンパイラだけ入れればビルドは通るが、ライブラリを入れないと実行ができないという罠が待っている。 ldconfigも忘れがち。

$ sudo apt install make g++-i686-linux-gnu libc6-i386
$ wget https://www.openssl.org/source/openssl-version.tar.gz
$ wget https://www.openssl.org/source/openssl-version.tar.gz.sha256
$ sha256sum openssl-version.tar.gz
$ tar xfvz openssl-version.tar.gz
$ cd openssl-version
$ export CC=i686-linux-gnu-gcc
$ ./Configure --prefix=/usr/local/openssl-version-x86 linux-elf
$ make
$ sudo make install
$ sudo ldconfig /usr/local/openssl-version-x86/lib

続いてqmail。 主なパッチは、512バイトを超えるDNS・メッセジーオーバーフロー・メッセージID・TLS・remove-prepend。 他にもあったかもしれない。

$ cd
$ git clone user@server:/path/to/qmail
$ cd qmail

 パッチが更新されていた場合はパッチの当て直し。 Linuxのカーネルみたいにインクリメンタルなパッチならいいが、qmail-tlsはnetqmailからの差分なので、一度netqmailのオリジナルにgit reset --hardしてからパッチを当てて、git resetでブランチの先頭に戻ってコミットする。 reset --hardするときに現在のブランチの先っぽに何か印をつけておかないと見失うので注意。

$ git checkout netqmail-tls
$ git tag t1
$ git reset --hard netqmail
$ patch -p1 < netqmail-1.06-tls-version.patch
$ git reset t1
$ git tag -d t1
$ git commit -a
$ git checkout master
$ git merge netqmail-tls

 ここで場合によってはconf-ccconf-ldをいぢる必要がある。 今回はコンパイラがi686-linux-gnu-gccで、さっきビルドしたOpenSSLにパスを通さないといけないのでこんな感じ。 あと、エラーや警告を食らわないようにもろもろ。

conf-cc

i686-linux-gnu-gcc -std=gnu90 -O2 -fno-builtin -DTLS=20160918 -I/usr/local/openssl-version-x86/include

conf-ld

i686-linux-gnu-gcc -s -L /usr/local/openssl-version-x86/lib

 ビルドとインストール。 qmailのビルドにはユーザーやグループがごちゃごちゃと必要だけど、さっきユーザーとグループをマージしたときに全部終わってるので、あとはビルドするだけ。

$ make
$ sudo make setup
$ sudo make check

 普通、ここで、config-fastやTLSパッチ用のmake cert tmprsadhを実行するが、それは全部/usr/local/etc/qmailに入っているのでここでは不要。 設定ファイル類はgit cloneしただけだとパーミッションが想定どおりになっていないので調整しておく。 シェルスクリプトで一気にやってしまうが、大体以下のような感じ。

aliasディレクトリはalias:qmail 700 g+s、ファイルはalias:qmail 600
users/*root:qmail 600
controlqmaild:qmail 600 dh2048.pem rsa2048.pem
qmaild:qmail 640 rcpthosts servercert.pem
qmails:qmail 640 virtualdomains
root:qmail 644 残り
$ cd /usr/local/etc/qmail
$ sudo ./setperm.sh

 設定ファイルにシンボリックリンクを張り、systemdと、あと、TLS用のcrontabを仕掛ける。 また、users/cdbはリポジトリに入れてないので、qmail-newuしておく。 実際にはusers/cdbchmod 600しているので、qmail-newuもシェルスクリプトにしてある。 一箇所viしているのは、ソケットの待ち受けアドレスを書き換えるため。

$ cd /var/qmail
$ sudo rm -rf alias control users
$ sudo ln -s /usr/local/etc/qmail/alias .
$ sudo ln -s /usr/local/etc/qmail/control .
$ sudo ln -s /usr/local/etc/qmail/users .
$ cd users
$ sudo ./newu.sh
$ sudo systemctl link /usr/local/etc/systemd/qmail-deliver.service
$ sudo systemctl enable --now qmail-deliver.service
$ sudo systemctl link /usr/local/etc/systemd/qmail-smtpd@.service
$ sudo vi /usr/local/etc/systemd/qmail-smtpd.socket
$ sudo systemctl link /usr/local/etc/systemd/qmail-smtpd.socket
$ sudo systemctl enable --now qmail-smtpd.socket	
$ cd /etc/cron.d
$ sudo ln -s /usr/local/etc/cron/qmail-update-tmprsadh .

 配送のテストをする前に、Maildirを作っておく必要がある。

$ cd
$ /var/qmail/bin/maildirmake Maildir

あとは、qmailのTEST.deliverTEST.receiveに従ってテストをする。 リモートからのテストはtelnetで直接SMTPを叩く。

$ telnet 192.168.1.2 25
Trying 192.168.1.2...
Connected to 192.168.1.2.
Escape character is '^]'.
220 mx.example.jp ESMTP
HELO example.com
250 mx.example.jp
MAIL FROM: <user@example.com>
250 ok
RCPT TO: <user@example.jp>
250 ok
DATA
354 go ahead
subject: test

test.
.
250 ok 1537190551 qp 23956
QUIT
221 mx.example.jp
Connection closed by foreign host.

 うまくいったらファイアウォールに穴を開けて、リポジトリ更新。

$ sudo ufw allow smtp
$ git gui
$ git push

 もし、ローカルからの発信のみで、リモートからの受信はしない場合(引越前の場合)は、SMTPを止めて、localsを空に、virtualdomainsを削除すればよい。 localsは削除してしまうとmeが使われてメールを受け取ろうとするので注意。 うっかりコミットしないように(まぁしてもブランチをリセットすればいいけど)。

$ sudo systemctl disable --now qmail-smtpd.socket
$ cd /usr/local/etc/qmail/control
$ sudo rm locals virtualdomains
$ sudo touch locals
$ sudo systemctl reload qmail-delivery.service

home / vps / sakura-ubuntu システムが使うMUA

 メールを送るプログラムがないとシステムがメールを送れないので入れておく。 mailutilよりもbsd-mailxの方が入るものが少ないので、bsd-mailxを入れることにする。 が、どうしてもpostfix(あるいは他のMTA)が付いてくる。 昔話

postfixを抜こうとするとbsd-mailxもいなくなってしまう。 仕方ないのでこれはこのまま放置して、systemctlで殺しておく(ちゃんと設定してないからどうせ動かないけど)。
$ sudo apt install bsd-mailx
$ sudo systemctl disable --now postfix

 findしてみるとsendmail/usr/sbinにあり、/usr/lib/sendmail -> ../sbin/sendmailだったので、

$ cd /usr/sbin
$ sudo mv sendmail sendmail.postfix
$ sudo ln -s /var/qmail/bin/sendmail .

これでcronunattended-upgradesがメールを送れるようになる、と思う。

 apt-cache depends bsd-mailxするとmail-transport-agentが依存関係として入っているので、空っぽのmail-transport-agentパッケージを作ってインストールしてしまえばよい。 空っぽのパッケージを作るにはequivsを使う(結構でかい、postfixよりでかかったりして)。

# apt install equivs
# equivs-control null-mta
# vi null-mta

 ここで以下のように2行ほど書き換える。

Package: null-mta
Provides: mail-transport-agent

equivs-buildを実行すると.debファイルができるので、dpkgでインストールする。

# equivs-build null-mta
# dpkg -i *.deb

あとはapt install bsd-mailxすれば、余計なMTAはインストールされずにmailxだけインストールされる。 メール送信時にsendmailコマンドを使うが、これはqmailに(qmail-injectでメールを放り投げる)互換品ができているはずなので、シンボリックリンクを張っておく。

# ln -s /var/qmail/bin/sendmail /usr/sbin

これでcronunattended-upgradesがメールを送れるようになる、と思う。 /etc/apt/apt.conf.d/50unattended-upgradesのメールアドレスを埋めておく。

home / vps / sakura-ubuntu mess822など

 他に、.qmailから指定されているシェルスクリプトやプログラムを持ってくる必要がある。 grep -r '^|' .qmail*あたりでプログラムを実行している.qmailを探す。 うちの場合、手製のcheck-spam.shcheck-null、メーリングリスト用のseqnumaddheaderが必要だった。 あとmess822。 これもちょっとスタイルが古いコードなので、いろいろ引っかかる。

 で、こんな感じでconf-ccを書くと、-Wall -Wextraでも無警告で通ります(長ぇよ!)。

i686-linux-gnu-gcc -O -Wall -Wextra -fno-builtin -Wno-misleading-indentation -Wno-unused -Wno-implicit-function-declaration -Wno-sign-compare -Wno-main -Wno-parentheses -Wno-missing-field-initializers -Wno-empty-body -Wno-implicit-fallthrough

home / vps / sakura-ubuntu nginx

$ sudo apt install nginx

 ここでいきなり

Errors were encountered while processing:
 nginx-core
 nginx
E: Sub-process /usr/bin/dpkg returned an error code (1)

と言われる。 ログ確認。

$ journalctl -b
systemd[1]: Starting A high performance web server and a reverse proxy server...
nginx[24332]: nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
nginx[24332]: nginx: configuration file /etc/nginx/nginx.conf test failed
systemd[1]: nginx.service: Control process exited, code=exited status=1
systemd[1]: nginx.service: Failed with result 'exit-code'.
systemd[1]: Failed to start A high performance web server and a reverse proxy server.

IPv6を殺しているのがいけないと分かる。 が、このエラーは/etc/nginx/sites-enabled/defaultのシンボリックリンクの先にある設定ファイルが出しており、どうせ手持ちの設定と置き換えるので、無視して先に進める。 CGIを実行するためにfcgiwrapがいるのでこれもインストール。 やっぱりnginxが動かせないと怒られるけど無視。 ぽこぽことシンボリックリンクを張って、nginxをリスタート。 ファイアウォールを開ける。

$ sudo apt install fcgiwrap
$ cd /etc/nginx/conf.d
$ sudo ln -s /usr/local/etc/nginx/http.conf .
$ cd ../sites-enabled
$ sudo rm default
$ sudo ln -s /usr/local/etc/nginx/default-server.conf .
$ sudo systemctl restart nginx
$ sudo ufw allow http

 これでサーバーは動き出すがドキュメントがない。 ドキュメントをCVSからチェックアウトしてくる。 なんで今さらCVSなのかというと、「作業ディレクトリに余計なデータを置かない」から。 手元でHTMLファイルを編集、cvs ciして、サーバーのHTML公開ディレクトリに行ってcvs upすると更新が終わるのです。 なんで、CVSはまだなんとなく使えますが、Subversionはほんと忘れそう。 たまに新たにディレクトリ作ったのに、cvs up-d付け忘れてハマってますが。

$ sudo apt install cvs
...
W: APT had planned for dpkg to do more than it reported back (8 vs 12).
   Affected packages: nginx-core:amd64

この警告は無視していいらしい。 CVSでHTMLファイルをチェックアウト。 CVS_RSHを設定しないといけないと思ったけど、rshsshへのリンクになってました。 なんで、設定しなくてもsshでアクセスしに行くけど、一応設定しておく。 .bashrcにも書いておく。 wwwadminグループの人が管理をする前提。

$ export CVS_RSH=ssh
$ cd; echo 'export CVS_RSH=ssh' >> .bashrc
$ cd /usr/local
$ sudo mkdir www
$ sudo chgrp wwwadmin www
$ sudo chmod g+ws www
$ cvs -d :ext:user@example.jp:/cvs-repo co -d www www-docs

 ログ周りの設定。 Apache httpdrotatelogsを使う。 パーミッションをいろいろ変更するのだが、デフォルトの位置のままだとunattended-upgradeがかかったときにパーミッションを元に戻されてしまうことがある(おかげさまで数日分ログを失いました)ので、/var/localというディレクトリを作って、その下を使うことにする。 とりあえず、nginxのユーザーIDを確認する。

$ ps -AF | head -n1; ps -AF | grep nginx
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
root     24793     1  0 35160  1580   0 22:57 ?        00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 24794 24793  0 35831  6212   0 22:57 ?        00:00:00 nginx: worker process

www-dataさんでした。 www-dataさんのグループを確認。

$ grep www-data /etc/passwd
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
$ grep :33: /etc/group
www-data:x:33:

www-dataグループでした。 これを元に作業。

$ sudo systemctl stop nginx
$ sudo apt install apache2-utils
$ cd /var
$ sudo mkdir local
$ cd local
$ sudo chmod g+ws .
$ sudo chgrp staff .
$ sudo mkdir nginx
$ cd nginx
$ sudo chown www-data:adm .
$ sudo chmod o-rwx .
$ sudo mkfifo log.fifo
$ sudo chown www-data log.fifo
$ sudo chmod 600 log.fifo
$ sudo systemctl link /usr/local/etc/systemd/nginx-rotatelogs.service
$ sudo systemctl enable nginx-rotatelogs.service
$ sudo systemctl start nginx-rotatelogs.service
$ sudo systemctl start nginx

 カウンタCGIがあるので、パーミッションを調整する必要がある。 例によってシェルスクリプトになっているので、グループ名をwww-dataにして設定スクリプト実行。

$ cd www
$ sudo WWWGRP=www-data ./wwwcount-setup.sh

あとはユーザーディレクトリだけど、これはホームディレクトリをコピーすれば勝手についてくるはず。

home / vps / sakura-ubuntu Webプロキシ

 昔はApacheで全部やってたんだけど、nginxは基本的にフォワードプロキシとして使うようにはできていない。 何ができないのかと言うと、CONNECThttps://をそのまま放り投げる)と多段プロキシができない。 前者はパッチ当てればできるらしい。 Ubuntuのnginxにパッチが当たっているかどうかは確かめてない。 以下、フォワードプロキシとして使えそうなものを列挙。

home / vps / sakura-ubuntu tinyproxy

 aptで入れると1.8.4が入るが、最新は1.10.0。 実は1.10.0では以下の条件が揃うとフォアグランドでログを標準出力に出しながら動く。

aptで入れてみて、こういう動きにならないのかなー、と思ってgithubでソースを追うと、どうもそういう挙動になっているように見えたので色々やってみたが、どうしても思い通りに動かない。 git blameしてみると、masterのコミットccbbb81aで機能追加されており、1.8系ブランチには取り込まれてない模様。 どおりで変だと思った。

 万人に公開しているプロキシじゃないし、使いたいときにちゃらっと立ち上げて使えればいいので、1.10.0を/usr/local以下に入れてしまった。

$ cd ~/src
$ wget https://github.com/tinyproxy/tinyproxy/releases/download/1.10.0/tinyproxy-1.10.0.tar.gz
$ tar xfvz tinyproxy-1.10.0.tar.gz
$ cd tinyproxy-1.10.0
$ ./configure
$ make
$ sudo make install

設定ファイルは/usr/local/etc/tinyproxy/tinyproxy.conf。 特権ポートを使っていない限り、tinyproxy -dとすれば一般ユーザーでも動く。

 ポートは開けない。 sshのポートフォワードで使うので、localhostからだけ使えればよい。

home / etc / sakura-ubuntu fail2ban

 いたづらしてきた人にお仕置きするツール。 実際にはufwdenyを指定して無反応にする。 rejectだとすぐに接続失敗になるが、denyだと無反応になるので、ボットはタイムアウトを待つことになる。 ログを見てbanするかどうか決めているので、loggerなんかでログを書き込める人は、簡単にfail2banを誤動作させることができる。 十分に信頼できない人にシェルアカウントを与えているようなシステムでは運用に注意する必要がある。

 設定ファイルは/etc/fail2banにある。 *.confに対して、*.localというファイルを作り、そこにデフォルト設定からの差分を書く。 デフォルトではsshだけ有効になっている。 とりあえず、こんなjail.localを書いてみた。

[DEFAULT]
findtime = 1m
destemail = root@example.jp
sender = root@example.jp
banaction = ufw
bantime = 1d
usedns = no

 usednsnoにしてあるのは、デフォルトでは変なDNS queryが発生してしまうから。 localとかjpにサーチドメインを付けて、local.example.jpとか、jp.example.jpとかを検索してしまう。 ただ、usednsnoにした場合、ログに記録されたアドレスがホスト名になっているとufwにIPアドレスを渡せない。 ログを監視されるアプリケーション側で、IPアドレスでログを吐くようにする必要がある。

 /action.d/ufw.local

[Init]
blocktype = deny log-all

こうしておくと、banされた後もアクセスしに来るとログが残る。 ufwのデフォルトではルールに対してはログを残さないらしい。

 SSHでユーザー名を入れた後、パスワード認証が使えないと分かった時点で接続を切ってしまう輩は引っかからないらしいので、ルールを追加してみた。 man jail.confすると書いてあるが、ルールを追加する場合、.confを直接編集しなくても、.localの方に以下のように書けばよい。

[DEFAULT]
prohibited_users = (root)

[Definition]
failregex = %(known/failregex)s
        ^%(__prefix_line)sConnection closed by authenticating user %(prohibited_users)s <HOST> port [0-9]+ \[preauth\]

これはこんな行に引っかかる。

sshd[1234]: Connection closed by authenticating user root 192.0.2.123 port 12345 [preauth]

 fail2ban-regexを使うとルールがどう適用されるかが分かる。 fail2ban-regexのログファイルは実ファイルが必要なようで(matchとmissで2回読むからかな?)、bash<( )記法は使えなかった。

$ fail2ban-regex --print-all-matched /var/log/auth.log sshd

 systemdのジャーナルを直接食わせることもできる。

$ fail2ban-regex --print-all-matched systemd-journal -m '_SYSTEMD_UNIT=ssh.service' sshd

-mオプションの書き方はjournalctl -o verbose -u sshなどとすればなんとなく分かるだろう。 journalctl-uオプションではワイルドカードを使えるが、この形式では使えないっぽい。 socketを使ってるとちょっと困ることになる気がする。

qmail-smtpd

 qmail-smtpdはほとんどログを残してくれない上、向こうが不躾に接続を切ると終了コードが非0になり、systemdfailedと記録してそれが溜まっていってしまう。 うちのSMTPは外からやってくるメールしか受け付けず(MUAが使うことを想定していない)、AUTHを発行してぶち切る奴は間違いなく普通のMTAではないので、これを弾くことを考える。

 まず、qmail-smtpdをちょっといじって、AUTHを発行して接続を切られた場合は終了コードで見分けられるようにしておく。 そうすると、

systemd[1]: qmail-smtpd@pid-srvaddr:25-cliaddr:port.service: Main process exited, code=exited, status=2/INVALIDARGUMENT

というログを残すようになるので、これを引っ掛ける。 フィルターはこんな感じ。

[INCLUDES]
before = common.conf
[DEFAULT]
_daemon = systemd
[Definition]
failregex = ^%(__prefix_line)sqmail-smtpd@\d+-[0-9.:]+-<HOST>:\d+\.service: Main process exited, code=exited, status=2/.*

 あとはjail.localでルールを有効にしてやればよいのだが、このログはqmail-smtpdではなく、systemdが残していることに注意。 したがって、journalmatchqmail-smtpdを指定しても引っかからない。 EXIT_CODE=exitedで引っ掛けることにする。

[qmail-smtpd]
enabled = true
backend = systemd
journalmatch = EXIT_CODE=exited

home / etc / sakura-ubuntu その他のプログラム

 sudo apt installで入れる。


Copyright (C) 2018 akamoz.jp

$Id: sakura-ubuntu.htm,v 1.13 2020/12/10 04:32:07 you Exp $