CentOS6.x 下 /etc/security/limits.conf 被改錯的故障經歷

weixin_34321977發表於2016-12-21

Intro

我司本小廠,每個員工都是身兼數職,所以開發人員直接登入線上伺服器改東西是常態。有些開發人員,自持水平較高(的確水平也是較高,但缺乏對系統的敬畏),所以總是越俎代庖,改一些本身應該是線上運維人員改動的配置。本文提到的 /etc/security/limits.conf 兩次改錯導致的事故,皆是因為於此。

In details

The first time

第一次是在 /etc/security/limits.conf 中加了兩句:

*   soft    nofile  unlimited
*   hard    nofile  unlimited

結果就是:
所有使用者無法登入。一登入,馬上被踢出來。

最後解決方法:
單使用者進系統把檔案 /etc/security/limits.conf 改回來。

原因:
配置檔案 /etc/security/limits.conf 中 nofile 的引數,只支援數字,"unlimited" 顯然系統不認。

The second time

第二次也是在 /etc/security/limits.conf 中加了兩句:

root    soft    nofile  2000000
root    hard    nofile  2000000

結果是:

  • root 使用者一登入,就被踢
  • 普通使用者可登入,但 sudo su - 一切成 root 馬上會被踢(但普通使用者只支援 sudo su -

解決方法:
像前面文章 一次本地提權的實戰演練 有提到的:

  1. 普通使用者登入
  2. 用 DirtyCow(髒牛)本地提權
  3. 然後把 /etc/security/limits.conf 改回去。

原因:

  1. 配置檔案 /etc/security/limits.conf 中 nofile 的引數,其最大值不能大於 kernel 引數 NR_OPEN 的限制
  2. 而 kernel 2.6.32 裡,NR_OPEN 的值預設為 1024*1024=1048576
  3. 這裡的 2000000>1048576,所以出錯被踢

稍稍延展一下,如果我一定要將 nofile 引數設定為 2000000呢?
其實這也有辦法,提高 kernel 裡 NR_OPEN 的值即可,具體方法是:

[[ ! -e /etc/sysctl.d ]] && mkdir /etc/sysctl.d;
echo "fs.nr_open = 2000000" > /etc/sysctl.d/nr_open.conf;
sysctl -w fs.nr_open=2000000;

總結

總而言之,言而總之:Linux 下配置檔案 /etc/security/limits.conf 檔案不要隨意改動。我其實還是傾向於在啟動服務的啟動指令碼里手工用 ulimit 命令來設定相關引數而不要直接在 /etc/security/limits.conf 檔案裡改。

相關文章