- 論壇徽章:
- 2
|
22:為啥我已經(jīng)是Root了,但是對(duì)系統(tǒng)進(jìn)行修改升級(jí)仍然沒(méi)有權(quán)限呢?
securelevel
FreeBSD kernel 有個(gè)觀念叫 securelevel。當(dāng)還有人在爭(zhēng)論這是不是夠完美時(shí),這個(gè)
機(jī)制已經(jīng)夠防止大部份的 "script kiddiez"。Securelevel 是指你的 kernel 在執(zhí)行時(shí)
的安全等級(jí)。每一個(gè)等級(jí)具有不同的保護(hù)和檢查機(jī)制。這些是 init( 的 man page:
The kernel runs with four different levels of security. Any superuser
process can raise the security level, but only init can lower it. The
security levels are:
Kernel 可以以四種不同的安全等級(jí)來(lái)執(zhí)行。任何 superuser process 可以提高安全
等級(jí), 但是只有 init 可以降低它。這四種等級(jí)分別是:
-1 Permanently insecure mode - always run the system in level 0 mode.
永遠(yuǎn)不安全模式 - 切換到 level 0 吧!
0 Insecure mode - immutable and append-only flags may be turned off.
All devices may be read or written subject to their permissions.
不安全模式 - "不可更動(dòng)"和"只能附加"這兩個(gè)旗標(biāo)(flag)可以被改變。所有的
devices 可以照著它們的讀寫(xiě)權(quán)限被讀寫(xiě)。
1 Secure mode - the system immutable and system append-only flags may
not be turned off; disks for mounted filesystems, /dev/mem, and
/dev/kmem may not be opened for writing.
安全模式 - "不可更動(dòng)"和"只能附加" 的旗標(biāo)不能被取消; mount 上來(lái)的檔案系
統(tǒng), /dev/mem, 和 /dev/kmem 不能寫(xiě)入。
2 Highly secure mode - same as secure mode, plus disks may not be
opened for writing (except by mount(2)) whether mounted or not.
his level precludes tampering with filesystems by unmounting them,
but also inhibits running newfs( while the system is multi-user.
高安全模式 - 和安全模式一樣, 又多加了不管硬碟有沒(méi)有被 mount 起來(lái),
除了 mount(2) 之外都不能寫(xiě)入。它防止一個(gè)檔案系統(tǒng)在 umount 的時(shí)候被
搞亂。而且在這個(gè)等級(jí)也禁止在 multi-user 時(shí)執(zhí)行 newfs(。
如果安全等級(jí)最初是 -1, 那麼 init 就會(huì)保持原狀。否則在 single user mode 時(shí),
init 會(huì)把安全等級(jí)調(diào)到 0, 而在 multiuser mode 時(shí)會(huì)以 1 來(lái)跑。如果你希望在
multiuser 模式是以等級(jí) 2 在跑, 你可以先進(jìn)入 single user mode, 編輯 /etc/rc,
使用 sysctl 來(lái)更動(dòng)。
若是你的系統(tǒng)只拿來(lái)跑 web server 之類(lèi)的, 你可以放心的將 securelevel調(diào)高到2。
但若是你要跑 X server, 把你的 securelevel 調(diào)至 1 或更高會(huì)導(dǎo)致一些問(wèn)題。因?yàn)?br />
X server 必須要寫(xiě)入 /dev/mem 和 /dev/kmem, 而 securelevel 1 不允許你這麼做。
有一個(gè)解決的方法是, 在啟動(dòng) X server 後再調(diào)高 securelevel。但我的意見(jiàn)是, 如果
你跑 X server 的話, 你已經(jīng)有了其它的安全問(wèn)題須要考量, 而不止是 securelevel。
以下這個(gè)指令會(huì)顯示出你目前的 securelevel 設(shè)定值。
# sysctl kern.securelevel
如果要提高你的 securelevel:
# sysctl -w kern.securelevel=X
X 可以是 0, 1 或 2。
又在 securelevel 是 1 的話, 你在 "make world" 時(shí)也會(huì)有些問(wèn)題。因?yàn)?"make
install" 時(shí)會(huì)在 kernel 上加上 immutable flag:
# ls -lo /kernel
-r-xr-xr-x 1 root wheel schg 1061679 Jun 30 01:27 /kernel
"schg" flag 會(huì)防止你安裝新的 kernel:
nfr# id
uid=0(root) gid=0(wheel) groups=0(wheel), 2(kmem)
nfr# sysctl kern.securelevel
kern.securelevel: 2
nfr# rm -rf /kernel
rm: /kernel: Operation not permitted
nfr# mv /kernel /tmp/
mv: rename /kernel to /tmp//kernel: Operation not permitted
如果你在 securelevel 1 或 2, 那麼 schg flag 是不能被改變的。
# chflags noschg /kernel
chflags: /kernel: Operation not permitted
值得留意的是, /boot.config 可以改變你開(kāi)機(jī)時(shí)的系統(tǒng)設(shè)定,要預(yù)防有心人篡改
你應(yīng)該這麼做:
# touch /boot.config
# chflags schg /boot.config
你可以看看系統(tǒng)預(yù)設(shè)還有那些執(zhí)行檔是有 schg flag 的。
# ls -lo /sbin | grep schg
-r-x------ 1 bin bin schg 204800 Jul 19 20:38 init
# ls -lo /bin | grep schg
-r-sr-xr-x 1 root bin schg 192512 Jul 19 20:36 rcp
再回過(guò)頭來(lái)談?wù)勬i定系統(tǒng)這件事吧! 既然剛剛談到了 immutable flags, 何不試著把整
個(gè) /sbin 和 /bin 都設(shè)成 schg flag 呢 !? 這會(huì)給想 crack你系統(tǒng)的人一點(diǎn)小挫折。
(假設(shè)你的系統(tǒng)也正以適當(dāng)?shù)?securelevel 咦髦?
# chflags schg /bin/*
# chflags schg /sbin/*
不過(guò) /sbin 可能被改成別的名字,再重新創(chuàng)造一份新的 /sbin ,所以改變 /sbin 與
/bin 的 schg flag 是很合理的想法,我們可以依照以下的方式改變 /sbin 和 /bin
的 schg flag:
# chflags schg /bin/*
# chflags schg /sbin/*
這些 schg flag 的檔案會(huì)讓你在 "make world" 時(shí)有問(wèn)題。
("make installworld" 也是)
無(wú)論如何 ,最好是以 single user 模式來(lái) "make world"。有關(guān) "makr world" 的相
資訊, 還有為什麼要這麼做, 到下面這個(gè)網(wǎng)頁(yè)來(lái)看看:
http://www.nothing-going-on.demo ... rld/make-world.html
現(xiàn)在你已經(jīng)適當(dāng)?shù)逆i定你的系統(tǒng), 也以只跑必要的的 service, 而檔案系統(tǒng)也適當(dāng)?shù)?br />
mount 上來(lái), 且也以適合的 kernel securelevel 咦髦小?
與以上所述的相關(guān) man pages 有: init(, chflags(1), sysctl(。 |
|