私は私のサーバーユーザーのルートレスdockercontainerとしてsteamcmdを使用したいと思います。ただし、steamcmdは通常/opt/steam/steamcmd/steamcmd.shの下に通常のユーザーとしてインストールする必要があります。
私はsteamcmd arksを使ってdocker / podmanコンテナを実行し、呼び出し元のユーザーIDを環境に渡すカスタムsteamcmd.shを作成しました。
デフォルトのエントリポイントスクリプトを/opt/steam/steamcmd/steamcmd.docker.sh(steamuser)というカスタムエントリポイントスクリプトに置き換えました。
コンテナをrootとして実行すると、すべてがうまく機能しますが、サーバーユーザーを使用しようとすると、「エラー:エラーステータスファイル:権限が拒否され/opt/steam/steamcmd/steamcmd.docker.sh
ました:OCI権限が拒否されました」と表示されます。
私のselinuxはホストシステムで快適な状態にあります。だからログを確認してみると、次のようなメッセージが出ました。
Mai 06 02:13:48 host setroubleshoot[81420]: SELinux is preventing steamcmd.replace from read access on the file steamcmd.docker.sh.
If you believe that steamcmd.replac should be allowed read access on the steamcmd.docker.sh file by default.
# ausearch -c 'steamcmd.replace' --raw | audit2allow -M my-steamcmdreplace
# semodule -X 300 -i my-steamcmdreplace.pp
ファイルを作成しましたが、次のように表示されます。
module my-steamcmdreplace 1.0;
require {
type container_t;
type etc_t;
class file entrypoint;
}
#============= container_t ==============
allow container_t etc_t:file entrypoint;
2番目のselinuxメッセージは次のとおりです。
Mai 05 01:30:29 host setroubleshoot[3763945]: SELinux is preventing /bin/dash from entrypoint access on the file /usr/bin/steamcmd.replace.
If you believe that dash should be allowed entrypoint access on the steamcmd.replace file by default.
モジュールを追加しましたが、何も変更されませんでした。そのため、udicaを使用してコンテナポリシーを作成しようとしました。ただし、実行中のコンテナでのみ機能するため、ルートで実行されているコンテナを使用しました。
次の内容で、udica生成モジュールにルールを手動で追加しました。
(block steamcmd
(blockinherit container)
(allow process process ( capability ( chown dac_override fowner fsetid kill net_bind_service setfcap setgid setpcap setuid sys_chroot )))
(allow process usr_t ( dir ( getattr ioctl lock open read search )))
(allow process usr_t ( file ( getattr ioctl lock open read )))
(allow process usr_t ( sock_file ( getattr open read )))
(allow process usr_t ( dir ( add_name create getattr ioctl lock open read remove_name rmdir search setattr write )))
(allow process usr_t ( file ( append create getattr ioctl lock map open read rename setattr unlink write )))
(allow process usr_t ( sock_file ( append getattr open read write )))
(allow container_t etc_t (file (entrypoint)))
)
serveruserでコンテナを実行するコマンドは次のとおりです。
podman run --network=host --dns 8.8.8.8 --security-opt label=type:steamcmd.process -t --rm --entrypoint 'steamcmd.replace' --name steamcmd -v /opt/steam/steamcmd/steamcmd.docker.sh:/usr/bin/steamcmd.replace:z -v .:/data docker.io/steamcmd/steamcmd:latest +force_install_dir /data validate
その理由は何ですか?