- 论坛徽章:
- 2
|
22:为啥我已经是Root了,但是对系统进行修改升级仍然没有权限呢?
securelevel
FreeBSD kernel 有個觀念叫 securelevel。當還有人在爭論這是不是夠完美時,這個
機制已經夠防止大部份的 "script kiddiez"。Securelevel 是指你的 kernel 在執行時
的安全等級。每一個等級具有不同的保護和檢查機制。這些是 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 可以以四種不同的安全等級來執行。任何 superuser process 可以提高安全
等級, 但是只有 init 可以降低它。這四種等級分別是:
-1 Permanently insecure mode - always run the system in level 0 mode.
永遠不安全模式 - 切換到 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.
不安全模式 - "不可更動"和"只能附加"這兩個旗標(flag)可以被改變。所有的
devices 可以照著它們的讀寫權限被讀寫。
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.
安全模式 - "不可更動"和"只能附加" 的旗標不能被取消; mount 上來的檔案系
統, /dev/mem, 和 /dev/kmem 不能寫入。
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.
高安全模式 - 和安全模式一樣, 又多加了不管硬碟有沒有被 mount 起來,
除了 mount(2) 之外都不能寫入。它防止一個檔案系統在 umount 的時候被
搞亂。而且在這個等級也禁止在 multi-user 時執行 newfs(。
如果安全等級最初是 -1, 那麼 init 就會保持原狀。否則在 single user mode 時,
init 會把安全等級調到 0, 而在 multiuser mode 時會以 1 來跑。如果你希望在
multiuser 模式是以等級 2 在跑, 你可以先進入 single user mode, 編輯 /etc/rc,
使用 sysctl 來更動。
若是你的系統只拿來跑 web server 之類的, 你可以放心的將 securelevel調高到2。
但若是你要跑 X server, 把你的 securelevel 調至 1 或更高會導致一些問題。因為
X server 必須要寫入 /dev/mem 和 /dev/kmem, 而 securelevel 1 不允許你這麼做。
有一個解決的方法是, 在啟動 X server 後再調高 securelevel。但我的意見是, 如果
你跑 X server 的話, 你已經有了其它的安全問題須要考量, 而不止是 securelevel。
以下這個指令會顯示出你目前的 securelevel 設定值。
# sysctl kern.securelevel
如果要提高你的 securelevel:
# sysctl -w kern.securelevel=X
X 可以是 0, 1 或 2。
又在 securelevel 是 1 的話, 你在 "make world" 時也會有些問題。因為 "make
install" 時會在 kernel 上加上 immutable flag:
# ls -lo /kernel
-r-xr-xr-x 1 root wheel schg 1061679 Jun 30 01:27 /kernel
"schg" flag 會防止你安裝新的 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 可以改變你開機時的系統設定,要預防有心人篡改
你應該這麼做:
# touch /boot.config
# chflags schg /boot.config
你可以看看系統預設還有那些執行檔是有 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
再回過頭來談談鎖定系統這件事吧! 既然剛剛談到了 immutable flags, 何不試著把整
個 /sbin 和 /bin 都設成 schg flag 呢 !? 這會給想 crack你系統的人一點小挫折。
(假設你的系統也正以適當的 securelevel 咦髦?
# chflags schg /bin/*
# chflags schg /sbin/*
不過 /sbin 可能被改成別的名字,再重新創造一份新的 /sbin ,所以改變 /sbin 與
/bin 的 schg flag 是很合理的想法,我們可以依照以下的方式改變 /sbin 和 /bin
的 schg flag:
# chflags schg /bin/*
# chflags schg /sbin/*
這些 schg flag 的檔案會讓你在 "make world" 時有問題。
("make installworld" 也是)
無論如何 ,最好是以 single user 模式來 "make world"。有關 "makr world" 的相
資訊, 還有為什麼要這麼做, 到下面這個網頁來看看:
http://www.nothing-going-on.demo ... rld/make-world.html
現在你已經適當的鎖定你的系統, 也以只跑必要的的 service, 而檔案系統也適當的
mount 上來, 且也以適合的 kernel securelevel 咦髦小?
與以上所述的相關 man pages 有: init(, chflags(1), sysctl(。 |
|