一、背景介紹
近期在安裝配置MongoDB的時候,用自己配置的數據目錄始終無法正常運行,報錯爲ERROR: child process failed, exited with error Number 100,啓動日誌記錄“Attempt to create a lock file on a read-only directory: /mnt/disk1/mongo, terminating”,檢查目錄歸屬都爲mongod用戶,目錄權限爲755,按理來說權限是沒問題的。網上找了半天原因,都說只要刪除數據目錄中的mongod.lock,顯然都是不適合我的解決辦法。
糾結了半天,終於想起可以看看是不是SELinux的原因。因爲SELinux用的少,所以一開始沒意識到這點。最終稍微學習了一下SELinux並配置完成,MongoDB成功啓動。
這篇文章主要記錄一下如何進行SELinux的相關配置(targeted模式)以確保程序主體(進程)擁有對象資源(目錄、文件、設備等)的正確權限,主要爲配置的步驟,不多介紹相關的知識。
二、SELinux相關命令
我用的系統是CentOS 7 1804,以下爲SELinux相關命令、文件和工具:
- ls -Z # 查看文件或目錄的安全上下文(security context)
- ps -efZ # 查看主體(進程)的安全上下文
- sestatus # 查看當前SELinux的狀態
- getenforce # 查看當前SELinux工作模式
- setenforce 0|1 # 設置SELinux工作模式
- /etc/selinux/config # SELinux配置文件,修改重啓後生效
- seinfo # SELinux相關信息查詢,可查詢用戶、角色、類型、bool規則等,具體可用-h查看help
- sesearch # SELinux詳細規則查詢,具體可用-h查看help
- chcon # 修改對象的安全上下文,具體可用-h查看help
- getsebool # 查詢某個bool規則的開關狀態
- setsebool # 開關某個bool規則
- restorecon # 恢復默認的安全上下文
- semanage # 豐富的管理功能呢
- 其他相關工具:setroubleshoot、auditd
標黑的爲本次所用主要命令。
三、配置過程
SELinux最常用的模式爲targeted,在targeted模式下最主要的就是確保主體(subject,一般爲進程)的安全上下文和對象(object)的安全上下文滿足已生效的策略即可,targeted模式下主要關注源(進程)類型和目標(對象)類型的匹配。
3.0 確認當前SELinux工作狀態
sestatus
3.1 查看進程的類型
我這裏的進程爲mongod,進程的類型一般稱爲域(domain)。
語法:ps -efZ | grep -v grep | grep 進程名稱
system_u:system_r:mongod_t,分別爲用戶身份(indentify)、角色(role)、類型(type),targeted模式下主要關注類型(type)。
可以看到mongod的type爲mongod_t
3.2 查看指定源類型的相關規則
語法:sesearch -s 源類型 -t 目標類型 # 這裏不知道目標類型,所以使用grep匹配
sesearch -A -s mongod_t | grep 'mongod_t.* \\(file\\|dir\\) .*write.*create' # (注意裏面的雙反斜槓實際爲單反斜槓)'-A'爲查看allow的規則,' (file|dir) '爲匹配文件和目錄資源,還有兩個需要的關鍵權限:'write'要有寫權限,'create'要有創建文件權限
可以看到有三個同時有dir和file的配置,且權限完整。根據目標類型名稱基本可以判斷用途,這裏選擇mongod_var_lib_t作爲目標類型。
3.3 配置目標類型
語法:chcon [-R] -t 類型名稱 文件或目錄
sudo chcon -R -u system_u -t mongod_var_lib_t mongo
再運行ls -Z可以查看已設置成功。
運行 mongod,可以成功運行,配置完畢。
四、參考資料
鳥哥的Linux私房菜:http://cn.linux.vbird.org/linux_basic/0440processcontrol_5.php