相信很多人看完docker容器, 需要加crontab, 加完卻發現不能執行,心塞.....接著便開始各種折騰...
首先當然是看日志了, 發現/var/log 下面沒有任何信息, 那是因為你沒有打開rsyslog.
# /etc/init.d/rsyslog start
繼續看日志
# tail /var/log/crondDec 29 16:39:01 web01-50794 crond[2839]: (root) FAILED to open PAM security session (Cannot make/remove an entry for the specified session)Dec 29 16:40:01 web01-50794 crond[2842]: (root) FAILED to open PAM security session (Cannot make/remove an entry for the specified session)Dec 29 16:40:01 web01-50794 crond[2841]: (root) FAILED to open PAM security session (Cannot make/remove an entry for the specified session)Dec 29 16:41:01 web01-50794 crond[2846]: (root) FAILED to open PAM security session (Cannot make/remove an entry for the specified session)# tail /var/log/secureDec 29 16:39:01 web01-50794 crond[2839]: pam_loginuid(crond:session): set_loginuid failedDec 29 16:40:01 web01-50794 crond[2841]: pam_loginuid(crond:session): set_loginuid failedDec 29 16:40:01 web01-50794 crond[2842]: pam_loginuid(crond:session): set_loginuid failedDec 29 16:41:01 web01-50794 crond[2846]: pam_loginuid(crond:session): set_loginuid failed# tail /var/log/crondDec 29 16:39:01 web01-50794 crond[2839]: (root) FAILED to open PAM security session (Cannot make/remove an entry for the specified session)Dec 29 16:40:01 web01-50794 crond[2842]: (root) FAILED to open PAM security session (Cannot make/remove an entry for the specified session)Dec 29 16:40:01 web01-50794 crond[2841]: (root) FAILED to open PAM security session (Cannot make/remove an entry for the specified session)Dec 29 16:41:01 web01-50794 crond[2846]: (root) FAILED to open PAM security session (Cannot make/remove an entry for the specified session)# tail /var/log/secureDec 29 16:39:01 web01-50794 crond[2839]: pam_loginuid(crond:session): set_loginuid failedDec 29 16:40:01 web01-50794 crond[2841]: pam_loginuid(crond:session): set_loginuid failedDec 29 16:40:01 web01-50794 crond[2842]: pam_loginuid(crond:session): set_loginuid failedDec 29 16:41:01 web01-50794 crond[2846]: pam_loginuid(crond:session): set_loginuid failed
從crontab的日志可以看出是因為pam的原因無法建立一個session連接.
接著看secure日志, 報出了set_loginuid failed , 無法獲取用戶uid.
分析:
為什么在docker里面無法獲取uid?pam_loginuid.so又代表什么?
pam_loginuid.so模塊: session類型:用來設置已通過認證的進程的uid.以使程序通過正常的審核(audit).而在docker里面,由于內核能力機制的安全限制,docker啟動的容器被嚴格要求只允許使用內核的部分能力.其中包括,但不僅限于ssh、cron、syslogd、硬件管理工具模塊(例如負載模塊)、網絡配置,等屬于特權進程.容器無法獲取這些特權進程信息。導致crond服務啟動時的set_loginuid failed. 而required機制要求必須所有的驗證條件均要滿足,才能進行后續操作,這就導致了crond的執行失敗.
這里扯一下pam模塊鑒證級別,共有四種取值:分別為required、Requisite、sufficient或_optional.
required:表示該行以及所有涉及模塊的成功是用戶通過鑒別的必要條件。換句話說,只有當對應于應用程序的所有帶 required標記的模塊全部成功后,該程序才能通過鑒別。同時,如果任何帶required標記的模塊出現了錯誤,PAM并不立刻將錯誤消息返回給應用程序,而是在所有模塊都調用完畢后才將錯誤消息返回調用他的程序。 反正說白了,就是必須將所有的模塊都執行一次,其中任何一個模塊驗證出錯,驗證都會繼續進行,并在執行完成之后才返回錯誤信息。這樣做的目的就是不讓用戶知道自己被哪個模塊拒絕,通過一種隱蔽的方式來保護系統服務。就像設置防火墻規則的時候將拒絕類的規則都設置為drop一樣,以致于用戶在訪問網絡不成功的時候無法準確判斷到底是被拒絕還是目標網絡不可達。
新聞熱點
疑難解答