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 は 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

エマージェンシーモード

/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'!

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

ssh デーモン

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

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

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 のみがパッケージ.

/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

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

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

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 を入れる。

nodejs

ok

redis

ok