CentOS7, Stream 8のシステム管理系コマンドメモ

CentOS 7, Stream 8 のシステム管理系のコマンドのメモです。

記事の前提環境:

- CentOS 7 / Stream 8 (x86_64)
- インストールタイプ: Minimal Install
- インストール時のキーボードタイプ: `Japanese` を選択

Red Hat Enterprise Linux (RHEL) のドキュメント参考:

- CentOS 7 : [Red Hat Enterprise Linux 7](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/7)
- CentOS 8/Stream 8 : [Red Hat Enterprise Linux 8](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8)

以下、本記事ではRHEL側のドキュメントを参考とする。

# 基本設定

システム管理でよく使う基本設定のメモ。

## OSのバージョン情報

`/etc/` の下の `*-release` や `*-version` ファイルをチェックする。

```
[CentOS 7/Stream 8 共通]
$ ls -l /etc/*release
-rw-r--r--. 1 root root 37 Nov 24  2020 /etc/centos-release
lrwxrwxrwx. 1 root root 21 Aug 22 23:36 /etc/os-release -> ../usr/lib/os-release
lrwxrwxrwx. 1 root root 14 Aug 22 23:36 /etc/redhat-release -> centos-release
lrwxrwxrwx. 1 root root 14 Aug 22 23:36 /etc/system-release -> centos-release

$ ls -l /etc/*version

[保有パッケージ: CentOS 7]
$ rpm -qf /usr/lib/os-release
centos-release-7-9.2009.1.el7.centos.x86_64

$ rpm -qf /etc/centos-release
centos-release-7-9.2009.1.el7.centos.x86_64

[保有パッケージ: CentOS Stream 8]
$ rpm -qf /usr/lib/os-release
centos-stream-release-8.5-3.el8.noarch

$ rpm -qf /etc/centos-release
centos-stream-release-8.5-3.el8.noarch
```

CentOS 7/Stream 8 でのファイル内容（例）：

```
[例: CentOS 7 : /etc/centos-release]
$ cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)

[例: CentOS 7 : /etc/os-release]
$ cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

[例: CentOS Stream 8 : /etc/centos-release]
$ cat /etc/centos-release
CentOS Stream release 8

[例: CentOS Stream 8 : /etc/os-release]
$ cat /etc/os-release
NAME="CentOS Stream"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Stream 8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux 8"
REDHAT_SUPPORT_PRODUCT_VERSION="CentOS Stream"
```

## 日付と時刻, ロケール, ホスト名

参考:

- Red Hat Enterprise Linux 7 システム管理者のガイド, 第1章 はじめに, [1.1. 環境の基本設定](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-getting_started#sec-Basic_Conf_Env)
- Red Hat Enterprise Linux 7 ネットワークガイド, [第6章 ホスト名の設定](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/networking_guide/ch-configure_host_names)
- Red Hat Enterprise Linux 8 基本的なシステム設定の構成, [第4章 基本的な環境設定の変更](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/assembly_changing-basic-environment-settings_configuring-basic-system-settings)
- Red Hat Enterprise Linux 8 ネットワークの設定および管理, [第18章 ホスト名の変更](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/assembly_changing-a-hostname_configuring-and-managing-networking)


### 日付と時刻

```
$ man 1 date

$ date
Tue Aug 24 16:33:53 JST 2021

$ man 1 timedatectl

$ timedatectl
      Local time: Tue 2021-08-24 16:33:42 JST
  Universal time: Tue 2021-08-24 07:33:42 UTC
        RTC time: Mon 2021-08-23 20:29:03
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

※設定を更新する際は sudo timedatectl ...
```

### ロケール(システムの言語, 文字コード, キーボードレイアウト)

```
$ man 1 localectl

$ localectl
   System Locale: LANG=en_US.UTF-8
       VC Keymap: jp
      X11 Layout: jp

※設定を更新する際は sudo localectl ...
```

### ホスト名

- `man 1 hostnamectl`
- `pretty hostname`
  - 記号など含むホスト名
  - 例: `Lennart's Laptop`
  - 保存先: `/etc/machine-info` (未設定の場合は作成されない？)
  - see: `man 5 machine-info`
- `static hostname`
  - 起動時に初期化されるkernel用ホスト名
  - 例: `lennarts-laptop`
  - 保存先: `/etc/hostname`
  - see `man 5 hostname`
- `transient hostname`
  - DHCPなどネットワーク設定で取得するホスト名
  - static hostnameが使えないときのfallback用

```
$ man 1 hostnamectl

$ hostnamectl
   Static hostname: centos-7-t01.localdomain
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 6a6bc562612f0247bc92fcfb812ee614
           Boot ID: a9f7f9a98f71499cb5c78dc8e43d9113
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1160.36.2.el7.x86_64
      Architecture: x86-64

※設定を更新する際は sudo hostnamectl ...
```

### NTP(chrony) の同期状態

CentOS 7/Stream 8 ではNTPクライアントとして chrony がデフォルトで使われる。

参考:

- manページ
  - `man 5 chrony.conf` : `/etc/chrony.conf` 設定ファイル
  - `man 8 chronyd` : NTPデーモン
  - `man 1 chronyc` : NTPクライアント
- Red Hat Enterprise Linux 7 システム管理者のガイド
  - [第18章 chrony スイートを使用した NTP 設定](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-configuring_ntp_using_the_chrony_suite)
  - [18.3.5. chrony の同期確認](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-using_chrony#sect-Checking_chrony_tracking)
  - [18.3.5.2. chrony ソースの確認](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-using_chrony#sect-Checking_chrony_sources)
  - [18.3.6. システムクロックの手動調整](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-using_chrony#sect-Manually_Adjusting-the-System_Clock)
- Red Hat Enterprise Linux 8 基本的なシステム設定
  - [第14章 時刻同期の設定](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/configuring-time-synchronization_configuring-basic-system-settings)
  - [14.2. chrony の使用](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/using-chrony_configuring-time-synchronization)
  - [14.2.2 chrony の同期確認](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/using-chrony_configuring-time-synchronization#checking-if-chrony-is-synchronized_using-chrony)
  - [14.2.3. システムクロックの手動調整](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/using-chrony_configuring-time-synchronization#manually-adjusting-the-system-clock_using-chrony)

chronyd のインストール:

- インストール時にネットワーク接続を有効化し、NTPをONにすると chronyd がデフォルトでインストールされ、時刻同期が有効化される。
- ネットワーク接続を有効化しても、NTPがOFFのままだと chronyd がインストールされず、時刻同期も行われないケースがあった。
  - この場合は、手動で chrony をインストールする必要がある。

```
$ sudo yum install chrony
or
$ sudo dnf install chrony

$ sudo systemctl enable chronyd
$ sudo systemctl start chronyd
$ sudo systemctl status chronyd
```

chrony の同期状態の確認:

```
$ chronyc sources
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^- rilynn.me.uk                  2   6   377    50  -5138us[-5031us] +/-  140ms
^* i172-105-204-167.poolntp>     3   6   337    47   +258us[ +365us] +/- 5107us
^- 152.115.59.242                2   6   377    46    -36us[  -36us] +/-  157ms
^- ktor1.k-ten.de                2   7     7    36  -1020us[-1020us] +/-  182ms
```

特に重要な M, S 列の見方(from RHEL7 "18.3.5.2. chrony ソースの確認"):

- M 列
  - ソースのモードを示します。
  - `^` はサーバーを意味し、 `=` はピアを意味し、 `#` はローカルに接続された基準クロックを意味します。
- S 列
  - この列は、ソースの状態を示します。
  - `*` : chronyd が現在同期しているソースを表します。
  - `+` : 選択したソースと結合する、受け入れ可能なソースを表します。
  - `-` : 受け入れ可能なソースで、結合アルゴリズムにより除外されたものを表します。
  - `?` : 接続が切断されたソース、またはパケットがすべてのテストをパスしないソースを表します。少なくとも 3 つのサンプルが収集されるまで開始時にも表示されます。
  - `x` : chronyd が falseticker と考える (つまり、その時間が他の大半のソースと一致しない) クロックを表します。
  - `~` : 時間の変動性が大きすぎるように見えるソースを表します。
- 詳細は `chronyc(1)` 参照


システムクロックを徐々に調整していく (slew) のを止め、一度に修正 (step) する:

```
$ sudo chronyc makestep
```

# パッケージ管理(yum, dnf)

- RHEL, CentOS 7 まで
  - YUM v3 をベースとした yum コマンドを使っていた。
- RHEL, CentOS 8 以降
  - YUM v4 をベースとした dnf コマンドが導入され、今後はこちらがスタンダードとなる見込み。
  - 概要: RHEL8, [RHEL 8 の導入における検討事項, 第6章 ソフトウェア管理](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/considerations_in_adopting_rhel_8/software-management_considerations-in-adopting-rhel-8)
  - `yum` コマンドベースでのパッケージ管理の説明:
     - RHEL8, [ユーザー空間コンポーネントのインストール、管理、および削除](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html-single/installing_managing_and_removing_user-space_components/index)
     - RHEL8, [Installing, managing, and removing user-space components](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html-single/installing_managing_and_removing_user-space_components/index)
- [DNF本家 readthedocs](https://dnf.readthedocs.io/en/latest/index.html)
- `dnf` と `yum` コマンドの違い:
  - [Changes in DNF CLI compared to YUM — dnf latest documentation](https://dnf.readthedocs.io/en/latest/cli_vs_yum.html)
  - 主な yum plugin は dnf の plugin でも提供している。
  - `yum-utils` で提供されていたユーティリティコマンドについても dnf の plugin で提供している。
  - これらの dnf plugin は `dnf-plugins-core` として、コアのプラグインとして組み込まれている。
  - `dnf-plugins-core` が提供するプラグイン一覧については以下参照:
     - https://dnf-plugins-core.readthedocs.io/en/latest/index.html
     - あるいは `rpm -ql dnf-plugins-core` からのmanページ参照 / `man -k dnf`

## コマンド一覧等の参考資料

コマンド一覧(チートシート)等の参考資料:

1. [Fedora User Docs / System Administrator’s Guide / Package Management / DNF (Fedora 40)](https://docs.fedoraproject.org/en-US/fedora/f40/system-administrators-guide/package-management/DNF/)
   - Fedora によるDNFガイドで、全体像を掴みやすい資料になっている。
   - `/etc/yum.repos.d/` 以下の設定ファイルの書き方やリポジトリ管理も解説している。
1. その他の Fedora とDNF関連:
   - [Quick Docs / Adding and managing software / Package management system](https://docs.fedoraproject.org/en-US/quick-docs/package-management/)
   - [Quick Docs / Adding and managing software / Using the DNF software package manager](https://docs.fedoraproject.org/en-US/quick-docs/dnf/)
1. `@IT Linux基本コマンドTips 【dnf】コマンドシリーズ`
   1. [基礎編 ソフトウェア（パッケージ）をインストールする](https://atmarkit.itmedia.co.jp/ait/articles/2001/09/news018.html)
   1. [応用編その1 ソフトウェア（パッケージ）を探す](https://atmarkit.itmedia.co.jp/ait/articles/2001/10/news020.html)
   1. [応用編その2 複雑な条件を付けてソフトウェア（パッケージ）を探す](https://atmarkit.itmedia.co.jp/ait/articles/2001/16/news020.html)
   1. [応用編その3 複雑な条件を付けてソフトウェア（パッケージ）の情報を表示する](https://atmarkit.itmedia.co.jp/ait/articles/2001/17/news016.html)
   1. [応用編その4 ソフトウェア（パッケージ）グループの情報を表示する](https://atmarkit.itmedia.co.jp/ait/articles/2001/23/news026.html)
   1. [応用編その5 ソフトウェア（パッケージ）グループをインストールする](https://atmarkit.itmedia.co.jp/ait/articles/2001/24/news014.html)
   1. [応用編その6 リポジトリを有効化／無効化する](https://atmarkit.itmedia.co.jp/ait/articles/2001/30/news019.html)
   1. [応用編その7 リポジトリを追加する](https://atmarkit.itmedia.co.jp/ait/articles/2001/31/news006.html)
   1. [応用編その8 パッケージを更新する](https://atmarkit.itmedia.co.jp/ait/articles/2002/06/news010.html)
1. [Linuxシステムの勉強に役立つコマンドの紹介 - SSTエンジニアブログ](https://securesky-plus.com/engineerblog/1829/#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E6%83%85%E5%A0%B1%E3%81%AE%E8%AA%BF%E6%9F%BB)
   - 基本的には上記記事の「パッケージ情報の調査」セクションを参考。
1. PDF: [YUM コマンドチートシート for Red Hat Enterprise Linux](https://access.redhat.com/sites/default/files/attachments/rh_yum_cheatsheet_1214_jcs_print-ja.pdf)
1. [yum｜yum リポジトリの有効／無効](https://kazmax.zpp.jp/linux_beginner/yum_repository_enable_disable.html)

以下、上記参考資料[1] に未掲載のリポジトリ関連の操作を補足として載せる。

### パッケージ更新

```
[CentOS Stream 8]
$ sudo dnf upgrade
```

- `upgrade` と `distro-sync` の違い:
  - `upgrade` は新しいパッケージバージョンが出ていればそれに更新する、最も一般的な用途。
  - `distro-sync` はユーザが何らかの事情でディストリビューションより新しいバージョンを入れてしまってシステムが壊れてしまったときなどのために、ディストリビューション側の最新に揃え、結果としてダウングレードが発生することもある。
    - 標準的な公式リポジトリから `dnf install` したり `dnf upgrade` しているだけならまず問題にはならないと思うが、他のリポジトリなども登録しているうちに、依存関係などで公式パッケージを上書きしてしまうなど混乱が生じた場合、一旦ディストリビューション公式のパッケージについては公式の最新バージョンに強制的に揃えるためのコマンド・・・だと、推測します。
    - 参考
      - https://kernhack.hatenablog.com/entry/2015/07/20/113059
      - https://forums.fedoraforum.org/showthread.php?310166-What-s-the-differentce-between-the-dnf-commands-quot-distro-sync-quot-and-quot-upgrade-quot
      - https://docs.fedoraproject.org/en-US/quick-docs/upgrading-fedora-offline/#sect-using-distro-sync-to-resolve-dependency-issues
- Fedora の DNF を使ったシステム更新ガイド: [Quick Docs / Upgrading to a new release / Upgrading Fedora using the DNF system upgrade](https://docs.fedoraproject.org/en-US/quick-docs/upgrading-fedora-offline/)

### パッケージの情報取得

```
# 基本的なパッケージ情報の表示 (インストール済み)
$ rpm -qi procps-ng

# まだインストールしていないパッケージ情報の表示
$ dnf info <<package_name>>
$ dnf repoquery <<package_name>> --info

# どのリポジトリから追加されたのか？を知りたいときは dnf info
$ dnf info procps-ng
(...)
From repo    : baseos #<<<<<<<<< リポジトリ情報
(...)

# インストール済みパッケージ一覧
$ rpm -qa

# インストール済みパッケージのファイル一覧
$ rpm -ql <<package_name>>

# 依存パッケージの表示
$ rpm -qR <<package_name>>

# changelogの表示
$ rpm -q --changelog <<package_name>>

# カスタムスクリプトの表示
$ rpm -q --scripts <<package_name>>
$ rpm -q --triggers <<package_name>>
$ rpm -q --triggers --scripts <<package_name>>
```

NOTE: `rpm -q` 系で、ローカルファイル上にある `.rpm` ファイルの情報を確認したい場合は `-q` に `p` を加える。例： `rpm -qpi`, `rpm -qpl`, `rpm -qp --changelog`, `rpm -qp --triggers --scripts`


### ファイルの所有者, パーミッション一覧

```
$ rpm -q --qf "[%{FILEMODES:perms} %{FILEUSERNAME}:%{FILEGROUPNAME} %{FILENAMES}\n]" <package-name>
$ rpm -qp --qf "[%{FILEMODES:perms} %{FILEUSERNAME}:%{FILEGROUPNAME} %{FILENAMES}\n]" foobar.rpm
```

### リポジトリ一覧/詳細/追加

```
[CentOS 7]
(enabledのみ)
$ sudo yum repolist
$ sudo yum repolist enabled

(disabled含む一覧)
$ sudo yum repolist all

(baseリポジトリの詳細)
$ sudo yum repolist base -v

(リポジトリの追加)
$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo <repository-url>

[CentOS Stream 8]
(enabledのみ)
$ dnf repolist
$ dnf repolist enabled

(disabled含む一覧)
$ dnf repolist all

(baseリポジトリの詳細)
$ dnf repolist baseos -v

(リポジトリの追加)
$ sudo dnf config-manager --add-repo <repository-url>
```

### EPEL(Extra Packages for Enterprise Linux repository configuration) のインストール

```
[CentOS 7]
$ sudo yum search epel
(...)
============================================================ N/S matched: epel =============================================================
epel-release.noarch : Extra Packages for Enterprise Linux repository configuration

$ sudo yum install epel-release

[CentOS Stream 8]
$ sudo dnf search epel
(...)
============================================================ Name Matched: epel ============================================================
epel-next-release.noarch : Extra Packages for Enterprise Linux Next repository configuration
epel-release.noarch : Extra Packages for Enterprise Linux repository configuration

$ sudo dnf install epel-release
```

### パッケージの検索とインストール例: screen

```
[CentOS 7]
$ sudo yum --disablerepo=* --enablerepo=base search screen
(...)
=========================================================== N/S matched: screen ============================================================
(...)
screen.x86_64 : A screen manager that supports multiple logins on one terminal
(...)
→ base リポジトリで見つかったので、そのままインストール

$ sudo yum --disablerepo=* --enablerepo=base install screen


[CentOS Stream 8]
$ sudo dnf --disablerepo=* --enablerepo=baseos search screen
→ 見つからない。

$ sudo dnf --disablerepo=* --enablerepo=epel search screen
(...)
====================================================== Name & Summary Matched: screen ======================================================
screen.x86_64 : A screen manager that supports multiple logins on one terminal
(...)

→ EPEL リポジトリにあったのでインストール
$ sudo dnf --disablerepo=* --enablerepo=epel install screen
```
### パッケージグループの情報取得

```
[CentOS Stream 8]
# パッケージグループ一覧表示
$ dnf group list
# パッケージグループ一覧表示(英語で表示)
$ LANG=C dnf group list

# --hidden | --installed | --available | --ids はどれか一つだけ指定できる。
$ dnf group list --hidden
$ dnf group list --installed
$ dnf group list --available
# (group id を表示したいときは --ids オプション。)
$ dnf group list --ids
(-v をつけても良い)

# 特定のパッケージグループに含まれるパッケージ一覧
$ dnf group info "Development Tools"
(dnf group list --ids で表示されるIDを指定する場合:)
$ dnf group info development
(パッケージのバージョンまで表示したい場合:)
$ dnf -v group info "Development Tools"
$ dnf -v group info development
(info コマンドはインストールしていないパッケージグループでも使える)

# パッケージグループのインストール例
$ sudo dnf group install "Development Tools"
```

`dnf group` コマンド参考:

- [How to work with dnf package groups - Linux Tutorials - Learn Linux Configuration](https://linuxconfig.org/how-to-work-with-dnf-package-groups)
- [dnf(yum) groupinstallでは何がインストールされているのか - Qiita](https://qiita.com/yumenomatayume/items/7e64544e022548969557)

## AppStream (RHEL8, CentOS8以降)

参考:

- Red Hat Enterprise Linux 8
  - RHEL 8 の導入における検討事項, [第4章 アプリケーションストリーム](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/considerations_in_adopting_rhel_8/application-streams_considerations-in-adopting-rhel-8)
  - [ユーザー空間コンポーネントのインストール、管理、および削除](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/installing_managing_and_removing_user-space_components/index)
     - **ここに全て書かれてる**
- [Make & Review | RHEL/CentOS8のAppStream 知識整理](https://blog.yyyak.com/post/cappstream/)
- [Red Hat Enterprise Linux 8 で 10年維持されるパッケージはどれ? - 赤帽エンジニアブログ](https://rheb.hatenablog.com/entry/rhel8lifecycle)

コマンド抜粋:

```
[モジュールの一覧/詳細]
$ sudo dnf module list
$ sudo dnf module list (module-name)
$ sudo dnf module info (module-name)

[パッケージインストール前にストリームを有効化]
$ sudo dnf module enable (module-name):(stream)

[モジュールのコンテンツ(=パッケージ一式)をインストール]
$ sudo dnf module install (module-name)
$ sudo dnf module install (module-name):(stream)
$ sudo dnf module install (module-name):(stream)/(profile)

[アクティブなストリームからすべてのパッケージを削除]
$ sudo dnf module remove --all (module-name)
$ sudo dnf module remove --all (module-name):(stream)
$ sudo dnf module remove --all (module-name):(stream)/(profile)

[モジュールを初期状態へのリセット]
$ sudo dnf module reset (module-name)

[モジュールおよびそのストリームの無効化]
$ sudo dnf module disable (module-name)
```

## RPMパッケージの作成

RPMパッケージを作る方法については、RHEL公式ガイドやRPM公式ドキュメントが参考になる。
まずRHEL公式ガイドを一通り読んだあと、細かいところは使用するツールのmanページや、RPM公式ドキュメントを参考にするとよい。
RPMのビルドツールも進化しているので、古いblog記事のやり方では微妙に冗長だったり、今となっては余計な作業が残ってしまう懸念もある。
必ず使用するRHEL(またはそれと同等のディストーション)のバージョンを確認し、そのバージョンの公式ドキュメントを一読すること。

- RHEL8:
  - [ソフトウェアのパッケージ化および配布](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/packaging_and_distributing_software/index)
  - [Packaging and distributing software](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html/packaging_and_distributing_software/index)
- RHEL9:
  - [ソフトウェアのパッケージ化および配布](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/packaging_and_distributing_software/index)
  - [Packaging and distributing software](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/packaging_and_distributing_software/index)
- https://rpm.org/ : RPM公式ドキュメント
- [RPM Packaging Guide](https://rpm-packaging-guide.github.io/)
- https://docs.fedoraproject.org/en-US/fedora/f40/system-administrators-guide/RPM/
  - Fedora 40 の "Fedora User Docs" -> "System Administrator’s Guide" -> "RPM"

### SRPMのビルド

準備:

- `rpmdevtools` パッケージをインストールして `rpmdev-setuptree` コマンドを実行しておく。
  - `$ sudo dnf install rpmdevtools`
  - `$ rpmdev-setuptree` -> `~/rpmbuild/` 以下のディレクトリツリーが作成される。
- `rpm-build` パッケージをインストールして `rpmbuild` を使えるようにしておく。
  - `$ sudo dnf install rpm-build`

SRPM(`.src.rpm`)からのビルド:

1. `$ mv xxx.src.rpm ~/rpmbuild/SRPMS/`
1. `$ cd ~/rpmbuild/SRPMS/`
1. `$ rpmbuild --recompile xxx.src.rpm`
   - 参考URLのRHEL公式ドキュメントでは `--rebuild` オプションを紹介しているが、そちらでは spec ファイルとソースコードを削除してしまう。 `--recompile` なら残すので、spec やソースコード, patch などを調査するのであれば `--recompile` の方がおすすめ。

ビルドはせず、単に spec ファイルとソースコードを展開したいだけであれば、`.src.rpm` をそのままインストールするのもあり。

```
$ rpm -i ~/rpmbuild/SRPMS/xxx.src.rpm
```

`~/rpmbuild/SPECS/` 以下に spec ファイルが、 `~/rpmbuild/SOURCES/` 以下にソースコード(.tarボールなど)が配置される。

他にも `rpm2archive` コマンドで `.rpm` を tar.gz ファイルに変換できる。これを使うと `src.rpm` についても `src.rpm.tgz` に変換し、 `tar ztf xxx.src.rpm.tgz` 等で内容を確認・抽出できる。


参考:

- RHEL8:
  - [4.6.2. ソース RPM からのバイナリー RPM の再ビルド](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/packaging_and_distributing_software/building-rpms_packaging-software#rebuilding-a-binary-from-a-source-rpm_building-rpms)
  - [4.6.2. Rebuilding a binary RPM from a source RPM](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html/packaging_and_distributing_software/packaging-software_packaging-and-distributing-software#rebuilding-a-binary-from-a-source-rpm_building-rpms)
- RHEL9:
  - [5.5.2. ソース RPM からのバイナリー RPM の再ビルド](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/packaging_and_distributing_software/building-rpms_packaging-software#rebuilding-a-binary-from-a-source-rpm_building-rpms)
  - [5.5.2. Rebuilding a binary RPM from a source RPM](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/packaging_and_distributing_software/packaging-software_packaging-and-distributing-software#rebuilding-a-binary-from-a-source-rpm_building-rpms)

### RPMファイルの中身を展開

RPMをインストールせずに、その中身だけを展開したい場合：

- `rpm2archive` コマンドを使って tar ファイルに変換する。
  - `$ rpm2archive foo.rpm` -> `foo.rpm.tgz` として tar.gz に変換される(未確認)。
- `rpm2cpio` コマンドを使って cpio ファイルに変換する。

参考:

- RHEL8
  - [4.9. RPM コンテンツの抽出](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/packaging_and_distributing_software/proc_extracting-rpm-content_packaging-software)
  - [4.9. Extracting RPM content](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/8/html/packaging_and_distributing_software/packaging-software_packaging-and-distributing-software#proc_extracting-rpm-content_packaging-software)
- RHEL9
  - [5.8. RPM コンテンツの抽出](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/packaging_and_distributing_software/proc_extracting-rpm-content_packaging-software)
  - [5.8. Extracting RPM content](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/packaging_and_distributing_software/packaging-software_packaging-and-distributing-software#proc_extracting-rpm-content_packaging-software)

# NetworkManager によるコマンドライン操作

設定ファイルではなく、NetworkManager によるGUI/tui/cui操作で設定する方が無難そう。
コマンドライン操作ではCUIである `nmcli(1)` を使う方法がシンプル。

参考:

- [Red Hat Enterprise Linux 7 ネットワークガイド](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/networking_guide/index)
- [Red Hat Enterprise Linux 8 ネットワークの設定および管理](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/index)
- `man 1 nmcli`
- [nmcliチートシート - Qiita][nmcli-dev-con-ref-1]
- [nmcliコマンドの基礎 - えんでぃの技術ブログ][nmcli-dev-con-ref-2]

[nmcli-dev-con-ref-1]:https://qiita.com/liqsuq/items/1474702cb01c9cc9e781
[nmcli-dev-con-ref-2]:https://endy-tech.hatenablog.jp/entry/2018/09/08/140950

## ネットワークインターフェイス名の命名規則

ネットワークインターフェイス名について、CentOS 7, Stream 8 では Predictable Network Interface Names という命名規則を採用している。
以前の kernel起動時に検出した `eth0`, `eth1`, ... という命名ルールでは、hot-plugデバイスへの対応や検出順序によりインターフェイス名が入れ替わる（ずれる）などの課題があった。
Predictable Network Interface Names を使うことで、全体として一貫した命名規則、つまりデバイス間で一意に名前が定まり、インターフェイス名が入れ替わることも無くなる。
設定により、以前の命名規則に戻すことも可能。

systemd v197 で導入された Predictable Network Interface Names については以下を参照:

1. [NetworkInterfaceNames - Debian Wiki](https://wiki.debian.org/NetworkInterfaceNames)
1. [Predictable Network Interface Names](https://systemd.io/PREDICTABLE_INTERFACE_NAMES/)
   - https://systemd.io/PREDICTABLE_INTERFACE_NAMES/
   - https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/
1. [ほげめも: Debian vs Ubuntu: ネットワークインタフェースの名前](http://blog.keshi.org/hogememo/2014/12/28/debian-vs-ubuntu-network-interface-names)

CentOS 7/8 系 = RHEL7/8系でのインターフェイス名命名規則については以下を参照。

1. Red Hat Enterprise Linux 7 ネットワークガイド, [第11章 ネットワークデバイス命名における一貫性](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/networking_guide/ch-consistent_network_device_naming)
1. Red Hat Enterprise Linux 8 ネットワークの設定および管理, [第1章 一貫性のあるネットワークインターフェースデバイスの命名](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/consistent-network-interface-device-naming_configuring-and-managing-networking)

## nmcli の使い方

`bash-completion` パッケージを入れると nmcli のコマンド補完が有効になるのでおすすめ:

```
[RHEL7/CentOS7]
$ sudo yum install bash-completion
→ログアウト後、ログインし直す。

[RHEL8/CentOS8/CentOS Stream 8]
$ sudo dnf install bash-completion
→ログアウト後、ログインし直す。
```

general, networking コマンド例:

```
[NetworkManager全体のステータス表示]
$ sudo nmcli general
$ sudo nmcli general status
STATE      CONNECTIVITY  WIFI-HW  WIFI     WWAN-HW  WWAN
connected  full          enabled  enabled  enabled  enabled

[ホスト名(static hostname)の表示]
$ sudo nmcli general hostname

[ホスト名(static hostname)の設定]
$ sudo nmcli general hostname (new-hostname)

[ネットワーク管理のON/OFF]
$ sudo nmcli networking on
$ sudo nmcli networking off
```

## デバイスと接続プロファイル

NetworkManager ではイーサネットアダプタなど物理的な「デバイス」と、そのデバイスでの「接続」設定を分離している。
これにより、例えばイーサネットアダプタのあるノートPCを自宅と職場で持ち歩くときに、1つのデバイス(ノートPCのイーサネットアダプタ)に対して自宅/職場それぞれの接続設定を接続プロファイルとして切り替えるような使い方が可能となる。
`nmcli device ...` で始まるコマンドがデバイス、つまりネットワークインターフェイスを操作するコマンドになる。
`nmcli connection ...` で始まるコマンドが接続プロファイルを操作するコマンドになる。

デバイスと接続プロファイルについては以下の資料の解説が分かりやすい:

- [nmcliチートシート - Qiita][nmcli-dev-con-ref-1]
- [nmcliコマンドの基礎 - えんでぃの技術ブログ][nmcli-dev-con-ref-2]


```
[ネットワークインターフェイス一覧]
$ sudo nmcli device
$ sudo nmcli device status

[ネットワークインターフェイス設定値一覧]
$ sudo nmcli device show (device-name)

[接続プロファイル一覧]
$ sudo nmcli connection show

[接続プロファイルの設定値一覧]
$ sudo nmcli connection show (connection-name)

[接続プロファイルの設定変更]
$ sudo nmcli connection modify (connection-name) (設定項目名) (値)

[例: 接続プロファイル名の変更]
$ sudo nmcli connection modify (old-connection-name) connection.id (new-connection-name)

[接続プロファイルの起動(= 接続)]
$ sudo nmcli connection up (connection-name)

[接続プロファイルの停止(= 切断)]
$ sudo nmcli connection down (connection-name)

[接続プロファイルの削除]
$ sudo nmcli connection delete (connection-name or connection-uuid)
```

## 接続プロファイルの自動接続ON/OFF

```
[自動接続の確認]
$ sudo nmcli -f name,autoconnect connection show

[自動接続ON]
$ sudo nmcli connection modify (connection-name) connection.autoconnect yes

[自動接続OFF]
$ sudo nmcli connection modify (connection-name) connection.autoconnect no
```

## DHCPをON

```
[DHCP用の接続プロファイルを追加]
$ sudo nmcli connection add con-name (new-connection-name) ifname (device-name) type ethernet

[IPアドレス/ゲートウェイ/DNSの設定を空に戻す]
$ sudo nmcli connection modify (connection-name) ipv4.dns ""

$ sudo nmcli connection modify (connection-name) ipv4.gateway ""
(or
$ sudo nmcli connection modify (connection-name) ipv4.gateway 0.0.0.0
)

$ sudo nmcli connection modify (connection-name) ipv4.addresses ""
※ ipv4.gateway を空にしてから、ipv4.addresses を空にする。逆だとエラーになる。

[DHCPを有効化]
$ sudo nmcli connection modify (connection-name) ipv4.method auto

[既存プロファイルの修正の場合、一度停止]
$ sudo nmcli connection down (connection-name)

[接続プロファイルを起動]
$ sudo nmcli connection up (connection-name)
```

`ipv4.xxx` の手動設定が残ったままだと、DHCPで取得したIP/ゲートウェイ/DNS情報と、手動設定が両方有効な状態となる。

参考:

1. Red Hat Enterprise Linux 7 ネットワークガイド, [3.3.7. nmcli を使用した動的イーサネット接続の追加および設定](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/networking_guide/sec-configuring_ip_networking_with_nmcli#sec-Adding_and_Configuring_a_Dynamic_Ethernet_Connection_with_nmcli)
1. Red Hat Enterprise Linux 8 ネットワークの設定および管理, [2.9. nmstatectl を使用した動的 IP アドレスでのイーサネット接続の設定](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/configuring-an-ethernet-connection-with-a-dynamic-ip-address-by-using-nmstatectl_configuring-an-ethernet-connection)
   - 以前は「8.5. nmcli で動的イーサネット接続の設定」というセクションがあったが、2025年1月時点ではロストした模様。
   - 8.2 で [nmstate](https://nmstate.io/) が導入され、最新ではこちらを推している模様。
   - 参考: [nmstate 宣言的なネットワーク管理](https://www.kimullaa.com/posts/202012120517/)

## DHCPを無効化し、IPアドレス/ゲートウェイ/DNSを手動設定

接続プロファイルのIPアドレスを `ipv4.addresses` で設定した後に、 `ipv4.method` を `manual` に設定する。
( `ipv4.addresses` が空の状態で `ipv4.method` を `manual` に変更しようとすると 「`ipv4.addresses` が空の状態で `manual` に設定することはできません」という趣旨のエラーメッセージが表示される)

```
[手動設定用の接続プロファイルを追加]
$ sudo nmcli connection add con-name (new-connection-name) ifname (device-name) type ethernet

[IPアドレス設定]
$ sudo nmcli connection modify (connection-name) ipv4.addresses 192.168.1.10/24

[デフォルトゲートウェイ設定]
$ sudo nmcli connection modify (connection-name) ipv4.gateway 192.168.1.1

[DNS設定]
$ sudo nmcli connection modify (connection-name) ipv4.dns "8.8.8.8 8.8.4.4"

[DHCPを無効化]
$ sudo nmcli connection modify (connection-name) ipv4.method manual

[既存プロファイルの修正の場合、一度停止]
$ sudo nmcli connection down (connection-name)

[接続プロファイルを起動]
$ sudo nmcli connection up (connection-name)
```

参考:

1. Red Hat Enterprise Linux 7 ネットワークガイド, [3.3.8. nmcli を使用した静的イーサネット接続の追加および設定](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/networking_guide/sec-configuring_ip_networking_with_nmcli#sec-Adding_and_Configuring_a_Static_Ethernet_Connection_with_nmcli)
1. Red Hat Enterprise Linux 8 ネットワークの設定および管理, [2.1. nmcli を使用したイーサネット接続の設定](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/configuring-an-ethernet-connection_configuring-and-managing-networking#configuring-an-ethernet-connection_configuring-and-managing-networking)

## DNSの追加/削除

```
[追加]
$ sudo nmcli connection modify (connection-name) +ipv4.dns 8.8.8.8
$ sudo nmcli connection modify (connection-name) +ipv4.dns "8.8.8.8 8.8.4.4"

[削除]
$ sudo nmcli connection modify (connection-name) -ipv4.dns 8.8.8.8
$ sudo nmcli connection modify (connection-name) -ipv4.dns "8.8.8.8 8.8.4.4"
```

### 参考: 公開DNSキャッシュサーバー(パブリックDNS)

1. [Google Public DNS](https://developers.google.com/speed/public-dns)
   - primary: `8.8.8.8`
   - secondary: `8.8.4.4`
1. Cloudflare
   - [Announcing 1.1.1.1: the fastest, privacy-first consumer DNS service](https://blog.cloudflare.com/announcing-1111/)
     - primary: `1.1.1.1`
     - secondary: `1.0.0.1`
   - [Introducing 1.1.1.1 for Families](https://blog.cloudflare.com/introducing-1-1-1-1-for-families/)
     - Malware Blocking Only
       - primary: `1.1.1.2`
       - secondary: `1.0.0.2`
     - Malware and Adult Content
       - primary: `1.1.1.3`
       - secondary: `1.0.0.3`
   - [Cloudflareが無料の新DNSサービス「1.1.1.1 for Families」発表。DNSのレベルでアダルトコンテンツやマルウェアをブロック － Publickey](https://www.publickey1.jp/blog/20/cloudflaredns1111_for_familiesdns.html)
   - [1.1.1.1 - Wikipedia](https://ja.wikipedia.org/wiki/1.1.1.1)

## 静的ルート/ゲートウェイの設定

参考:

- Red Hat Enterprise Linux 7 ネットワークガイド, [第4章 静的ルートおよびデフォルトゲートウェイの設定](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/networking_guide/ch-configuring_static_routes_and_the_default_gateway)
  - [4.2. nmcli を使った静的ルートの設定](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/networking_guide/sec-configuring_static_routes_using_nmcli)
  - [4.6. デフォルトゲートウェイの設定](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/networking_guide/sec-configuring_the_default_gateway)
- Red Hat Enterprise Linux 8 ネットワークの設定および管理
  - [第24章 デフォルトのゲートウェイ設定の管理](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/managing-the-default-gateway-setting_configuring-and-managing-networking)
  - [24.8. NetworkManager が複数のデフォルトゲートウェイを管理する方法](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/con_how-networkmanager-manages-multiple-default-gateways_managing-the-default-gateway-setting)
  - [第25章 静的ルートの設定](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/configuring-static-routes_configuring-and-managing-networking)
  - [25.2. nmcli ユーティリティーを使用して静的ルートを設定する方法](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/how-to-use-the-nmcli-command-to-configure-a-static-route_configuring-static-routes#how-to-use-the-nmcli-command-to-configure-a-static-route_configuring-static-routes)

静的ルート設定:

```
[上書き設定]
$ sudo nmcli connection modify (connection-name) ipv4.routes "ip[/prefix] [next_hop]"
$ sudo nmcli connection modify (connection-name) ipv4.routes "ip[/prefix] [next_hop] [metric] [attribute=value] [attribute=value] ..."

[ルートの追加]
$ sudo nmcli connection modify (connection-name) +ipv4.routes "ip[/prefix] [next_hop]"
$ sudo nmcli connection modify (connection-name) +ipv4.routes "ip[/prefix] [next_hop] [metric] [attribute=value] [attribute=value] ..."

[ルートの削除]
$ sudo nmcli connection modify (connection-name) -ipv4.routes "ip[/prefix] [next_hop]"
$ sudo nmcli connection modify (connection-name) -ipv4.routes "ip[/prefix] [next_hop] [metric] [attribute=value] [attribute=value] ..."
```

複数の接続プロファイルがアクティブなときのデフォルトゲートウェイについては、metric指定をして制御できる:

```
$ sudo nmcli connection modify (connection-name) ipv4.route-metric (new-metric)
$ sudo nmcli connection modify (connection-name) ipv4.route-metric (new-metric) ipv6.route-metric (new-metric)
```

ルーティングテーブルの確認:

```
$ sudo ip r
$ sudo ip -4 r
$ sudo ip -6 r

$ tracepath -n (ip-address)
$ tracepath -n (internet-hostname)
```

## manページのEXAMPLESから抜粋

manページの最後にEXAMPLESがあり、実際のコマンド例がいろいろ紹介されている。
個人的に気になったものをいくつか抜粋する。

- `nmcli connection show --active`
  - アクティブな接続プロファイルを一覧表示する。
- `nmcli -f name,autoconnect c s`
  - 接続プロファイル名と `connection.autocnnect` プロパティを一覧表示する。
  - 全体的に `-f` で表示するフィールド名を指定できる。
- `nmcli -p connection show "My default em1"`
  - "My default em1" 接続プロファイルの詳細を表示する。
  - 全体的に `-p` により、より分かりやすい表示になる。(`-p = --pretty`)
- `nmcli dev disconnect em2`
  - デバイス em2 を切断する。デバイス自体が利用不可能となるため、 autoconnect が有効な接続プロファイルがあっても接続が確立されない。
  - 明示的に `nmcli device connect (device-name)` するか、デバイスの `autoconnect` をTRUEにしないと、自動接続が動作しない。

# セキュリティ

## ファイアウォール(firewalld)

- Red Hat Enterprise Linux 7 セキュリティーガイド, [第5章 ファイアウォールの使用](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/security_guide/sec-using_firewalls)
- Red Hat Enterprise Linux 8 ネットワークの設定および管理, [第41章 firewalld の使用および設定](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/using-and-configuring-firewalld_configuring-and-managing-networking)
- [CentOS 7 firewalld よく使うコマンド - Qiita](https://qiita.com/kenjjiijjii/items/1057af2dddc34022b09e)

コマンド抜粋:

```
[起動/停止/状態確認]
$ sudo systemctl start firewalld.service
$ sudo systemctl stop firewalld.service
$ sudo systemctl status firewalld.service
$ sudo firewall-cmd --state

[自動起動ON/OFF/確認]
$ sudo systemctl enable firewalld.service
$ sudo systemctl disable firewalld.service
$ sudo systemctl is-enabled firewalld.service

[デフォルトゾーン/アクティブゾーンの確認]
$ sudo firewall-cmd --get-default-zone
$ sudo firewall-cmd --get-active-zones

[すべてのゾーン/指定したゾーンの設定確認]
$ sudo firewall-cmd --list-all-zones
$ sudo firewall-cmd --list-all --zone=(zone-name)

[すべてのゾーン/指定したゾーンの恒久的な設定確認]
$ sudo firewall-cmd --list-all-zones --permanent
$ sudo firewall-cmd --list-all --zone=(zone-name) --permanent

[デフォルトゾーンの変更]
$ sudo firewall-cmd --set-default-zone=(zone-name)
$ sudo firewall-cmd --set-default-zone=(zone-name) --permanent
[アクティブゾーンの変更]
$ sudo firewall-cmd --zone=(zone-name) --change-interface=(if-name)
$ sudo firewall-cmd --zone=(zone-name) --change-interface=(if-name) --permanent

[設定の再読み込み]
$ sudo firewall-cmd --reload

[利用可能なサービス一覧]
$ sudo firewall-cmd --get-services

[許可サービスの追加/削除]
$ sudo firewall-cmd --add-service=(service-name) --zone=(zone-name)
$ sudo firewall-cmd --add-service=(service-name) --zone=(zone-name) --permanent
$ sudo firewall-cmd --remove-service=(service-name) --zone=(zone-name)
$ sudo firewall-cmd --remove-service=(service-name) --zone=(zone-name) --permanent

[ポート番号許可の追加/削除]
$ sudo firewall-cmd --add-port=(port-number)/{tcp|udp} --zone=(zone-name)
$ sudo firewall-cmd --add-port=(port-number)/{tcp|udp} --zone=(zone-name) --permanent
$ sudo firewall-cmd --remove-port=(port-number)/{tcp|udp} --zone=(zone-name)
$ sudo firewall-cmd --remove-port=(port-number)/{tcp|udp} --zone=(zone-name) --permanent

[IPアドレス許可の追加/削除]
$ sudo firewall-cmd --add-source=192.168.0.0/24 --zone=(zone-name)
$ sudo firewall-cmd --add-source=192.168.0.0/24 --zone=(zone-name) --permanent
$ sudo firewall-cmd --remove-source=192.168.0.0/24 --zone=(zone-name)
$ sudo firewall-cmd --remove-source=192.168.0.0/24 --zone=(zone-name) --permanent

[IPアドレス拒否の追加/削除]
$ sudo firewall-cmd --add-source=192.168.0.0/24 --zone=drop
$ sudo firewall-cmd --add-source=192.168.0.0/24 --zone=drop --permanent
$ sudo firewall-cmd --remove-source=192.168.0.0/24 --zone=drop
$ sudo firewall-cmd --remove-source=192.168.0.0/24 --zone=drop --permanent
```

## 信頼するルート証明書の追加

社内等のローカル or プライベートな認証局や開発向けのルート証明書を追加する方法：

- RHEL8の場合:
  1. PEM or DER フォーマットの証明書を `/usr/share/pki/ca-trust-source/anchors/` ディレクトリーまたは `/etc/pki/ca-trust/source/anchors/` ディレクトリーにコピーする。
  1. `# update-ca-trust extract`

参考:

- RHEL8, ネットワークのセキュリティー保護, [3.2. 新しい証明書の追加](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/securing_networks/adding-new-certificates_using-shared-system-certificates#adding-new-certificates_using-shared-system-certificates)
  - `update-ca-trust(8)`, `trust(1)`

# RHELドキュメントの逆引き

RHELドキュメントはたくさんの種類が公開されており、どこに何が書かれてあるかすぐに探すのが難しい。
そのため、筆者の方で主なRHELドキュメントのトピックを抜粋してみた。
CentOSでシステム構築をする際に、キーワードで探してみて、そこからRHELのドキュメントを逆引きするのに使ってほしい。

## RHEL8 ドキュメントの逆引き

全体:
 - [Red Hat Enterprise Linux 8](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/)

一般的なシステム設定:

- [「基本的なシステム設定の構成」](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/index)
  - 日付と時刻
  - システムロケールの設定
  - キーボードレイアウトの設定
  - ネットワーク設定（基礎編）
  - systemd
  - ファイアウォールの設定（基礎編）
  - SELinuxの設定（基礎編）
  - ユーザーアカウント管理, sudo/sudoers管理, rootユーザパスワードのリセットなど
  - kdump, syslog設定
  - yum によるパッケージ管理, 自動更新設定
  - システムのシャットダウン/再起動
  - systemd, systemctl によるサービス管理, 独自ユニットファイルの作成
  - ファイル権限, umask管理
  - chrony による時刻同期
  - OpenSSHの設定と管理
  - rsyslogによるリモートロギング設定
  - Python, PHP, Tcl/Tk の使用ガイド
- [「さまざまな種類のサーバーのデプロイメント」](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/deploying_different_types_of_servers/index)
  - Apache HTTPD
  - nginx
  - samba
  - BIND DNS
  - NFS
  - squid
  - データベース (MariaDB, PostgreSQL)
  - SMTP(sendmail, postfix), POP/IMAP(Dovecot)
  - 印刷(cups)
- [「カーネルの監視および更新の管理」](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/managing_monitoring_and_updating_the_kernel/index)
  - kernel RPMパッケージの構成, yum による更新
  - kernel モジュールの管理
  - kernel コマンドラインパラメータ設定
  - sysctl によるパラメータ設定
  - データベースサーバ向けのkernelパラメータ調整
  - printk, dmesg, `/var/log/boot.log` 等の kernel logging (ring buffer)
  - kdump の詳細な管理と設定
  - crash を使ったコアダンプ解析
  - kernel の live patch
  - コントロールグループ (cgroups v1, v2) の解説とsystemdによる管理
  - eBPFとbcc-toolsの紹介

ネットワークとセキュリティ:

- [「ネットワークの設定および管理」](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/configuring_and_managing_networking/index)
  - デバイス名の命名規則
  - NetworkManager, nmtui, nmcli によるネットワーク/WiFi設定の詳細
  - VLAN/ネットワークブリッジ/チーミング/ボンディング設定の詳細
  - VPN, IPSec 設定の詳細
  - IPトンネル(IPIP, GRE)の詳細
  - ポートミラーリングの設定
  - 802.1x標準の使用
  - ルーティング設定(デフォルトゲートウェイ, 静的ルート)の詳細
  - ダミーインターフェイスとnetconsoleの紹介
  - systemd とのインテグレーション
  - トラフィック制御 (qdiscs, tc)
  - Multipath TCP の使用
  - DNSの優先度設定の詳細, `/etc/resolv.conf` の手動設定
  - ethtool によるオフロード/コロケーター機能の設定
  - ping, host ユーティリティの紹介
  - DHCPサービスの詳細
  - firewalld, nftablesの詳細
  - eBPF と bcc-tools の詳細
  - [Nmstate](https://nmstate.io/) の概要
  - その他高度なネットワーク設定の管理
- [「ネットワークのセキュリティー保護」](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/securing_networks/index)
  - OpenSSHの詳細
  - RHEL8におけるSSL/TLSの設定詳細
  - 証明書ストアの管理と証明書の追加
  - IPSec, firewalld, nftables の詳細
- [「セキュリティー更新の管理および監視」](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/managing_and_monitoring_security_updates/index)
  - セキュリティ情報の参照先
  - セキュリティ更新の一覧取得とインストール
- [「セキュリティーの強化」](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/security_hardening/index)
  - システム全体の暗号化ポリシー設定
  - FIPSモードの使用
  - Crypto Policies を使ったカスタム暗号ポリシーの設定
  - PKCS#11 で暗号化ハードウェアを使用する設定
  - SCAPを使った設定コンプライアンスと脆弱性スキャン
  - AIDEで整合性の確認
  - LUKSを使用したブロックデバイスの暗号化
  - auditd を使ったシステム監査
  - USBGuard によるUSBデバイスからの保護
  - その他高度なセキュリティ設定
- [「SELinuxの使用」](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/using_selinux/index)
  - Permissive/Enforcingモードの切り替えと無効化
  - 制限のあるユーザ/ないユーザ, sysadm_u による管理者の制約, sudo と sysadm_r ロールによる制約
  - トラブルシューティングとauditログ
  - MLS(Multi-Level Security) の詳細
  - カスタムSELinuxポリシーの作成
  - コンテナのSELinuxポリシーの作成
  - SELinux設定のデプロイメント

GNOMEデスクトップ環境:

- [「RHEL 8 でデスクトップ環境の使用」](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/using_the_desktop_environment_in_rhel_8/index)
  - GNOME3, GNOME Standard / Classic の紹介と選択方法, カスタマイズ方法
  - リモートデスクトップアクセス(VNC)
  - GNOME設定 (dconf, gsettings)
  - GNOMEのカスタマイズ
  - 日本語入力のインストール

開発系:

- [「RHEL 8 での C および C ++ アプリケーションの開発」](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/developing_c_and_cpp_applications_in_rhel_8/index)
  - gccによるC/C++のコンパイルとビルド, 静的/動的ライブラリ作成
  - make, Makefile によるソースコード管理
  - デバッグ情報の使用とgdbによるデバッグ
  - strace/ltrace/SystemTap/gdbによるシステムコールのトレースと監視
  - コアダンプ解析
  - GCC Toolset 9/10 とbinutilsの紹介
- [「Red Hat build of OpenJDK 21」](https://docs.redhat.com/ja/documentation/red_hat_build_of_openjdk/21)
- [「ソフトウェアのパッケージ化および配布」](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/packaging_and_distributing_software/index)
  - RPMパッケージの作成と署名, サンプル紹介