Git の “fatal: detected dubious ownership in repository” エラーを解決する

サーバーで git fetch や git pull を実行したときに、突然以下のようなエラーが出てびっくりすることがあります。 このエラーは、一言で言うと 「Git があなたのセキュリティを守るために、念のため操作をブ […]

広告ここから
広告ここまで

目次

    サーバーで git fetchgit pull を実行したときに、突然以下のようなエラーが出てびっくりすることがあります。

    fatal: detected dubious ownership in repository at '/var/www/vhosts/.../plugins/event-publisher-on-aws'
    To add an exception for this directory, call:
    
            git config --global --add safe.directory /var/www/vhosts/.../plugins/event-publisher-on-aws

    このエラーは、一言で言うと 「Git があなたのセキュリティを守るために、念のため操作をブロックした」 という状態です。

    2022年4月にリリースされた Git 2.35.2 で、CVE-2022-24765 への対応として追加されたセキュリティ機能で、「実行しているユーザー」と「リポジトリの所有者」が一致しない場合に発生します。


    なぜこのエラーが出るのか

    サーバー上の /var/www/... といったディレクトリは、多くの場合 root ユーザーや www-data(Web サーバー用ユーザー)が所有しています。

    それを別のユーザー、あるいは root で入った状態で git fetch しようとすると、Git は以下のように判断します。

    「このフォルダは他の人の持ち物だぞ。もし悪意のある第三者が .git/config を書き換えていたら、Git コマンドを実行した瞬間に任意コードが実行されるかもしれない。危ないから一旦止めるね」

    これが「dubious ownership(疑わしい所有権)」の正体です。共有マシンで他ユーザー所有のリポジトリに対して任意コマンドが実行できてしまう脆弱性 (CVE-2022-24765) への対応として、所有者が一致しないリポジトリでの操作をデフォルトで拒否するようになりました。


    解決方法

    状況に合わせて、主に 2 つの解決策があります。

    1. Git に「このディレクトリは安全」と教える(おすすめ)

    エラーメッセージの中に表示されているコマンドをそのまま実行します。これが一番手っ取り早い方法です。

    git config --global --add safe.directory /var/www/vhosts/i-0cdd635c8d5d08a75/wp-content/plugins/event-publisher-on-aws

    ユーザーのグローバル設定(~/.gitconfig)に「このパスのリポジトリは信頼する」という例外ルールが追加されます。所有者を変更せずに済むため、Web サーバーのファイル権限を壊す心配がありません。

    2. 所有者を自分に変更する

    そのディレクトリを今後あなたがメインで管理するのであれば、所有権を変える方法もあります。

    sudo chown -R $(whoami) /var/www/vhosts/i-0cdd635c8d5d08a75/wp-content/plugins/event-publisher-on-aws

    ただし、Web サーバー(Apache や Nginx)がファイルを読み書きできなくなる可能性があるため、共有環境では慎重に判断してください。WordPress のプラグインディレクトリのように Web サーバーが書き込みする領域では、この方法は避けたほうが無難です。


    どちらを選ぶべきか

    基本的には 1 番の git config --global --add safe.directory ... を実行するのが安全で確実です。所有権を変えないので副作用が出ません。

    「いちいち個別に許可するのが面倒」という場合は、全てのディレクトリを例外にする設定もありますが、CVE-2022-24765 への防御を実質的に無効化することになるので、開発用ローカルマシン以外ではおすすめしません。

    # 全てのディレクトリでこのチェックを無効化する場合
    git config --global --add safe.directory '*'


    実行例

    実際にエラーが出たサーバーで対処したログがこちらです。

    [root@ip-172-31-55-163 event-publisher-on-aws]# git remote -v
    fatal: detected dubious ownership in repository at '/var/www/vhosts/i-0cdd635c8d5d08a75/wp-content/plugins/event-publisher-on-aws'
    To add an exception for this directory, call:
    
            git config --global --add safe.directory /var/www/vhosts/i-0cdd635c8d5d08a75/wp-content/plugins/event-publisher-on-aws
    
    [root@ip-172-31-55-163 event-publisher-on-aws]# git config --global --add safe.directory /var/www/vhosts/i-0cdd635c8d5d08a75/wp-content/plugins/event-publisher-on-aws
    
    [root@ip-172-31-55-163 event-publisher-on-aws]# git fetch origin
    [root@ip-172-31-55-163 event-publisher-on-aws]# git pull origin main
    From https://github.com/hideokamoto/event-publisher-on-aws
     * branch            main       -> FETCH_HEAD
    Already up to date.

    safe.directory を追加したあとは、git fetchgit pull も問題なく通るようになりました。エラーメッセージが提示するコマンドをそのまま叩くだけで解決するパターンが多いので、まずは 1 番の方法を試してみてください。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark