見出し画像

Docker/Podman開発日誌



今日は1日Podmanを弄ってました。

先日、教えていただいたPodmanのCnetOS7のコンテナイメージを起動したのですがコンテナのNICがONならなかった。

警備体制は万全である

Podmanは、デーモンやRoot権限なしでも使用できるのがその特徴になるのですが(DockerでもRootless機能は実装はされています。)今日は、その特徴を活かすべく午後の早い時間は、一般ユーザーでCentOS7のコンテナイメージを起動させて作業をしていました。

しかし、CnetOS7のコンテナイメージをプルして起動をしてコマンドを投入したところエラー返ってきてしまいました。

CnetOS8のコンテナイメージでも状況が同じ・・・

投入コマンド

podman run centos echo "run rootless containers"

#標準エラー
/usr/bin/coreutils: error while loading shared libraries: librt.so.1: cannot change memory protections
​

ジャーナルログを確認すると

717 11:43:28 glabo5.dev.example.jp systemd[1757]: Started podman-2103.scope.
717 11:43:29 glabo5.dev.example.jp kernel: SELinux: mount invalid.  Same superblock, different security settings for (dev mqueue, type mqueue)
7月 17 11:43:32 glabo5.dev.example.jp dbus-daemon[887]: [system] Activating service name='org.fedoraproject.Setroubleshootd' requested by ':1.46' (uid=0 pid=864 comm="/usr/sbin/sedispatch " label="system_u:system_r:auditd_t:s0") (using servicehelper)
717 11:43:32 glabo5.dev.example.jp dbus-daemon[887]: [system] Successfully activated service 'org.fedoraproject.Setroubleshootd'
717 11:43:33 glabo5.dev.example.jp setroubleshoot[2156]: AnalyzeThread.run(): Cancel pending alarm
717 11:43:33 glabo5.dev.example.jp dbus-daemon[887]: [system] Activating service name='org.fedoraproject.SetroubleshootPrivileged' requested by ':1.62' (uid=995 pid=2156 comm="/usr/libexec/platform-python -Es /usr/sbin/setroub" label="system_u:system_r:setroubleshootd_t:s0-s0:c0.c1023") (using servicehelper)
717 11:43:33 glabo5.dev.example.jp dbus-daemon[887]: [system] Successfully activated service 'org.fedoraproject.SetroubleshootPrivileged'
717 11:43:34 glabo5.dev.example.jp setroubleshoot[2156]: SELinux is preventing echo from read access on the file /usr/lib64/librt-2.28.so. For complete SELinux messages run: sealert -l 48863d11-aaee-4b3d-a842-befd47b83fb5
717 11:43:34 glabo5.dev.example.jp setroubleshoot[2156]: SELinux is preventing echo from read access on the file /usr/lib64/librt-2.28.so.
                                                             *****  Plugin restorecon (99.5 confidence) suggests   ************************
                                                             If you want to fix the label.
                                                             /usr/lib64/librt-2.28.so default label should be lib_t.
                                                             Then you can run restorecon. The access attempt may have been stopped due to insufficient permissions to access a parent directory in which case try to change the following command accordingly.
                                                             Do
                                                             # /sbin/restorecon -v /usr/lib64/librt-2.28.so
                                                             *****  Plugin catchall (1.49 confidence) suggests   **************************
                                                             If you believe that echo should be allowed read access on the librt-2.28.so file by default.
                                                             Then you should report this as a bug.
                                                             You can generate a local policy module to allow this access.
                                                             Do
                                                             allow this access for now by executing:
                                                             # ausearch -c 'echo' --raw | audit2allow -M my-echo
                                                             # semodule -X 300 -i my-echo.pp
7月 17 11:43:34 glabo5.dev.example.jp setroubleshoot[2156]: AnalyzeThread.run(): Set alarm timeout to 10

SELinuxがきっちり仕事をしておりアクセス権エラーになっていました。

なので一旦SELinuxのアクセス制御を無効にして実際に事象の原因がSElinuxなのかを確認しました。

現在の設定を確認

getenforce

# 有効です
Enforcing

無効化に設定

sudo setenforce 0
getenforce

# 無効(正確にはアクセス拒否はしないがログには書き込む状態
Permissive

リトライ

podman run centos echo "run rootless containers"


# 成功
run rootless containers

SElinuxの制御の問題だと確定したので、先ほどのジャーナルログに提示されていたSElinuxのコンテキスト書き換え提案を実施します。

まずは、許可設定ファイルを生成

sudo -i
ausearch -c 'echo' --raw | audit2allow -M my-echo

生成した設定ファイルの確認

cat my-echo.te
module my-echo 1.0;

require {
type data_home_t;
type container_t;
class file read;
}

#============= container_t ==============
allow container_t data_home_t:file read;

設定を実施

semodule -i my-echo.pp

SELinuxを有効に戻して一般ユーザーで再度コマンドを実行

exit

sudo setenforce 1
getenforce

# 有効にもどりました
Enforcing

コマンドを再実行

podman run centos echo "run rootless containers"

# 実行できることが確認できました。
run rootless containers

問題なく実行できることを確認、念のため別のコマンドも実行して確認

podman run centos cat /etc/redhat-release

正常に実行できました

CentOS Linux release 8.3.2011

コンテナが無事に稼働してコマンドの投入もできたので「yum update」を実行したところ今度は、パッチ配布用のサーバのURLが見つかりませんとエラーになりました;

コンテナにログインしてipコマンドを打ったのですがそもそもipコマンド自体がないと言われてしましました。

Podman:Rootlessネットワーク

Podmanのネットワーク設定について色々調べたところ、どうやら一般ユーザで実行した場合は、Podmanのホスト側にPodman用のブリッジ接続NICができない設計のと言うことがわかりました。

https://qiita.com/akiakishitai/items/f38feeb08f4a68cd7a33

まぁNICの設定になるので管理者権限を必要とするため適正な動きなのかなと思います。

おそらくPodman設計的には、「コンテナ自体の集合はユーザー各自でそれぞれ好きに作ってその中で勝手に連携してOKです。でもお外に公開するときは管理者の許可をとってね」っという事なんじゃないかなと思います。

しかし今回は、リポジトリサーバを作りたいので外に行けないのそもそも役割を果たせないと言うことになります。

単純に中継用のプロキシサーバなりを管理者権限で作ってそこ経由という風なのが前述のPodman設計思想的な構成なんだと思うのですが・・・流石に初回の構築でしかもローカル用のリポジトリサーバでそこまで複雑にする気もまだ理解度もなかったので今回は、Root権限で実装する方針に変更しました。

外出禁止令は解けず

気を取り直してRoot権限で改めてCnetOS7のコンテナイメージをプルして起動・・・しかし状況が変わらず(CentOS8も同様でした

さらに調べたところPodman用の仮想NICのアクセス許可が必要という記事を見かけたのでfirewallでそれらを許可しました。

sudo firewall-cmd --zone=public --change-interface=cni-podman0 
sudo firewall-cmd --zone=public --add-source=10.88.0.0/16 
sudo firewall-cmd --runtime-to-permanent
sudo firewall-cmd --zone=public --list-all

この設定を行ったらCentOS8の方は、外への通信が確立してパッケージアップデートやインストールができるようになりました。

しかしCnetOS7の方は、やはりダメな状態でした。

Podmanホスト側では、起動しているコンテナ分のNICが作られているのですがコンテナないでNICを見ることができない状態です。

この時点でもう夕方になってしまいこのまま原因調査し続けても得策ではないと考えたのではやりCentOS8での実装は諦めてCnetOS7でDockerを使ってまずは実装する事にしました。

Dockerの方が情報も多いのでまだ慣れていない技術なのでそうした方がいいと思いました。

あすは、Dockerで挑戦です。

参考書籍も届いたので

https://www.amazon.co.jp/gp/product/4295005525/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1

また明日、挑戦!

お疲れ様でした。


この記事が気に入ったらサポートをしてみませんか?