星期一, 1月 09, 2006

[.Net]mono 與 SELinux

重灌 server 並啟用 SELinux 以後,發現 asp.net 應用程式無法啟動.
原本不想碰 SELinux 的,不得已,出來混的早晚都要還,只好硬著頭皮去K.

經過研讀文件之後,大致上對 SELinux 有一定的瞭解.
SELinux 本身純粹是作安全性的加強,所以不管是 user, file, directory, socket, process...等等的,都另外有了 security context,作為安全性的第二道防線.
當系統要存取這些資源的時候,首先會使用原有的 unix permission 去作檢查,接著 SELinux 會再依照 security context 作第二道檢查,當檢查沒問題之後,才會允許存取.

SELinux 裡面有所謂的 identity, domain, type, security context, target context 等等物件...
大致上來說, identity 決定身份, domain 決定 process 能幹麼, type 決定 process 以外的物件可以幹麼, security context, target context 則是 identity + domain + type 的組合. policy 則用來定義 security context, target context 可以存取哪些物件. (這些組合,真的很讓人頭暈.)

存取的指令也蠻多的:
  • 要看檔案目錄的 security context, 可以加上 -Z (ls -Z)
  • 要看process的 security context, 也可以用 -Z (ps axZ)
  • 要看自己的security context,可以用 id
  • 要改security context, 可以用 chcon
  • 要 reset security context, 可以用 restorecon
  • ...


整個研讀完之後,發現應該是 policy 問題.
今天下午用Google去找到這篇文章,發現有這麼個工具 - audit2allow,他是在 policycoreutils 套件裡面的指令,可以根據 warning message 產生 policy,省掉不少編寫的麻煩.

為了要能重新編譯 policy, 你需要安裝 selinux-policy-targeted-sources 這個套件
yum install selinux-policy-targeted-sources


再使用 audit2allow 這個指令,從 dmesg 裡面分析 warning, 並將產生以後的 policy 寫入到 mono.policy 檔案中.
audit2allow -d -o mono.policy

接著把 mono.policy 更名為 local.te, 放到 /etc/selinux/targeted/src/policy/domains/misc/ .
放完之後,切換到 /etc/selinux/targeted/src/policy
強制 selinux 重新編譯 policy
make load

最後重新啟動我的 Apache server,就大功告成了.

參考資料:

沒有留言: