sudo log

開啓sudo日誌,並驗證查看
2018年06月20日 11:10:57 hello墨寒 閱讀數 762
vim /etc/sudoers 進入sudoers 相關配置

Defaults logfile=/var/log/sudo //定義日誌記錄並指定存儲位置
Sudo 文件是自動生成 日誌大部分都是自動生成

用第二個賬戶 使用速度命令
跟蹤產看 sudo日誌 就是剛纔設置的sudo 存放位置
tail -f /var/log/sudo

生成記錄

簡介
系統管理員可以通過 sudo 實用程序讓用戶或組能夠作爲另一個用戶運行命令。換句話說,可以分派命令特權,而不需要另一個用戶的密碼。root 用戶通過在 /etc/sudoers 文件中設置 sudo 條目完成這個過程。使用 visudo 命令編輯此文件。在分派特權時,必須相信得到特權的用戶會慎重地使用它。這裏要澄清一個誤解:sudo 不僅用於讓用戶作爲 root 用戶運行某些命令;它主要用於讓另一個用戶作爲應用程序用戶/所有者運行應用程序或系統命令。如果系統上當前安裝了 sudo,它不會覆蓋現有的 sudoers 文件。但是,一定要保留 /etc/sudoers 的備份並閱讀升級說明。

安裝 sudo
下載 sudo 的最新版本。

本文並不介紹 sudo 的基本功能,而是討論不同的 sudo 特性。

對於本文,我使用 sudo version 1.7.2。如果您使用 AIX® 5.3,那麼一定要有最新的 gcc 版本 (4.0.0)。

export LIBPATH=/usr/lib

./configure --with-aixauth

make

make install

作爲 root 用戶使用以下命令檢查安裝的版本,查看構建選項和當前安裝的配置:

sudo -V

Sudo version 1.7.2
Sudoers path: /etc/sudoers
Authentication methods: 'aixauth'

< rest of output truncated>
從 1.6.9 版開始,在 sudo 執行給定的腳本或命令之前,會縮減一些系統環境變量(比如 LIBPATH)的設置。這會給在 sudo 下運行的現有命令造成問題。但是,在大多數情況下有辦法解決。

在默認情況下:

sudo 放在 /usr/local/bin 中。使用它作爲另一個用戶運行命令。
visudo 放在 /usr/local/sbin 中。使用它編輯 sudoers 文件。
sudoers 文件(如果還沒有的話)放在 /etc 中。這個文件包含 sudo 條目。
sudoers 文件
/etc/sudoers(通常簡稱爲 sudoers)文件控制誰可以使用 sudo 以及使用 sudo 運行什麼。 root 用戶或具有根特權的用戶可以設置這些條目。sudoers 中 sudo 條目最基本的形式如下:

<user> <host> = <user to alias> <password required> < command to run>
作爲某一用戶運行以下命令,可以看到此用戶能夠使用 sudo 運行什麼命令以及其他限制:

sudo -l
運行 sudo 命令的一般格式爲:

sudo -u < user to run as> <command to run>

日誌記錄
通過在 /etc/syslog.conf 文件中使用以下設置,可以使用 syslog 在 /var/adm/messages 中記錄通過 sudo 運行的所有命令:

*.debug /var/adm/messages
但是,我認爲 sudo 命令應該記錄在一個單獨的文件中,這樣便於查看已經運行的 sudo 命令。當然,這也有助於監視失敗的 sudo 活動。創建 /var/adm/sudo.log 文件,然後在 /etc/sudoers 文件中添加以下條目:

Defaults logfile=/var/adm/sudo.log
Defaults !syslog
現在,無論執行成功還是失敗,所有 sudo 活動都會記錄在 /var/adm/sudo.log 中。

管理 sudoers
隨着時間的推移,sudoers 文件中的條目會越來越多。這是因爲服務器上設置的應用程序環境越來越多,也可能因爲進一步分派當前任務以隔離責任。隨着條目增加,輸入錯誤會越來越常見。讓 root 用戶更方便地管理 sudoers 文件是有積極意義的。我們來討論兩種實現這個目標(至少建立良好的標準)的方法。如果有許多靜態條目(在有 sudo 的每臺機器上都運行相同的命令),那麼把這些命令放在一個單獨的 sudoers 文件中,這可以使用 include 指令來實現。

如果有許多用戶條目,在添加或刪除條目時會耗時很長。對於這種情況,好做法是對用戶進行分組。可以把用戶直接分組在一起,這些組是有效的 AIX 組。

現在詳細討論這兩種方法。

包含文件
在大型企業環境中,維護 sudoers 文件是一項重要且必須經常執行的任務。簡化這項任務的一個解決方案是重新組織 sudoers 文件。一種做法是提取出靜態或可重用的條目,它們在每臺機器上都運行相同的命令。與審計/安全或 storix 備份或一般性能報告一樣,現在可以對 sudo 使用 include 指令。主 sudoers 文件可以包含本地條目,包含文件包含靜態條目,所以很少需要編輯。在調用 visudo 時,它會掃描 sudoers。當看到 include 條目時,它會掃描此文件,然後返回到主 sudoers 文件繼續掃描。在從主 sudoers 文件退出 visudo 時,它會進入包含文件進行編輯。退出包含文件之後,返回到 AIX 提示。可以有多個包含文件,但是我不認爲有必要這麼做。

假設我們的輔助 sudoers 文件名爲 sudo_static.<hostname>。在本文的示例中,使用的主機名是 rs6000。在主 sudoers 文件中,設置以下條目:

#include /etc/sudo_static.rs6000
接下來,在 /etc/sudo_static.rs6000 文件中添加一些條目。不必設置所有 sudoers 指令或小節。如果這個文件包含不必要的條目,就不要包含它們。例如,我的包含文件只包含以下文本。

可以使用 %h 替代實際的主機名:

#include /etc/sudo_static.%h.

我個人不使用這種方法,因爲我遇到過返回的主機名包含額外字符的情況。這個問題在 sudo 1.7.2 p1 中已經糾正了。

bravo rs6000 = (root) NOPASSWD: /usr/opt/db2_08_01/adm/db2licd -end
bravo rs6000 = (root) NOPASSWD: /usr/opt/db2_08_01/adm/db2licd
bravo rs6000 = (db2inst) NOPASSWD: /home/db2inst/sqllib/adm/db2start
bravo rs6000 = (db2inst) NOPASSWD: /home/db2inst/sqllib/adm/db2stop force
在運行 visudo、保存並退出文件時,visudo 會讓您按 Enter 開始編輯包含 sudoers 文件。與主文件一樣,編輯此文件之後,sudo 會指出語法錯誤(如果有的話)。另外,可以使用

visudo -f /etc/sudo_static.rs6000
直接編輯包含文件。

使用組
屬於有效的 AIX 組的用戶可以包含在 sudoers 中,這樣針對單一用戶的條目更少,sudoers 文件更容易管理。在使用組重新組織 sudoers 條目時,可能需要在 AIX 中創建一個新的組,其中只包含允許使用 sudo 運行某些命令的用戶。要想使用組,只需在條目前面加上前綴 ‘%’。假設您有 devops 和 devuat 組,其中包含以下用戶:

lsgroup -f -a users devops

devops:
users=joex,delta,charlie,tstgn

lsgroup -f -a users devuat

devuat:
users=zebra,spsys,charlie
允許 devops 組作爲 dbdftst 運行 /usr/local/bin/data_ext.sh 命令。

允許 devuat 組作爲 dbukuat 運行命令 /usr/local/bin/data_mvup.sh 和 /usr/local/bin/data_rep.sh。

可以設置以下 sudoers 條目:

%devops rs6000 = (dbdftst) NOPASSWD: /usr/local/bin/data_ext.sh
%devuat rs6000 = (dbukuat) /usr/local/bin/data_mvup.sh
%devuat rs6000 = (dbukuat) /usr/local/bin/data_rep.sh
注意,對於前面的條目,devops 組中的用戶在執行 /usr/local/bin/data_ext.sh 時不會提示他們輸入密碼。但是,會提示 devuat 組中的用戶輸入密碼。用戶 “charlie” 是這兩個組(devops 和 devuat)的成員,所以他可以執行以上所有命令。

對 sudo 使用超時
sudo 的一個特性使用時間票據判斷自從最後一次運行 sudo 命令以來已經過了多長時間。在指定的時間段內,用戶可以重新運行命令而不會提示輸入密碼(此用戶自己的密碼)。超過這段時間之後,用戶必須再次輸入密碼才能重新運行命令。如果用戶提供了正確的密碼,就執行命令,票據復位,計時重新開始。如果在 sudoers 中此用戶的條目中有 NOPASSWD,票據特性是無效的。默認的超時是 5 分鐘。如果希望修改默認值,只需在 sudoers 中添加一個條目。例如,可以使用以下條目把用戶 “bravo” 運行任何命令的超時值設置爲 20 分鐘:

Defaults:bravo timestamp_timeout=20
作爲用戶使用以下命令銷燬票據:

$ sudo -k
銷燬票據之後,在運行 sudo 命令時會再次提示用戶輸入密碼。

請不要設置所有用戶的超時值,因爲這會造成問題,尤其是在運行花費時間比較長的作業集合時。在 timestamp_timeout 變量中使用 -1 值可以禁用這個特性。時間票據是 /var/run/sudo 中包含用戶名的目錄條目。

變量
正如前面提到的,sudo 會縮減系統變量,這可能有危險。可以使用 sudo -V 檢查哪些變量保持不變,哪些變量會被縮減。輸出顯示保持不變和縮減的變量列表。縮減 LIBPATH 顯然很不方便。有兩個解決方法 —— 編寫一個包裝器腳本或在命令行上指定環境。先看一下包裝器腳本解決方案,假設您的一個應用程序會停止或啓動 DB2® 實例。可以編寫一個腳本來保持變量不變。在 清單 1. rc.db2 中,使用以下代碼訪問實例配置文件,進而導出各個 LIBPATH 和 DB2 環境變量,這會保持環境變量不變:

. /home/$inst/sqllib/db2profile
sudoers 中執行此腳本的條目如下,它們不會縮減任何系統環境變量:

bravo rs6000 = (dbinst4) NOPASSWD: /home/dbinst4/sqllib/adm/db2start
bravo rs6000 = (dbinst4) NOPASSWD: /home/dbinst4/sqllib/adm/db2stop force
bravo rs6000 = (dbinst4) NOPASSWD: /usr/local/bin/rc.db2 stop db2inst4
bravo rs6000 = (dbinst4) NOPASSWD: /usr/local/bin/rc.db2 start db2inst4
在這個示例中,用戶 “bravo” 可以作爲用戶 “dbinst4” 執行以上命令。通常,這個用戶會運行:

sudo -u dbinst4 /usr/local/bin/rc.db2 stop db2inst4
sudo -u dbinst4 /usr/local/bin/rc.db2 start db2inst4
清單 1. rc.db2
#!/bin/sh

rc.db2

stop/start db2 instances

check to see if db2 inst is runningdb2_running(){state=`ps -ef |grep db2sysc

                |grep -v grep| awk '$1=="'${inst}'" { print $1 }'`

if [ "$state" = "" ]
then
return 1
else
return 0
fi}

usage ()

{
echo "basename $0 start | stop <instance>"
}

stop db2

stop_db2 ()
{
echo "stopping db2 instance as user $inst"
if [ -f /home/$inst/sqllib/db2profile ]; then
. /home/$inst/sqllib/db2profile
else
echo "Cannot source DB2..exiting"
exit 1
fi
/home/$inst/sqllib/adm/db2stop force
}

start db2

start_db2 ()
{
echo "starting db2 instance as user $inst"
if [ -f /home/$inst/sqllib/db2profile ]; then
. /home/$inst/sqllib/db2profile
else
echo "Cannot source DB2..exiting"
exit 1
fi
/home/$inst/sqllib/adm/db2start
}

check we get 2 params

if [ $# != 2 ]
then
usage
exit 1
fi

inst=$2

case "$1" in
Start|start)
if db2_running
then
echo "db2 instance $inst appears to be already running"
exit 0
else
echo " instance not running as user $inst..attempting to start it"
start_db2 $inst

    fi
    ;; 

Stop|stop)
if db2_running
then
echo "instance running as $inst..attempting to stop it"
stop_db2 $inst
else
echo "db2 instance $inst appears to be not running anyway"
exit 0
fi
;;
*) usage
;;
esac
保留系統環境變量的另一種方法是在 sudoers 中使用 Defaults !env_reset 指令:

Defaults !env_reset
然後,在命令行上指定環境變量名和值:

$ sudo LIBPATH=″/usr/lib:/opt/db2_09_05/lib64″ -u delta /usr/local/bin/datapmp
如果沒有設置 !env_reset 條目,那麼在試圖運行命令時會從 sudo 收到以下錯誤:

sudo: sorry, you are not allowed to set the following environment variables: LIBPATH
如果發現 sudo 還會縮減其他環境變量,那麼可以在 sudoers 中指定變量名(使用 Defaults env_keep += 指令),讓 sudo 保持這些變量不變。例如,假設對於我的一個使用 sudo 的腳本,sudo 會縮減應用程序變量 DSTAGE_SUP 和 DSTAGE_META。爲了保留這些變量,可以在 sudoers 中設置以下條目:

Defaults env_keep += "DSTAGE_SUP"
Defaults env_keep += "DSTAGE_META"
注意,我指定了變量名,但是沒有指定變量值。值已經包含在我的腳本中,比如:

export DSTAGE_SUP=/opt/dstage/dsengine; export DSTAGE_META=/opt/dstage/db2
現在,在執行這個腳本時,這兩個環境變量會保持不變。

保護 sudo 路徑
可以使用 secure_path 指令修改 sudoers 中默認的 PATH。這個指令指定當用戶執行 sudo 命令時在什麼地方尋找二進制代碼和命令。這個選項的目的顯然是要限制用戶運行 sudo 命令的範圍,這是一種好做法。在 sudoers 中使用以下指令,指定安全 PATH 及其搜索目錄:

Defaults secure_path="/usr/local/sbin:/usr/local/bin:/opt/freeware/bin:/usr/sbin"

實施限制
可以對用戶能夠運行的命令實施限制。假設有一個名爲 dataex 的組,其成員是 “alpha”、“bravo” 和 “charlie”。現在,已經允許這個組運行 sudo 命令 /usr/local/bin/mis_ext *,這裏的星號代表傳遞給腳本的許多參數。但是,如果參數是 import,就不允許用戶 “charlie” 執行此腳本。可以使用邏輯否 '!' 操作符設置這種條件。下面是在 sudoers 中的實現方法:

%dataex rs6000 = (dbmis) NOPASSWD: /usr/local/bin/mis_ext *
charlie rs6000 = (dbmis) NOPASSWD: !/usr/local/bin/mis_ext import
在 visudo 中時,不要以爲保存 sudo 條目就會讓修改生效;不會的。必須退出 visudo,修改纔會生效。

注意,邏輯否操作符條目出現在無限制的條目後面。可以在同一行上應用多個邏輯否條目;只需以逗號分隔它們,比如:

charlie rs6000 = (dbmis) NOPASSWD: /usr/local/bin/aut_pmp *

charlie rs6000 = (dbmis) NOPASSWD: !/usr/local/bin/aut_pmp create,
!/usr/local/bin/aut_pmp delete, !/usr/local/bin/aut_pmp amend

提交 sudo 命令
在企業環境中,把 sudo 命令提交給遠程主機最好是作爲 root 用戶使用 ssh 腳本來完成,對於無密碼登錄,還應該在主機之間交換密鑰。我們來看一個示例。對於地理上遠程的機器,如果遇到某種硬件問題(磁盤或內存),IBM® 工程師會到現場更換髮生故障的硬件。在這種情況下,他們需要有 root 密碼才能完成工作。一種實現方法是讓工程師必須使用 sudo 訪問 root 用戶。在工程師訪問站點之前告訴他們密碼是有好處的。清單 2 演示提交這種配置的一種方法。仔細看看 清單 2,這裏使用一個 for 循環包含要提交配置的主機列表。(但是,一般情況下,把這些主機名放在一個文本文件中並使用 while 循環讀取它們。)使用 ‘here’ 文檔方法建立 sudoers 的備份,然後在 sudoers 中添加下面的條目:

-- ibmeng sudo root

ibmeng host1 = (root) NOPASSWD:ALL
接下來,創建用戶 “ibmeng”,使用 chpasswd 設置此用戶的密碼。在這個示例中,密碼是 ibmpw。然後在此用戶的配置文件中添加一條消息,告訴用戶如何使用 sudo 訪問 root 用戶。因此,在工程師登錄時,他會看到以下消息:

IBM Engineer, to access root account type: sudo -u root su -
當然,在工程師離開之後,應該鎖住 ibmeng 賬戶。

清單 2. dis_ibm
#!/bin/sh

dis_ibm

dest_hosts='host1 host2 host3 host4'

for host in $dest_hosts
do
echo "doing [$host]"

$ssh -T -t -l root $host<<'mayday'
host=hostname
cp /etc/sudoers /etc/sudoers.bak

if [ $? != 0 ]
then
echo "error: unable to cp sudoers file"
exit 1
fi

echo "# -- ibmeng sudo root\nibmeng $host = (root) NOPASSWD:ALL">>/etc/sudoers

mkuser su=false ibmeng
if [ $? = 0 ]
then
echo "ibmeng:ibmpw" | chpasswd -c
else
echo "error: unable to create user ibmeng and or passwd"
exit 1
fi
chuser gecos='IBM engineer acc' ibmeng
if [ -f /home/ibmeng/.profile ]
then
echo "echo \"IBM Engineer, to access root account type: sudo -u root su -"\"

/home/ibmeng/.profile
fi
mayday
done

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章