hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

SELinuxコマンド概要

1 はじめに

SELinuxで使用するコマンド概要、およびコマンドが含まれるパッケージ一覧をまとめました。

2 環境

AlmaLinuxの版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 8.6 (Sky Tiger)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
4.18.0-372.9.1.el8.x86_64

3 コマンド一覧

3.1 libselinux-utilsパッケージ

コマンド 概要
getenforce SELinuxの動作モード(*1)を確認するコマンド
setenforce SELinuxの動作モード(*1)を変更するコマンド
getsebool SELinuxの論理パラメータのON/OFFを出力するコマンド
matchpathcon ファイルパスのコンテキストを確認し、そのパスのデフォルトラベルと比較するコマンド

(*1) Enforcing,Permissive,Disabled

なお、libselinux-utilsパッケージのインストール方法は以下になります。他のパッケージも同様にしてインストールします。

[root@server ~]# dnf install libselinux-utils

3.2 setools-consoleパッケージ

コマンド 概要
sesearch SELinuxのルールを検索するコマンド
seinfo SELinuxのポリシーを出力するコマンド

3.3 policycoreutilsパッケージ

コマンド 概要
setsebool SELinuxの論理パラメータのON/OFFを設定するコマンド
restorecon デフォルトの SELinux コンテキストを復元するコマンド
sestatus SELinuxの状態やBoolean値の状態を出力するコマンド
fixfiles 標準のセキュリティコンテキストを定義している設定ファイルの内容に基づいて、全てのファイルにラベルを付与するコマンド
setfiles 指定したセキュリティコンテキストを定義している設定ファイルに基づいて、指定したファイルパスにラベルを付与するコマンド
semodule モジュールのインストール、削除等をおこなうコマンド

3.4 policycoreutils-python-utilsパッケージ

コマンド 概要
semanage ファイルやポートに対するタイプを変更するコマンド
audit2allow ログからルールを作成するコマンド
audit2why ログからアクセス拒否の理由を出力するコマンド

3.5 policycoreutils-develパッケージ

コマンド 概要
sepolicy インストールされたSELinuxポリシーを照会し、有用なレポートやman ページを生成するコマンド

3.6 policycoreutils-newroleパッケージ

コマンド 概要
newrole シェルを新しいロールで実行するためのコマンド

3.7 coreutilsパッケージ

コマンド 概要
runcon 指定したセキュリティコンテキストでコマンドを実行するコマンド
chcon ファイルのセキュリティコンテキストを変更するコマンド

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ

コンテナーのネットワークについて

1 はじめに

podmanコマンドを使ってコンテナを生成した際のネットワークについて説明します。なお、podmanコマンドの基本的な使い方は、podmanコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

1.1 コンテナ生成前

コンテナの生成前の環境は以下です。サーバとクライアントの2台構成です。サーバは受信したパケットの宛先IPアドレスをキーにルーティングテーブルを検索します。検索した結果、自身宛ならサーバのプロセスに受信したパケットを転送します。

                 +---------------------- server ------------------------------------+
                 |                                                                  |
                 | +- servre's process -+                                           |
                 | | For example:       |                                           |
                 | |   httpd, chronyd   |                                           |
                 | +--------------------+                                           |
                 |           A                                                      |
                 |           |                                                      |
                 |           |                                                      |
                 |           |                                                      |
                 |           |                                                      |
                 |           |                                                      |
                 |           |                                                      |
                 |           |                                                      |
                 |           |                                                      |
                 | +--------------------+                                           |
                 | |       Routing      |                                           |
                 | +--------------------+                                           |
                 |    |              |                                              |
                 |    +----+    +----+                                              |
+--- client ---+ |         |    |                                                   |
|              | |         |    V                                                   |
|  +--------+  | |       +--------+                                                 |
+--| enp1s0 |--+ +-------| enp1s0 |-------------------------------------------------+
   +--------+            +--------+
       | .177                | .68
       |                     |
-------------------------------------------------------------------------------------
            192.168.122.0/24

1.2 コンテナ生成後

コンテナ(web1,web2)を生成すると、コンテナとホストを接続するブリッジが作成されます。サーバは受信したパケットの宛先IPアドレスをキーにルーティングテーブルを検索します。検索した結果、自身宛ならサーバのプロセスに受信したパケットを転送します。コンテナ宛てなら、受信したパケットをcni-podman0より送信します。なお、図中のデバイスの意味は以下のとおりです。

バイス 概要
cni-podman0 ブリッジです。宛先MACアドレスをキーにパケットの出力NICを決定するデバイスです
vetha0a16d8a,veth8b2242ec ブリッジに作成されたNICです
enp1s0 サーバ/クライアントのNICです
eth0 コンテナのNICです
                 +---------------------- server ------------------------------------+
                 |                                                                  |
                 | +- servre's process -+      +---- web1 ----+  +---- web2 ----+   |
                 |                      |      |              |  |              |   |
                 | | For example:       |      |    nginx     |  |    httpd     |   |
                 | |   httpd, chronyd   |      |              |  |              |   |
                 | +--------------------+      |    +----+    |  |    +----+    |   |
                 |           A                 +----|eth0|----+  +----|eth0|----+   |
                 |           |                      +----+            +----+        |
                 |           |                         |                 |          |
                 |           |                 +--------------+  +--------------+   |
                 |           |               +-| vetha0a16d8a |--| veth8b2242ec |-+ |
                 |           |               | +--------------+  +--------------+ | |
                 |           |               |                                    | |
                 |           |               |            cni-podman0             | |
                 |           |               |          (Bridge device)           | |
                 | +--------------------+    |                                    | |
                 | |       Routing      | -> |                                    | |
                 | +--------------------+    +------------------------------------+ |
                 |    |              |                                              |
                 |    +----+    +----+                                              |
+--- client ---+ |         |    |                                                   |
|              | |         |    V                                                   |
|  +--------+  | |       +--------+                                                 |
+--| enp1s0 |--+ +-------| enp1s0 |-------------------------------------------------+
   +--------+            +--------+
       | .177                | .68
       |                     |
-------------------------------------------------------------------------------------
            192.168.122.0/24

2 検証環境

クライアント、サーバのAlmaLinuxの版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 8.6 (Sky Tiger)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
4.18.0-372.9.1.el8.x86_64

3 検証結果

サーバのNICを確認します。ループバックデバイス(lo)とサーバ外部との通信用のNIC(enp1s0)が確認できます。

[root@server ~]# ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:98:95:eb brd ff:ff:ff:ff:ff:ff

コンテナのイメージを確認します。nginxとhttpdの最新イメージが存在することがわかります。なお、イメージのダウンロード方法は、podmanコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# podman images
REPOSITORY               TAG         IMAGE ID      CREATED      SIZE
docker.io/library/nginx  latest      670dcc86b69d  10 days ago  146 MB
docker.io/library/httpd  latest      444f7df01ce9  2 weeks ago  149 MB

web1という名前のコンテナを起動します。

[root@server ~]# podman run -d -p 8080:80 --name web1 670dcc86b69d
3881981d35e65364dd1df5b0fd2a2850714a9214cf5a09ae51b0f5f933a7c7b3

コンテナを起動すると、ブリッジ(cni-podman0)とNIC(vetha0a16d8a)が作成されたことがわかります。

[root@server ~]# ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:98:95:eb brd ff:ff:ff:ff:ff:ff
3: cni-podman0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 72:24:37:26:77:17 brd ff:ff:ff:ff:ff:ff
4: vetha0a16d8a@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master cni-podman0 state UP mode DEFAULT group default
    link/ether 6a:f0:d2:db:20:0e brd ff:ff:ff:ff:ff:ff link-netns netns-db3d0237-4de3-5827-ee92-25e760337c1d

なお、brctlコマンドを実行すると、cni-podman0はブリッジ、vetha0a16d8aはブリッジに作成されたNICであることがわかります。

[root@server ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
cni-podman0             8000.722437267717       no      vetha0a16d8a

次に、web2という名前のコンテナを起動します。

[root@server ~]# podman run -d -p 9090:80 --name web2 444f7df01ce9
311285f82dbae08a17323bab1e6e6d560b21bbfd6716551aa3d0f8911edb704f

コンテナを起動すると、NICがさらに1つ(veth8b2242ec)作成されたことがわかります。

[root@server ~]# ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:98:95:eb brd ff:ff:ff:ff:ff:ff
3: cni-podman0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 72:24:37:26:77:17 brd ff:ff:ff:ff:ff:ff
4: vetha0a16d8a@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master cni-podman0 state UP mode DEFAULT group default
    link/ether 6a:f0:d2:db:20:0e brd ff:ff:ff:ff:ff:ff link-netns netns-db3d0237-4de3-5827-ee92-25e760337c1d
5: veth8b2242ec@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master cni-podman0 state UP mode DEFAULT group default
    link/ether e6:8c:c8:4d:81:6e brd ff:ff:ff:ff:ff:ff link-netns netns-d229252d-f395-e935-1c2a-0e2cc4080cfa

なお、brctlコマンドを実行すると、ブリッジにNIC(veth8b2242ec)が追加されたことがわかります。

[root@server ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
cni-podman0             8000.722437267717       no      vetha0a16d8a
                                                        veth8b2242ec

次にpsコマンドを実行します。コンテナが2つ(web1,web2)動作していることがわかります。

[root@server ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED             STATUS                 PORTS                 NAMES
3881981d35e6  docker.io/library/nginx:latest  nginx -g daemon o...  2 minutes ago       Up 2 minutes ago       0.0.0.0:8080->80/tcp  web1
311285f82dba  docker.io/library/httpd:latest  httpd-foreground      About a minute ago  Up About a minute ago  0.0.0.0:9090->80/tcp  web2

コンテナweb1で動作しているプロセスを確認します。nginxプロセスが動作していることがわかります。

[root@server ~]# podman top web1
USER        PID         PPID        %CPU        ELAPSED          TTY         TIME        COMMAND
root        1           0           0.000       2m30.808444783s  ?           0s          nginx: master process nginx -g daemon off;
nginx       32          1           0.000       2m30.808765576s  ?           0s          nginx: worker process
nginx       33          1           0.000       2m30.808847992s  ?           0s          nginx: worker process
nginx       34          1           0.000       2m30.808919483s  ?           0s          nginx: worker process
nginx       35          1           0.000       2m30.808999017s  ?           0s          nginx: worker process

コンテナweb2で動作しているプロセスを確認します。www-data(httpd)プロセスが動作していることがわかります。

[root@server ~]# podman top web2
USER        PID         PPID        %CPU        ELAPSED          TTY         TIME        COMMAND
root        1           0           0.000       1m35.137631946s  ?           0s          httpd -DFOREGROUND
www-data    9           1           0.000       1m35.138004623s  ?           0s          httpd -DFOREGROUND
www-data    10          1           0.000       1m35.138121226s  ?           0s          httpd -DFOREGROUND
www-data    11          1           0.000       1m35.138194124s  ?           0s          httpd -DFOREGROUND

次にiptablesのDNATターゲットを確認します。コンテナを起動すると、下記DNATターゲットが作成されることがわかります。作成されるDNATターゲットのルールは以下の意味になります。受信したTCPパケットを以下のように変換します。
・宛先ポート番号が8080→宛先IPアドレスを10.88.0.2、宛先ポート番号を80に変換
・宛先ポート番号が8090→宛先IPアドレスを10.88.0.3、宛先ポート番号を80に変換

[root@server ~]# iptables -t nat -nvL |grep DNAT
 pkts bytes target     prot opt in     out     source               destination
Chain CNI-HOSTPORT-DNAT (2 references)
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:10.88.0.2:80
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:9090 to:10.88.0.3:80

DNAT変換をしたあと、ルーティングテーブルの検索処理が実行されます。ルーティングテーブルを確認すると、以下のようになっています。宛先が10.88.0.0/16のパケットはcni-podman0 デバイスから、宛先が192.168.122.0/24のパケットはenp1s0から送信することがわかります。つまり、コンテナ宛てのパケットはcni-podman0デバイスから送信されることがわかります。

[root@server ~]# ip r
default via 192.168.122.1 dev enp1s0 proto dhcp metric 100
10.88.0.0/16 dev cni-podman0 proto kernel scope link src 10.88.0.1
192.168.122.0/24 dev enp1s0 proto kernel scope link src 192.168.122.68 metric 100

クライアントからweb1コンテナのnginxに対してhttpアクセスします。なお、curlコマンドの使い方は、curlコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@client ~]# curl -I http://192.168.122.68:8080
HTTP/1.1 200 OK
Server: nginx/1.23.1
Date: Mon, 01 Aug 2022 10:25:52 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 19 Jul 2022 14:05:27 GMT
Connection: keep-alive
ETag: "62d6ba27-267"
Accept-Ranges: bytes

DNATターゲットを確認します。DNATで処理したパケット数が1増加したことがわかります。

[root@server ~]#  iptables -t nat -nvL |grep DNAT
 pkts bytes target     prot opt in     out     source               destination
Chain CNI-HOSTPORT-DNAT (2 references)
    1    60 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:10.88.0.2:80
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:9090 to:10.88.0.3:80

次に、クライアントからweb2コンテナのhttpdに対してhttpアクセスします。

[root@client ~]# curl -I http://192.168.122.68:9090
HTTP/1.1 200 OK
Date: Mon, 01 Aug 2022 10:35:51 GMT
Server: Apache/2.4.54 (Unix)
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Content-Type: text/html

DNATターゲットを確認します。DNATで処理したweb2宛てのhttpパケット数が1増加したことがわかります。

[root@server ~]# iptables -t nat -nvL |grep DNAT
 pkts bytes target     prot opt in     out     source               destination
Chain CNI-HOSTPORT-DNAT (2 references)
    1    60 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:10.88.0.2:80
    1    60 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:9090 to:10.88.0.3:80

次に、tsharkを使って、NICを通過するhttpパケットを確認してみます。なお、tsharkコマンドのインストール方法、使い方は、tsharkコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。まず、tsharkでパケットキャプチャが可能なインタフェース一覧を表示してみます。ブリッジデバイス、コンテナと接続するNICが、キャプチャ可能なインタフェースとして表示されています。

[root@server ~]# tshark -D
Running as user "root" and group "root". This could be dangerous.
1. veth8b2242ec
2. enp1s0
3. cni-podman0
4. vetha0a16d8a
-snip-

ブリッジとweb1コンテナを接続するNICでパケットをキャプチャしてみます。

[root@server ~]# tshark -i vetha0a16d8a -nn
Running as user "root" and group "root". This could be dangerous.
Capturing on 'vetha0a16d8a'

クライアントからweb1コンテナのnginxに対してhttpアクセスします。

[root@client ~]# curl -I http://192.168.122.68:8080

web1コンテナのnginxに対してhttpアクセスすると、下記HTTPパケットのやり取りが確認できます。1,2,3番のパケットを確認すると、クライアントからサーバのweb1コンテナのnginxに対してSYNパケットを送信することで、3 way Handshakeを実行して、TCPコネクションを確立していることがわかります。そして、8番のパケットで、クライアントからサーバのweb1コンテナのnginxに対してFINパケットを送信して、TCPコネクションの開放を開始しています。なお、8,9,10のパケットをやり取りすることでTCPコネクションを開放します。なお、TCPコネクションの確立、解放の様子は、TCPコネクションの確立、解放シーケンス - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# tshark -i vetha0a16d8a -nn
Running as user "root" and group "root". This could be dangerous.
Capturing on 'vetha0a16d8a'
    1 0.000000000 192.168.122.177 → 10.88.0.2    TCP 74 57960 → 80 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=372010414 TSecr=0 WS=128
    2 0.000116548    10.88.0.2 → 192.168.122.177 TCP 74 80 → 57960 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=2845155008 TSecr=372010414 WS=128
    3 0.001329368 192.168.122.177 → 10.88.0.2    TCP 66 57960 → 80 [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=372010416 TSecr=2845155008
    4 0.001448952 192.168.122.177 → 10.88.0.2    HTTP 150 HEAD / HTTP/1.1
    5 0.001659216    10.88.0.2 → 192.168.122.177 TCP 66 80 → 57960 [ACK] Seq=1 Ack=85 Win=29056 Len=0 TSval=2845155010 TSecr=372010416
    6 0.003723081    10.88.0.2 → 192.168.122.177 HTTP 304 HTTP/1.1 200 OK
    7 0.004638309 192.168.122.177 → 10.88.0.2    TCP 66 57960 → 80 [ACK] Seq=85 Ack=239 Win=30336 Len=0 TSval=372010420 TSecr=2845155012
    8 0.005427533 192.168.122.177 → 10.88.0.2    TCP 66 57960 → 80 [FIN, ACK] Seq=85 Ack=239 Win=30336 Len=0 TSval=372010420 TSecr=2845155012
    9 0.005777478    10.88.0.2 → 192.168.122.177 TCP 66 80 → 57960 [FIN, ACK] Seq=239 Ack=86 Win=29056 Len=0 TSval=2845155014 TSecr=372010420
   10 0.006914414 192.168.122.177 → 10.88.0.2    TCP 66 57960 → 80 [ACK] Seq=86 Ack=240 Win=30336 Len=0 TSval=372010422 TSecr=2845155014

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ

debuginfoパッケージのインストール方法

1 はじめに

カーネルやユーザアプリのdebuginfoパッケージをインストールしてみます。debuginfoパッケージをインストールすると、crashコマンド、gdbコマンド、stapコマンド等でソースコードデバッグが可能になります。

2 検証環境

AlmaLinuxの版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 8.6 (Sky Tiger)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
4.18.0-372.9.1.el8.x86_64

3 カーネルのdebuginfoパッケージのインストール方法

カーネルのdebuginfoパッケージをインストールします。

[root@server ~]# dnf debuginfo-install kernel-debuginfo-4.18.0-372.9.1.el8.x86_64

インストールしたパッケージを確認します。kernel-debuginfoをインストールすると、依存関係によりkernel-debuginfo-commonパッケージもインストールされます。

[root@server ~]# rpm -qa|grep kernel-debuginfo
kernel-debuginfo-common-x86_64-4.18.0-372.9.1.el8.x86_64
kernel-debuginfo-4.18.0-372.9.1.el8.x86_64

kernel-debuginfoをインストールすると、下記ディレクトリ配下にソースもインストールされます。

[root@server linux-4.18.0-372.9.1.el8.x86_64]# pwd
/usr/src/debug/kernel-4.18.0-372.9.1.el8/linux-4.18.0-372.9.1.el8.x86_64

次にcrashパッケージをインストールします。

[root@server ~]# dnf install crash

crashコマンドを実行します。

[root@server ~]# crash
-snip-
crash> sys
      KERNEL: /usr/lib/debug/lib/modules/4.18.0-372.9.1.el8.x86_64/vmlinux
    DUMPFILE: /proc/kcore
        CPUS: 4
        DATE: Fri Jul 29 07:27:32 EDT 2022
      UPTIME: 01:18:00
LOAD AVERAGE: 0.44, 0.15, 0.05
       TASKS: 163
    NODENAME: server
     RELEASE: 4.18.0-372.9.1.el8.x86_64
     VERSION: #1 SMP Tue May 10 08:57:35 EDT 2022
     MACHINE: x86_64  (2808 Mhz)
      MEMORY: 4 GB

disコマンドを実行して、ip_rcv関数の逆アセンブルを表示してみます。関数名が表示されていることがわかります。

crash> dis ip_rcv
0xffffffff98e76f30 <ip_rcv>:    nopl   0x0(%rax,%rax,1) [FTRACE NOP]
0xffffffff98e76f35 <ip_rcv+5>:  push   %r13
0xffffffff98e76f37 <ip_rcv+7>:  push   %r12
-snip-

4 httpdのdebuginfoパッケージのインストール方法

httpdの版数を確認します。

[root@server ~]# rpm -qa|grep httpd
httpd-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64
-snip-

httpdのdebuginfoパッケージをインストールします。

[root@server ~]# dnf debuginfo-install httpd-debuginfo-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64

httpdのdebuginfoパッケージをインストールすると、debuginfoパッケージとdebugsourceパッケージがインストールされることがわかります。

[root@server ~]# rpm -qa|grep httpd
httpd-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64
httpd-debuginfo-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64
httpd-debugsource-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64
-snip-

httpd-debuginfoをインストールすると、下記ディレクトリ配下にソースもインストールされます。

[root@server httpd-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64]# pwd
/usr/src/debug/httpd-2.4.37-47.module_el8.6.0+2935+fb177b09.2.x86_64

httpdサービスを起動します。

[root@server ~]# systemctl start httpd

psコマンドを実行して、httpdのPIDを確認します。なお、psコマンドの使い方は、psコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# ps -C httpd -o comm,pid,ppid,args
COMMAND             PID    PPID COMMAND
httpd              1794       1 /usr/sbin/httpd -DFOREGROUND
httpd              1795    1794 /usr/sbin/httpd -DFOREGROUND
httpd              1796    1794 /usr/sbin/httpd -DFOREGROUND
httpd              1797    1794 /usr/sbin/httpd -DFOREGROUND
httpd              1798    1794 /usr/sbin/httpd -DFOREGROUND

gdbコマンドを実行します。ここでは、httpdの親プロセスに対してgdbを実行してみます。

[root@server ~]# gdb -p 1794

btコマンドを実行します。関数名、引数が表示されていることがわかります。

(gdb) bt
#0  0x00007f0de168a1db in select () from target:/lib64/libc.so.6
#1  0x00007f0de1d78919 in apr_sleep () from target:/lib64/libapr-1.so.0
#2  0x0000560d51f81b4d in ap_wait_or_timeout (status=status@entry=0x7ffebc94cce8,
    exitcode=exitcode@entry=0x7ffebc94ccec, ret=ret@entry=0x7ffebc94ccf0, p=<optimized out>, s=<optimized out>)
    at mpm_common.c:201
#3  0x00007f0dd6853041 in server_main_loop (num_buckets=1, remaining_children_to_start=0) at event.c:2904
#4  event_run (_pconf=<optimized out>, plog=<optimized out>, s=<optimized out>) at event.c:3082
#5  0x0000560d51f8115e in ap_run_mpm (pconf=0x560d5289da18, plog=0x560d528cac38, s=0x560d528c6cc0) at mpm_common.c:94
#6  0x0000560d51f79733 in main (argc=<optimized out>, argv=<optimized out>) at main.c:819

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ

podmanコマンドの使い方

1 podmanコマンドとは?

・podmanはRedHat社が開発したコンテナ管理ツール
RHEL 8 でDocker コンテナエンジン、docker コマンドを削除
RHEL 8 はpodmanコマンドを使用
・podmanはサービス(docker.service)の起動が不要

2 検証環境

2.1 ネットワーク構成

サーバとクライアントの2台構成です。図中のeth0はNICの名前です。

                           192.168.122.0/24
client(eth0) ------------------------------------------- (eth0) server
           .177                                         .68

2.2 版数

サーバ、クライアントのAlmaLinux版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 8.6 (Sky Tiger)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
4.18.0-372.9.1.el8.x86_64

3 インストール方法

podmanパッケージをインストールします。

[root@server ~]# dnf -y install podman

podmanの版数を確認します。

[root@server ~]# podman -v
podman version 4.0.2

4 オプション一覧

オプションは以下のとおりです。

[root@server ~]# podman --help
Manage pods, containers and images

Usage:
  podman [options] [command]

Available Commands:
  attach      Attach to a running container
  auto-update Auto update containers according to their auto-update policy
  build       Build an image using instructions from Containerfiles
  commit      Create new image based on the changed container
  container   Manage containers
  cp          Copy files/folders between a container and the local filesystem
  create      Create but do not start a container
  diff        Display the changes to the object's file system
  events      Show podman events
  exec        Run a process in a running container
  export      Export container's filesystem contents as a tar archive
  generate    Generate structured data based on containers, pods or volumes
  healthcheck Manage health checks on containers
  help        Help about any command
  history     Show history of a specified image
  image       Manage images
  images      List images in local storage
  import      Import a tarball to create a filesystem image
  info        Display podman system information
  init        Initialize one or more containers
  inspect     Display the configuration of object denoted by ID
  kill        Kill one or more running containers with a specific signal
  load        Load image(s) from a tar archive
  login       Login to a container registry
  logout      Logout of a container registry
  logs        Fetch the logs of one or more containers
  machine     Manage a virtual machine
  manifest    Manipulate manifest lists and image indexes
  mount       Mount a working container's root filesystem
  network     Manage networks
  pause       Pause all the processes in one or more containers
  play        Play containers, pods or volumes from a structured file
  pod         Manage pods
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image from a registry
  push        Push an image to a specified destination
  rename      Rename an existing container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Removes one or more images from local storage
  run         Run a command in a new container
  save        Save image(s) to an archive
  search      Search registry for image
  secret      Manage secrets
  start       Start one or more containers
  stats       Display a live stream of container resource usage statistics
  stop        Stop one or more containers
  system      Manage podman
  tag         Add an additional name to a local image
  top         Display the running processes of a container
  unmount     Unmounts working container's root filesystem
  unpause     Unpause the processes in one or more containers
  unshare     Run a command in a modified user namespace
  untag       Remove a name from a local image
  version     Display the Podman version information
  volume      Manage volumes
  wait        Block on one or more containers

Options:
      --cgroup-manager string       Cgroup manager to use ("cgroupfs"|"systemd") (default "systemd")
      --conmon string               Path of the conmon binary
  -c, --connection string           Connection to use for remote Podman service
      --events-backend string       Events backend to use ("file"|"journald"|"none") (default "file")
      --help                        Help for podman
      --hooks-dir strings           Set the OCI hooks directory path (may be set multiple times) (default [/usr/share/containers/oci/hooks.d])
      --identity string             path to SSH identity file, (CONTAINER_SSHKEY)
      --log-level string            Log messages above specified level (trace, debug, info, warn, warning, error, fatal, panic) (default "warn")
      --namespace string            Set the libpod namespace, used to create separate views of the containers and pods on the system
      --network-cmd-path string     Path to the command for configuring the network
      --network-config-dir string   Path of the configuration directory for networks
      --noout                       do not output to stdout
  -r, --remote                      Access remote Podman service
      --root string                 Path to the root directory in which data, including images, is stored
      --runroot string              Path to the 'run directory' where all state information is stored
      --runtime string              Path to the OCI-compatible binary used to run containers. (default "runc")
      --runtime-flag stringArray    add global flags for the container runtime
      --storage-driver string       Select which storage driver is used to manage storage of images and containers
      --storage-opt stringArray     Used to pass an option to the storage driver
      --syslog                      Output logging information to syslog as well as the console (default false)
      --tmpdir string               Path to the tmp directory for libpod state content.

                                    Note: use the environment variable 'TMPDIR' to change the temporary storage location for container images, '/var/tmp'.

      --url string                  URL to access Podman service (CONTAINER_HOST) (default "unix:/run/podman/podman.sock")
  -v, --version                     version for podman

5 イメージを取得/削除する方法(pull/rmi)

5.1 AlmaLinuxのイメージ取得(最新版)

下記ページを参考にAlmaLinuxのイメージを取得してみます。
https://hub.docker.com/_/almalinux

まず、TAGにlatestを指定して、AlmaLinuxの最新版イメージを取得してみます。

[root@server ~]# podman pull almalinux:latest

イメージ一覧を確認します。

[root@server ~]# podman images
REPOSITORY                   TAG         IMAGE ID      CREATED      SIZE
docker.io/library/almalinux  latest      4580d9e4bab7  2 weeks ago  195 MB

確認したイメージIDを指定して、イメージを削除します。

[root@server ~]# podman rmi 4580d9e4bab7
Untagged: docker.io/library/almalinux:latest
Deleted: 4580d9e4bab7a568a73d120b6a7d189a0a12ba9311cd71506c5dbedec94ceb9b

イメージ一覧を確認します。イメージが削除されたことがわかります。

[root@server ~]# podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

5.2 AlmaLinuxのイメージ取得(版数指定)

TAGに8.6を指定して、AlmaLinuxの8.6版のイメージを取得してみます。

[root@server ~]# podman pull almalinux:8.6

イメージ一覧を確認します。

[root@server ~]# podman images
REPOSITORY                   TAG         IMAGE ID      CREATED      SIZE
docker.io/library/almalinux  8.6         4580d9e4bab7  2 weeks ago  195 MB

確認したイメージIDを指定してイメージを削除します。

[root@server ~]# podman rmi 2e19f62a21cc

イメージ一覧を確認します。イメージが削除されたことがわかります。

[root@server ~]# podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

5.3 SUSE のイメージ取得(最新版)

下記ページを参考に、SLES154SP4のイメージを取得してみます。
https://registry.suse.com/static/bci/bci-base-15sp4/index.html

[root@server ~]# podman pull registry.suse.com/bci/bci-base:latest

イメージ一覧を確認します。

[root@server ~]# podman images
REPOSITORY                      TAG         IMAGE ID      CREATED     SIZE
registry.suse.com/bci/bci-base  latest      86698fe00598  8 days ago  122 MB

確認したイメージIDを指定してイメージを削除します。

[root@server ~]# podman rmi 86698fe00598

イメージ一覧を確認します。SUSEのイメージが削除されたことがわかります。

[root@server ~]# podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

5.4 SUSE のイメージ取得(版数指定)

下記ページを参考に、SLES15SP3のイメージを取得してみます。
https://registry.suse.com/static/bci/bci-base/index.html

[root@server ~]# podman pull registry.suse.com/bci/bci-base:15.3

イメージ一覧を確認します。

[root@server ~]# podman images
REPOSITORY                      TAG         IMAGE ID      CREATED     SIZE
registry.suse.com/bci/bci-base  15.3        c675c295c6ba  2 days ago  122 MB

確認したイメージIDを指定してイメージを削除します。

[root@server ~]# podman rmi c675c295c6ba

イメージ一覧を確認します。イメージが削除されたことがわかります。

[root@server ~]# podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

5.5 Ubuntuのイメージ取得(最新版)

下記ページを参考に、Ubuntuの最新版イメージを取得してみます。
https://hub.docker.com/_/ubuntu

[root@server ~]# podman pull ubuntu:latest

イメージ一覧を確認します。

[root@server ~]# podman images
REPOSITORY                TAG         IMAGE ID      CREATED      SIZE
docker.io/library/ubuntu  latest      27941809078c  6 weeks ago  80.3 MB

確認したイメージIDを指定して、イメージを削除します。

[root@server ~]# podman rmi 27941809078c

イメージ一覧を確認します。イメージが削除されたことがわかります。

[root@server ~]# podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

5.6 Ubuntuのイメージ取得(版数指定)

Ubuntuの22.10版イメージを取得してみます。

[root@server ~]# podman pull ubuntu:22.10

イメージ一覧を確認します。

[root@server ~]# podman images
REPOSITORY                TAG         IMAGE ID      CREATED      SIZE
docker.io/library/ubuntu  22.10       8264e2ec2ece  6 weeks ago  72.7 MB

確認したイメージIDを指定して、イメージを削除します。

[root@server ~]# podman rmi 8264e2ec2ece

イメージ一覧を確認します。イメージが削除されたことがわかります。

[root@server ~]# podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

5.7 CentOSのイメージ取得(最新版)

下記ページを参考に、CentOSのイメージを取得してみます。
https://hub.docker.com/_/centos

CentOS7の最新イメージを取得してみます。

[root@server ~]# podman pull centos:7

CentOS6の最新イメージを取得してみます。

[root@server ~]# podman pull centos:6

イメージ一覧を確認します。

[root@server ~]# podman images
REPOSITORY             TAG         IMAGE ID      CREATED        SIZE
quay.io/centos/centos  7           8652b9f0cb4c  20 months ago  212 MB
quay.io/centos/centos  6           d0957ffdf8a2  3 years ago    202 MB

取得したイメージを一括で削除します。

[root@server ~]# podman rmi -a
Untagged: quay.io/centos/centos:7
Untagged: quay.io/centos/centos:6
Deleted: 8652b9f0cb4c0599575e5a003f5906876e10c1ceb2ab9fe1786712dac14a50cf
Deleted: d0957ffdf8a2ea8c8925903862b65a1b6850dbb019f88d45e927d3d5a3fa0c31

イメージ一覧を確認します。イメージが削除されたことがわかります。

[root@server ~]# podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

5.8 CentOSのイメージ取得(版数指定)

下記ページを参考に、CentOS6.10,CentOS6.9のイメージを取得してみます。
https://hub.docker.com/_/centos/

[root@server ~]# podman pull centos:6.10
[root@server ~]# podman pull centos:6.9

イメージ一覧を確認します。

[root@server ~]# podman images
REPOSITORY             TAG         IMAGE ID      CREATED      SIZE
quay.io/centos/centos  6.9         2199b8eb8390  3 years ago  202 MB
quay.io/centos/centos  6.10        48650444e419  3 years ago  202 MB

取得したイメージを一括で削除します。

[root@server ~]# podman rmi -a

5.9 Nginxイメージ取得(最新版数)

下記ページを参考に、Nginxのイメージを取得してみます。
https://hub.docker.com/_/nginx

[root@server ~]# podman pull nginx

イメージ一覧を確認します。

[root@server ~]# podman images
REPOSITORY               TAG         IMAGE ID      CREATED     SIZE
docker.io/library/nginx  latest      670dcc86b69d  6 days ago  146 MB

6 コンテナの起動/停止/削除する方法(run/stop/rm)

AlmaLinuxの最新版イメージを取得します。

[root@server ~]# podman pull almalinux:latest

取得したイメージを確認します。

[root@server ~]# podman images
REPOSITORY                   TAG         IMAGE ID      CREATED     SIZE
docker.io/library/almalinux  latest      39f63d416992  9 days ago  196 MB

IMAGE IDを指定して、testという名前のコンテナを起動します。

[root@server ~]# podman run -it --name test 39f63d416992
[root@7681ef14d47b /]#

オプションの意味は以下のとおりです。

オプション 意味
--detach(-d) コンテナをバックグラウンドで実行する時に指定する
--interactive(-i) 対話式プロセスの場合には、-i と -t を併用してコンテナプロセスに端末を割り当てる
--name コンテナの名前を指定する

ホストでもう1つターミナルを開いて、コンテナの状態を確認します。testという名前のコンテナが起動したことがわかります。

[root@server ~]# podman ps -a
CONTAINER ID  IMAGE                               COMMAND     CREATED         STATUS             PORTS       NAMES
7681ef14d47b  docker.io/library/almalinux:latest  /bin/bash   32 seconds ago  Up 33 seconds ago              test

少し話がそれますが、コンテナを起動すると、ネームスペースが作成されることがわかります。なお、ip netnsコマンドの使い方は、ip netnsコマンドの使い方(ネットワークの実験の幅が広がるなぁ~) - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# ip netns
netns-1c9a7443-c30e-742d-ed19-bcd1e72b10d4 (id: 0)

コンテを停止します。

[root@server ~]# podman stop test
test

コンテナの状態を確認します。

[root@server ~]# podman ps -a
CONTAINER ID  IMAGE                               COMMAND     CREATED             STATUS                       PORTS       NAMES
7681ef14d47b  docker.io/library/almalinux:latest  /bin/bash   About a minute ago  Exited (130) 13 seconds ago              test

コンテナを停止すると、ネームスペースが削除されることがわかります。

[root@server ~]# ip netns
[root@server ~]#

コンテナを削除します。

[root@server ~]# podman rm test
7681ef14d47b7d0abe94f5a7e019ecf803100856e6f117b3f769f19675c1cce2

コンテナの状態を確認します。コンテナが削除されたことがわかります。

[root@server ~]# podman ps -a
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

7 コンテナでコマンドを実行する方法(exec)

7.1 bashを実行する場合

SUSEの最新版イメージを取得してみます。

[root@server ~]# podman pull registry.suse.com/bci/bci-base:latest

取得したイメージを確認します。

[root@server ~]# podman images
REPOSITORY                      TAG         IMAGE ID      CREATED     SIZE
registry.suse.com/bci/bci-base  latest      86698fe00598  9 days ago  122 MB

IMAGE IDを指定して、testという名前のコンテナを起動します。

[root@server ~]# podman run -it --name test 86698fe00598

testコンテナで /bin/bash コマンドを実行します。

[root@server ~]# podman exec -it test /bin/bash
2a0aa7efdfe1:/ #

コンテナ内でSLES版数を確認します。SLES版数はSLES15SP4であることがわかります。

2a0aa7efdfe1:/ # cat /etc/os-release
NAME="SLES"
VERSION="15-SP4"
VERSION_ID="15.4"
PRETTY_NAME="SUSE Linux Enterprise Server 15 SP4"
ID="sles"
ID_LIKE="suse"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:suse:sles:15:sp4"
DOCUMENTATION_URL="https://documentation.suse.com/"

testコンテナから抜けます。

2a0aa7efdfe1:/ # exit
exit

7.2 catを実行する場合

AlmaLinuxの8.6版のイメージを取得します。

[root@server ~]#  podman pull almalinux:8.6

取得したイメージを確認します。

[root@server ~]# podman images
REPOSITORY                   TAG         IMAGE ID      CREATED      SIZE
docker.io/library/almalinux  8.6         4580d9e4bab7  2 weeks ago  195 MB

IMAGE IDを指定して、testという名前のコンテナを起動します。

[root@server ~]# podman run -it --name test 4580d9e4bab7

testコンテナで cat コマンドを実行します。

[root@server ~]# podman exec -it test cat /etc/redhat-release
AlmaLinux release 8.6 (Sky Tiger)

8 Nginxコンテナを起動する方法

Nginxのイメージを取得します。

[root@server ~]# podman pull nginx

取得したイメージを確認します。

[root@server ~]# podman images
REPOSITORY               TAG         IMAGE ID      CREATED     SIZE
docker.io/library/nginx  latest      670dcc86b69d  6 days ago  146 MB

web1という名前でNginxコンテナを起動します。-pは、ホストの8080番ポートへのパケットをNginxがTCPパケットを待ち受けている80番ポートにDNATするオプションです。

[root@server ~]# podman run -d -p 8080:80 --name web1 670dcc86b69d
6cf767a55b6fcfc231d023071f0173e67d35d093c721055de638d7879ac14165

コンテナの状態を確認します。web1という名前のコンテナが動作していることがわかります。

[root@server ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED            STATUS                PORTS                 NAMES
6cf767a55b6f  docker.io/library/nginx:latest  nginx -g daemon o...  About an hour ago  Up About an hour ago  0.0.0.0:8080->80/tcp  web1

web1コンテナで動作しているプロセスを確認します。nginx プロセスが動作していることがわかります。

[root@server ~]# podman top web1
[USER        PID         PPID        %CPU        ELAPSED             TTY         TIME        COMMAND
root        1           0           0.000       1h12m34.751738038s  ?           0s          nginx: master process nginx -g daemon off;
nginx       31          1           0.000       1h12m31.752241266s  ?           0s          nginx: worker process
nginx       32          1           0.000       1h12m31.75239912s   ?           0s          nginx: worker process
nginx       33          1           0.000       1h12m31.752494334s  ?           0s          nginx: worker process
nginx       34          1           0.000       1h12m31.752615683s  ?           0s          nginx: worker process

コンテナとホストのポート番号の対応関係を確認します。コンテナの80番ポートがホストの8080番ポートに対応していることがわかります。

[root@server ~]# podman port web1
80/tcp -> 0.0.0.0:8080

iptablesのターゲットを確認します。Nginxコンテナを起動すると、以下のターゲットがiptablesに作成されます。

[root@server ~]# iptables -t nat -nvL |grep 8080
 pkts bytes target     prot opt in     out     source               destination
    0     0 CNI-DN-ddb746c8c102be9c936ab  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* dnat name: "podman" id: "6cf767a55b6fcfc231d023071f0173e67d35d093c721055de638d7879ac14165" */ multiport dports 8080
    0     0 CNI-HOSTPORT-SETMARK  tcp  --  *      *       10.88.0.0/16         0.0.0.0/0            tcp dpt:8080
    0     0 CNI-HOSTPORT-SETMARK  tcp  --  *      *       127.0.0.1            0.0.0.0/0            tcp dpt:8080
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:10.88.0.2:80

curlコマンドでNginxにアクセスしてみます。なお。curlコマンドの使い方は、curlコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@client ~]# curl -I http://192.168.122.68:8080
HTTP/1.1 200 OK
Server: nginx/1.23.1
Date: Tue, 26 Jul 2022 12:37:13 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 19 Jul 2022 14:05:27 GMT
Connection: keep-alive
ETag: "62d6ba27-267"
Accept-Ranges: bytes

curlコマンドを1回実行すると、DNATターゲットが処理したパケット数が1増加していることがわかります。DNATでは、ホストが受信したTCPパケットの宛先IPアドレスを10.88.0.2、宛先ポート番号を8080から80に変更しています。

[root@server ~]# iptables -t nat -nvL |grep 8080
 pkts bytes target     prot opt in     out     source               destination
    1    60 CNI-DN-ddb746c8c102be9c936ab  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* dnat name: "podman" id: "6cf767a55b6fcfc231d023071f0173e67d35d093c721055de638d7879ac14165" */ multiport dports 8080
    0     0 CNI-HOSTPORT-SETMARK  tcp  --  *      *       10.88.0.0/16         0.0.0.0/0            tcp dpt:8080
    0     0 CNI-HOSTPORT-SETMARK  tcp  --  *      *       127.0.0.1            0.0.0.0/0            tcp dpt:8080
    1    60 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:10.88.0.2:80

9 コンテナが出力するログを確認する方法(logs)

コンテナの状態を確認します。web1という名前のコンテナが動作しています。

[root@server ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED      STATUS          PORTS                 NAMES
6cf767a55b6f  docker.io/library/nginx:latest  nginx -g daemon o...  2 hours ago  Up 2 hours ago  0.0.0.0:8080->80/tcp  web1

web1コンテナが出力するログを確認します。なお、-tは時刻を表示するオプションです。

[root@server ~]# podman logs -t web1
2022-07-27T06:36:27.689125596-04:00 /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
2022-07-27T06:36:27.689125596-04:00 /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
2022-07-27T06:36:27.793904921-04:00 /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
-snip-

-fオプションを指定すると、ログ末尾からメッセージを表示できます。

[root@server ~]# podman logs -ft web1
-snip-
2022-07-27T06:36:29.295646046-04:00 2022/07/27 10:36:29 [notice] 1#1: start worker process 33
2022-07-27T06:36:29.362196075-04:00 2022/07/27 10:36:29 [notice] 1#1: start worker process 34
2022-07-27T07:27:10.427918068-04:00 192.168.122.177 - - [27/Jul/2022:11:27:10 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.61.1" "-"

10 ファイルをコピーする方法(cp)

ここでは、Nginxコンテナとホスト間でファイルのコピーを試してみます。

10.1 ホストからコンテナにファイルをコピーする方法

まず、コンテナの名前を確認します。実行結果の右端を確認すると、コンテナの名前がweb1であることがわかります。

root@server ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED         STATUS             PORTS                 NAMES
2a5cbc04259e  docker.io/library/nginx:latest  nginx -g daemon o...  26 minutes ago  Up 26 minutes ago  0.0.0.0:8080->80/tcp  web1

ホストでファイルを作成します。

[root@server ~]# touch index.html
[root@server ~]# echo "Hello" > index.html
[root@server ~]# cat index.html
Hello

ホストからコンテナにファイルをコピーをします。cpコマンドの書式は以下になります。

podman cp [ホスト側のファイルパス名] コンテナ名:[コンテナ側のファイルパス名]

ファイルをコピーします。

[root@server ~]# podman cp /root/index.html web1:/usr/share/nginx/html/

curlコマンドでNginxコンテナにアクセスすると、ホストで作成したindex.htmlファイルの中身が表示されることがわかります。なお、curlコマンドの使い方は、curlコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# curl http://192.168.122.68:8080
Hello

10.2 コンテナからホストにファイルをコピーする方法

コンテナでファイルを作成します。

root@2a5cbc04259e:~# pwd
/root
root@2a5cbc04259e:~# touch container.dat
root@2a5cbc04259e:~# echo "I'm in container" > container.dat
root@2a5cbc04259e:~# cat container.dat
I'm in container

コンテナからホストにファイルをコピーをします。このときcpコマンドの書式は以下になります。

podman cp コンテナ名:[コンテナ側のファイルパス名]  [ホスト側のファイルパス名] 

ファイルをコピーをします。

[root@server ~]# podman cp web1:/root/container.dat /tmp/

コンテナからホストにコピーしたファイルの中身を確認します。コンテナで作成したファイルであることがわかります。

[root@server ~]# cat /tmp/container.dat
I'm in container

11 コンテナを他のホストに移動する方法(commit/save/load)

ここでは、10章で作成したNginxコンテナをサーバからクライアントに移動してみます。手順は次のようになります。
(1) コンテナをイメージ化(サーバで実施)
(2) イメージをtarファイルに保存(サーバで実施)
(3) サーバからクライアンにtarファイルを転送
(4) tarファイルをイメージに保存(クライアントで実施)
(5) イメージからコンテナ起動(クライアントで実施)

11.1 サーバ側の手順

コンテナをイメージ化します。コンテナをイメージ化すると、コンテナを他のホストに移動したり、同じ構成のコンテナを複数作成することができます。

イメージに書き出すコンテナの名前を確認します。名前はweb1であることがわかります。

[root@server ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED         STATUS             PORTS                 NAMES
0b6e8582e445  docker.io/library/nginx:latest  nginx -g daemon o...  28 minutes ago  Up 28 minutes ago  0.0.0.0:8080->80/tcp  web1

コンテナをweb1_imageという名前のイメージに書き出します。
このときcommitコマンドの書式は以下になります。
podman commit コンテナ名 イメージ名

[root@server ~]# podman commit web1 web1_image
Getting image source signatures
Copying blob ec4a38999118 skipped: already exists
Copying blob f7ed3797e296 skipped: already exists
Copying blob f86e88a471f4 skipped: already exists
Copying blob 5a5bafd53f76 skipped: already exists
Copying blob e2d75d87993c skipped: already exists
Copying blob 6cffb086835a skipped: already exists
Copying blob 1e966fea3cb1 done
Copying config 5dd8a2bd0e done
Writing manifest to image destination
Storing signatures
5dd8a2bd0ee2108b1a0816a56975ebd6363de0690e14ebd287e4014d78681ded

作成したイメージを確認します。

[root@server ~]# podman images
REPOSITORY               TAG         IMAGE ID      CREATED         SIZE
localhost/web1_image     latest      5dd8a2bd0ee2  53 minutes ago  146 MB
docker.io/library/nginx  latest      88736fe82739  4 days ago      146 MB

web1_imageというイメージをweb1_image.tarという名前のファイルに保存します。

[root@server ~]# podman save -o web1_image.tar web1_image
Copying blob ec4a38999118 done
Copying blob f7ed3797e296 done
Copying blob f86e88a471f4 done
Copying blob 5a5bafd53f76 done
Copying blob e2d75d87993c done
Copying blob 6cffb086835a done
Copying blob 1e966fea3cb1 done
Copying config 5dd8a2bd0e done
Writing manifest to image destination
Storing signatures

作成したファイルを確認します。

[root@server ~]# ls -l web1_image.tar
-rw-r--r--. 1 root root 146211840 11月 19 21:39 web1_image.tar

作成したファイルをクライアントに転送します。

[root@server ~]# scp web1_image.tar root@192.168.122.177:/root
root@192.168.122.177's password:
web1_image.tar

11.2 クライアント側の手順

ファイルの確認をします。

[root@client ~]# ls -l web1_image.tar
-rw-r--r--. 1 root root 146211840 11月 19 21:42 web1_image.tar

登録されているイメージを確認します。まだイメージが何も登録されていないことがわかります。

[root@client ~]# podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

tarファイルをイメージとして保存します。

[root@client ~]# podman load -i web1_image.tar
Getting image source signatures
Copying blob 6cffb086835a done
Copying blob 5a5bafd53f76 done
Copying blob ec4a38999118 done
Copying blob e2d75d87993c done
Copying blob f7ed3797e296 done
Copying blob f86e88a471f4 done
Copying blob 1e966fea3cb1 done
Copying config 5dd8a2bd0e done
Writing manifest to image destination
Storing signatures
Loaded image: localhost/web1_image:latest

イメージを確認すると、tarファイルがイメージとして保存されたことがわかります。

[root@client ~]# podman images
REPOSITORY            TAG         IMAGE ID      CREATED         SIZE
localhost/web1_image  latest      5dd8a2bd0ee2  52 minutes ago  146 MB

イメージからコンテナを起動します。今回は、web2という名前でコンテナを起動してみます。

[root@client ~]# podman run -d -p 8080:80 --name web2 5dd8a2bd0ee2
bc87b3fccb5fe70973aac96024e938bbe3d7ca7f9769e5e636500de89a52ab1e

コンテナを確認します。web2という名前のコンテナが起動できたことがわかります。

[root@client ~]# podman ps
CONTAINER ID  IMAGE                        COMMAND               CREATED        STATUS            PORTS                 NAMES
bc87b3fccb5f  localhost/web1_image:latest  nginx -g daemon o...  5 seconds ago  Up 5 seconds ago  0.0.0.0:8080->80/tcp  web2

lsofコマンドを実行します。コンテナがTCPの8080番ポートでListenしていることがわかります。なお、lsofコマンドの使い方は、lsofコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@client ~]# lsof -i:8080 -a -i -a -nP
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
conmon  2458 root    5u  IPv4  75500      0t0  TCP *:8080 (LISTEN)

curlコマンドでNginxにアクセスします。サーバで作成したindex.htmlの内容が表示できたことがわかります。

[root@client ~]# curl http://192.168.122.177:8080
Hello

12 ボリュームをマウントする方法

ボリュームをマウントする方法には、以下の方法があります。

方法 概要
バインドマウント コンテナ内やホストのファイルやディレクトリをマウントする
ボリュームマウント コンテナ内にボリュームを作成してマウントする

12.1 バインドマウントする方法

マウントするディレクトリを作成します。

[root@server ~]# mkdir /test_html

作成したディレクトリにテスト用のindex.htmlファイルを作成します。

[root@server ~]# echo "Test" > /test_html/index.html

起動するコンテナのイメージIDを確認します。

[root@server ~]# podman images
REPOSITORY               TAG         IMAGE ID      CREATED     SIZE
docker.io/library/nginx  latest      88736fe82739  4 days ago  146 MB

確認したイメージIDを指定して、web3という名前のコンテナを起動します。このとき"-v"オプションを使って、/test_htmlをコンテナのディレクトリにマウントをします。

[root@server ~]# podman run -d -p 8080:80 -v /test_html:/usr/share/nginx/html --name web3 88736fe82739
e6c10a2857cf397c62c86f482c2fd16984fa4385dcd7832073f6c2e40c35f408

SELinuxが有効になっていると、この後の動作確認がうまくいきません。本来、SELinuxのルールを作成するべきですが、お手軽にマウントの実行結果を試すため、一時的にSELinuxをPermissiveにします。

[root@server ~]# setenforce 0
[root@server ~]# getenforce
Permissive

curlコマンドを使ってコンテナにアクセスします。テスト用に作成したindex.htmlファイルの中身を確認することができました。

[root@server ~]# curl http://192.168.122.68:8080
Test

12.2 ボリュームマウントする方法

未稿


curlコマンドの使い方

1 curlコマンドとは?

ファイルのダウンロードやアップロードを行うためのコマンドです。

2 環境

2.1 ネットワーク構成

サーバとクライアントの2台構成です。図中のeth0はNICの名前です。また、ホスト名の下はIPv4,IPv6アドレス(リンクローカルアドレス)を表しています。

client(eth0) -----------------------------------------(eth0) server
192.168.122.181                                       192.168.122.216
fe80::41c0:1283:fe8c:ef3b/64                          fe80::1f5d:b4c1:979d:359f/64

2.2 版数

サーバとクライアントのCentOS版数は以下のとおりです。

[root@server ~]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

curlの版数は以下のとおりです。

[root@server ~]# curl -V
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.44 zlib/1.2.7 libidn/1.28 libssh2/1.8.0
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz unix-sockets

3 基本的な使い方

www.example.comにアクセスしてみます。サーバ、クライアントどちらで実行しても構いません。ここでは、クライアントで実行してみます。なお、www.example.comは、ドキュメントに例示用として使えるドメインとして、RFC2606で予約されています。

[root@client ~]# curl https://www.example.com
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
-snip-

4 ファイルを保存する方法

4.1 リモートのファイル名で保存する方法(-O)

理研のサーバからbcパッケージをダウンロードしてみます。bcパッケージを選択した理由は、ファイルサイズが小さく、確認が早く終わるからです。

[root@client ~]# curl -O http://ftp.riken.jp/Linux/centos/7.9.2009/os/x86_64/Packages/bc-1.06.95-13.el7.x86_64.rpm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  114k  100  114k    0     0   953k      0 --:--:-- --:--:-- --:--:--  962k

ダウンロードしたbcパッケージを確認します。理研のサーバで保存されていたファイル名でダウンロードできたことがわかります。

[root@client ~]# ls -l bc-1.06.95-13.el7.x86_64.rpm
-rw-r--r--. 1 root root 117272  7月  6 21:18 bc-1.06.95-13.el7.x86_64.rpm

4.2 任意の名前を付けて保存する方法(-o)

bcパッケージをtest.rpmという名前で保存してみます。

[root@client ~]# curl -o test.rpm http://ftp.riken.jp/Linux/centos/7.9.2009/os/x86_64/Packages/bc-1.06.95-13.el7.x86_64.rpm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  114k  100  114k    0     0   880k      0 --:--:-- --:--:-- --:--:--  887k

ダウンロードしたbcパッケージを確認します。 test.rpmという名前でbcパッケージが保存されたことがわかります。

[root@client ~]# ls -l test.rpm
-rw-r--r--. 1 root root 117272  7月  6 21:21 test.rpm

4.3 複数ファイルをダウンロードする方法

複数ファイルを一括でダウンロードする場合、curl -O URL1 -O URL2として実行します。

root@client ~]# curl -O http://ftp.riken.jp/Linux/centos/7.9.2009/os/x86_64/Packages/bcc-0.10.0-1.el7.x86_64.rpm -O http://f
tp.riken.jp/Linux/centos/7.9.2009/os/x86_64/Packages/bcc-devel-0.10.0-1.el7.x86_64.rpm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  566k  100  566k    0     0  1397k      0 --:--:-- --:--:-- --:--:-- 1396k
100 67632  100 67632    0     0  1431k      0 --:--:-- --:--:-- --:--:-- 1431k

ダウンロードしたbccパッケージを確認します。

root@client ~]# ls -l bcc-*
-rw-r--r--. 1 root root 580524  7月  6 21:27 bcc-0.10.0-1.el7.x86_64.rpm
-rw-r--r--. 1 root root  67632  7月  6 21:27 bcc-devel-0.10.0-1.el7.x86_64.rpm

5 HTTPヘッダのみ表示する方法(-I)

[root@client ~]# curl -I https://www.example.com
HTTP/1.1 200 OK
Content-Encoding: gzip
Accept-Ranges: bytes
Age: 413874
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Wed, 06 Jul 2022 12:33:00 GMT
Etag: "3147526947"
Expires: Wed, 13 Jul 2022 12:33:00 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (sab/56F3)
X-Cache: HIT
Content-Length: 648

6 proxy経由でアクセスする方法(-X)

クライアントからサーバのproxy server経由で東京都のHPにアクセスしてみます。構成は以下のとおりです。

6.1 事前準備

ncコマンドを使って、proxyサーバを起動します。proxyサーバは8080番ポートでListenするようにします。ncコマンドの使い方は、ncコマンドの使い方(ネットワーク実験の幅が広がるなぁ~) - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# nc -l 8080 --proxy-type http

ncプロセスがListenしているポート番号を確認します。ncプロセスはTCPの8080番ポートでListenしていることがわかります。なお、lsofコマンドの使い方は、lsofコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# lsof -c nc -a -i -a -nP
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      1177 root    3u  IPv6  28514      0t0  TCP *:8080 (LISTEN)
nc      1177 root    4u  IPv4  28515      0t0  TCP *:8080 (LISTEN)

proxyサーバがListenするポート番号を開放します。firewall-cmdの使い方は、firewall-cmdの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# firewall-cmd --add-port=8080/tcp
success

ポートの状態を確認します。8080番ポートが解放されたことがわかります。

[root@server ~]# firewall-cmd --list-ports
8080/tcp

6.2 実行結果

クライアントからproxyサーバ経由で東京都のHPにアクセスしてみます。

[root@client ~]# curl -x http://192.168.122.216:8080 https://www.metro.tokyo.lg.jp/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">

<title>東京都公式ホームページ</title>
-snip-

7 GET,POST,PUT,DELETEの使い方

7.1 事前準備

サーバにHTTPサーバ(json-server)をインストールします。

[root@server ~]# yum -y install npm
[root@server ~]# npm install -g json-server
[root@server ~]# json-server -v
0.17.0

id,ベンダー、PCを組みにしたデータを作成します。

[root@server ~]# vi db.json
[root@server ~]# cat db.json
{
  "pc": [
    { "id": 1, "fujitsu": "fmv" },
    { "id": 2, "nec": "lavie" }
  ]
}

json-serverを起動します。 json-serverの起動ログより、json-serverのは3000番ポートでListenしていることがわかります。

[root@server ~]# json-server -H 192.168.122.216 --watch db.json

  \{^_^}/ hi!

  Loading db.json
  Done

  Resources
  http://192.168.122.216:3000/pc

  Home
  http://192.168.122.216:3000

  Type s + enter at any time to create a snapshot of the database
  Watching...

json-serverは、nodeというプロセス名でTCPの3000番ポートでListenしていることがわかります。

[root@server ~]# lsof -c node -a -i -a -nP
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    1233 root   22u  IPv4  21992      0t0  TCP 192.168.122.216:3000 (LISTEN)

TCPの3000番ポートを解放します。

[root@server ~]# firewall-cmd --add-port=3000/tcp
success

ポート番号の状態を確認します。3000番ポートが解放されたことがわかります。

[root@server ~]# firewall-cmd --list-ports
3000/tcp

7.2 GETの使い方

GETメソッドを使ってデータを読み出してみます。

[root@client ~]# curl http://192.168.122.216:3000/pc
[
  {
    "id": 1,
    "fujitsu": "fmv"
  },
  {
    "id": 2,
    "nec": "lavie"
  }
][root@client ~]#

7.3 POSTの使い方(追加)

POSTメソッドを使ってデータを追加してみます。追加データは-dで指定します。

[root@client ~]# curl -X POST http://192.168.122.216:3000/pc -d toshiba=dynabook
{
  "toshiba": "dynabook",
  "id": 3
}[root@client ~]#
[root@client ~]# curl http://192.168.122.216:3000/pc
[
  {
    "id": 1,
    "fujitsu": "fmv"
  },
  {
    "id": 2,
    "nec": "lavie"
  },
  {
    "toshiba": "dynabook",
    "id": 3
  }
][root@client ~]#

7.4 PUTの使い方(更新)

PUTメソッドを使って、fujitsuのPCをfmvからPRIMERGYに更新してみます。更新するデータは-dで指定します

[root@client ~]# curl -X PUT http://192.168.122.216:3000/pc/1 -d fujitsu=PRIMERGY
{
  "fujitsu": "PRIMERGY",
  "id": 1

更新したデータを確認します。fujitsuのPCがfmvからPRIMERGYに更新されたことがわかります。

[root@client ~]# curl http://192.168.122.216:3000/pc
[
  {
    "fujitsu": "PRIMERGY",
    "id": 1
  },
  {
    "id": 2,
    "nec": "lavie"
  },
  {
    "toshiba": "dynabook",
    "id": 3
  }
][root@client ~]#

7.5 DELETEの使い方(削除)

DELETEメソッドを使って、idが3のデータをしてみます。更新データは-Xで指定します。

[root@client ~]# curl -X DELETE http://192.168.122.216:3000/pc/3

データを確認します。idが3のデータが削除されたことがわかります。

[root@client ~]# curl http://192.168.122.216:3000/pc
[
  {
    "fujitsu": "PRIMERGY",
    "id": 1
  },
  {
    "id": 2,
    "nec": "lavie"
  }
][root@client ~]#

8 プログレスメータの出力やエラー出力

8.1 出力方法(-#)

[root@server ~]# curl -# -O http://ftp.riken.jp/Linux/centos/7.9.2009/os/x86_64/Packages/bc-1.06.95-13.el7.x86_64.rpm
######################################################################## 100.0%

8.2 抑止方法(-s)

[root@server ~]# curl -s -O http://ftp.riken.jp/Linux/centos/7.9.2009/os/x86_64/Packages/bc-1.06.95-13.el7.x86_64.rpm
[root@server ~]#

9 指定したTLSバージョンでアクセスする方法

TLS1.2でwww.example.comにアクセスしてみます。

[root@server ~]# curl --tlsv1.2 https://www.example.com
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
-snip-

10 ftpサーバのディレクトリリストを取得する方法(-l)

ftpサーバのディレクトリのファイル一覧を表示してみます。

[root@server ~]# curl -l ftp://ftp.riken.go.jp/Linux/ubuntu/
ubuntu
dists
indices
pool
project
ls-lR.gz

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ

nmcliコマンドの使い方

1 nmcliコマンドとは?

NICIPアドレス設定等のネットワーク管理方法として、CentOS7よりNetwokManagerが採用されました。NetwokManagerを利用するために、GUIベースのnmtuiコマンドと、CUIベースのnmcliコマンドがあります。本記事では、nmcliコマンドの使い方を説明します。

用語について簡単に説明しておきます。nmcliのマニュアルを参照すると、connectionについて以下の説明があります。connectionとは、IPアドレス等を定義した設定ファイルのことです。本記事では、設定ファイルのことをプロファイルと呼ぶことにします。

NetworkManager stores all network configuration as "connections", which are collections of data (Layer2
details, IP addressing, etc.) that describe how to create or connect to a network.

プロファイルの使い方として、例えば、ネットワークXに接続するときのプロファイルをプロファイルX、ネットワークYに接続するときのプロファイルをプロファイルYとして作成しておきます。このとき、NICの接続がネットワークXからネットワークYに切り替わったとき、プロファイルYを読み込むことで、簡単にNICの設定を切り替えることができます。

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

NetworkManagerサービスの状態を確認します。activeであることを確認します。

[root@kvm ~]# systemctl is-active NetworkManager
active

3 書式

nmcliコマンド書式は以下のとおりです。本記事では、deviceコマンドおよびconnectionコマンドについて説明します。

# nmcli [OPTIONS...] {help | general | networking | radio | connection | device | agent | monitor} [COMMAND] [ARGUMENTS...]

4 事前準備

お手軽にnmcliコマンドを試すため、本記事では仮想マシンNICを作成します。そのために、以下を実行します。
KVM上に仮想ブリッジ作成
仮想マシンNIC追加

4.1 仮想ブリッジ作成

仮想マシンと接続する仮想ブリッジをKVMホストに作成します。このとき、ifnameには仮想ブリッジの名前、con-nameにはプロファイル名を指定します。プロファイルとは設定ファイルのことです。どちらも任意の文字列を指定できます。

[root@kvm ~]# nmcli connection add type bridge ifname br1 con-name br1-profile
接続 'br1-profile' (0db2f7b8-ba21-4d84-98a4-29de2154e620) が正常に追加されました。

プロファイルを確認します。なお、プロファイル名は、ifcfgにcon-nameで指定した文字列を連結したものになります。

[root@kvm ~]# cat /etc/sysconfig/network-scripts/ifcfg-br1-profile
STP=yes
BRIDGING_OPTS=priority=32768
TYPE=Bridge
-snip-

作成した仮想ブリッジに、管理用のIPアドレスを設定します。

[root@kvm ~]# nmcli connection modify br1-profile ipv4.method manual ipv4.addresses "10.0.0.1/24"

仮想ブリッジをシステムに接続します。

[root@kvm ~]# nmcli device connect br1
デバイス 'br1' が '0db2f7b8-ba21-4d84-98a4-29de2154e620' で正常にアクティベートされました。

バイスの状態を確認します。仮想ブリッジがシステムに接続されたことがわかります。

[root@kvm ~]# nmcli device |grep br1
br1         bridge    接続済み  br1-profile

4.2 仮想マシンNIC追加

仮想マシンの状態を確認します。serverが実行中であることがわかります。このserverにNICを追加します。

[root@kvm ~]# virsh list
 Id    名前                         状態
----------------------------------------------------
 1     server                         実行中

仮想ブリッジと接続するNICをserverに追加します。

[root@kvm ~]# virsh attach-interface --type bridge --source br1 --model virtio server
インターフェースが正常に接続できました

serverにログインしてNICを確認します。serverには元々eth0が存在していたので、eth1が追加されたことがわかります。本記事では、eth1に対してnmcliコマンドを試してみます。

[root@server ~]# ip l
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:6f:b0:ca brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:e6:11:cc brd ff:ff:ff:ff:ff:ff

5 デバイスに対する操作(device)

5.1 デバイス一覧を表示する方法

deviceはデバイス一覧を表示するコマンドです。eth1がテスト用に追加したデバイスです。eth1にはIPアドレスを設定していないので、状態(STATE)が「接続中」となっています。eth1のプロファイル名は有線接続 1であることがわかります。

[root@server ~]# nmcli device
DEVICE  TYPE      STATE                     CONNECTION
eth0    ethernet  接続済み                  eth0
eth1    ethernet  接続中 (IP 設定を取得中)  有線接続 1
lo      loopback  管理無し                  --

5.2 デバイスの状態を表示する方法(show)

showはデバイスの詳細情報を表示するオプションです。

[root@server ~]# nmcli device show eth1
GENERAL.DEVICE:                         eth1
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         52:54:00:E6:11:CC
GENERAL.MTU:                            1500
GENERAL.STATE:                          70 (接続中 (IP 設定を取得中))
GENERAL.CONNECTION:                     有線接続 1
GENERAL.CON-PATH:                       /org/freedesktop/NetworkManager/ActiveConnection/2
WIRED-PROPERTIES.CARRIER:               オン

6 プロファイルに対する操作(connection)

プロファイルはNICに設定するIPアドレスやデフォルトルータのIPアドレス等の定義のことです。プロファイルは/etc/sysconfig/network-scripts配下に作成されます。作成されるファイル名は、ifcfg+プロファイル名、という書式になります。

6.1 プロファイル名の変更方法

プロファイル一覧を確認します。eth0と有線接続 1という名前のプロファイルが2つ存在することがわかります。

[root@server ~]# nmcli connection show
NAME        UUID                                  TYPE      DEVICE
有線接続 1  0a3de8e8-6615-3898-a691-222ef3580417  ethernet  eth1
eth0        faa3fcd4-e5a9-484c-a98a-7615e3787b4c  ethernet  eth0

プロファイル名の変更は、プロファイル名もしくはUUIDを指定することができます。まず、uuidを指定してプロファイル名を有線接続 1からeth1-profileに変更してみます。

[root@server ~]# nmcli connection modify 0a3de8e8-6615-3898-a691-222ef3580417 connection.id eth1-profile

プロファイル一覧を確認します。プロファイル名が有線接続 1からeth1-profileに変更されたことがわかります。

[root@server ~]# nmcli connection show
NAME          UUID                                  TYPE      DEVICE
eth1-profile  0a3de8e8-6615-3898-a691-222ef3580417  ethernet  eth1
eth0          faa3fcd4-e5a9-484c-a98a-7615e3787b4c  ethernet  eth0

次は、プロファイル名を指定してプロファイルを変更してみます。

[root@server ~]# nmcli connection modify eth1-profile connection.id eth1

プロファイル一覧を確認します。プロファイル名がeth1-profileからeth1に変更されたことがわかります。

[root@server ~]# nmcli connection show
NAME  UUID                                  TYPE      DEVICE
eth1  0a3de8e8-6615-3898-a691-222ef3580417  ethernet  eth1
eth0  faa3fcd4-e5a9-484c-a98a-7615e3787b4c  ethernet  eth0

6.2 プロファイルを削除する方法

プロファイル一覧を確認します。2つのプロファイルが存在することがわかります。

[root@server ~]# nmcli connection show
NAME  UUID                                  TYPE      DEVICE
eth1  0a3de8e8-6615-3898-a691-222ef3580417  ethernet  eth1
eth0  faa3fcd4-e5a9-484c-a98a-7615e3787b4c  ethernet  eth0

eth1という名前のプロファイルを削除してみます。

[root@server ~]# nmcli connection delete eth1
接続 'eth1' (0a3de8e8-6615-3898-a691-222ef3580417) が正常に削除されました。

プロファイル一覧を確認します。eth1-profileが削除されたことがわかります。

[root@server ~]# nmcli connection show
NAME  UUID                                  TYPE      DEVICE
eth0  faa3fcd4-e5a9-484c-a98a-7615e3787b4c  ethernet  eth0

/etc/sysconfig/network-scripts配下を確認すると、プロファイルが削除されたことがわかります。

[root@server ~]# ls -l /etc/sysconfig/network-scripts/ifcfg-eth1-profile
ls: /etc/sysconfig/network-scripts/ifcfg-eth1-profile にアクセスできません: そのようなファイルやディレクトリはありません

6.3 プロファイルを追加する方法

バイスの状態を確認します。eth0のプロファイル名はeth0であることがわかります。eth1については、プロファイルが存在しないので(CONNECTION列が"--"になっている)、eth1のプロファイルを作成してみます。

[root@server ~]# nmcli device status
DEVICE  TYPE      STATE     CONNECTION
eth0    ethernet  接続済み  eth0
eth1    ethernet  切断済み  --
lo      loopback  管理無し  --

eth1-profileという名前のプロファイルを追加します。

[root@server ~]# nmcli connection add type ethernet ifname eth1 con-name eth1-profile
接続 'eth1-profile' (1d91c062-e4b6-4d8d-9f10-8f123749323a) が正常に追加されました。

プロファイル一覧を確認します。eth1-profileという名前のプロファイルが追加されたことがわかります。

[root@server ~]# nmcli connection show
NAME          UUID                                  TYPE      DEVICE
eth1-profile  1d91c062-e4b6-4d8d-9f10-8f123749323a  ethernet  eth1
eth0          faa3fcd4-e5a9-484c-a98a-7615e3787b4c  ethernet  eth0

/etc/sysconfig/network-scripts配下を確認すると、プロファイルが作成されたことがわかります。

[root@server ~]# ls -l /etc/sysconfig/network-scripts/ifcfg-eth1-profile
-rw-r--r--. 1 root root 286  7月  5 20:26 /etc/sysconfig/network-scripts/ifcfg-eth1-profile

6.4 プロファイルを変更する方法

ここでは、IPv4アドレスを設定してプロファイルを変更してみます。

[root@server ~]# nmcli connection show
NAME          UUID                                  TYPE      DEVICE
eth1-profile  1d91c062-e4b6-4d8d-9f10-8f123749323a  ethernet  eth1
eth0          faa3fcd4-e5a9-484c-a98a-7615e3787b4c  ethernet  eth0

作成したプロファイルに定義されているIPv4アドレスを確認します。IPv4アドレスが設定されていないことがわかります。

[root@server ~]# nmcli -g ipv4.addresses connection show eth1-profile

作成したプロファイルにIPv4アドレスを設定します。

[root@server ~]# nmcli connection modify eth1-profile ipv4.method manual ipv4.addresses 10.0.0.20/24

プロファイルを確認します。プロファイルにIPv4アドレスが設定されたことがわかります。

[root@server ~]# nmcli -g ipv4.addresses connection show eth1-profile
10.0.0.20/24

eth1に対してもう1つIPアドレスを追加します。追加する場合"+"を使います。"+"をつけないと、元の設定を変更することになります。

[root@server ~]# nmcli connection modify eth1-profile ipv4.method manual +ipv4.addresses 20.0.0.20/24

プロファイルを確認します。20.0.0.20が追加されたことがわかります。

[root@server ~]# nmcli -g ipv4.addresses connection show eth1-profile
10.0.0.20/24, 20.0.0.20/24

プロファイルから20.0.0.20を削除します。

[root@server ~]# nmcli connection modify eth1-profile ipv4.method manual -ipv4.addresses 20.0.0.20/24

プロファイルを確認します。20.0.0.20が削除されたことがわかります。

[root@server ~]# nmcli -g ipv4.addresses connection show eth1-profile
10.0.0.20/24

6.5 プロファイルを有効(up)/無効にする方法(down)

NICの状態を確認します。IPアドレスが設定されていないので、状態が「接続中」となっています。

[root@server ~]# nmcli device status
DEVICE  TYPE      STATE                     CONNECTION
eth0    ethernet  接続済み                  eth0
eth1    ethernet  接続中 (IP 設定を取得中)  eth1-profile
lo      loopback  管理無し                  --

プロファイルを有効にします。プロファイルを有効にすると、設定ファイルに定義したIPアドレス等がデバイスに設定されます。

[root@server ~]# nmcli connection up eth1-profile
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/15)

eth1に設定されているIPアドレスを確認します。10.0.0.20が設定されたことがわかります。

[root@server ~]# nmcli device show eth1 |grep IP4.ADDRESS
IP4.ADDRESS[1]:                         10.0.0.20/24

プロファイルを無効にします。

[root@server ~]#  nmcli connection down eth1-profile
接続 'eth1-profile' が正常に非アクティブ化されました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/15)

eth1に設定されているIPアドレスを確認します。IPアドレスが設定されていないことがわかります。

[root@server ~]# nmcli device show eth1 |grep IP4.ADDRESS
[root@server ~]#

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ

AIDEの使い方

1 AIDEとは?

ファイル等が改ざんされたことを検知するセキュリティツールです。

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/centos-release
CentOS Linux release 8.3.2011

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
4.18.0-240.el8.x86_64

3 インストール方法

aideパッケージをインストールします。

[root@server ~]# dnf -y install aide

版数を確認します。

[root@server ~]# aide -v
Aide 0.16
-snip-

4 オプション一覧

オプションは以下のとおりです。

[root@server ~]# aide -h
Aide 0.16

Usage: aide [options] command

Commands:
  -i, --init            Initialize the database
  -C, --check           Check the database
  -u, --update          Check and update the database non-interactively
  -E, --compare         Compare two databases

Miscellaneous:
  -D, --config-check    Test the configuration file
  -v, --version         Show version of AIDE and compilation options
  -h, --help            Show this help message

Options:
  -c [cfgfile]  --config=[cfgfile]      Get config options from [cfgfile]
  -l [REGEX]    --limit=[REGEX]         Limit command to entries matching [REGEX]
  -B "OPTION"   --before="OPTION"       Before configuration file is read define OPTION
  -A "OPTION"   --after="OPTION"        After configuration file is read define OPTION
  -r [reporter] --report=[reporter]     Write report output to [reporter] url
  -V[level]     --verbose=[level]       Set debug message level to [level]

5 基本的な使いかた

5.1 手順

改ざんチェックの手順は以下のようになります。
1. データベース初期化(aide -i)
2. データベース保存(cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz)
3. ファイルの改ざん
4. 改ざんチェック(aide -C)

5.2 実行例

-iオプションを指定してデータベースを初期化します。データベースは、/var/lib/aide配下にaide.db.new.gzという名前で作成されます。デフォルトでは、/boot配下、/opt配下の情報をデータベース化します。私の環境では、実行完了まで5分程度かかりました。

[root@server ~]# aide -i

AIDE, version 0.15.1

### AIDE database at /var/lib/aide/aide.db.new.gz initialized.

作成したデータベースを確認します。

[root@server ~]# ls -l /var/lib/aide/aide.db.new.gz
-rw-------. 1 root root 2603228  6月 23 19:45 /var/lib/aide/aide.db.new.gz

作成したデータベースをaide.db.gzという名前に変更します。このあと実行するaide -Cで生成するデータベースと比較することで、ファイルに改ざんがあったかどうかを検出します。

[root@server ~]# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

ファイルの改ざんをチェックします。改ざんされていなければ、以下のメッセージが出力されます。

[root@server ~]# aide -C

AIDE, version 0.15.1

### All files match AIDE database. Looks okay!

6 特定のディレクトリをチェックする方法(--limit)

/etc配下をチェックしてみます。

/etc配下の情報をデータベースに登録します。

[root@server ~]# aide -i --limit=/etc
Start timestamp: 2022-06-26 06:48:43 -0400 (AIDE 0.16)
AIDE initialized database at /var/lib/aide/aide.db.new.gz
Limit: /etc

Number of entries:      1031

---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------

/var/lib/aide/aide.db.new.gz
  MD5      : +hEAiMnlMo2gQsb8IDAm1Q==
  SHA1     : Cv7erFfc5437Hm4fyWWeSKSPt18=
  RMD160   : 9CMcIrdEmpEEIHlQP4tu5uYoRSE=
  TIGER    : gpAlYMOoHqEmkyWm0QpnKdZdfMTb2eIz
  SHA256   : SQoWM6VpLsLAkzoDsXKyC/p/0itkHhN/
             UN0IK72H5OI=
  SHA512   : xsTXbY3LISeQc2o3CWEXAvoG2i9MWpdn
             Rk4I52EQbEhwIfiCs2LcUte4Y4Jo7Bf3
             XETs3tM9n746A3/FYSgtWQ==


End timestamp: 2022-06-26 06:48:44 -0400 (run time: 0m 1s)

作成したデータベースの名前をaide.db.gzに変更します。

[root@server ~]# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

改ざんされた状況を意図的に作成するため、/etc配下にテストファイルを作成します。

[root@server ~]# touch /etc/test.txt

/etc配下に改ざんがあったかどうかをチェックします。実行結果に、"AIDE found differences between database and filesystem!!"と出力されているので、/etc配下に改ざんがあったことがわかります。また、Added entriesの項を確認すると、 ファイル(/etc/test.txt)が追加されたことがわかります。

[root@server ~]# aide -C --limit=/etc
Start timestamp: 2022-06-26 06:51:18 -0400 (AIDE 0.16)
AIDE found differences between database and filesystem!!
Limit: /etc

Summary:
  Total number of entries:      1032
  Added entries:                1
  Removed entries:              0
  Changed entries:              0

---------------------------------------------------
Added entries:
---------------------------------------------------

f++++++++++++++++: /etc/test.txt

---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------

/var/lib/aide/aide.db.gz
  MD5      : +hEAiMnlMo2gQsb8IDAm1Q==
  SHA1     : Cv7erFfc5437Hm4fyWWeSKSPt18=
  RMD160   : 9CMcIrdEmpEEIHlQP4tu5uYoRSE=
  TIGER    : gpAlYMOoHqEmkyWm0QpnKdZdfMTb2eIz
  SHA256   : SQoWM6VpLsLAkzoDsXKyC/p/0itkHhN/
             UN0IK72H5OI=
  SHA512   : xsTXbY3LISeQc2o3CWEXAvoG2i9MWpdn
             Rk4I52EQbEhwIfiCs2LcUte4Y4Jo7Bf3
             XETs3tM9n746A3/FYSgtWQ==


End timestamp: 2022-06-26 06:51:18 -0400 (run time: 0m 0s)

7 ファイルサイズの変更をチェックする方法(s)

/test配下のファイルサイズが変更されたら、その旨のメッセージが出力されるようにしてみます。

7.1 設定ファイル編集

オリジナルの設定ファイルに対して次の設定を追加しました。/testディレクトリに対してs属性を設定します。s属性はファイルサイズの変更をチェックする属性です。

[root@server ~]# diff -Nur /etc/aide.conf.org /etc/aide.conf
--- /etc/aide.conf.org  2022-06-26 07:09:58.051229926 -0400
+++ /etc/aide.conf      2022-06-26 07:09:35.229036599 -0400
@@ -87,6 +87,7 @@
 DATAONLY =  p+n+u+g+s+acl+selinux+xattrs+sha512

 # Next decide what directories/files you want in the database.
+/test       s
 /boot       CONTENT_EX
 /opt        CONTENT

7.2 事前準備

/test配下にテスト用のファイルを作成します。

[root@server ~]# mkdir /test
[root@server ~]# echo 12345 > /test/aa.txt

ファイルサイズを確認します。6バイトであることがわかります。

[root@server ~]# ls -l /test/aa.txt
-rw-r--r--. 1 root root 6  6月 26 07:10 /test/aa.txt

7.3 データベース初期化

/test配下の情報をデータベースに登録します。

[root@server ~]# aide -i --limit=/test
Start timestamp: 2022-06-26 07:27:31 -0400 (AIDE 0.16)
AIDE initialized database at /var/lib/aide/aide.db.new.gz
Limit: /test

Number of entries:      2

---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------

/var/lib/aide/aide.db.new.gz
  MD5      : mRgo15fHMTVh0OpUpAtjzQ==
  SHA1     : sfHRHcYXlgUl/dkSHcaAcdj0Rng=
  RMD160   : jkM7RxPQ5WsBdJZZLPvMOQNd3Go=
  TIGER    : sTie6HE3mmTESOacMrGabXudO9sUsKeL
  SHA256   : cEO0jd8ahI/yWt4OVgzpiED8MBEpd6r3
             YtrvzSewlQ4=
  SHA512   : 8Jh4Md+c0ToeP2/fu+aJtWMeLqSQ6RkG
             9JW8hEAypqI+wYNZxdNmaZ/guweRnUSD
             sJNJ/lPGqRFeCNJXXeyAiQ==


End timestamp: 2022-06-26 07:27:31 -0400 (run time: 0m 0s)

作成したデータベースの名前をaide.db.gzに変更します。

[root@server ~]# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

7.4 ファイルサイズ変更

テスト用ファイルのサイズを変更します。

[root@server ~]# vi /test/aa.txt
[root@server ~]# cat /test/aa.txt
123456

ファイルサイズを確認します。ファイルサイズが7バイトに変更されたことがわかります。

[root@server ~]# ls -l /test/aa.txt
-rw-r--r--. 1 root root 7  6月 26 07:28 /test/aa.txt

7.5 改ざんチェック

/test配下のファイルサイズの変更をチェックします。/test/aa.txtファイルサイズが6バイトから7バイトに変更された旨のメッセージが出力されていることがわかります。

[root@server ~]# aide -C --limit=/test
Start timestamp: 2022-06-26 07:29:37 -0400 (AIDE 0.16)
AIDE found differences between database and filesystem!!
Limit: /test

Summary:
  Total number of entries:      2
  Added entries:                0
  Removed entries:              0
  Changed entries:              1

---------------------------------------------------
Changed entries:
---------------------------------------------------

f >              : /test/aa.txt

---------------------------------------------------
Detailed information about changes:
---------------------------------------------------

File: /test/aa.txt
  Size     : 6                                | 7


---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------

/var/lib/aide/aide.db.gz
  MD5      : mRgo15fHMTVh0OpUpAtjzQ==
  SHA1     : sfHRHcYXlgUl/dkSHcaAcdj0Rng=
  RMD160   : jkM7RxPQ5WsBdJZZLPvMOQNd3Go=
  TIGER    : sTie6HE3mmTESOacMrGabXudO9sUsKeL
  SHA256   : cEO0jd8ahI/yWt4OVgzpiED8MBEpd6r3
             YtrvzSewlQ4=
  SHA512   : 8Jh4Md+c0ToeP2/fu+aJtWMeLqSQ6RkG
             9JW8hEAypqI+wYNZxdNmaZ/guweRnUSD
             sJNJ/lPGqRFeCNJXXeyAiQ==


End timestamp: 2022-06-26 07:29:37 -0400 (run time: 0m 0s)

8 パーミッションの変更をチェックする方法(p)

ファイルのパーミッションが変更されたら、その旨のメッセージが出力されるようにしてみます。

8.1 設定ファイル編集

/test配下でパーミッションが変更されたら、その旨のメッセージが出力されるようにしてみます。

オリジナルの設定ファイルに対して次の設定を追加しました。/testディレクトリに対してp属性を設定します。p属性はパーミッションの変更をチェックする属性です。

[root@server ~]# diff -Nur /etc/aide.conf.org /etc/aide.conf
--- /etc/aide.conf.org  2022-06-26 07:09:58.051229926 -0400
+++ /etc/aide.conf      2022-06-26 07:38:30.530954496 -0400
@@ -87,6 +87,7 @@
 DATAONLY =  p+n+u+g+s+acl+selinux+xattrs+sha512

 # Next decide what directories/files you want in the database.
+/test       p
 /boot       CONTENT_EX
 /opt        CONTENT

8.2 事前準備

ファイルのパーミッションを確認します。ファイルのパーミッションが644であることがわかります。

[root@server ~]# ls -l /test/aa.txt
-rw-r--r--. 1 root root 7  6月 26 07:28 /test/aa.txt

8.3 データベース初期化

/test配下の情報をデータベースに登録します。

[root@server ~]# aide -i --limit=/test
Start timestamp: 2022-06-26 07:42:10 -0400 (AIDE 0.16)
AIDE initialized database at /var/lib/aide/aide.db.new.gz
Limit: /test

Number of entries:      2

---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------

/var/lib/aide/aide.db.new.gz
  MD5      : OXMh6+1T5fMDGmmCDo+shQ==
  SHA1     : A7j/Rwxcriuoh7j9wf+pcgLdm2w=
  RMD160   : Ga1vS5/0/asagJQyjwmanNFuqMI=
  TIGER    : J3eFuSYh2TxYA7MCR4DMwSqJ8H3N/Uum
  SHA256   : 77JH0lwEm9EDK1XUdCzj8m/0JMLZGMkY
             Pi5w4IQa0pw=
  SHA512   : K7AIAmG8Ovkc5/82LQKuuD7QOPOGCrlE
             /Us9m2ujGi4WqzRcyIKcz/tWhoC23Dce
             Cf2zx5ZlTFphnBg9SXwQww==


End timestamp: 2022-06-26 07:42:10 -0400 (run time: 0m 0s)

作成したデータベースの名前をaide.db.gzに変更します。

[root@server ~]# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

8.4 パーミッションの変更

ファイルのパーミッションを変更します。ファイルのパーミッションが666に変更されたことがわかります。

[root@server ~]# chmod 666 /test/aa.txt
[root@server ~]#  ls -l /test/aa.txt
-rw-rw-rw-. 1 root root 7  6月 26 07:28 /test/aa.txt

8.5 改ざんチェック

/test配下のファイルのパーミッションの変更をチェックをします。ファイルのパーミッションが644から666に変更された旨のメッセージが出力されていることがわかります。

[root@server ~]# aide -C --limit=/test
Start timestamp: 2022-06-26 07:48:19 -0400 (AIDE 0.16)
AIDE found differences between database and filesystem!!
Limit: /test

Summary:
  Total number of entries:      2
  Added entries:                0
  Removed entries:              0
  Changed entries:              1

---------------------------------------------------
Changed entries:
---------------------------------------------------

f   p            : /test/aa.txt

---------------------------------------------------
Detailed information about changes:
---------------------------------------------------

File: /test/aa.txt
  Perm     : -rw-r--r--                       | -rw-rw-rw-


---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------

/var/lib/aide/aide.db.gz
  MD5      : OXMh6+1T5fMDGmmCDo+shQ==
  SHA1     : A7j/Rwxcriuoh7j9wf+pcgLdm2w=
  RMD160   : Ga1vS5/0/asagJQyjwmanNFuqMI=
  TIGER    : J3eFuSYh2TxYA7MCR4DMwSqJ8H3N/Uum
  SHA256   : 77JH0lwEm9EDK1XUdCzj8m/0JMLZGMkY
             Pi5w4IQa0pw=
  SHA512   : K7AIAmG8Ovkc5/82LQKuuD7QOPOGCrlE
             /Us9m2ujGi4WqzRcyIKcz/tWhoC23Dce
             Cf2zx5ZlTFphnBg9SXwQww==


End timestamp: 2022-06-26 07:48:19 -0400 (run time: 0m 0s)

9 ハッシュ値の変更をチェックする方法(sha256)

ファイルのハッシュ値が変更されたら、その旨のメッセージが出力されるようにしてみます。

9.1 設定ファイル編集

設定ファイルを編集します。/test配下のファイルのハッシュ値が変更されたことを検出するための設定をします。

[root@server ~]# diff -Nur /etc/aide.conf.org /etc/aide.conf
--- /etc/aide.conf.org  2022-06-26 07:09:58.051229926 -0400
+++ /etc/aide.conf      2022-06-26 08:25:53.969079561 -0400
@@ -87,6 +87,7 @@
 DATAONLY =  p+n+u+g+s+acl+selinux+xattrs+sha512

 # Next decide what directories/files you want in the database.
+/test       sha256
 /boot       CONTENT_EX
 /opt        CONTENT

9.2 事前準備

ファイルの中身を確認します。

[root@server ~]# cat /test/aa.txt
123456

ファイルのハッシュ値を確認します。

[root@server ~]# sha256sum /test/aa.txt
e150a1ec81e8e93e1eae2c3a77e66ec6dbd6a3b460f89c1d08aecf422ee401a0  /test/aa.txt

9.3 データベース初期化

/test配下の情報をデータベースに登録します。

[root@server ~]# aide -i --limit=/test
Start timestamp: 2022-06-26 08:31:55 -0400 (AIDE 0.16)
AIDE initialized database at /var/lib/aide/aide.db.new.gz
Limit: /test

Number of entries:      2

---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------

/var/lib/aide/aide.db.new.gz
  MD5      : vVvQAlRJvsQCKCVw7AqYRw==
  SHA1     : /RqI1fEY3Qfmi+29D8TApd5B4u4=
  RMD160   : Iiu4SoGt/2CClCTTYJaPTIzOVm8=
  TIGER    : 3AO8JU+SXLrFf/qZ8WA/CMK+IouS9HGE
  SHA256   : H3obOMJ1ncE+acfZcbTpwXh8CknC4f3z
             IwF4iFwixqc=
  SHA512   : X9Su1CtO4ykeE1lRcVLX89jdEbcN4oE0
             F5K9M6uTCaUn9dNIkAXuYzyuSbc1hqkO
             CtJqL7Db8osDwzXZIjzw5Q==


End timestamp: 2022-06-26 08:31:55 -0400 (run time: 0m 0s)

作成したデータベースの名前をaide.db.gzに変更します。

[root@server ~]# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

9.4 ファイルの変更

テスト用ファイルの1バイト目を1から0に変更します。ファイルサイズは変化しませんが、ファイルのハッシュ値が変化します。

[root@server ~]# vi /test/aa.txt
[root@server ~]# cat /test/aa.txt
023456

ファイルのハッシュ値を確認します。ファイルのハッシュ値が変更されたことがわかります。

[root@server ~]# sha256sum /test/aa.txt
4a9bf1614ab844e85878ac81d566fce98b5306f3f4c5ba8abb419b1e79aa67c3  /test/aa.txt

9.5 改ざんチェック

/test配下のファイルのハッシュ値の変更をチェックをします。/test/aa.txtのハッシュ値が変更された旨のメッセージが出力されていることがわかります。

[root@server ~]# aide -C --limit=/test
Start timestamp: 2022-06-26 08:34:32 -0400 (AIDE 0.16)
AIDE found differences between database and filesystem!!
Limit: /test

Summary:
  Total number of entries:      2
  Added entries:                0
  Removed entries:              0
  Changed entries:              1

---------------------------------------------------
Changed entries:
---------------------------------------------------

f           C    : /test/aa.txt

---------------------------------------------------
Detailed information about changes:
---------------------------------------------------

File: /test/aa.txt
  SHA256   : 4VCh7IHo6T4eriw6d+ZuxtvWo7Rg+Jwd | SpvxYUq4ROhYeKyB1Wb86YtTBvP0xbqK
             CK7PQi7kAaA=                     | u0GbHnmqZ8M=


---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------

/var/lib/aide/aide.db.gz
  MD5      : vVvQAlRJvsQCKCVw7AqYRw==
  SHA1     : /RqI1fEY3Qfmi+29D8TApd5B4u4=
  RMD160   : Iiu4SoGt/2CClCTTYJaPTIzOVm8=
  TIGER    : 3AO8JU+SXLrFf/qZ8WA/CMK+IouS9HGE
  SHA256   : H3obOMJ1ncE+acfZcbTpwXh8CknC4f3z
             IwF4iFwixqc=
  SHA512   : X9Su1CtO4ykeE1lRcVLX89jdEbcN4oE0
             F5K9M6uTCaUn9dNIkAXuYzyuSbc1hqkO
             CtJqL7Db8osDwzXZIjzw5Q==


End timestamp: 2022-06-26 08:34:32 -0400 (run time: 0m 0s)

10 特定ファイルをチェックする方法

10.1 設定ファイル編集

設定ファイルを編集します。このとき、aa.txtをチェック対象にします。特定のファイルをチェック対象にする場合、ファイル名の後に$をつけます。

[root@server ~]# diff -Nur /etc/aide.conf.org /etc/aide.conf
--- /etc/aide.conf.org  2022-06-26 07:09:58.051229926 -0400
+++ /etc/aide.conf      2022-06-26 09:00:52.349211300 -0400
@@ -87,6 +87,7 @@
 DATAONLY =  p+n+u+g+s+acl+selinux+xattrs+sha512

 # Next decide what directories/files you want in the database.
+/test/aa.txt$   s
 /boot       CONTENT_EX
 /opt        CONTENT

10.2 事前準備

テスト用のファイルを2つ作成します。

[root@server ~]# echo 12345 > /test/aa.txt
[root@server ~]# echo 12345 > /test/bb.txt

ファイルサイズを確認します。それぞれ6バイトであることがわかります。

[root@server ~]# ls -l /test/*
-rw-rw-rw-. 1 root root 6  6月 26 08:54 /test/aa.txt
-rw-r--r--. 1 root root 6  6月 26 08:54 /test/bb.txt

10.3 データベース初期化

/test配下の情報をデータベースに登録します。

[root@server ~]# aide -i --limit=/test
Start timestamp: 2022-06-26 08:55:27 -0400 (AIDE 0.16)
AIDE initialized database at /var/lib/aide/aide.db.new.gz
Limit: /test

Number of entries:      0

---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------

/var/lib/aide/aide.db.new.gz
  MD5      : mZErF6fEeiGDWhBS/vXMEw==
  SHA1     : Fu519gbIwJuhJGp3RdZcW3BCsD8=
  RMD160   : VL2HDmnEcoG61J5yWEBDLJYc+p8=
  TIGER    : Zhu4RqzEscpW9XSo18nO66Xr57BtLLcN
  SHA256   : uT95XevmBGqQ2N9VABhuP+8UnecUdfkj
             ba0NI3M59AQ=
  SHA512   : qupMv5oC+CwIcINZTqyqIKT1iMQD5XT5
             p5j09N3KblR6bH5MjomMZ2Bs8524mfGd
             t/AcMyGaLs+tO+yT5XuWlw==


End timestamp: 2022-06-26 08:55:27 -0400 (run time: 0m 0s)
[root@server ~]# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

10.4 ファイルサイズの変更

各ファイルのファイルサイズを変更します。

[root@server ~]# echo 1 > /test/aa.txt
[root@server ~]# echo 1 > /test/bb.txt

ファイルサイズを確認します。2バイトに変更されたことがわかります。

[root@server ~]# ls -l /test/*
-rw-rw-rw-. 1 root root 2  6月 26 08:56 /test/aa.txt
-rw-r--r--. 1 root root 2  6月 26 08:56 /test/bb.txt

10.5 改ざんチェック

/test配下のファイルサイズの変更をチェックをします。aa.txtのファイルサイズが変更された旨のメッセージは出力されていますが、bb.txtのファイルサイズ変更のメッセージは出力されていないことがわかります。

[root@server ~]# aide -C --limit=/test
Start timestamp: 2022-06-26 09:01:59 -0400 (AIDE 0.16)
AIDE found differences between database and filesystem!!
Limit: /test

Summary:
  Total number of entries:      1
  Added entries:                0
  Removed entries:              0
  Changed entries:              1

---------------------------------------------------
Changed entries:
---------------------------------------------------

f <              : /test/aa.txt

---------------------------------------------------
Detailed information about changes:
---------------------------------------------------

File: /test/aa.txt
  Size     : 6                                | 2


---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------

/var/lib/aide/aide.db.gz
  MD5      : Geh32xwbL1oj3f64oTOyXQ==
  SHA1     : klCEJ18PUMppLQa+v+OcfdDe5sc=
  RMD160   : jRjZ5PHqHcyb/ZwjJSCLAPBy87o=
  TIGER    : jWwk9ycxi4DQ12LzTkH2LlFSj67Mhs7m
  SHA256   : D4JEuKIuAaYSqvRhMFjZg1jDVSycYold
             mg5zMreGT6w=
  SHA512   : pQPc73MgdVam3MRSPd4PUmauowtKn7LL
             usfDabApG/VayBpP54bdTpwrgaooYqh0
             4lMhyRBN4NtIQUlGXzHJnw==


End timestamp: 2022-06-26 09:01:59 -0400 (run time: 0m 0s)

11 ログファイルの格納場所

aideの実行結果は、/var/log/aide/aide.logに保存されます。

[root@server ~]# cat /var/log/aide/aide.log
Start timestamp: 2022-06-26 09:01:59 -0400 (AIDE 0.16)
AIDE found differences between database and filesystem!!
Limit: /test

Summary:
  Total number of entries:      1
  Added entries:                0
  Removed entries:              0
  Changed entries:              1

---------------------------------------------------
Changed entries:
---------------------------------------------------

f <              : /test/aa.txt

---------------------------------------------------
Detailed information about changes:
---------------------------------------------------

File: /test/aa.txt
  Size     : 6                                | 2


---------------------------------------------------
The attributes of the (uncompressed) database(s):
---------------------------------------------------

/var/lib/aide/aide.db.gz
  MD5      : Geh32xwbL1oj3f64oTOyXQ==
  SHA1     : klCEJ18PUMppLQa+v+OcfdDe5sc=
  RMD160   : jRjZ5PHqHcyb/ZwjJSCLAPBy87o=
  TIGER    : jWwk9ycxi4DQ12LzTkH2LlFSj67Mhs7m
  SHA256   : D4JEuKIuAaYSqvRhMFjZg1jDVSycYold
             mg5zMreGT6w=
  SHA512   : pQPc73MgdVam3MRSPd4PUmauowtKn7LL
             usfDabApG/VayBpP54bdTpwrgaooYqh0
             4lMhyRBN4NtIQUlGXzHJnw==


End timestamp: 2022-06-26 09:01:59 -0400 (run time: 0m 0s)

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ