openSUSE Leap 15.4 でサーバ構築 [2022年]

私 (堀川) はサーバ構築はずっと CentOS or Fedora でやってきたが、CentOS Stream 9 があまりにもパッケージが少なくてギブアップ。openSUSE Leap 15.4 で構築するためのメモ。

テスト機の構成
192.168.0.27 apricot.fruits UEFI, 1 CPU, 2G メモリ, xfs

openSUSE の特徴

CentOS Stream 9 はパッケージが少なすぎて、話にならない。Debian は、Red Hat系と設定ファイルの場所やパッケージ構成などが結構違っていて、乗り換えにそれなりにハードルがある。余談だが、apt remove (旧くは apt-get remove) コマンドは, 必須パッケージでも削除できてしまうので、いろいろ実験中に誤って詰みやすい。

openSUSE は、コミュニティプロジェクトだが、ドイツのSUSE 社がスポンサーしており、一定の品質がある。Red Hat のクローンではないが、ディレクトリ構成、パッケージがかなり似ており、Debian への乗り換えよりもハードルが低い。

最新ヴァージョンは openSUSE Leap 15.3. 現在, 15.4 がベータ版.

パッケージのヴァージョン選定は, 最新かつ安定指向。例えば, openssl は 1.1.11。他方, CentOS Stream 9 は openssl 3.0 で、かなりアグレッシブ。

openSUSEのデフォルトファイルシステムは btrfs. しかし、btrfs はマダマダ安定しておらず、xfs でインストールするのが良い。

強制アクセス制御 (MAC: Mandatory Access Control)

openSUSE 15.4 は AppArmor (デフォルトで有効). SELinux ではない。SUSE は昔から AppArmor だった。もともと Novell 社が貢献したもので、SUSE から広まった。

Ubuntu も AppArmor らしい。Debian 11 もデフォルトで AppArmor が有効になる。openSUSE も Debian も, 次で有効かどうか確認できる。

$ cat /sys/module/apparmor/parameters/enabled
Y

openSUSE Leap 16.0: SELinux になった (!) AppArmor はデフォルト無効。

パッケージ管理

openSUSE は zypper コマンド. これは覚え直し。

Leap 15.4 でも, gcc のデフォルトは v7.5.0. `gcc11` が別パッケージになっている。/var/lib/alternatives/ 以下に gcc はない。自分で設定。

# update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 110
update-alternatives: using /usr/bin/gcc-11 to provide /usr/bin/gcc (gcc) in auto mode
# update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 70

Leap 16.0: gcc15 がデフォルト。そのままでOK

エマージェンシーモード

/etc/profile.d/ 以下をしくじったりして、正常にログインできなくなった場合のシングルユーザモードについて。

openSUSE は親切なレスキューモードのようなものはない。

デフォルトで `dracut` パッケージがインストールされている。そうすると、CentOS と同じかな? /etc/dracut.conf.d/ 以下に設定ファイル。

GRUB2 のメニューエントリで, linux (BIOS) または linuxefi (UEFI) から始まる行に起動オプションを追加できる。rd.break を追加すると、シングルユーザモードで起動できる。

See Chapter 24. Changing and resetting the root password Red Hat Enterprise Linux 8 | Red Hat Customer Portal

CentOS8, CentOS7をシングルユーザモードで起動する3つの方法 | りんか ネット

dracut.cmdline(7) - Linux manual page 通常使うのは rd.break だけだが、パラメータで, シェルに落ちるタイミングを調整できる。ほかの起動オプションの説明も。

個別パッケージ

順番に確認していこう。

sudo

一般ユーザを sudoers にすると、それが穴になる。openSUSE は sudo でも root password を尋ねる設定。なるほど.

/etc/sudoers ファイル:

## In the default (unconfigured) configuration, sudo asks for the root password.
## This allows use of an ordinary user account for administration of a freshly
## installed system. When configuring sudo, delete the two
## following lines:
Defaults targetpw   # ask for the password of the target user i.e. root
ALL   ALL=(ALL) ALL   # WARNING! Only use this together with 'Defaults targetpw'!
Leap 16.0: 一般ユーザのパスワードを尋ねるようになった。ほかのディストリビューションと同じ形に。

name service cache

DNS のことではなく、NIS (yp), NIS+ (NIS v3) or LDAP など、外部ディレクトリ (認証プロバイダ) 結果のキャッシュ。具体的には, passwd, group, hosts, services をキャッシュする。

openSUSE は nscd パッケージ。glibc の一部. nscd は sssd と競合する。Fedora / CentOS は sssd パッケージを使い, nscd パッケージは存在しない。

どちらにしても, disable でよい。

# systemctl disable nscd

AlmaLinux 9 は nscd, sssd ともデフォルトでは入っていない。

ssh デーモン

/etc/ssh/sshd_config ファイルで PermitRootLogin が有効になっていたら no!

openSUSE は yes になってる。不味い! 要修正。CentOS は初期値 no.

openSUSE Leap 16.0: ssh がデフォルトで起動しない。sshd での rootログインはデフォルト禁止。OK

 # systemctl enable sshd
 # systemctl start sshd

ntpデーモン

openSUSE, CentOS とも chronyd. 昔は ntpd だった。

ファイアウォール

openSUSE, CentOS とも firewalld パッケージ。設定方法も同じ。Linuxのファイアウォール設定

httpサーバ (リバースプロキシ)

CentOS, openSUSE とも nginx. OK

Let's Encrypt を導入。例えばこの記事が詳しい。Let's EncryptによるSSLサーバー証明書の取得、自動更新設定(Snapを使用しない版)

攻撃防御

fail2ban か denyhosts. CentOS も openSUSE も fail2ban のみがパッケージ.

AlmaLinux 9 は、どちらもリポジトリにない。epel-release を入れてからインストールする。

/etc/fail2ban/filter.d/ 以下に, 各ソフトウェアに対応した設定集がある。これを適宜、有効にしていけばよい。これらを使う;

  • dovecot.conf
  • postfix.conf
  • sshd.conf
  • nginx-http-auth.conf

/etc/fail2ban/jail.conf ファイルを直接編集してはいけない。jail.d/ ディレクトリに保存する。

[dovecot]
enabled = true

[postfix]
enabled = true

[sshd]
enabled = true

[nginx-http-auth]
enabled = true

サービスを再起動。

# systemctl restart fail2ban

状態確認

# fail2ban-client status
Status
|- Number of jail:      4
`- Jail list:   dovecot, nginx-http-auth, postfix, sshd

実際に動作を確認してみよう。何度かログインに失敗する。 /var/log/fail2ban.log に次の行が出力される

2022-03-04 23:01:31,906 fail2ban.actions        [902]: NOTICE  [sshd] Ban 192.168.0.13
# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     6
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   192.168.0.13

Banを解除。

# fail2ban-client set sshd unbanip 192.168.0.13

再度, ログインできることを確認。OK

DNS 権威サーバ

DNS 権威サーバとキャッシュサーバを分けるのが重要。Web 上の解説はおかしいのが多い。せっかく分けたのにキャッシュサーバを外部に公開する解説は誤り。

キャッシュサーバをLAN内に公開する場合、権威サーバと別ホストにしなければならない。

CentOS 標準は Dnsmasq. nsd はパッケージがない。EPEL (EL9) にも! Fedora にはあるのに.

openSUSE には nsd パッケージ, dnsmasq ともある。nsdを選ぶ。

CentOS: ソースコードからビルド

$ ./configure --enable-systemd --with-libevent=no

ユーザ nsd:nsdを作る

# groupadd -g 975 nsd
# useradd -g nsd -d /var/lib/nsd -s /sbin/nologin -u 977 nsd
/usr/lib/systemd/system/nsd.service ファイルを手書きする。ディストリビューションごとに依存target 名なども異なる。次は最小限のみの設定。
[Unit]
Description=NSD DNS Server
After=syslog.target network-online.target

[Service]
Type=notify
ExecStart=/usr/local/sbin/nsd -d -c /etc/nsd/nsd.conf $NSD_EXTRA_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
PrivateTmp=true

[Install]
WantedBy=multi-user.target

PostgreSQL

WITH RECURSIVE CYCLE 句は, PostgreSQL 14 で導入されており、必ず v14 以降を使うこと。

CentOS Stream 9 は PostgreSQL 13.5. PostgreSQL 公式リポジトリの v14 を使う。

openSUSE 15.4 のパッケージ postgresql-14-150400.2.42 は, 一番最新の系列 postgresql14 パッケージに依存している。これでよい。

Leap 16.0: PostgreSQL は v17 までパッケージされている。OK. postgresql-server postgresql-devel パッケージをインストール. libpq.so, /usr/include/pgsql が入る.

postfix, dovecot

OK. 設定は別ページにて。Postfix の設定

Cockpit - web-based interface for servers

Red Hat系だけでなく, Debian/Ubuntu にも含まれる。openSUSE Leap 15.4 にはない。しかし, openSUSE Tumbleweed にはある。

# systemctl start cockpit.socket

Port 9090 で開く。しかし root でログインできてしまう。これでは穴が開く。アカン. disable でよい。

ruby

CentOS Stream 9 は v3.0.3. OK.

openSUSE は v2.5-1.21. 何でこれだけ古い? YaST (yast2) が依存しているため。rbenv で別途, 自分でビルドした Ruby v3.1 を入れる。

Leap 16.0: Ruby 3.4 がパッケージされている。そのまま使ってよい。Rust も v1.85 がパッケージされている。こちらもそのまま使ってよい。

nodejs

ok

redis

OK.

Leap 16.0: redis パッケージもあるが, zypper update で, valkey valkey-compat-redis パッケージに置き換えられる。