rootユーザでtarを展開するとファイルの所有者が一般ユーザになりうる

結論

rootユーザがtarコマンドでtarファイルを展開するとき、デフォルトではtarファイルの作成時の所有者情報を引き継ごうとする。

他のホストで作成されたファイルだとしてもその所有者情報を引き継ごうとするため、引き継ぎたくない場合は、 --no-same-owner を付ける。

例:

tar zxv --no-same-owner -f  file.tar.gz

環境: Debian bullseye

man tar

man tar より、root user(superuser)では --same-owner が付与された状態と等価なので所有者情報を引き継ごうとする。root userの場合のみ --no-same-owner を付与すれば所有者情報を引き継がなくなる。

       --no-same-owner
              Extract files as yourself (default for ordinary users).
       --same-owner
              Try extracting files with the same ownership as exists in the archive (default for superuser).

きっかけ(余談)

Visual Studio CodeRemote Container を使っていて、 Creating a non-root user に倣って一般ユーザで動作する以下のようなDockerfileを作成した際に、

FROM debian:bullseye-slim
# root user
RUN apt-get update && apt-get install -y curl && \
    curl -L https://<domain>/foo.tar.gz | tar  xzv -C /usr/local/src/


ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID

RUN groupadd --gid ${USER_GID} ${USERNAME} && \
    useradd --uid ${USER_UID} --gid ${USER_GID} -m ${USERNAME} && \
    echo "done" 

USER vscode

chown -R vscode /usr/local/src/foo としていないどころかuseradd前に配置した(展開した)ディレクトリにもかかわらず以下のように所有者がvscodeになっており、混乱した。

$ ls -l  /usr/local/src/
total 4
drwxr-xr-x 19 vscode vscode 4096 Apr 26 13:47 foo

foo.tar.gz を別途調べると、UID=1000で作成されていて、偶然vscode userに所有者情報がマッピングされていた、という顛末だった。

$ gunzip foo.tar.gz 
$ tar xf foo.tar --to-command 'echo $TAR_UID' | uniq
1000