Linux/CentOS Stream8でサーバ構築/OSのインストール@さくらのVPS

OSのインストール@さくらのVPS(2022-03-11)




まず最初にバックアップ

バックアップ用のshellスクリプトを作りましょう。

#!/bin/sh -x
 
#firewall-cmd  --list-all > /tmp/now_fire # ※firewalldを起動後に
crontab -l > /tmp/now_crontab
 
BACK_UP_FILES="
 #/tmp/now_fire
 /tmp/now_crontab
 `pwd`/$0
 "
 
tar zcvf backup_`date +%Y%m%d`.tgz $BACK_UP_FILES 2>&1 > /dev/nul

#rm -f /tmp/now_fire
rm -f /tmp/now_crontab

この後の作業でバックアップを取りたいファイルやディレクトリが現れるたびに BACK_UP_FILES に行追加していきます。
「`pwd`/$0」の部分は、このシェルスクリプト自身をバックアップに取っています。

別にこういうシェルでなくても普通にメモ帳でも良いのですが、とにかく何かコンフィグを更新する作業のタイミングで、忘れる前にメモを残しておくと後々で楽になると思います。

さくらのVPSで再インストール

コンソールから再インストールします。 (ただVPSのサービスにログインして、OS再インストールを選ぶだけです)
たぶん、他の(さくらインターネット以外の)サービスでも似たような手順になると思います。

まだCentOS Stream9 ではなく 8にした理由(2022/03現在)

今回はStream8 を入れます。
9を選ばない理由は、現時点(2022/03)では、mailx(メールを読んだり送受信したりするコマンド)や cerbot (Let't Encryptから証明書を更新する時に使う)のパッケージが見つけられなかったからです。

pkgs.org に行って右上のSearchボックスから certbotとかで検索すると、まだCentOS8までしか対応してないことが分かりました。*1
足りないものはソースからビルドするという手もあるのですが、今回はそれはやらない方針なので、最新OSではなく一つ古いOSを選びます。

CentOS Stream8 をインストール@さくらのVPS

以下、さくらのVPSのコンソールログイン後に、サーバを指定して

  1. OS再インストールボタンを押す
  2. OSを選ぶ(今回はCentOS Stream8)
  3. パケットフィルタは使う(TCP:22 と 任意のもう一つを追加)
  4. 再インストールを実行する

さくらのVPSが提供しているスタートアップスクリプトは利用しませんでした、が、これの内容をざっと見てみると最初に何を設定する必要があるのかが分かるので参考になります。

パケットフィルタは使います。最初の構築が終わるまでの暫定ファイアウォールとして。
ssh(TCP 22) に加えて、このあとでやるsshのポート変更(22 -> 10022のように、32767以下の5桁に変更)を見込んで許可ポートをカスタム追加しておきます。

再インストールボタンを押すのってドキドキしませんか?
…そして三回目を超えたあたりから、スナック感覚でできるようになりませんか? VPSの再インストールの早いこと早いこと、apacheやPHPのソースをビルドするより遥かに早くて驚きです [smile]

sshでログインして、ポート設定変更

再インストール後にsshログインします。
この時、もし初回インストールでは無かった場合は、sshコマンド実行時にこんな警告が出るかもしれません。

 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

再インストールによって接続先のfingerprintが変わったことで、接続拒否されます。 TeraTermとかでログインする場合も警告ウィンドウが表示されるはずです。

その場合は以下のように古い情報を削除します。

$ ssh-keygen -R 接続先
(ポートも指定する場合は ssh-keygen -R '[接続先]:ポート番号')


そして無事にrootでログインできたら、
ひとまず さくらのVPSのOSセットアップ情報 に目を通しておきましょう。

それらが終わったら、
まず最初に useradd する前にメールspoolを作成しないようにしておきます(後の手順で postfix/dovecotと連携します)。

※ちなみにrootのプロンプトといえば
 "#" ですが、ここでは "$" で表記します。
 su - してからrootで実行するか sudo で実行するか読み替えてください。
$ vi /etc/default/useradd
(以下を yesから noに設定)
CREATE_MAIL_SPOOL=no

ここでCREATE_MAIL_SPOOLをnoにしておかないと useraddする度にメール用のディレクトリも一緒に作成されてしまいます。
なので先に noに変更して、この後にインストールする postfix/dovecot がメール送受信したタイミングで作成できるようにします。
すでに /var/spool/mail/ にファイルが生成されてしまっていた場合は削除しましょう*2

そして任意のログイン用ユーザを作成。

$ useradd ユーザ名
$ passwd ユーザ名

ここで新規ユーザを加えておかないと、この次の手順でrootログイン不許可にできません。
もし必要なら、この追加ユーザに対して visudo で管理者権限を付与しましょう。

一旦ログアウトして、今作ったユーザでログインできるか確認します。
それから今の開いているポートを確認

$ netstat -ta
-bash: netstat: command not found
(netstatが無かったので、ここでインストールしました)
$ dnf install net-tools bind-utils

netstatでTCPポート(-t)のぜんぶ(-a)を見て開いているポートがsshのみであることを確認しておきたかったのですが、そもそも netstatコマンドがありませんでした。なので net-toolsを入れました。
あと、dig コマンドもよく使うので、bind-utils も入れます。*3

ちなみにインストールと言えば私のなかでは yum/rpm だったんですが、今は dnf コマンドなんですね…。

そして firewalld にTCPポートを追加します。
sshポートを22から他の任意のポートに変更したい、という目的です。
(さくらのVPSで再インストール時にパケットフィルタを設定した場合、そこで許可したポートをここで使います)

$ cp -pi /usr/lib/firewalld/services/ssh.xml  /usr/lib/firewalld/services/my_ssh.xml
$ vi  /usr/lib/firewalld/services/my_ssh.xml
(port=22を、変更予定のポート番号にする)

$ systemctl start firewalld     # firewallを起動
$ firewall-cmd --list-all       # 状態を確認
(デフォルトで services: ssh が許可されているはず)

$ firewall-cmd --add-service=my_ssh --zone=public --permanent # いま作ったmy_sshを有効化
$ firewall-cmd --reload         # 設定を再読み込み
$ firewall-cmd --list-all       # 反映されていることを確認
(これでservices: my_ssh が増えているはず)

これで最初にさくらのVPSのパケットフィルタに設定した内容と同じように2つのTCPポート(変更前後のsshポート)が許可された状態になりました。
下準備が終わったので sshdの設定を変更します。

$ vi /etc/ssh/sshd_config
  (以下の項目を変更する)
   Port 任意の番号        # 22 以外に変える
   PermitRootLogin no     # rootログインは禁止、他ユーザからsuさせる。
   
   Match User 任意のユーザ   # 証明書ログイン用ユーザ
      PubkeyAuthentication yes   # クライアント証明書でログインする
      PasswordAuthentication no  # パスワード認証は受け付けない

ここが結構重要です。理由は lastb(=ログイン失敗履歴を見るコマンド)を打てば分かります。

デフォルトのポート(ssh=22)のままだと外から攻撃されまくって、その大半が root であることが一週間もすればうんざりするほど分かります。
そういった攻撃を放置すると、自称セキュリティ組織やらクラッカーやらがこのサーバは甘いと評価して、さらに別の攻撃仕掛けて来るきっかけとなってしまうのです。

なので、ssh用のポートを変更してrootログイン不可にするだけでも、かなりリスクが軽減できます。面倒くさいかもしれませんががんばりましょう。*4

PubkeyAuthenticationはお好みでどうぞ。*5
参考まで、クライアント証明書を使う場合は対象ユーザに authorized_keyを追記します。

$ mkdir ~任意のユーザ/.ssh
$ chmod 700 ~ユーザ/.ssh
$ vi ~ユーザ/.ssh/authorized_keys  # 公開鍵を書き込む
$ chmod 600 ~ユーザ/.ssh/authorized_keys  # 本人だけが読めるように変更
$ chown -R ユーザ:ユーザ  ~ユーザ/.ssh    # 本人だけが読めるように変更

一通り変更したらsshd を再起動して、別のユーザからログインできるか確認しましょう。

$ systemctl reload sshd
(まだログアウトはしないこと! 他の端末からログインできることを先に確認)
(別の端末から、変更後のポートでログインできることを確認
 sshコマンドの場合は以下のように -p を使う。scp なら -P )
$ ssh -p 変更後ポート  ユーザ@ホスト


万が一接続できなくなった場合は、コンソール画面から設定を直しましょう。*6

パケットフィルタ許可設定と /etc/ssh/sshd_config と firewall-cmd --list-all のポートがそれぞれ一致していること、netstat -tan でLISTENしていることなどを見てみましょう。
むしろ一回くらいは失敗して、今のうちにコンソールログインも経験しておいた方が良いんじゃないかと思います。

変更後の sshポートでログインできることを確認したら、古いポートは閉じてしまいましょう。

$ firewall-cmd --remove-service=ssh --zone=public --permanent
(他にも要らないポートが開いていたら remove-service しておきましょう)
$ firewall-cmd --reload        # 設定を再読み込み
$ systemctl enable firewalld   # 以降はOSのファイアウォールを使う

ポートが整理出来たら、さくらのVPS側のパケットフィルタを使用中の場合は忘れずにOFFにします。
(対象サーバの「グローバルネットワーク」 - 「パケットフィルターを設定」ボタン - 「利用しない」を押す)

ホスト名変更

ホスト名を変更します。

$ hostnamectl set-hostname ホスト名


パッケージを最新化

$ dnf upgrade
(すべて更新するので時間がかかります)

最新にして脆弱性を少しでも減らしておきましょう。

localeの変更

デフォルトのままでも良いんですが、vi とかで日本語を使うなら変更が必要です。

$ localectl                 # 現在の locale を表示する
$ dnf install langpacks-ja  # 日本語パッケージを追加
$ localectl set-locale LANG=ja_JP.utf8


(どーでも良いですけど、ja か jp か統一して欲しいですよね)

EPELとRemiを入れる

そもそもEPELとRemiとは何か、については割愛します(検索 CentOS EPEL Remi)。
パッケージをダウンロードするためのリポジトリを追加しましょうと言う話です。

$ dnf install epel-release
$ vi /etc/yum.repos.d/epel.repo
 (ひとまず enabled=0 に変更する。
  使う時は「dnf --enablerepo=epel ~」のように使うオプション付きで)
$ dnf install  https://rpms.remirepo.net/enterprise/remi-release-8.rpm
$ vi /etc/yum.repos.d/remi-safe.repo
 (ひとまず enabled=0 に変更する。
  使う時は「dnf --enablerepo=remi-safe ~」のように使うオプション付きで)

epelは opendkim や fail2ban を入れるために必要になります。
remiは、最新の phpや DB関連パッケージを入れるために必要だったりします。

サーバ証明書のインストールまたは復元

近年はもうWebの検索サイトとかプロバイダー各社とかもSSL/TLS接続が前提なんですよね。
Webサイトもメールも httpsやら pop3sやらの s付きがほとんどです。

サーバ証明書なんて持っていないという方は Let's Enctyptでフリーの証明書 を取得できます。*7

ここで手順には触れませんが、取得と更新には certbot コマンドを使います ので、ここでインストールできることを確認しておきます 。

$ dnf --enablerepo=epel install certbot

すでに Let's Encryptをインストール済みの方はデフォルトだと /etc/letsencrypt/ に入るので、「tar zcvf letsenctypt_files.tgz /etc/letsencrypt」のように丸ごとバックアップを取ったり、tar zxvfで復元したりしましょう。

ここで取得・更新方法には詳しくは触れませんが、やることは簡単で、

  1. (新規の場合はメールアドレスを用意する)
  2. DNS情報を更新できる準備をする
    (コマンド実行中にTXTを更新するので、
     さくらのVPSの場合はドメインコントローラ画面を開いておく)
  3. certbotコマンドを実行
  4. 対話式で指示に従いながら必要な情報を入力していく

という流れ作業です。(または対話式では無く自動更新にすることもできます)

 $ certbot certonly --manual -d あなたのドメイン名.net -d *.あなたのドメイン名.net --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory
("*." 部分で www.null-i.net と null-i.net のように、サブドメイン全体を含む証明書を取得する)



これで基本的な設定が終わりました。
このあと

と続きます。


*1 なんだかんだでこの時点でStream8と9を行ったり来たり三回以上はOS再インストールを試みています [worried]
*2 ディレクトリを作成しようとしている場所に同名のファイルが存在するというエラーが発生してしまいます。
*3 sshやメールやWebで不正アクセスがあるたびに、なんとなく「 dig -x IPアドレス」でどこからの攻撃かを確認してしまうのです
*4 あとは、rootログイン許可する代わりにクライアント証明書必須にする方法もあります。いずれにしてもsshログインは海外から執拗に狙われるので対策が必須です。
*5 パスワードログインよりはクライアント証明書の方が安全です、特にログインする端末が特定のPCやスマホに限られる場合は証明書でログインした方が楽です。
*6 さくらのVPSならば、VPSのコントロールパネルにログインしてWebブラウザ上からコンソール作業を行います。たぶん他のサービスも似たような感じかと。
*7 個人や法人でドメインとメールアドレスを持っていてサーバも所持していればLet's Encryptで証明書を取得できます。