Linuxでのアーカイブファイルの解凍・展開手順と応用例

Linuxでtar系アーカイブを展開する基本はtar -xf archive.tarですが、カレントディレクトリに直接実行するのは安全ではありません。アーカイブは多数のファイル、権限、シンボリックリンク、深い階層を含み、展開先の既存ファイルを上書きしたり容量を使い切ったりする可能性があります。特にインターネットや外部組織から受け取ったものは、発行元とチェックサムを確認し、内容一覧を見て、アクセスを限定した空の専用ディレクトリへ一般ユーザーで展開します。

目次

アーカイブと圧縮を分けて理解する

tarは複数のファイルとメタデータを一つのアーカイブへまとめる形式です。.tar自体は通常圧縮されていません。.tar.gzや.tgzはtarをgzipで、.tar.xzはxzで、.tar.bz2はbzip2で圧縮したものです。拡張子は単なる名前なので、送信者の情報とfile、一覧表示、対象版のtarヘルプを照合します。未知のファイルを拡張子だけで実行形式だと決めつけません。

file -- package.tar.gz
tar --version

GNU tarは圧縮形式を自動認識できる場面がありますが、移植性や古い版を考慮してgzipなら-z、xzなら-J、bzip2なら-jを明示する運用もあります。短いオプションをまとめた-xzfでは、-fの直後がアーカイブ名です。順序を誤ると別の文字をファイル名として解釈する可能性があるため、長形式はレビューしやすい選択です。

入手元と完全性を確認する

展開前に、ダウンロード元が公式サイトか、HTTPS証明書が正常か、発行元が公開するチェックサムや署名と一致するかを確認します。チェックサムは同じ侵害された場所から取得すると真正性を証明できないため、署名や別経路のリリース情報を優先します。メール添付や共有リンクでは、送信者へ別経路で確認します。ハッシュ一致は「配布元が示したバイト列と同じ」ことを示すだけで、中身が安全である保証ではありません。

sha256sum -- package.tar.gz

期待する値を端末へ貼るときは、ファイル名と値を取り違えず、比較結果を目視だけに頼らない検証手順を使います。組織のマルウェア検査やソフトウェア供給網ポリシーも適用します。

展開せず内容一覧を見る

tar -tfはメンバー名を一覧表示します。圧縮形式に応じたオプションを付け、長い一覧はlessへ送るか新しい確認用ファイルへ保存します。標準エラーと終了状態も確認し、途中で壊れたアーカイブを「一部だけ見えたから正常」と判断しません。

tar -tzf package.tar.gz | less
printf 'list status=%s\n' "$?"

パイプの末尾がlessなので、Bashの既定ではtarの失敗が全体の終了状態へ出ないことがあります。厳密に確認するならpipefailを有効にするか、一覧を権限付きの新規ファイルへ出してtarの状態を直後に確認します。

一覧で確認する項目

  • 最上位が一つのディレクトリにまとまり、展開先へファイルを散らさないか。
  • 先頭スラッシュ付き絶対パスや../による親ディレクトリ参照がないか。
  • 同名項目、大小文字だけが違う名前、非常に長いパス、制御文字を含む名前がないか。
  • シンボリックリンクやハードリンクの参照先が、専用ディレクトリ外へ向かないか。
  • 実行ファイル、setuid/setgidビット、デバイスファイル、FIFOなど予想外の種類がないか。
  • 展開後サイズ、ファイル数、圧縮率が妥当で、容量枯渇を起こさないか。

tarの一覧だけで圧縮後サイズから展開後合計を完全に判断できない場合があります。高圧縮率の巨大ゼロ列、疎ファイル、多数の小ファイルは、容量、inode、バックアップ、ウイルス検査を圧迫します。隔離された検証環境とクォータを使います。

空の専用ディレクトリを用意する

GNU tar公式マニュアルは、信頼できないアーカイブを新しいディレクトリへ展開することを推奨しています。親ディレクトリと展開先は信頼できる利用者だけが操作できる場所にし、他利用者が途中でシンボリックリンクへ差し替えられないようにします。次の例は一般ユーザーの作業領域で新規ディレクトリを作る形です。

umask 077
mkdir -- ./inspect-package-20260716
tar -xzf package.tar.gz -C ./inspect-package-20260716

umask 077は以後そのシェルで作る項目の権限へ影響します。共有シェルで設定を変えたくない場合はサブシェル内で実行するか、事前値を記録して適切に戻します。専用ディレクトリは空であることを確認し、二つの未知アーカイブを同じ場所へ順番に展開しません。最初のアーカイブが作ったリンクを二つ目がたどる攻撃を避けるためです。

一般ユーザーで展開する

管理者権限で展開すると、デバイスファイル、所有者、権限、任意の場所への書き込みなど影響が大きくなります。内容検査は一般ユーザーか、ネットワークや機密データへアクセスできない隔離ユーザーで行います。所有者復元が必要な正式バックアップは別の承認済み復旧手順で扱います。権限不足を理由に展開先を全員書き込み可能へ変更しません。

GNU tarは一般ユーザーでの展開時、所有者や権限を安全側に調整しますが、アーカイブの内容と利用オプションで挙動が変わります。--same-owner、--same-permissions、--absolute-names、--overwriteのような影響の大きいオプションを、意味を理解せず追加しないでください。

形式別の基本例

tar -xf archive.tar -C ./destination
tar -xzf archive.tar.gz -C ./destination
tar -xJf archive.tar.xz -C ./destination
tar -xjf archive.tar.bz2 -C ./destination

これらはtarアーカイブ向けです。.gzだけのファイルは通常、単一ファイルをgzip圧縮したもので、tarではありません。その場合はgzip -dkなど、元の圧縮ファイルを残すオプションを対象版のgzipマニュアルで確認します。ZIP、7z、rarは別形式なので、対応ツールの公式文書と組織ポリシーを使います。拡張子をtar.gzへ変えても形式は変わりません。

一部のメンバーだけを展開する

必要なファイルだけを展開すれば、攻撃面と容量を減らせます。メンバー名は一覧表示に出た表記と完全一致させます。ワイルドカードはtar自身とシェルのどちらが展開するかで結果が変わるため、引用とオプションを確認します。ユーザー入力をパターンへそのまま入れません。

tar -xzf package.tar.gz -C ./inspect-package-20260716 'package/README.txt'

一つのメンバーが安全でも、その親ディレクトリやリンクがアーカイブ内にどう定義されるか確認します。出力を標準出力へ取り出す-Oはファイルを作らず内容確認に使えますが、複数メンバーは連結され、秘密やバイナリを端末へ流す危険があります。小さな既知のテキストだけに限定します。

既存ファイルとの衝突を避ける

展開はアーカイブ自体を変更しませんが、展開先にはファイルを作成し、同名があれば上書きする場合があります。ホームディレクトリ、アプリの設定ディレクトリ、Web公開領域、ルート直下へ直接展開しません。空の専用ディレクトリで内容を検査し、必要なファイルを正式配置する工程は別にします。正式配置ではバックアップ、差分レビュー、サービス停止要否、所有者・権限、ロールバックを計画します。

シンボリックリンクとパストラバーサル

現在のGNU tarには危険なパスを抑制する保護がありますが、ツール版、オプション、複数アーカイブ、既存の展開先状態に依存するため、それだけを防御にしません。空の隔離ディレクトリ、一般ユーザー、一覧検査、他利用者が書けない親ディレクトリを組み合わせます。展開後はfindの読み取り条件でリンクや特殊ファイルを一覧化し、リンク先を追わずに確認します。

find ./inspect-package-20260716 -type l -print
find ./inspect-package-20260716 ! -type f ! -type d ! -type l -print

出力に予想外の項目があれば実行せず、隔離を維持してセキュリティ担当へ相談します。アーカイブ内のスクリプト、インストーラー、Office文書、HTMLを開くだけでもコード実行や外部通信が起きる可能性があります。展開と実行を同じ工程にしません。

展開後の検証

  1. tarの終了状態と標準エラーを確認し、警告を成功扱いで無視しない。
  2. 展開先が専用ディレクトリ内だけか、親や絶対パスへ項目ができていないか確認する。
  3. ファイル数、合計サイズ、所有者、権限、実行ビット、リンク、特殊ファイルを確認する。
  4. 発行元のマニフェストや個別チェックサムがあれば、同じ信頼経路で照合する。
  5. マルウェア検査とライセンス・SBOM確認を組織手順に従って行う。
  6. 必要なファイルだけを正式配置し、不要な展開物は保持期限と廃棄手順に従う。

壊れたアーカイブと途中展開

CRCエラー、unexpected end of file、write error、No space leftなどが出た場合、展開先には途中までのファイルが残り得ます。それを正常な成果物として使いません。ディスク容量、ダウンロード完全性、圧縮形式、分割アーカイブ、ファイルシステムエラーを確認します。何度も同じ場所へ再実行すると、途中ファイルと新しい結果が混ざるため、原因を直した後に別の新しい空ディレクトリでやり直します。

よくある取り違え

  • -xは展開、-tは一覧、-cは新規作成。短い1文字を実行前に読み直す。
  • -fの後はアーカイブ名であり、展開先は-Cで指定する。
  • tar.gzと単独の.gzは異なり、拡張子変更では変換できない。
  • 展開成功と中身の安全性は別で、実行前にリンク、権限、スクリプトを検査する。
  • 一覧が表示できても全データが正常とは限らず、終了状態と完全性検査が必要。
  • 管理者権限は便利な回避策ではなく、正式な復旧で必要性が確認された場合だけ使う。

安全な展開の要点は「一覧を見る」「空の専用ディレクトリ」「一般ユーザー」「終了状態と展開後検査」です。tarの一行だけで終わらせず、入手元、容量、リンク、権限、正式配置を別工程として確認してください。

公式情報・参考資料

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次