最近公司有個場景,需要限制使用者登陸以後可以執行的命令,從而提高系統的安全性。本身bash已經有了乙個受限制的版本叫做rbash,我們在這個基礎上還可以通過環境變數的方式對使用者做進一步的限制。
正常情況下用useradd xx
去建立使用者的時候給使用者配置的shell都是bash,這個可以通過檢視檔案/etc/passwd
或者是通過命令echo $shell
進行確認。
檢視bash命令的man頁面會發現bash還有乙個受限制模式,如下
當執行bash
命令的時候帶上-r
引數或者是--restricted
的時候,當前的shell就由普通的bash變成了受限制的shell,上圖紅框內的命令就都執行不了了,我這裡就不一一翻譯了,選取最前面的幾條羅列下
有了這個受限制的shell,使用者基本上就被限制在自己的home目錄下,並且只能執行path下的命令。
但是這個還不夠,我們還需要在不影響別的使用者的前提下將受限制使用者能執行的命令進行限制,換句話說,需要繼續限制該使用者的path環境變數所包含的命令集合。如果我們能夠將允許使用者執行的命令都放在乙個目錄中,再將這個目錄指定為path,那麼就可以限制使用者能夠執行的命令了。下面看看怎麼在使用者登入的時候自動完成這一目標。
使用者在登入的時候會自動執行幾個檔案,來設定shell的環境變數,如下所示
/etc/profile - 對所有使用者生效,其中有乙個for迴圈會從/etc/profile.d中執行.sh格式的檔案
/etc/bashrc - 對所有使用者生效,如果使用者使用的是bash,會自動執行該檔案
~/.bash_profile - 放在使用者home目錄,對單使用者生效,如果存在.bashrc檔案還會執行該檔案
~/.bashrc - 每次使用者登入或者開啟新的shell的時候都會執行該檔案
我這裡的思路是在/etc/profile.d
中建立乙個.s**件,在其中設定好對應動作,這樣使用者登入以後就會自動執行該檔案,達到限制的目的。借鑑網上的經驗,可以直接忽略系統的profile檔案,然後使用自定義的profile檔案。
在/etc/profile.d
下建立login_tester.sh
如下
#!/bin/bashm=`
whoami`if
[["$"==
"tester"]]
;then
echo -e "\e[01;33m* ** 你目前登陸的是受限制的shell ** *\e[00m"
## 建立命令集合
mkdir -p $home/bin
rm -f $home/bin/*
ln -s /bin/ls $home/bin
ln -s /bin/ping $home/bin
ln -s /usr/bin/ssh $home/bin/
ln -s /usr/bin/ssh-keygen $home/bin/
ln -s /usr/bin/expect $home/bin/
ln -s /bin/grep $home/bin/
## 設定環境變數
cat<< eof >
$home/.newbash_profile
export histfilesize=500000000
export histsize=99999999
export histtimeformat=
"%y/%m/%d_%h:%m:%s :"
export path=
$home/bin
export name=xiaofu
eof## 使用自定義profile檔案
chown$:
$$home/.newbash_profile
exec
bash --restricted --noprofile --rcfile $home/.newbash_profile
fi
首先判斷登陸的使用者是誰,如果是tester使用者,會執行下面的操作。
第一部分是建立命令集合,在使用者的home目錄下建立bin目錄,採用軟連線的方式將可以被使用者執行的命令放到該目錄下;第二部分設定環境變數,在使用者的home目錄下建立.newbash_profile
檔案,和上面的4個檔案一樣,export設定環境變數,需要注意的是這裡將path
設定為了第一步中的bin檔案,也就只讓使用者執行第一步中的幾個命令;第三部分使用自定義profile檔案,首先修改檔案許可權,保證使用者能執行,然後是比較關鍵的一步
exec
bash --restricted --noprofile --rcfile $home/.newbash_profile
這裡的--restricted
是將使用者的shell變為受限制的shell,--noprofile
是不載入系統的profile檔案,也就是好上面的4個檔案,然後是--rcfile
載入我們自定義的profile檔案。
這樣設定以後,使用者不能切換目錄,也只能使用受限制的幾個命令了。
下面建立使用者tester進行驗證。
從root切換到tester使用者會有下面的提示
如果執行不被允許的命令會有提示
bash-4.2$ cd
bash: cd: restricted
bash-4.2$ cp
bash: cp: command not found
並且可以看到環境變數也配置成功
bash-4.2$ echo $path
/home/tester/bin
bash-4.2$ echo $name
xiaofu
這個指令碼目前只能針對tester使用者進行限制,如果有多個使用者,可以將受限制的使用者名稱放在乙個檔案中,然後用類似下面的格式去做迴圈判斷
#!/bin/bashm=`
whoami
`while
read name
doif[$m
==$name];
then
echo
"found it"
# 替換為建立自定義profile的指令碼
exit
fidone
< names.txt
echo
"not found"
如果在名單列表中找到了當前登陸的使用者則執行指令碼,否則不做任何操作,我這裡就不展開了,大家可以自己試試看。 Linux使用者環境變數
1 使用者環境變數配置檔案路徑,以abc使用者為例 home abc bash profile 2 修改配置檔案後不會立即生效,需執行 source home abc bash profile 以上是 永久生效 的修改方式,也是一般應用時所需的方式。如果只是想除錯一下環境變數,則可以用export指...
環境變數 使用者變數 系統變數
環境變數 environment variables 一般是指在作業系統中用來指定作業系統執行環境的一些引數,如 臨時資料夾位置和系統資料夾位置等。環境變數是在作業系統中乙個具有特定名字的物件,它包含了乙個或者多個應用程式所將使用到的資訊。例如windows和dos作業系統中的path環境變數,當要...
linux環境程式設計 環境變數 列印環境變數
在shell程式設計主題中,我們已經大致的介紹過 環境變數和本地變數啦 我們今天來具體的介紹介紹,那環境變數到底是什麼呢?是我 一.環境變數含義 特徵 環境變數是指 作業系統中用來指定作業系統執行環境的一下引數 1 特徵 字串 有統一的格式 名 值 值 值用來描述程序的環境資訊 2 使用形式 與命令...