コンテンツにスキップ

Top

/

さくらのVPSでサーバー構築

ちょっとお試しで自宅サーバーやってたけど気づけば3年。

Google AdSenseもちょこちょこお金入ってくるようになったし、ちゃんとしたサーバーに移管することにした。

ここでは さくらのVPS 上に Ubuntu22.04 を入れ、Apache、Postfix/Dovecot、Nextcloud を構築する手順を記す。

ドメイン取得

このサーバー(jitaku.work)のドメインはお名前.comで取得した。

.workにしたのは安かったから。

この安かったから、は注意が必要で初年度だけ安いドメインが多いという点。

.workは二年目以降も比較的安価だが、中には初年度は数百円でも二年目から数千円になるものもあり、気を付けないといけない。

最悪ドメイン変えれば良いと思うかもしれないが、Google AdSenseなど後からドメインを変えてはいけないものもあるので、変えないに越したことはない。

ので、とりま.workがおすすめですが、ざっと見た感じ、 .gmo がなぜかあほみたいに安いのでこれでもいいかも。

以下が料金表だが、一番右の「更新 以降1年ごと」の料金を必ず確認してから契約しよう。
https://www.onamae.com/service/d-renew/price.html

ドメインをお名前.comからさくらに移管する

ドメインをさくらのVPSで使うのでさくらに移管する。

具体的には、お名前.comにログイン後、「ネームサーバーの設定」にアクセス。

その他のサービスのタブを選択し、

1-1

そこにさくらのネームサーバーを設定する。

1-2

さくらのネームサーバーは以下の通り。

ns1.dns.ne.jp  
ns2.dns.ne.jp  

ちなみにDNSの変更の反映は時間がかかる(即時ではない)のでのんびり待つこと。

さくらのVPSを契約する

次にさくらのVPSを契約する。

値段は以下の通り。
https://vps.sakura.ad.jp/specification/

最初は2Gがおすすめ

メモリたったの2G!?と思うかもしれないが、通常のサーバー運用としては問題ない。
SSDが100GBしかないのは用途によっては厳しいかもしれないが。

また、なんとなくサーバーつくりたいなぁ、ぐらいの気持ちなら、最初は年額じゃなく月額で契約したほうが良い(やっぱりいらないってなったときに年額は1年解約できないので) (ちなみに月額も途中で解約したとしても日割りとかじゃないので注意)

契約が完了したら、先ほどお名前.comで取得しさくらにネームサーバーを変更したドメインを、自分が契約したVPSに割り当てる。

さくらにログインし、
https://secure.sakura.ad.jp/auth/login
メニューから契約中のドメイン一覧を選択し、
2-1

ドメインコントロールパネルを選択。
2-2

メニューからネームサーバサービスを選び、ネームサーバ新規登録ボタンを押下。
2-3

自身がお名前.comで取得したドメイン名を入力して、ドメインを登録するボタンを押下。
2-4

ゾーン状態が「未設定」となっています。
2-5

ので、右側にある「ゾーン」をクリックします。
するとゾーン登録画面が出てくるので、さくらのDNSに設定する(簡易設定)で登録します。
2-6

サーバのIPアドレスは、会員メニューの「契約中のサービス一覧」をクリックすれば[]に囲われた状態で表示されている。
そのIPアドレスを入力すれば完了!
2-7

OSのインストール

さくらのVPSはUbuntuやCentOSなどのメジャーどころなOSであれば簡単にできる。

ここではUbuntu 22.04を選択する。

正直ここで詰まる人はいないので割愛する。

管理ユーザー名:ubuntu(固定) パスワード : (できるだけ長いパスワードに)

管理ユーザー名とあるがただの一般ユーザーでいわゆるrootではない。

そもそもUbuntu22.04ではrootはパスワードが設定されておらずそのままでは使うこともできない。
(パスワード設定して初めて使えるようになる)

rootが必要な作業はすべてsudoでやるべきで、rootユーザーにスイッチすべきではないという考えのためである。

が、個人的にはなんかrootにパスワードが設定されてないというのが気持ち悪いので設定した。

$ sudo passwd root

結果、sudo su - でスイッチできるようになったが、これは間違ったことをしているのかもしれない。

ホスト名の変更

ホスト名変更する。もちろんしなくても以降の作業になんら影響はない。
コンソールの見た目が気になっただけ。

$ sudo hostnamectl set-hostname jitaku

ファイヤーウォール設定

これから構築していくサーバーに必要となるポートに穴をあけていく。
(本当はサーバー構築するたびに必要なポートを開けるのが筋だが、一気にやるので一気に開ける)

なお、ufwをenableにした直後、すべてのポートがふさがれるので、この時なんかのミスで端末閉じたらアウチとなる。
(まぁ、さくらの場合はコンソールが別途用意してあって、全部ふさがっててもそこからは入れるけど)

$ sudo ufw enable

これで全部のポートがふさがった。

で、以下をあける。

sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw allow smtp
sudo ufw allow smtps
sudo ufw allow pop3
sudo ufw allow pop3s
sudo ufw allow imap
sudo ufw allow imaps
sudo ufw allow postfix
sudo ufw allow submission

ほぼわかると思うが見慣れないのはsubmissionだと思う。これはメールサーバーの設定のOB25対策として必要。

あと、ここではsshにしたが、22番というポートは狙われやすいので、sshは 12345 なり別のポート番号に変えたいのなら、

$ sudo ufw allow 12345
みたいな感じで数字で直接指定すること。

で、設定は以下のコマンドで確認できる。

$ sudo ufw status numbered
状態: アクティブ

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere                  
[ 2] 80/tcp                     ALLOW IN    Anywhere                  
[ 3] 443                        ALLOW IN    Anywhere                  
[ 4] 25/tcp                     ALLOW IN    Anywhere                  
[ 5] 465/tcp                    ALLOW IN    Anywhere                  
[ 6] 110/tcp                    ALLOW IN    Anywhere                  
[ 7] 995/tcp                    ALLOW IN    Anywhere                  
[ 8] 143/tcp                    ALLOW IN    Anywhere                  
[ 9] 993/tcp                    ALLOW IN    Anywhere                  
[10] 22/tcp (v6)                ALLOW IN    Anywhere (v6)             
[11] 80/tcp (v6)                ALLOW IN    Anywhere (v6)             
[12] 443 (v6)                   ALLOW IN    Anywhere (v6)             
[13] 25/tcp (v6)                ALLOW IN    Anywhere (v6)             
[14] 465/tcp (v6)               ALLOW IN    Anywhere (v6)             
[15] 110/tcp (v6)               ALLOW IN    Anywhere (v6)             
[16] 995/tcp (v6)               ALLOW IN    Anywhere (v6)             
[17] 143/tcp (v6)               ALLOW IN    Anywhere (v6)             
[18] 993/tcp (v6)               ALLOW IN    Anywhere (v6)             

もしも削除したいなら、deleteを使えば削除できる。

$ sudo ufw delete 1
削除:
 allow 22/tcp
操作を続けますか (y|n)? y
ルールを削除しました

ここで番号を指定して削除するわけだが、注意しないといけないのは削除するたびに番号が更新される、という点。

例えば、1番と対になっている10番(v6のssh)を消したいと思って、

$ sudo ufw delete 1
$ sudo ufw delete 10
なんてやったらおかしなことになる。

1を削除した時点で数字が繰り上がり、10は9になってしまっているからだ。
sudo ufw delete 1 を実行した直後のステータスを見てみよう。

$ sudo ufw status numbered
状態: アクティブ

     To                         Action      From
     --                         ------      ----
[ 1] 80/tcp                     ALLOW IN    Anywhere                  
[ 2] 443                        ALLOW IN    Anywhere                  
[ 3] 25/tcp                     ALLOW IN    Anywhere                  
[ 4] 465/tcp                    ALLOW IN    Anywhere                  
[ 5] 110/tcp                    ALLOW IN    Anywhere                  
[ 6] 995/tcp                    ALLOW IN    Anywhere                  
[ 7] 143/tcp                    ALLOW IN    Anywhere                  
[ 8] 993/tcp                    ALLOW IN    Anywhere                  
[ 9] 22/tcp (v6)                ALLOW IN    Anywhere (v6)             
[10] 80/tcp (v6)                ALLOW IN    Anywhere (v6)             
[11] 443 (v6)                   ALLOW IN    Anywhere (v6)             
[12] 25/tcp (v6)                ALLOW IN    Anywhere (v6)             
[13] 465/tcp (v6)               ALLOW IN    Anywhere (v6)             
[14] 110/tcp (v6)               ALLOW IN    Anywhere (v6)             
[15] 995/tcp (v6)               ALLOW IN    Anywhere (v6)             
[16] 143/tcp (v6)               ALLOW IN    Anywhere (v6)             
[17] 993/tcp (v6)               ALLOW IN    Anywhere (v6)             

上記のように、1以降のすべての番号が繰り上がってしまっている。
ここで10を消してしまうと、v6の22ポートは残る上に、v6の80のポートが消えてしまう。
ので消すときは注意が必要。

SSHサーバ構築手順

SSHサーバ構築とか言ってもパスワードでログインするならサーバーを立ち上げたら終わり、という感じ。

ここではSSH認証鍵を用いたログインに制限する設定をする。

これにより、まぁ、まず、外部から不正アクセスされなくなる(クライアントになるSSH認証鍵を物理的に盗まないといけないわけだから)

これを超えるには二要素認証だがやり方もわからんしそこまでセキュアにする必要がない。(あったらサーバー構築手順書なんて公開しない。この時点でセキュリティホール)

SSH認証鍵を使った公開鍵認証はクライアント側で秘密鍵と公開鍵を作って、サーバーに公開鍵を置くことでできるようになる認証方式です。

ちなみに自分は「逆」だと思っていたので最初混乱しました。サーバー側が提供してくれる公開鍵をクライアント側に持ってきて…と思いこんでいたので。

ので、まずはクライアント側で秘密鍵と公開鍵を作りましょう!

と言いたいところなのですが、サーバー側で作ります。

なんで!?

と思うかもしれないですが、別に個人用のVPSでサーバーも自由にいじれるし、WindowsPC側で頑張って秘密鍵とか作ってとか面倒。
Ubuntu上での作業のほうがやりやすいのでサーバー側で作った秘密鍵/公開鍵をあたかもクライアントが作った体で設定する。

ので以下はサーバー上での作業。

$ ssh-keygen -t ecdsa

パスワード以外はデフォルト値のままで。

なお、ここで-t云々でecdsaとか指定しているけど、デフォルトだと問題になるので注意。
例えば以下のように、

$ ssh-keygen 

でも鍵はできるが、ssh-rsaのアルゴリズムで作られた鍵になり、セキュリティ的に脆弱なためログインができない。
(抜け道として設定を書き換えることもできるが脆弱なアルゴリズムをあえて有効にする解決は間違い)

ほなデフォルトssh-rsaにすなよ!

と言いたいところだけど知らんがな。

でここではecdsa方式をとる。ほかにもed25519とかあるけど正直差はわからん。

んで、実行すると~/.ssh配下にid_ecdsaとid_ecdsa.pubという鍵ができる。
id_ecdsaが秘密鍵で、id_ecdsa.pubが公開鍵。

んで、この公開鍵を ~/.ssh/authorized_keys に追記する。
追記と言っても最初なのでまだファイルすらないはずだが。

$ cd ~/.ssh
$ cat id_ecdsa.pub >> authorized_keys
$ chmod 600 authorized_keys

次にSSHサーバーの設定を変更する。
まずはポート番号を変更。もちろん、変更するなら上記のファイヤーウォールで穴あけもしておくこと。
ここでは22から12345に変えたとする。
ちなみにだが設定変くするときはファイルのバックアップを取る癖を付けたほうが良い。

$ cd
$ mkdir -p ~/conf_backup/etc/ssh/
$ sudo cp /etc/ssh/sshd_config ~/conf_backup/etc/ssh/sshd_config
$ sudo vi /etc/ssh/sshd_config

#Port 22
->
Port 12345

次に、sshのパスワードでログインできないようにする。

#PasswordAuthentication yes
->
PasswordAuthentication no

ついでに明示的にrootでログインできないようにもしておく。

PermitRootLogin yes
->
PermitRootLogin no

で、再起動するともうパスワードによるログインができなくなるのでscpを使ってさっき作った秘密鍵と公開鍵(id_ecdsaとid_ecdsa.pub)をWindowsPC上に落として置く。
(正確にはクライアント側には秘密鍵だけあればよい)

んで、ちゃんとクライアント側に秘密鍵をダウンロードしたら、sshサーバーを再起動する。

$ sudo systemctl restart ssh

これでもうパスワードではログインできなくなった。

Windows側でSSH認証鍵を使ったログイン方法はツールによって異なるので、TeraTermなりRLoginなり使ってるツールのサイトを確認するかググれ。

クライアントもLinuxなら以下のようにアクセスできる。

ssh -i ~/.ssh/id_ecdsa -p 12345 ユーザー名@jitaku.work

-iで秘密鍵ファイルを指定するだけ。
ポート番号を22から変えたなら -p 12345 のように-pで指定する必要がある。
デフォルトでenableになっているはずだが、念のためenableにしておく。

$ sudo systemctl enable ssh

このenableは何をしてるのかというと、Linuxサーバーが再起動したときに自動でsshサービスが立ち上がるか否かの設定でdisableだと立ち上がってくれません。
(結果、sshでログインできなくなります)

ちなみに秘密鍵のファイル権限が0600じゃないと怒られる(というかログイン失敗する)ので注意。

chmod 0600 ~/.ssh/id_ecdsa

あと、毎回毎回 ssh -i 云々を打ち込むのヤダ!というのであれば、~/.ssh/configというファイルを作ることで省略できる。

vi ~/.ssh/config

Host jitaku
    Hostname jitaku.work
    User user
    Port 22
    IdentityFile /home/hoge/.ssh/id_rsa
    AddKeysToAgent yes

このようにしておくと、今後は、

ssh jitaku
で接続できるようになる。便利!
当然、ユーザー名、パスワード、秘密鍵のファイル場所などは環境に合わせること。

次にパスワードでのログインをできないようにする。
ちなみにだが設定変くするときはファイルのバックアップを取る癖を付けたほうが良い。

$ cd
$ mkdir -p ~/conf_backup/etc/ssh/
$ sudo cp /etc/ssh/sshd_config ~/conf_backup/etc/ssh/sshd_config
$ sudo vi /etc/ssh/sshd_config

#PasswordAuthentication yes
->
PasswordAuthentication no

ついでに明示的にrootでログインできないようにもしておく。

PermitRootLogin no

で、再起動するともうパスワードによるログインができなくなるのでscpを使ってさっき作った秘密鍵と公開鍵(id_ecdsaとid_ecdsa.pub)をWindowsPC上に落として置く。
(正確にはクライアント側には秘密鍵だけあればよい)

んで、ちゃんとクライアント側に秘密鍵をダウンロードしたら、sshサーバーを再起動する。

$ sudo systemctl restart ssh

これでもうパスワードではログインできなくなった。

Windows側でSSH認証鍵を使ったログイン方法はツールによって異なるので、TeraTermなりRLoginなり使ってるツールのサイトを確認するかググれ。

RloginならSSH認証鍵に秘密鍵(pubがついていないほう)をセットすればいい。ポートを変えてるならTCPポートをsshから12345などに変更。
パスワードは証明書を作った時のパスワードなので注意。

クライアントもLinuxなら以下のようにアクセスできる。

ssh -i ~/.ssh/id_ecdsa -p 12345 ユーザー名@jitaku.work

-iで秘密鍵ファイルを指定するだけ。
ポート番号を22から変えたなら -p 12345 のように-pで指定する必要がある。
デフォルトでenableになっているはずだが、念のためenableにしておく。

$ sudo systemctl enable ssh

このenableは何をしてるのかというと、Linuxサーバーが再起動したときに自動でsshサービスが立ち上がるか否かの設定でdisableだと立ち上がってくれません。
(結果、sshでログインできなくなります)

ちなみに秘密鍵のファイル権限が0600じゃないと怒られる(というかログイン失敗する)ので注意。

chmod 0600 ~/.ssh/id_ecdsa

あと、毎回毎回 ssh -i 云々を打ち込むのヤダ!というのであれば、~/.ssh/configというファイルを作ることで省略できる。

vi ~/.ssh/config

Host jitaku (<= 任意:ここで指定した名前でssh接続できるようになる)
        Hostname ホスト名
        User ユーザー名
        Port ポート番号
        IdentityFile /home/ユーザー名/.ssh/id_ecdsa
        AddKeysToAgent yes

このファイルが存在している状態であれば、

ssh jitaku

と打ち込むだけでログインが可能となる(当然というかパスワードは聞かれるが)

SSHサーバは以上。

SSH認証鍵を使ったログインができない

以下のようなメッセージが出てログインできない!

 SSH2 User Auth Failure "publickey" Status=0004

これはssh-rsaアルゴリズムを使っているため。
秘密鍵ファイル名が id_rsa になっていたらダメ。
ssh-keygen の時にちゃんとアルゴリズム指定をしなかったせい。

設定ファイルを書き換えssh-rsaも有効にする手もあるが、

$ sudo vi /etc/ssh/sshd_config

PubkeyAcceptedAlgorithms=+ssh-rsa
これはさすがに脆弱性の問題もあり、例えば昔からあるサーバーで、SSH認証鍵の交換が難しいとかあれば仕方ないが、新規のサーバーでこれをやるのは悪手である。

ので、普通により強度の高いアルゴリズムでSSH認証鍵を作り設定しなおそう。

$ ssh-keygen -t ed25519

or

$ ssh-keygen -t ecdsa

ED25519とECDSAのどっちが良いかはよく知らん。

以上。

Webサーバー構築手順

WebサーバーはApacheを用いる。
なお、Webサーバーの設定で作成したSSL証明書をメールサーバー構築時も用いるので、メールより先にWebサーバーの設定を行うこと!

$ sudo apt update -y
$ sudo apt upgrade -y
$ sudo apt install -y apache2

Apacheのデフォルトのディレクトリは /var/www/htmlでサンプルのhtmlがあるので起動したらもう見れる。

$ sudo systemctl enable apache2
$ sudo systemctl start  apache2

これでもうWebサーバーは立ち上がっているので、http://jitaku.work にChromeからアクセスしたら…
あれ、出ないぞ!
とちょっとびっくりしたが、jitaku.workと省略してChromeのアドレスに入れたもんだからhttps://が補完されてしまったせだった。
まだHTTPS通信には対応していないのでダメだったんですね。
ポートがちゃんと開いてないのかな?とファイヤーウォールを確認したり時間を取られてしまいました(笑)

ではHTTPS通信できるようにしよう。

$ sudo a2enmod ssl

$ sudo a2ensite default-ssl

$ sudo systemctl restart apache2

これで、https://jitaku.workにもアクセスできるようになった。
が、「この接続ではプライバシーが保護されません」と表示されるように。
そう、証明書が偽物だからだ。

このメッセージを消すにはちゃんとしたSSL証明書が必要だ。
昔はお金を払って買っていたのだろうが、今はLet's Encryptがある。ありがたいことです。

まずcertbotというLet’s Encryptのツールを入れる。

$ sudo apt install -y certbot python3-certbot-apache

次にApacheの設定を変更する。

$ cd
$ mkdir -p ~/conf_bak/etc/apache2/sites-available/
$ cp /etc/apache2/sites-available/000-default.conf ~/conf_bak/etc/apache2/sites-available/

以下のようにコメントアウトされているServerNameを編集する。

$ sudo vi /etc/apache2/sites-available/000-default.conf

#ServerName www.example.com
->
ServerName jitaku.work

んで、Apacheをrestart。

$ sudo systemctl restart apache2

certbotにはApach専用のオプションがある。ApacheがメジャーなWebサーバーだからだろう。
これによりほぼ自動で簡単に設定ができる。
(※Would you be willing,~のところはNにしないとあれなので注意)

$ sudo certbot --apache

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): webmaster@jitaku.work

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
Account registered.

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: jitaku.work
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Requesting a certificate for jitaku.work

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/jitaku.work/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/jitaku.work/privkey.pem
This certificate expires on 2022-10-02.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for jitaku.work to /etc/apache2/sites-available/000-default-le-ssl.conf
Congratulations! You have successfully enabled HTTPS on https://jitaku.work

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

んで、Apacheを再起動。

$ sudo systemctl restart apache2

すると、https://jitaku.work にアクセスしても証明書の警告はでなくなったはず!
(数分ぐらい時間がかかった。キャッシュのせいかもしれないのでキャッシュをクリアしてみたが変わらず、Chromeをもう一個立ち上げて確認したらOKになった。それが功をそうしたのか時間がたったからかはしらん)

証明書は、

Certificate is saved at: /etc/letsencrypt/live/jitaku.work/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/jitaku.work/privkey.pem

配下に出力されている。
これらはあとでメールサーバーの設定でも用いるので、メールサーバーより先にApacheの設定をする必要がある。

なお、作成したSSL証明書の有効期限は3か月しかない。 ので定期的に更新してあげる必要がある、というかあった。

デフォルトで有効になっているはずだが念のため、

$ sudo systemctl enable certbot.timer
$ sudo systemctl restart certbot.timer
$ sudo systemctl status certbot.timer
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Tue 2022-07-05 16:54:25 JST; 5s ago
    Trigger: Wed 2022-07-06 01:49:06 JST; 8h left
   Triggers: ● certbot.service

 7月 05 16:54:25 jitaku systemd[1]: certbot.timer: Deactivated successfully.
 7月 05 16:54:25 jitaku systemd[1]: Stopped Run certbot twice daily.
 7月 05 16:54:25 jitaku systemd[1]: Stopping Run certbot twice daily...
 7月 05 16:54:25 jitaku systemd[1]: Started Run certbot twice daily.

twice dailyとあるので日に2日更新してくれるみたい。
(有効期限が30日を切るまでは実際には更新しないけど)

以上!

ppa:certbot/certbotリポジトリを追加したらエラーが出て困った

古い本だと、

$ sudo add-apt-repository ppa:certbot/certbot 

するように書かれているのでしたところ、

$ sudo apt update
...
E: リポジトリ https://ppa.launchpadcontent.net/certbot/certbot/ubuntu jammy Release には Release ファイルがありません。

とエラーが出て困った。
どうもUbuntu18.04までは必要だったらしいが今はいらないとのこと。
なので、削除する。

$ sudo apt-add-repository -r ppa:certbot/certbot

E: パッケージ python-certbot-apache が見つかりません

あれ? python-certbot-apacheが見つからんぞ!とひとしきり困ったが、今はpython3になっているので、

$ sudo apt install -y python3-certbot-apache
にすればOK!

メールサーバー構築手順

メールサーバーは設定ファイルの変更箇所が多いので辟易する。何とかならんもんか。

まぁいいとして Postfix と Dovecot を用いる。

なんで2つ?と思ったかもしれないが、PostfixがSMTPサーバーと言われるメールを送信するサーバーで、DovecotがIMAP/POPサーバーと言われるメールを受信するサーバーだから。
いや、一つでやれよ、と思うかもしれないが知らんがな!

まずはPostfixから設定する。

Postfix

$ sudo apt update -y
$ sudo apt install -y postfix
$ sudo systemctl enable postfix
$ sudo systemctl restart postfix

なんかいっぱい書き換える必要があって辟易する。
当然だが、jitaku.workのところは自身のドメインに変更すること。

$ sudo cp /usr/share/postfix/main.cf.dist /etc/postfix/main.cf
$ mkdir ~/conf_bak/etc/postfix/
$ sudo cp /etc/postfix/main.cf ~/conf_bak/etc/postfix/main.cf
$ sudo vi /etc/postfix/main.cf

myhostname                   = jitaku.work
mydomain                     = jitaku.work
myorigin                     = $mydomain
mydestination                = $myhostname, jitaku.work, localhost.localdomain, localhost
inet_interfaces              = all
home_mailbox                 = Maildir/
smtpd_banner                 = $myhostname ESMTP
local_recipient_maps         = unix:passwd.byname $alias_maps

mailbox_size_limit           = 0
message_size_limit           = 102400000

disable_vrfy_command         = yes
smtpd_helo_required          = yes
smtpd_sender_restrictions    = reject_non_fqdn_sender, reject_unknown_sender_domain

smtpd_sasl_auth_enable       = yes
smtpd_sasl_security_options  = noanonymous
broken_sasl_auth_clients     = yes
smtpd_sasl_local_domain      = $myhostname
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

smtpd_tls_cert_file=/etc/letsencrypt/live/jitaku.work/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/jitaku.work/privkey.pem
smtpd_use_tls=yes
smtpd_tls_session_cache_database=btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database =btree:${data_directory}/smtp_scache

あと、 = で終わってるやつはエラーになるのでコメントアウトする。
(デフォルトでしといてくれや...)

#sendmail_path =
#newaliases_path =
#mailq_path =
#setgid_group =
#html_directory =
#manpage_directory =
#sample_directory =
#readme_directory =

再起動してこれでPostfix側の設定は「いったん」終了。

$ sudo systemctl restart postfix

次は受信サーバー。

Dovecot

こっちもあほみたいに変更しないといけない。しんどい。

$ sudo apt install -y dovecot-core dovecot-imapd dovecot-pop3d
$ sudo systemctl enable dovecot
$ sudo systemctl restart dovecot

設定ファイルを更新する。
いつものようにバックアップを取ってから、

$ mkdir ~/conf_bak/etc/dovecot
$ sudo cp -rf /etc/dovecot/* ~/conf_bak/etc/dovecot/

■dovecot.conf

$ sudo vi /etc/dovecot/dovecot.conf 

# listen = *, ::
->
listen = *, ::

■10-auth.conf

$ sudo vi /etc/dovecot/conf.d/10-auth.conf

#disable_plaintext_auth = yes
->
disable_plaintext_auth = no

#auth_mechanisms = plain
->
auth_mechanisms = plain login

■10-mail.conf

$ sudo vi /etc/dovecot/conf.d/10-mail.conf

#mail_location = mbox:~/mail:INBOX=/var/mail/%u
->
mail_location = maildir:~/Maildir

■10-ssl.conf

$  sudo vi /etc/dovecot/conf.d/10-ssl.conf 

ssl = require
->
ssl = yes

ssl_cert = </etc/dovecot/private/dovecot.pem
->
ssl_cert = </etc/letsencrypt/live/jitaku.work/fullchain.pem

ssl_key = </etc/dovecot/private/dovecot.key
->
ssl_key = </etc/letsencrypt/live/jitaku.work/privkey.pem

■10-master.conf

$ sudo vi /etc/dovecot/conf.d/10-master.conf 

#unix_listener /var/spool/postfix/private/auth {
#    mode = 0666
#}
->
unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
}

inet_listener imap {
    #port = 143
}
inet_listener imaps {
    #port = 993
    #ssl = yes
}
->
inet_listener imap {
    port = 143
}
inet_listener imaps {
    port = 993
    ssl = yes
}

service pop3-login {
    inet_listener pop3 {
        #port = 110
    }
    inet_listener pop3s {
        #port = 995
        #ssl = yes
    }
}
->
service pop3-login {
    inet_listener pop3 {
        port = 110
    }
    inet_listener pop3s {
        port = 995
        ssl = yes
    }
}

service submission-login {
    inet_listener submission {
        #port = 587
    }
}
->
service submission-login {
    inet_listener submission {
      port = 587
    }
}

以上でdovecotの設定は終了です。再起動しましょう。

sudo systemctl restart postfix dovecot

OP25対応

自分のメールサーバーが不正中継の踏み台に使われないように設定をする。

submissionの行(の1行目だけ)をコメントアウトする。

$ sudo vi /etc/postfix/master.cf

# submission inet n       -       n       -       -       smtpd
->
submission inet n       -       n       -       -       smtpd

再起動。

sudo systemctl restart postfix dovecot

SMTP over SSL用対応

結構、変更が面倒くさいので注意。以下を削除して、

 #  -o smtpd_client_restrictions=$mua_client_restrictions

代わりに、

 -o smtpd_client_restrictions=permit_sasl_authenticated,reject

追加したりとか、面倒。

$ sudo vi /etc/postfix/master.cf

#smtps     inet  n       -       y       -       -       smtpd
#  -o syslog_name=postfix/smtps
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

->

smtps     inet  n       -       y       -       -       smtpd
#  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

と4行分、一致する場所の#を外す。
再起動して終了。

sudo systemctl restart postfix dovecot

これでメールサーバの設定は完了。
もうメールの送受信ができます。
が、ユーザーがいません。
追加しましょう。

ここでは このサイトの管理人となる webmaster を追加します。

sudo adduser webmaster

要はunixのアカウントを追加すればよいだけです(というかそうなるように設定した)

ユーザー追加したら再起動しないと反映されなかったので再起動。

sudo systemctl restart postfix dovecot

これでwebmaster @ jitaku.workが使えるようになりました。

実際にThunderBirdなどに設定して確認しましょう。

以上!

fatal: bad string length 0 < 1: setgid_group =

なんか知らんがエラーになると思ったら、main.cfの中で、= で終わってるやつがいたらダメとのこと。

なので全部コメントアウトする。

$ sudo vi /etc/postfix/main.cf

sendmail_path =
->
#sendmail_path =

みたいな感じで。全部。 = で終わってる行をコメントアウト。

iPhoneでのメール設定に失敗する

Windowsのメールクライアントではあっさり設定できたのに、なぜかiPhoneでのメール設定が失敗する。
わからん。
困ったね。

"jitaku.work"のパスワードが指定されていません メールアカウント設定でパスワードを入力してください

とか言われる。
んで、結局わかったのが受信メールサーバーや送信メールサーバのユーザー名に設定するの、メールアドレスじゃなかった、ということ。

なんかネットでみたiPhoneのメール設定でユーザー名の所にメールアドレス入れてたから信じてしまった。

のでiPhoneでちゃんとメールの送受信できた。
以上!

オンラインストレージ構築手順

Nextcloudの構築をする。
内部でMariaDBというDBを使っているのでデータベースの設定も必要。
なおMariaDBというのはMySQLから派生したDB。
だから、と言われたらあれだが。

必要となるPHPインストールして(nextcloudじゃない。それは後)、

sudo apt update -y
sudo apt install -y php-cli php-fpm php-json php-intl php-imagick php-pdo php-mysql php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmath apache2 libapache2-mod-php

設定ファイルをバックアップして、

mkdir -p ~/conf_bak/etc/php/8.1/apache2/
sudo cp /etc/php/8.1/apache2/php.ini ~/conf_bak/etc/php/8.1/apache2/

書き換え。

$ sudo vi /etc/php/8.1/apache2/php.ini

;date.timezone =
->
date.timezone = Asia/Tokyo

;memory_limit = 128M
->
memory_limit = 512M

;upload_max_filesize = 2M
->
upload_max_filesize = 512M

;post_max_size = 8M
->
post_max_size = 512M

;max_execution_time = 30
->
max_execution_time = 300

で、Apache再起動。

$ sudo systemctl restart apache2

データベースが必要なのでインストールする。

$ sudo apt install -y mariadb-server
$ sudo mysql_secure_installation 

ユーザーとテーブルを作成。
ここでのユーザー名とかパスワードとかデータベース名はあとでログインした直後の初期設定で必要となるのでメモっとくこと。

mysql -u root -p
CREATE USER 'ユーザー名'@'localhost' identified by 'パスワード';
CREATE DATABASE データベース名;
GRANT ALL PRIVILEGES ON nextcloud.* TO 'ユーザー名'@'localhost'; FLUSH PRIVILEGES;
QUIT;

やっとこさNextcloudをインストール。

$ wget https://download.nextcloud.com/server/releases/latest.zip
$ unzip latest.zip
$ sudo mv nextcloud /var/www/html/
$ sudo chown -R www-data:www-data /var/www/html/nextcloud/

んで、Apacheの設定を変える。

$sudo vi /etc/apache2/conf-enabled/nextcloud.conf

<VirtualHost *:80>
    ServerAdmin webmaster@jitaku.work
    DocumentRoot /var/www/html/nextcloud/
    ServerName jitaku.work
    ServerAlias jitaku.work
    ErrorLog /var/log/apache2/nextcloud-error.log
    CustomLog /var/log/apache2/nextcloud-access.log combined

    <Directory /var/www/html/nextcloud/>
        Options +FollowSymlinks
        AllowOverride All
            Require all granted
        SetEnv HOME /var/www/html/nextcloud
        SetEnv HTTP_HOME /var/www/html/nextcloud
        <IfModule mod_dav.c>
            Dav off
        </IfModule>
    </Directory>
</VirtualHost>

んでApache再起動したら終了。

$ sudo a2enmod rewrite dir mime env headers
$ sudo systemctl restart apache2

これで、https://jitaku.work/nextcloud/にログインしたら初期設定が始まる。
この時、ログインユーザーも作成することになる。
画面下部のデータベース云々はさっきのテーブル作成のときのやつで、ログインユーザーとは関係ないので注意。

以上!

定期的なデータのバックアップ

さくらのVPSが急に死んでしまった場合を考え、定期的にデータのバックアップをローカルに取っておく必要がある。
ちなみにさくら自体がなんか提供してくれているかと思ったが、

「さくらのVPS」でバックアップの機能はありますか?
いいえ、 さくらのVPS は標準・オプション共にバックアップの機能はございません。
とあるので自分でどうにかするしかない。

ローカルのPCに定期的にrsyncすることで対応する。

mkdocs

これは完全に自分用メモだが、静的サイトジェネレーターとしてmkdocsを用いるがバージョンが異なると動かなくて困るので、バージョンをメモ代わりに。

pip install mkdocs==1.3
pip install mkdocs-material==5.0.2
pip install fontawesome_markdown
pip install python-markdown-math

なお、Python 3.10.xでもエラーになるので、3.8系に戻した。
pyenvで。

pyenv

pyenvのインストールと3.8.13への変更。

$ sudo apt-get update -y
$ sudo apt-get install -y \
    make \
    build-essential \
    libssl-dev \
    zlib1g-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    wget \
    curl \
    llvm \
    libncursesw5-dev \
    xz-utils \
    tk-dev \
    libxml2-dev \
    libxmlsec1-dev \
    libffi-dev \
    liblzma-dev
$ curl https://pyenv.run | bash
$ vi ~/.bashrc

export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

$ source ~/.bashrc
$ pyenv install 3.8.13
$ pyenv global 3.8.13

Digest認証

これも自分用メモだが、このサイト上に著作権上問題のあるコンテンツを置きたいけどそのまま置くのは当然違法なのでガードをかける。
https://jitaku.work/it/category/server-construction/digest/

・・・と思ったが、実際にやったところ401が帰ってくるとGoogle AdSenseから文句を言われた。
MkDocsはsitemap.xmlを自動生成するがそこにhttps://jitaku.work/auth/が自動で入ってしまうせい。
このディレクトリをsitemap.xmlから除外したり、AdSense側でユーザー名とパスワードを設定してログインできるようにしたりするとうまくいくらしいが、
なんかそこまでするのもおかしいかなぁ、と思ったのでやめる。
mkdocsが自動生成するsitemap.xmlからauth以下のURLだけ簡単に外せれればいいのだが。

以上!

タイムリーにさくらのVPSで問題発生

さて、やっとこサーバー移行完了したぞい、と思ったらさくらのVPSからメールが。

[さくらのVPS]さくらのVPS 標準OS「Ubuntu 22.04」に関するご案内

平素は「さくらのVPS」サービスをご利用いただき誠にありがとうございます。
さくらインターネットカスタマーセンターでございます。

---------------------------------------------------------------------
本メールは2022年5月24日(火)~ 2022年7月12日(火)の期間中に「さくら
のVPS」にて、標準OS「Ubuntu 22.04」をインストールされた方に送信して
おります。
---------------------------------------------------------------------

「さくらのVPS」の標準OSとして提供しております「Ubuntu 22.04」において、
カーネルのアップデートが正常に行えない状態であることが判明いたしました。

https://vps.sakura.ad.jp/news/vps-os-ubuntu22_04-kernelupdate/

まさに問題発生期間!

ので書かれている通りコマンドを実行した。

$ sudo apt update
$ sudo apt install linux-generic

異常!