相信很多人看完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一樣,以致于用戶在訪問網絡不成功的時候無法準確判斷到底是被拒絕還是目標網絡不可達。
sufficient:表示該行以及所涉及模塊驗證成功是用戶通過鑒別的充分條件。也就是說只要標記為sufficient的模塊一旦驗證成功,那么PAM便立即向應用程序返回成功結果而不必嘗試任何其他模塊。即便后面的層疊模塊使用了requisite或者required控制標志也是一樣。當標記為sufficient的模塊失敗時,sufficient模塊會當做 optional對待。因此擁有sufficient 標志位的配置項在執行驗證出錯的時候并不會導致整個驗證失敗,但執行驗證成功之時則大門敞開。所以該控制位的使用務必慎重。
解決方案:
# cat /etc/pam.d/crond account required pam_access.soaccount include password-auth#session required pam_loginuid.so #注釋此行session include password-authauth include password-auth# cat /etc/pam.d/crond account required pam_access.soaccount include password-auth#session required pam_loginuid.so #注釋此行session include password-authauth include password-auth
以上所述是小編給大家介紹的docker容器中crontab無法正常運行解決方案,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!
新聞熱點
疑難解答
圖片精選