Unix – 禁止某使用者登入

這裡討論的內容以 FreeBSD 為主,可能會與 linux 系的不同。

「身為一個專業的網管,有時將一個看不順眼的使用者停權也是非常合情合理的。」

有時我們會需要將某一個使用者停權,讓他暫時不能登入系統, 請注意!是「暫時」不能登入而已,所以不能直接刪除他的帳號, 不然之後就沒辦法回復了。

那要怎麼做呢?事實上有很多種方法可以做到這一點,差別只是方法有好有壞而已, 我在這裡簡單分成三種類型的方式,分別為「針對使用者的方法」、「針對密碼的方法」和「針對 login shell 的方法」, 並稍微做一個比較。

針對使用者的方法

這種方法很簡單,就是使用 vipw 指令編輯密碼檔, 然後在該使用者那一行最前加上「#」。 比如說若我要將可惡的 marco 停權,我可以這麼做:

>>> sudo vipw

然後在 marco 那一行前面加上 「#」

#marco:$1$65Y.0rv4$DSzwced814r9dA2ZSodLQ0:1001:1001::0:0:marco li:/home/marco:/bin/tcsh
Code language: PHP (php)

這個做法的意思其實就是把這一行註解掉,於是這個使用者就「不存在」了, 自然就不能登入系統,之後回復的辦法也很簡單,就是把「#」去掉即可。

不過這個方法的壞處是在停權的期間,無法用「id」這個指令找到這個使用者, 而且這個使用者的檔案,上面的使用者的資訊也只剩 UID,對大部分的使用者而言, 只看 UID 這個數字並不知道到底是誰,所以會有一點不方便。

另外,除了加「#」外,也可以加「-」代替,比如說

-marco:$1$65Y.0rv4$DSzwced814r9dA2ZSodLQ0:1001:1001::0:0:marco li:/home/marco:/bin/tcsh
Code language: JavaScript (javascript)

基本上結果加「-」和加「#」幾乎完全沒有區別,缺點也和上面說的一樣, 所以單看你喜歡用什麼方法,如果覺得「-」比較性感,那就用這個吧。

不過由於這個方法的缺點是使用者的資訊會消失,所以一般來說並不是很推薦使用。

針對密碼的方法

這個方法一樣是要使用「vipw」編輯密碼檔,但卻是對使用者的密碼動手腳, 不過當然不是隨便亂改別人的密碼,而是有規則的,這樣才比較容易回復。

這個方法就是在使用者密碼前面加上「*」,這樣一來,因為密碼永遠都不可能對上, 自然就不能登進入。

marco:*$1$65Y.0rv4$DSzwced814r9dA2ZSodLQ0:1001:1001::0:0:marco li:/home/marco:/bin/tcsh
Code language: JavaScript (javascript)

而回復也很容易,只要之後把「*」去掉即可,而且和第一種方法比起來, 使用者資訊可以保留下來,所以「id」是可以找到這個使用者的。

但是加「」也有一些小缺點,那就是「」看起來並不顯眼,所以若直接瀏覽下來很容易就會沒注意到, 更好的方式是改換成在前面加上「LOCKED」。

marco:*LOCKED*$1$65Y.0rv4$DSzwced814r9dA2ZSodLQ0:1001:1001::0:0:marco li:/home/marco:/bin/tcsh
Code language: JavaScript (javascript)

這樣子一來,簡單清楚明瞭,棒極了。

不過身為一個懶惰的網管,每次停權一個人,還要打這麼多字,實在有一點麻煩。 所以事實上,還有另一個更好的辦法(偷懶的辦法),就是使用指令「pw」。

比如想停權該死的 marco 這個使用者,只要打上

>>> sudo pw lock marco

就可以輕鬆的停權 marco 了,而事實上「pw」就是在做我剛剛說的事情, 就是在密碼那一欄前面加上「LOCKED」。

而且 pw 還很好心的另外提供一個回復的指令,那就是

>>> sudo pw unlock marco

這個指令做的事情也很簡單,其實就是將「LOCKED」去掉而已。 所以使用「pw」來停權是一個非常方便,而且推薦的辦法。

針對 login shell 的方法

事實上,還有第三種方法也是非常推薦的,就是將使用者的 shell 改成 /sbin/nologin。 這種方法一樣可以保留使用者的資訊,而且還有前述方法沒有的好處。

舉例來說,若果然還是想把萬惡的 marco 停權的話,那就可以改成:

marco:$1$65Y.0rv4$DSzwced814r9dA2ZSodLQ0:1001:1001::0:0:marco li:/home/marco:/sbin/nologin
Code language: JavaScript (javascript)

之前提到的方法,使用者都是完全登不進系統的, 所以其實沒辦法判別自己到底是帳密打錯了呢?還是被停權了? 但是若使用這個方法如果 marco 輸入正確的帳密是可以登得進系統的,只是一登入系統, 就會跳出下面訊息

This account is currently not available.

然後才踢掉,所以 marco 可以很清楚的知道自己到底是帳密打錯了,還是被停權了。 但也不是說這個方法就比上一種好,因為這個方法的缺點是把人家的 login shell 改掉了, 因此回復的時候就會比較麻煩一點,所以也不是完美的方法。

結論

我認為三種方法都是好方法,網管們可以依不同的情況使用不同的方法, 所以看在我打字打得這麼辛苦的份上(還有可憐的 marco 因為測試被停權這麼多次的份上), 還是都每個方法都用用看吧。

發表迴響