プロジェクト

全般

プロフィール

バグ #290

未完了

www.torutk.comサーバーで gitのpushがエラー

高橋 徹 さんが約1ヶ月前に追加. 約1ヶ月前に更新.

ステータス:
解決
優先度:
通常
担当者:
カテゴリ:
-
対象バージョン:
-
開始日:
2025/03/25
期日:
進捗率:

80%

予定工数:
重要度:

説明

www.torutk.com の gitリポジトリへのpushでエラーと思われるメッセージが表示された。なお、pushで追加したコンテンツはリポジトリにpushされていた。

実施した手順

  • git clone http://www.torutk.com/git/swe.primus
  • ローカルで変更・コミット
  • % git push
    Username for 'https://www.torutk.com': XXXXXXXX
    Password for 'https://torutk@www.torutk.com': 
    warning: redirecting to https://www.torutk.com/git/swe.primus/
    Enumerating objects: 31, done.
    Counting objects: 100% (31/31), done.
    Delta compression using up to 10 threads
    Compressing objects: 100% (19/19), done.
    Writing objects: 100% (28/28), 45.33 KiB | 22.66 MiB/s, done.
    Total 28 (delta 2), reused 0 (delta 0), pack-reused 0
    remote: fatal: mmap failed: Permission denied
    To http://www.torutk.com/git/swe.primus
       e8a1f91..4fc15b6  master -> master
    

ここで、次のメッセージが気になる点
remote: fatal: mmap failed: Permission denied

  • SELinuxのログ
time->Tue Mar 25 09:24:22 2025
type=PROCTITLE msg=audit(1742862262.376:181379): proctitle=676974007570646174652D7365727665722D696E666F
type=SYSCALL msg=audit(1742862262.376:181379): arch=c000003e syscall=9 success=no exit=-13 a0=0 a1=5504 a2=1 a3=2 items=0 ppid=572449 pid=572455 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="git" exe="/usr/bin/git" subj=system_u:system_r:git_script_t:s0 key=(null)
type=AVC msg=audit(1742862262.376:181379): avc:  denied  { map } for  pid=572455 comm="git" path="/var/lib/git/swe.primus.git/objects/pack/pack-ba2976612c233b683714126c6161cee998c36630.idx" dev="vda4" ino=269934671 scontext=system_u:system_r:git_script_t:s0 tcontext=unconfined_u:object_r:git_rw_content_t:s0 tclass=file permissive=0

原因・対処

Apache Webサーバーから起動される git コマンドは、SELinuxの検査対象となる。
gitコマンドがhttpdコンテクストで実行され、/var/lib/git下のhttpd_var_lib_tコンテクストにアクセスする際にシステムコール mmap が許可されていないため。

対処は、SELinuxのブール値 domain_can_mmap_files をデフォルトのオフからオンに変更すること。

高橋 徹 さんが約1ヶ月前に更新

リモートからのhttpプロトコルでの git push は、apache web server(httpd)プロセスが実行するので、httpdプロセスのタイプとgit アクセス先のディレクトリ・ファイル(/var/lib/git以下)のSELinux設定が影響している。

httpdプロセス

system_u:system_r:httpd_t:s0    apache    572438  0.0  1.0 561860 21396 ?        Sl   09:24   0:02 /usr/sbin/httpd -DFOREGROUND

$ ls -Z /var/lib/git
unconfined_u:object_r:git_rw_content_t:s0 swe.primus.git

sesearch で、httpd_t タイプから git_rw_content_t へのアクセスで許可されているのは

allow httpd_t git_rw_content_t:dir { add_name getattr ioctl lock open read remove_name search write }; [ httpd_builtin_scripting ]:True

allow httpd_t git_rw_content_t:file { append create getattr ioctl link lock open read rename setattr unlink write }; [ httpd_builtin_scripting ]:True

となっており、map は含まれていない。

高橋 徹 さんが約1ヶ月前に更新

CentOS 7でapache経由のgitサーバーを構築 に記載のSELinux設定をしていると、
/var/lib/git のコンテキストは、httpd_var_lib_tになるはず。なので、おそらく、CentOS 7からRocky Linux 8へ変更したときにSELinux設定が戻ってしまったのが原因と推定。

処置は、上述Wikiページ記載の通り。

~$ sudo semanage fcontext -a -t httpd_var_lib_t '/var/lib/git(/.*)?'
File context for /var/lib/git(/.*)? already defined, modifying instead
~$ sudo semanage fcontext -a -t httpd_sys_script_exec_t '/var/lib/git/[^/]+/hooks(/.*)?'
File context for /var/lib/git/[^/]+/hooks(/.*)? already defined, modifying instead
~$ sudo restorecon -v -R /var/lib/git
Relabeled /var/lib/git from unconfined_u:object_r:git_rw_content_t:s0 to unconfined_u:object_r:httpd_var_lib_t:s0
  :

高橋 徹 さんが約1ヶ月前に更新

新たにリポジトリからcloneを実施したところ、エラーとなるようになった。

work$ git clone http://www.torutk.com/git/swe.primus swe.primus.trial.1
Cloning into 'swe.primus.trial.1'...
warning: redirecting to https://www.torutk.com/git/swe.primus/
fatal: expected flush after ref listing

このとき、SELinuxのエラーは発生している。

type=SYSCALL msg=audit(1742948235.482:232586): arch=c000003e syscall=9 success=no exit=-13 a0=0 a1=5504 a2=1 a3=2 items=0 ppid=607147 pid=607148 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="git" exe="/usr/bin/git" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1742948235.482:232586): avc:  denied  { map } for  pid=607148 comm="git" path="/var/lib/git/swe.primus.git/objects/pack/pack-ba2976612c233b683714126c6161cee998c36630.idx" dev="vda4" ino=269934671 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:httpd_var_lib_t:s0 tclass=file permissive=0

高橋 徹 さんが約1ヶ月前に更新

httpdからのgitアクセスでSELinuxログに記録されたエラーから、許可ポリシーを生成してみた。

~$ sudo ausearch -m avc -ts today|audit2allow

#============= httpd_t ==============

#!!!! This avc can be allowed using the boolean 'domain_can_mmap_files'
allow httpd_t httpd_var_lib_t:file map;

ブール値 domain_can_mmap_files をonにするとよいとのメッセージが出た。

ブール値を確認してみたところ、

~$ sudo semanage boolean -l|grep domain_can_mmap
domain_can_mmap_files          (オフ   ,   オフ)  Allow domain to can mmap files

と設定がoffになっていたので、これをonにする

sudo semanage boolean --modify --on domain_can_mmap_files

git cloneで無事ローカルにリポジトリが展開できた。

高橋 徹 さんが約1ヶ月前に更新

  • 説明 を更新 (差分)
  • ステータス進行中 から 解決 に変更
  • 進捗率50 から 80 に変更

他の形式にエクスポート: Atom PDF