2010年7月4日 星期日

Debian 5 安裝 selinux

阿哩, Debian 5 預設沒有安裝 selinux? 那來裝一下吧. 啟動亂裝大法, apt-cache search selinux, 看看有沒有可以裝的, 恩, selinux-utils, 這個看來有像, 裝! 還是沒有? 恩, selinux-policy-default 這個看來有像, 再裝! 這次裝了一堆東西, getenforce 顯示 Disabled, 還是沒有 selinux? 可是已經有 /etc/selinux/config 了, 難道要改成 SELINUX=enforcing? 好吧只好讓專業的來, 有請谷歌大神! 喔, 原來還要裝 selinux-basics (奇怪剛剛怎沒看到?). 裝好後還要啟用 selinux-activate

Activating SE Linux
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found kernel: /boot/vmlinuz-2.6.26-2-686
Updating /boot/grub/menu.lst ... done

SE Linux is activated. You may need to reboot now.

對 grub 動手腳? 我瞧瞧, 原來是加了個東西, selinux=1

kernel /boot/vmlinuz-2.6.26-2-686 root=/dev/hda1 ro selinux=1 quiet

還要請出呂布(reboot)...
重新啟動後, 指令 getenforce, 有了! 顯示 Enforcing.
疑? 怎麼 SSH 連不進去? 這也保護的太好了吧!

問題又來了, 在 selinux 啟用的狀況下, SSH 要如何能連線? 再請谷歌大神! 搞了老半天原來不是 SSH 連不進去, 而是連網卡 eth0 都沒有啟動, 這果然是終極的保護啊! 可奇怪了, 這是甚麼道理? selinux 我真搞不懂你啊! 把 selinux 關掉, 重開機 eth0 是會啟動的. 可是為什麼 /etc/init.d/networking 卻不能把 eth0 給啟動呢, 看了一下 script, 應該是用 ifup -a 來啟動的, 可是執行 ifup -a 一點反應也沒有? man 一下 ifup, man 說 -a 這個參數是 "If given to ifup, affect all interfaces marked auto", 要有 auto 才會啟動? 奇怪了? 原先沒加開機時也會啟動啊? 沒關係我加, 在 /etc/network/interfaces 加上 auto eth0

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
auto eth0
iface eth0 inet dhcp


執行 ifup -a 還真的有反應, /etc/init.d/networking start 也會動, 那重開機呢? 見鬼了, 在 selinux
enforcing 的狀況下, eth0 也會啟動了! 真是活見鬼. 那為什麼原先不加 auto? 加了 auto 甚麼事都沒有了.

不過好像還是怪怪的, ls -Zd /var/www/

system_u:object_r:var_t:s0 /var/www/

這不太對吧? 果然還需要動些手腳, 原來針對在 selinux 安裝後才裝的服務 (daemon), 還要這一步, 例如 apache

semodule -i /usr/share/selinux/default/apache.pp

然後對相關目錄 restorecon

restorecon -R -v /etc /usr/sbin /var/run /var/log /var/www

結果 ls -Zd /var/www/

system_u:object_r:httpd_sys_content_t:s0 /var/www/

這樣才對吧? 但這也太麻煩了吧? 我怎知是否有遺漏? 看到 /usr/share/selinux/default/ 還有一堆服務可套用, 但我怎知那些目錄要 restorecon? 而且如果我裝了奇怪或少見的軟體呢? 又或者我自己寫的程式呢? selinux 要如何才能提供適當的保護作用呢?

先試試 selinux 幾個相關的指令, ls -Z, 有; id -Z 有; ps -Z, 有; netstat -Z, 疑? 沒有? 不會吧? 難道是版本太舊? 但我要如何能看 netstat 的版本? 先試試 apt-cache search netstat, 恩, 可能是藏在 net-tools 裡面, 看一下版本, apt-cache show net-tools, 是 1.60-22, 谷歌一下, 沒錯 netstat 是屬於 net-tools, 但 1.60-22 已經是 stable 最新的版本了, 難道要試 unstable? 試就試! 抓下來裝好後, 版本是 1.60-23, 那 netstat -Z 呢? 挖哩! 還是沒有? 看來 debian 對 selinux 的支援還沒完全? 這麼顯而易見的問題都沒改進? 對 debian 有些失望了.

那我自己重新編譯 netsata 看看能不能把 selinux 給編進去. 好, 開始了, 以下是花了三天兩夜才搞出來的. 一開始問題就來了, 要如何取得 netstat 的原始碼呢? apt-get source net-tools 就行, 那要怎麼取得 patch 呢? Debian 自己家的都找不到, 只好把別家的拿來用, 抓了 net-tools-1.60-81.el5.src.rpm, 那 debian 可以直接裝 rpm 檔嗎? ㄟ, 還真的可以, apt-get install rpm, 我裝 rpm -ivh net-tools-1.60-81.el5.src.rpm, 可是 source 裝在哪兒呢? 我找, 原來藏在這 /usr/src/rpm/SOURCES, 看目錄裡面有啥, 發現早在 2006-01-17 就有 selinux 的 patch 了! 檔案名 net-tools-1.60-selinux.patch, 那我要如何 patch 呢? 把 net-tools-1.60-selinux.patch 放在 net-tools-1.60 目錄的前面, 指令

patch -p 0 < net-tools-1.60-selinux.patch

直接 make

netstat.o: In function `prg_cache_load':
netstat.c:(.text+0x26c2): undefined reference to `getpidcon'
netstat.c:(.text+0x2734): undefined reference to `freecon'
netstat.o: In function `main':
netstat.c:(.text+0x3229): undefined reference to `is_selinux_enabled'
collect2: ld returned 1 exit status
make: *** [netstat] Error 1

有 error, 我就知道沒那麼容易, 看來還缺東西, 但 getpidcon 是甚麼鬼? man getpidcon 也沒有東西, 但是有 getpidcon 這個指令, 原來 netstat 就是用 getpidcon 取得 context 的. 搞了好久是缺這東西 libselinux1-dev, 我裝, apt-get install libselinux1-dev, 裝好後, selinux 的頭 (header) 終於出來了, 藏在這 /usr/include/selinux/selinux.h, 這下可以 make 了吧? 結果還是出現一樣的錯誤訊息, 又搞了好久, 原來是 Makefile 沒有 patch 到, 缺了這幾行

ifeq ($(HAVE_SELINUX),1)
LDFLAGS += -lselinux
CFLAGS += -DHAVE_SELINUX
else
endif

難怪 link 不到, 這下可以 make 了吧? 終於成功了! netstat -Z 有東西了. 這中間有在 config.h 設定一行 #define HAVE_SELINUX 1, config.h 可執行 make config 先產生出來.

那如果直接把別家的 netstat 拿來用呢? 神奇了, 把 CenOS 5.5 的 netstat 拿到 Debian 5 還真的可以執行, netstat -Z 也有東西.

沒有留言:

張貼留言