CentOS Stream 9 をインストールして最初にすること
篠原 隆司
アフィリエイト広告を利用しています
このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です
CentOS Stream 9 をさくらのVPS 2G で契約してインストールした覚書です。
ここでは、インストール直後に速攻でやっておいたほうが良いことを記します。
なお本番環境で利用される場合はここにある内容だけを鵜呑みにせずセキュリティ専門家に相談されることをお勧めします。
環境
実施日 | 2022-03-27 |
サーバ | さくらのVPS 2G |
OS | CentOS Stream 9 |
さくらVPSの契約・申込みプランは「さくらVPSでCentOS Stream 9 を契約」に記載しています。
起動
申込が完了したら、コンパネから起動します。
起動したら、ターミナルを使って操作していきます。
ちなみに「コンソール」から「VNCコンソール」を使ってブラウザ上で操作することもできます。やらかしてしまった時の緊急時にここから操作できることを覚えておくと良いです。
ログイン
CentOS Stream8 までは、最初の最初は root ユーザーでログインして一般ユーザーを作成するところから始めていましたが、CentOS Stream 9 からは、標準ユーザー「centos」が作成され、そこから sudo する形になっています。
※もしかしたら、CentOS Stream 9だからではなく、さくらVPS独自かもしれません。
ということで、初回は次のようにして接続します。
パスワードは、セットアップ時にコンパネで設定したパスワードです。
標準ユーザーについては「さくらVPSのマニュアル」もご覧ください。
rootユーザーのパスワードを設定
最初はrootユーザーのパスワードは設定されていないので、設定します。
sudo passwd root
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
root に切り替える
su
Password:
root ユーザーに設定したパスワードを入力して切り替え
ちなみに元のユーザーに戻る(rootを抜ける)には
exit
ここからは基本的に root ユーザーでの操作となります。
※root での操作と 一般ユーザーからの sudo の使い分けはケースバイケースです。ここでは root で行う手順とします。
CentOS のバージョンを確認する
cat /etc/redhat-release
CentOS Stream release 9
DNFの更新
まずはこの時点での最新にしておきます。
dnf update
dnf upgrade
SELinuxの有効化
さくらVPSではデフォルトでSELinuxが停止されています。
さくらVPSのマニュアル(SELinux)も確認ください。
CentOS Stream9からはSELinuxのパフォーマンスが大幅に改善されたとのことで、これからはSELinuxを積極的に使っていきたいと思います。
ということで、SELinuxを有効化します。
有効化するには、まず「Permissive モード」へ。ログを確認して「Enforcing モード」へと段階的に切り替えます。
これは、いきなり「Enforcing モード」にして詰むのを防ぐためです。
Permissive モードにする
# 確認
getenforce
Disabled
# 設定ファイルを編集
vi /etc/selinux/config
# vi /etc/sysconfig/selinux
# 従来の▲はエイリアスになっている
SELINUX=permissive
# SELINUX=disabled
CentOS Stream9 から有効・無効を切り替える方法が変わっています。
# 有効にする
grubby --update-kernel ALL --remove-args selinux
# 変更した場合は再起動
reboot
Enforcing モードにする
Enforcing にする前に Permissive でのログを確認しておきます。
aureport -a
問題なければ、Enforcing にします。
# 設定ファイルを編集
vi /etc/selinux/config
SELINUX=enforcing
# SELINUX=permissive
# SELINUX=disabled
# 変更した場合は再起動
reboot
# 確認
getenforce
Enforcing
SELinuxを一時的に無効化したいとき
再起動したときは、設定ファイルの内容に戻ります。
トラブル時に、SELinuxが原因なのか切り分けするために使うことがあるかもしれません。
# 一時的に無効化
setenforce 0
# 一時的に有効化
setenforce 1
SELinuxを恒久的に無効化したいとき
CentOS Stream9 から有効・無効を切り替える方法が変わっています。
# 無効にする
grubby --update-kernel ALL --args selinux=0
# 変更した場合は再起動
reboot
SELinuxの設定ツール
semanage をインストール
dnf install policycoreutils-python-utils
ユーザーの追加
作業用のユーザーを作成します。
root権限での作業は基本的に作業用ユーザーから行うようにします。
もとからある centos ユーザーは最終的に削除し、1から自分が設定したユーザーを残すことにします。
ここでは、ユーザー shinohara で行いますので、参考にする場合はコピペせずに shinohara を書き換えてください。
useradd shinohara
パスワードは設定しません。
作成したら、su で shinohara に切り替え、公開鍵を設置します。
su shinohara
mkdir /home/shinohara/.ssh
chmod 0700 /home/shinohara/.ssh
vi /home/shinohara/.ssh/authorized_keys
chmod 0600 /home/shinohara/.ssh/authorized_keys
exit
authorized_keys に公開鍵を貼り付けます。
su の制限
root に戻って、su できるユーザーの設定もついでに行っておきます。
接続の確認
ここで作成したユーザーで接続できることを確認しておきます。
新しくターミナルを開いて接続できればOKです。
接続できない場合はログを確認します。
tail -n 100 /var/log/secure
userauth_pubkey: key type ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]
こちらのようなログが出ている場合は対策が必要です。
原因としては、「ssh-rsa」タイプで作られた鍵を許可しないというものです。
まー、古いので新しい鍵使ってね、です。
で、上記エラー内容で調査していくと「pubkeyacceptedalgorithms +ssh-rsa」と書かれた記事に行きつくと思います。
罠です。
SSHのバージョンを確認してみます。
ssh -V
OpenSSH_8.7p1, OpenSSL 3.0.1 14 Dec 2021
記事をよく見ていくと丁寧に書かれてるところでは、「バージョン8.8から」という文字が見つかると思います。
8.8からと書かれてるのに、自分のとこは8.7
なんだかおかしな匂いがしてきました。
ということで、ここではヒントまでにします。
ということで、素直に鍵を作ったほうが良いです。
TeraTerm で鍵を作る
TeraTermを開いて、接続のダイアログは閉じて、「設定」からの「SSH鍵生成」です。
ED25519 にして生成します。
putty / puttygen.exe で ppk にする
puttygen.exe を起動して、Conversions > Import Key > 秘密鍵を選択
Conversions > Export OpenSSH Key
○○.ppk の名前にして保存
鍵を配置して接続確認
公開鍵を、.ssh/authorized_keys に配置し、実際にログインできることを確認できたらOKです。
SSHの設定変更
ログイン制限の設定がひととおり完了して、接続確認できるまでは作業中のターミナルは絶対に閉じないでください。
閉じてしまって、ミスってた場合はサーバ会社提供のコンソールとかからログインできる場合があります。(さくらのVPS の場合はコンパネから)
設定ファイルを編集します。
変更した内容は、sshd を再起動するまで反映されません。
vi /etc/ssh/sshd_config
# 説明
man sshd_config
肝になるのは次の設定です。
このタイミングではポートは変えません。(SELinuxやFirewallも関連するため)
PermitRootLogin no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
PermitEmptyPasswords no
KbdInteractiveAuthentication no
GSSAPIAuthentication no
こちらのように追加・変更します。
すでに設定されているもの、書かれているけどコメント(#)になっているもの、書かれていないものがありますので、デフォルト設定を読みながら設定していきます。
さくらVPSでポートを変更した場合は、コンパネからパケットフィルタの設定変更が必要です。
さくらVPSコンパネ > 対象サーバ > グローバルネットワーク > パケットフィルタを設定
SSHの TCP 22 が設定されているはずですので、新しいポートが開くようにします。
一部のユーザーだけパスワード認証
どうしてもパスワードでないと困る場面で、特定のユーザーだけパスワード認証を許可したい場合は次のようにします。
vi /etc/ssh/sshd_config
Match User user1,user2,user3
PasswordAuthentication yes
最下行に追記します。
変わったところ
「変わったところ」というか、設定していて気が付いたところです。
RSAAuthentication yes
RhostsRSAAuthentication no
▲この2つは無くなっているようです。
調べたところ、OpenSSH 7.4で SSH v1 のサポートが削除されたので、v1 向けの設定であるこれら2つが不要になったっぽいです。
AuthorizedKeyFile (旧)
AuthorizedKeysFile (新)
▲Key が Keys と複数形に変わっているようです。
ChallengeResponseAuthentication
が無くなって
KbdInteractiveAuthentication
に変わったようです。
SSH再起動
# 確認
/usr/sbin/sshd -t
# 再起動
systemctl restart sshd
接続確認
sshdの設定変更、ユーザーの追加、公開鍵の設定ができたら、新しいターミナルを起動してログインできるか確認してみます。
このとき、作業中のターミナルは閉じずにそのままにしておいてください。万が一のとき、そのまま復旧作業に入れます。閉じてしまった場合は、コンパネのコンソールなどから行うのでちょっとめんどいです。
rootユーザーの確認
root ユーザーではログインできなくなっているはずです。
パスワード入力の確認
パスワードを入力してのログインはできなくなっているはずです。
centos ユーザーをパスワード認証にしていたらログインできなくなっているはずです。既にログインしている場合は切断されたりはしませんので、新しくターミナルを起動して確認します。
公開鍵認証を使ってログインできるはずです。
ポートの変更
ポートを変更するときは、外側から順に設定していき、sshdの設定時には新旧のポートが開いた状態とします。
sshdのポート切り替え後、今度は反対に内側から外側に向かって古いポート設定を削除していきます。
パケットフィルタの設定
さくらインターネットだとコンパネにあります。
現在のポートは生かしつつ、新しいポートを追加します。
firewalledのポート設定
この記事通りに進んでいたらfirewalledはまだ設定していないはずですが、もし設定していたら、現在のポートは生かしつつ、新しいポートを追加します。
SELinuxのポート設定
# 2222 の tcp を ssh として使う場合
semanage port -a -t ssh_port_t -p tcp 2222
# 確認
semanage port -l | grep ssh
sshdのポート設定
vi /etc/ssh/sshd_config
Port 22
ここの数字を変更し、確認してから sshd の再起動で反映されます。
# 確認
/usr/sbin/sshd -t
# 再起動
systemctl restart sshd
接続確認
新しくターミナルを起動して、変更したポートで接続できればOKです。
変更前のポートを閉じる
外側のポートを閉じたら、元のポートで接続していたターミナルからは接続できなくなります。
SELinux の 22 は削除できないっぽいのでそのままにしておきます。
# 22 の tcp を ssh を削除
semanage port -d -t ssh_port_t -p tcp 22
# 確認
semanage port -l | grep ssh
firewalled はまだ設定していないので特になし
インストールしているなら元のポートを削除しておきます。
パケットフィルタからも元のポートを削除しておきます。
SSHのIP制限
CentOS 7 までは /etc/hosts.deny と /etc/hosts.allow で行っていましたが、CentOS 8 からは廃止されています。
代わりに firewalld で設定します。
まずは、firewalld が現在動作しているか確認します。
systemctl status firewalld
Active: inactive (dead)
inactive なので動いてません。
設定してから起動もしくは再起動をするのでいまは動作の有無だけ確認しておきます。
設定ファイルを開き、制限を書いていきます。
vi /etc/firewalld/zones/public.xml
<service name="ssh"/>
こちらのような記述があれば削除しておきます。
で、次のように書き加えます。
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<service name="cockpit"/>
<service name="http"/>
<service name="https"/>
<rule family="ipv4">
<source address="123.123.123.123"/>
<port port="22000" protocol="tcp"/>
<accept/>
</rule>
<rule family="ipv4">
<source address="124.124.124.124"/>
<port port="22000" protocol="tcp"/>
<accept/>
</rule>
</zone>
IPアドレス 123.123.123.123 と 124.124.124.124 のポート 22000 を許可する設定例です。
自分の環境が固定IPでないので、プロバイダのホスト名で設定したかったのですが、やり方が分からなかったので、今のところはとりあえずIPアドレス指定にしました。
まだやってないですがプロバイダのIPアドレス範囲で設定する方法もあります。
ついでに http https も加えておきます。
SSHのポート変更
vi /etc/firewalld/services/ssh-alt.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22★"/>
</service>
★の数字を変更し▼を追加します。
vi /etc/firewalld/zones/public.xml
<service name="ssh-alt"/>
firewalld が開始していなかった場合は、開始します。
systemctl start firewalld
自動起動も有効にしておきます。
systemctl enable firewalld
設定を再読み込みして確認します。
# 設定を再読み込み
firewall-cmd --reload
# 設定の確認
firewall-cmd --list-all
dnfの準備
アップデート
インストール直後にやっているはずなので確認だけです。
dnf update
dnf upgrade
日本語環境にする
次のようなエラーが出るときにもこちらで解決します
Failed to set locale, defaulting to C.UTF-8
# インストール
dnf install langpacks-ja glibc-langpack-ja
# 確認
localectl status
# System Locale: LANG=en_US.UTF-8 になってる
# 設定
localectl set-locale LANG=ja_JP.UTF-8
# 確認
localectl status
EPELリポジトリ
インストール
dnf install epel-release
設定変更
vi /etc/yum.repos.d/epel.repo
enabled=0
enabled=1 を 0 にして、普段は無効化しておきます。
必要な時は▼のように明示的に指定します。
dnf --enablerepo=epel ・・・
Remiリポジトリ
インストール
dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
設定変更
vi /etc/yum.repos.d/remi-safe.repo
enabled=0
enabled=1 を 0 にして、普段は無効化しておきます。
必要な時は▼のように明示的に指定します。
dnf --enablerepo=remi-safe ・・・
その他いろいろインストール
# wget
dnf install wget
# unzip
dnf install unzip
root宛のメールを転送
root宛のメールの送信先を変更します。
vi /etc/aliases
root: sample@example.com
newaliases
bash: newaliases: command not found になった場合は、MTAが無いと思います。
▼で「無い」ことを確認してみます。
alternatives --display mta
newaliases して有効化するにはメールサーバのインストールが必要です。
▼をご覧ください。
CentOS Stream 9 に Postfixをインストール
Postfixインストール後は、newaliases できるようになってます。
newaliases
終わりに
今回はここまでです。
まだ最低限の設定が終わったばかりです。
ここからは「サーバの使用目的」によって必要なものも変わってくると思います。