星期五, 5月 21, 2010

20100521_TWNIC_SELinux

引入 SElinux的好處
  • 針對Process 來限制規範權限
  • 也可以針對 root 使用者來進行程式的限制

觀察  SElinux
#sestatus

設定是否要強制規範SElinux
#setenforce

#setenforce  0

觀察  SElinux
#sestatus

相關設定檔
/etc/sysconfig/selinux

觀察 SElinux   相關設定
#getsebool  -a

只限制 /etc/init.d/*  內的 script 來規範 SElinux
  • 也就是說只要非 /etc/init.d/ 下面的 scripts 就不會列入 SElinux的保護
  • 沒有 純文字的設定來改 預設的 SElinux的保護路徑, 因為儲存在 db 內, 可以使用 dump的方式來更改

SElinux 可以設定程式不可以 listen port

權限控管機制項目
  • DAC ( Discretionary Access Control )
    • 自主存取控制
    • 傳統的權限控管方式, 依照身份來決定
  • MAC 
    • 強制存取控制
    • 根據條件來進行控管
    • 實際上, process 要先符合  DAC 規範, 並通過MAC的限制才可以存取

SElinux 策略切記不要設定 disable 後又切換到enforce (會死機)
  • 可以在開機的時候利用 selinux=0 引數來停用 selinux ( 萬一打不開 )
  • 解決方式
    • 如果設定為SELINUX=disable 又改設定為 SELINUX=enforce 應該先設定為  SELINUX=permissive 不可以直接啟用SELINUX=enforce
    • 然後啟動重新標記 Step 1. 建立 # touch  /.autorelabel ( 這樣開機的時候會重新建立 label ) Step 2. #reboot
    • 如果要從 SELINUX=permissive 轉到SELINUX=enforce 也要重新標記

規則檔存放路徑
/etc/selinux/targeted/policy

-- 中午休息 --

Security Context 組成
  • 一般格式組成
    •  identity:role:type
    • 身份識別:角色:類型

舉例來說
[root@localhost ~]# ls -Z
-rw-------  root root system_u:object_r:user_home_t    anaconda-ks.cfg
drwxr-xr-x  root root root:object_r:user_home_t        Desktop
-rw-r--r--  root root root:object_r:user_home_t        install.log
-rw-r--r--  root root root:object_r:user_home_t        install.log.syslog

[max@localhost ~]$ ls -aZ
drwx------  max  max  system_u:object_r:user_home_dir_t .
drwxr-xr-x  root root system_u:object_r:home_root_t    ..
-rw-------  max  max  root:object_r:user_home_t        .bash_history
-rw-r--r--  max  max  system_u:object_r:user_home_t    .bash_logout
-rw-r--r--  max  max  system_u:object_r:user_home_t    .bash_profile
-rw-r--r--  max  max  system_u:object_r:user_home_t    .bashrc
drwxr-xr-x  max  max  system_u:object_r:user_home_t    .mozilla
-rw-------  max  max  user_u:object_r:user_home_t      .Xauthority



觀察   Security Context
一般來說可以指令加上  -Z 來觀察
例如

# id -Z
root:system_r:unconfined_t:SystemLow-SystemHigh
# ls -Z
-rw-------  root root system_u:object_r:user_home_t    anaconda-ks.cfg
drwxr-xr-x  root root root:object_r:user_home_t        Desktop
-rw-r--r--  root root root:object_r:user_home_t        install.log
-rw-r--r--  root root root:object_r:user_home_t        install.log.syslog

Notes:
  • 如果 SELINUXTYPE=targeted 前面兩個欄位幾乎沒有功能, 在SELINUXTYPE=strict 才比較有作用
  • 一般來說會看 type 來決定規範, type 又可以稱為 domain
    • 查詢的方式, 例如 # sesearch  -a  |  grep 'allow httpd_t'        ( httpd_t 為type 名稱 )
    • 內容就是針對該process 可以執行的行為, 例如
    • allow httpd_t httpd_sys_script_exec_t : file { ioctl read getattr lock execute };

SELinux Boolean項目
  • /etc/selinux/booleans 存放目錄
  • 使用 getsebool 來觀察
    • #getsebool -a | cat -n | grep httpd


SELinux 錯誤trouble shooting
  • 藉由 #setsebool 服務名稱_disable_trans=1 來停止SELinux對該服務的干涉( 此為暫時性的作法)
  • 藉由 #setsebool  -P 服務名稱_disable_trans=1 來停止SELinux對該服務的干涉 ( 會存入設定檔, 永久生效 )
  • 例如
    • [root@localhost booleans]# getsebool -a |cat -n |  grep httpd_disable_trans
         102 httpd_disable_trans --> off
      [root@localhost booleans]# setsebool httpd_disable_trans=1
      [root@localhost booleans]# getsebool -a |cat -n |  grep httpd_disable_trans
         102 httpd_disable_trans --> on
      [root@localhost booleans]# setsebool httpd_disable_trans=0
      [root@localhost booleans]# getsebool -a |cat -n |  grep httpd_disable_trans
         102 httpd_disable_trans --> off
  • 可以透過 chcon 來變更檔案目錄的security context, 例如
    • [root@localhost booleans]# mkdir /home/max/test
      [root@localhost booleans]# ls -Zd /home/max/test
      drwxr-xr-x  root root root:object_r:user_home_t        /home/max/test
      [root@localhost booleans]# chcon -R -t httpd_sys_content_t /home/max/test/
      [root@localhost booleans]# ls -Zd /home/max/test
      drwxr-xr-x  root root root:object_r:httpd_sys_content_t /home/max/test
  • 如果對某一個路徑( 目錄 )設定 type, 在該目錄底下建立的檔案會繼承該type ,但是要注意像 cp -a 的方式, 他的type 未必會繼承,例如
    • [root@localhost test]# touch /home/max/test/testfile
      [root@localhost test]# ls -Zd /home/max/test
      drwxr-xr-x  root root root:object_r:httpd_sys_content_t /home/max/test
      [root@localhost test]# ls -Z /home/max/test
      -rw-r--r--  root root root:object_r:httpd_sys_content_t testfile
      [root@localhost test]# cp /etc/passwd  /home/max/test/
      [root@localhost test]# ls -Z /home/max/test
      -rw-r--r--  root root root:object_r:httpd_sys_content_t passwd
      -rw-r--r--  root root root:object_r:httpd_sys_content_t testfile
      [root@localhost test]# cp -a /etc/passwd  /home/max/test/passwd2
      [root@localhost test]# ls -Z /home/max/test
      -rw-r--r--  root root root:object_r:httpd_sys_content_t passwd
      -rw-r--r--  root root system_u:object_r:etc_t          passwd2
      -rw-r--r--  root root root:object_r:httpd_sys_content_t testfile

SELinux  GUI 管理工具
  • 套件名稱 policycoreutils-gui
  • 指令 system-config-selinux

參考資料
Notes:
  • samba 伺服器
    • 分享目錄一般要將type 設定為 samba_share_t
    • 利用 chcon  -t  samba_share_t   路徑改變
    • 家目錄的問題
    • [root@localhost test]# getsebool -a | grep samba_enable_home
      samba_enable_home_dirs --> off
      [root@localhost test]# setsebool samba_enable_home_dirs=1
      [root@localhost test]# getsebool -a | grep samba_enable_home
      samba_enable_home_dirs --> on
  • ftp 伺服器
    • 要enable home directory
      • [root@localhost test]# getsebool -a | grep ftp_h
      • ftp_home_dir --> off
      • [root@localhost test]# setsebool ftp_home_dir=1
      • [root@localhost test]# getsebool -a | grep ftp_h
      • ftp_home_dir --> on

如果觀察 SELinux Trouble shooting

首先 setroubleshootd 必須要執行 
# /etc/init.d/setroubleshoot status
setroubleshootd (pid  21958) 正在執行...

然後使用  sealert  指令觀察相關訊息
方式為 sealert -l  XXXXXXXXXX訊息代碼 ( 藉由觀察 /var/log/messages 取得 )


可以使用 semanage 來管理
假設要知道 httpd 可以在那一個port Listen
semanage  port  --list  | grep  httpd

新增定義的port 給httpd
semanage  port  -a  -t http_port_t  -p tcp  1234



沒有留言: