私 (堀川) はサーバ構築はずっと CentOS or Fedora でやってきたが、CentOS Stream 9 があまりにもパッケージが少なくてギブアップ。openSUSE Leap 15.4 で構築するためのメモ。
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 でインストールするのが良い。
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
を追加すると、シングルユーザモードで起動できる。
CentOS8, CentOS7をシングルユーザモードで起動する3つの方法 | りんか ネット
dracut.cmdline(7) - Linux manual page 通常使うのは rd.break
だけだが、パラメータで, シェルに落ちるタイミングを調整できる。ほかの起動オプションの説明も。
順番に確認していこう。
一般ユーザを 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'!
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
/etc/ssh/sshd_config
ファイルで PermitRootLogin
が有効になっていたら no!
openSUSE は yes になってる。要修正。CentOS は初期値 no.
openSUSE, CentOS とも chronyd. 昔は ntpd だった。
openSUSE, CentOS とも firewalld
パッケージ。設定方法も同じ。Linuxのファイアウォール設定
CentOS, openSUSE とも nginx. OK
Let's Encrypt を導入。例えばこの記事が詳しい。Let's EncryptによるSSLサーバー証明書の取得、自動更新設定(Snapを使用しない版)
fail2ban か denyhosts. CentOS も openSUSE も fail2ban のみがパッケージ.
サービスを再起動。
状態確認
実際に動作を確認してみよう。何度かログインに失敗する。
Banを解除。
再度, ログインできることを確認。OK
DNS 権威サーバとキャッシュサーバを分けるのが重要。Web 上の解説はおかしいのが多い。せっかく分けたのにキャッシュサーバを外部に公開する解説は誤り。
キャッシュサーバをLAN内に公開する場合、権威サーバと別ホストにしなければならない。
CentOS 標準は Dnsmasq. nsd はパッケージがない。EPEL (EL9) にも! Fedora にはあるのに.
openSUSE には nsd パッケージ, dnsmasq ともある。nsdを選ぶ。
ユーザ nsd:nsdを作る
攻撃防御
/etc/fail2ban/filter.d/
以下に, 各ソフトウェアに対応した設定集がある。これを適宜、有効にしていけばよい。これらを使う;
/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
# fail2ban-client set sshd unbanip 192.168.0.13
DNS 権威サーバ
CentOS: ソースコードからビルド
$ ./configure --enable-systemd --with-libevent=no
# 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
CentOS Stream 9 は PostgreSQL 13.5. PostgreSQL 公式リポジトリの v14 を使う。
openSUSE 15.4 のパッケージ postgresql-14-150400.2.42 は, 一番最新の系列 postgresql14
パッケージに依存している。これでよい。
OK. 設定は別ページにて。Postfix の設定
Red Hat系だけでなく, Debian/Ubuntu にも含まれる。openSUSE Leap 15.4 にはない。しかし, openSUSE Tumbleweed にはある。
# systemctl start cockpit.socket
Port 9090 で開く。しかし root でログインできてしまう。これでは穴が開く。アカン. disable でよい。
CentOS Stream 9 は v3.0.3. OK.
openSUSE は v2.5-1.21. 何でこれだけ古い? YaST (yast2) が依存しているため。rbenv で別途, 自分でビルドした Ruby v3.1 を入れる。