バグ #290
未完了
www.torutk.comサーバーで gitのpushがエラー
高橋 徹 さんが約1ヶ月前に追加.
約1ヶ月前に更新.
説明
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
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 をデフォルトのオフからオンに変更すること。
リモートからの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 は含まれていない。
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
:
新たにリポジトリから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
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で無事ローカルにリポジトリが展開できた。
- 説明 を更新 (差分)
- ステータス を 進行中 から 解決 に変更
- 進捗率 を 50 から 80 に変更
他の形式にエクスポート: Atom
PDF