テクノロジー · 実用ガイド

Docker daemon socket が permission denied?クライアント・socket・daemon を先に証明

docker.sock を 666/777 にしません。クライアント ID、Docker context、正確な socket を固定し、rootful・rootless・コンテナへのマウントを分けて最小の主体だけを認可します。

Docker クライアント ID、Unix socket 情報、実際の daemon の境界を示すオリジナルイラスト。
オリジナルイラスト:修復前に正確なクライアントと socket を証明します。 Watch at Ease

Docker の Unix socket で permission denied なら、クライアントプロセスがその pathname 境界を越えられません。daemon 停止や /var/run/docker.sock 選択を証明するものではありません。

クライアント ID、context、DOCKER_HOST、socket 情報を保存します。rootful ホスト daemon、rootless user daemon、コンテナ内のマウントを分類してからアクセスを変えます。

クライアント ID と選択 endpoint を固定

完全なエラー、command、有効 UID、補助 group を記録します。sudo や group 編集前に docker context show、DOCKER_HOST、解決済み endpoint を保存します。

正確な pathname の owner、group、mode、親 directory を名前と数値で調べます。pathname 不在は permission denied と別の分岐です。

rootful・rootless・mount socket を分類

rootful Linux daemon は root 所有 socket を docker group に開けます。この group は便利 group でなく特権管理として扱います。

rootless では user socket と context を確認します。CI や application container では mount した host socket と名前空間を分けます。

プロセス資格情報と数値 GID を証明

socket の数値 GID と実際に Docker を起動する process group を比較します。/etc/group の編集は既存 shell、IDE、agent、daemon の資格を変えません。

mount socket では両側の docker という名前が同じでも番号が違います。host socket を application user 所有に変えず、caller 側で GID を設計します。

最小の意図した認可境界を選択

rootful group access が承認済みなら必要な人・service だけを追加し、その session を更新します。恒久 root 相当が広すぎるなら rootless や隔離環境を検討します。

chmod 666/777 を恒久修復にしません。world-write は無関係な local process に強力な API を開き、daemon restart で管理 mode に再生成される場合もあります。

境界を隠さず意図した daemon を検証

同じ caller から docker context show と docker info または docker version を実行し、context、server、rootless security option を確認します。sudo だけの成功は資格差の証拠です。

承認済み workload を一つ実行します。非 world-write socket が意図した主体だけに動き、無関係な非特権主体を拒否して初めて完了です。

world-write、rootful group 認可、rootless mode を比較するオリジナルイラスト。
オリジナルイラスト:socket を world-write にせず認可境界を選びます。 Watch at Ease