Linux——系統配置:日誌、系統時間、批處理任務和用戶

系統配置:日誌、系統時間、批處理任務和用戶

/etc目錄結構

Linux系統的大部分系統配置文件都存放在/etc目錄中。按照慣例,每個程序在這裏都有一個或多個配置文件。因爲Unix系統的程序數目很多,所以/etc目錄也會越來越龐大。

不僅很難找到要找的配置文件,而且維護起來也不方便。比如,要更改系統的日誌配置,你需要輯/etc/syslog.conf文件。但是你的更改可能會被隨後的系統升級覆蓋掉。

目前比較常見的方式是將系統配置文件放到/etc下的子目錄,如果你運行ls -F /etc查看的話,你會發現大部分配置文件都放到了子目錄中。

爲了解決配置文件被覆蓋的問題,你可以將定製的配置放到子目錄裏的其他文件中,如/etc/grub.d

基本規律是針對系統的可定製的配置文件在/etc下,如用戶信息(/etc/passwd)和網絡配置(/etc/network)。然而,與應用程序細節相關的文件不在/etc中,如系統用戶界面的默認配置。你會發現那些不可定製的系統配置文件存放在了其他地方,比如預先打包的系統單元文件在/usr/lib/systemd中。

系統日誌

大多數系統程序將它們的日誌信息輸出到syslog服務。傳統的syslogd守護進程等待消息的到來,並根據它們的類型將它們輸出到文件、屏幕、用戶或其他地方,有的乾脆忽略。

系統日誌

系統日誌是系統中最重要的部分之一。如果系統出現你不清楚的錯誤,查看系統日誌文件是
第一選擇。以下是日誌文件示例:

系統日誌是系統中最重要的部分之一。如果系統出現你不清楚的錯誤,查看系統日誌文件是第一選擇。以下是日誌文件示例:

Aug 19 17:59:48 duplex sshd[484]: Server listening on 0.0.0.0 port 22.

大多數Linux系統使用的是syslogd的一個新版本,叫作rsyslogd。它的功能不僅僅限於記錄日誌信息。比如,你還可以讓它加載一個將日誌信息寫到數據庫的模塊。不過最簡單的方式還是從/var/log目錄開始。你看看其中的那些日誌文件後,就能夠了解它們來自哪裏。

配置文件

rsyslog的基礎配置文件是/etc/rsyslog.conf,但你還會在其他地方(如/etc/rsyslog.d)發現另外一些配置文件。其內容包含傳統的規則和rsyslog擴展。其中一條規則是任何以字符$開頭的都是擴展。

傳統的規則包括一個選擇符(selector)和一個操作(action),分別代表從哪裏獲得日誌和將它們寫到哪裏,如下例所示:

kern.* /dev/console
*.info;authpriv.none➊ /var/log/messages
authpriv.* /var/log/secure,root
mail.* /var/log/maillog
cron.* /var/log/cron
*.emerg *➋
local7.* /var/log/boot.log

左邊是選擇符,表示要爲哪種信息類型記錄日誌。右邊是操作列表,表示要將日誌寫到哪裏。

大部分的操作都是將日誌寫入文件,也有一些例外:/dev/console表示系統控制檯的一個特殊設備,root表示如果root用戶登錄的話,將消息發送給他,*代表發送消息給系統中的所有用戶

設施和優先級

選擇符用來匹配日誌信息的設施和優先級。設施是指消息的大致分類。

設施的功能很容易通過它們的名稱得知,從kern、authpriv、mail、cron和local7這些設施中抓取日誌信息,➋處的*號是一個通配符,表示從所有設施中獲得輸出

設施後的點號(.)後面是優先級,由低到高分別是:debug、info、notice、warning、err、crit、alert或emerge。

爲選擇符設置了優先級之後,rsyslogd將該優先級及其以上優先級的消息發送到指定目的地。➊處的*.info將抓取大部分日誌消息並將它們寫到/var/log/messages,因爲info是一個相對較低的優先級。

擴展語法

一個比較常用的擴展是讓你加載其他的配置文件。rsyslog.conf中就包含這樣的指令,讓rsyslogd加載/etc/rsyslog.d目錄中的所有.conf文件。

$IncludeConfig /etc/rsyslog.d/*.conf

大部分的指令都很好理解,比如以下涉及用戶和權限的指令:

$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022

故障排除

測試系統日誌最簡單的方法之一是使用logger命令手動發送日誌消息。

logger -p daemon.info something bad just happened

rsyslogd不容易出錯。出現問題大都是因爲配置文件沒有正確配置設施或優先級,因而沒有獲得想要抓取的日誌信息,或者是由於磁盤空間不足。大多數系統會使用logrotate或者類似工具來自動清除/var/log中的文件,不過如果在短時間寫入大量日誌,還是會出現系統負載增加、磁盤空間用盡的情況。

日誌的過去和未來

syslog服務在不斷演進。曾經出現過一個叫klogd的守護進程,負責爲syslogd截獲內核的日誌消息,這些日誌可以使用dmesg命令查看。後來該功能被併入到了rsyslogd中。

用戶管理文件

Unix系統支持多用戶。用戶對於內核而言只是一些數字(用戶ID),因爲用戶名比數字容易記憶,所以用戶一般都是用用戶名(或登錄名)而非用戶ID來管理系統。用戶名只存在於用戶空間,使用到用戶名的應用程序在和內核通信時,通常需要將用戶名映射爲用戶ID。

/etc/passwd文件

文本文件/etc/passwd中包含一一對應的用戶名和用戶ID。如下所示:

root:x:0:0:Superuser:/root:/bin/sh
daemon:*:1:1:daemon:/usr/sbin:/bin/sh
bin:*:2:2:bin:/bin:/bin/sh
sys:*:3:3:sys:/dev:/bin/sh
nobody:*:65534:65534:nobody:/home:/bin/false

每一行代表一個用戶,一共有7列,用冒號:分隔。這7列所代表的內容如下所示。

  • 登陸名
  • 經過加密的用戶密碼,大部分Linux系統都不在passwd文件存放實際的用戶密碼。而是將密碼存放在shadow文件中,普通用戶沒有訪問的權限。(Unix從不明文存儲密碼)
    • x帶包加密過的密碼存放在shadow中
    • * 用戶不能登錄
    • 空 表示登錄不需要密碼
  • 用戶ID:用戶在內核中的標識,同一個用戶ID可以出現在兩行中,不過這樣做比較容易混淆。程序在處理的時候也需要將他們合併起來,用戶ID必須唯一。
  • 用戶組ID:是/etc/group文件中的某個ID。用戶組定義了文件權限以及其他。
  • 用戶的真實名稱:有的時候會有逗號,用來分隔房間和電話號碼
  • 用戶的root目錄
  • 用戶使用的命令行:用戶運行終端的程序。

在這裏插入圖片描述

特殊用戶

在/etc/passwd中有一些特殊用戶。其中,超級用戶的UID和GID固定爲0

有一些用戶如守護進程用戶沒有登錄權限。nobody用戶的權限最小。一些進程在nobody用戶名下運行,因爲它沒有任何寫入權限。

/etc/shadow文件

Linux中的影子密碼文件(/etc/shadow)包含用戶驗證信息以及經過加密的密碼和密碼過期日期,這些都和/etc/passwd文件中的用戶相對應。

用戶和密碼管理

普通用戶使用passwd命令來更改密碼。默認狀態下,passwd可以更改用戶密碼,但你還可以使用-f選項來更改用戶名,用-s選項來更改shell。

passwd命令是一個suid-root程序,只有超級用戶能夠編輯/etc/passwd文件。

使用超級用戶來更改/etc/passwd

由於/etc/passwd是純文本文件,因此超級用戶可以使用任何文本編輯器來編輯它。要添加用戶,只需加上恰當的命令行併爲用戶創建一個root目錄即可。要刪除用戶則反之。

很多人不願意直接編輯passwd文件,因爲很容易把文件搞亂。使用另外的終端命令或者GUI會更爲方便和安全

可以使用超級用戶運行passwd user來設置用戶密碼。adduser和userdel可以添加和刪除用戶。

用戶組

用戶組可以將文件訪問權設定給某些用戶,而使其他用戶無權訪問。你可以爲某組用戶設置讀寫位,從而排除其他的用戶。

/etc/group 文件中包含了用戶組ID,類似的etc/passewd

在這裏插入圖片描述

  • 用戶組名:運行如ls -l這樣的命令時可以看到。
  • 用戶組密碼:很少也不應該被使用。可以設置爲*或者其他默認值
  • 用戶組ID:必須是一個唯一的數字
  • 屬於該組的用戶列表:該列是可選項。

使用group命令來查看你所屬的用戶組。

getty和login

getty連接到終端並且在其上顯示登錄提示符。大多數Linux系統中的getty程序很簡單,僅僅是在虛擬終端上顯示登錄提示符。它可以用在管道命令中

$ ps ao args | grep getty
/sbin/getty 38400 tty1

38400是波特率。有些getty不需要該設置。

輸入用戶名後,getty調用login程序提示你輸入密碼。如果輸入的密碼正確,login會調用你的shell(使用exec())。否則你會得到“登錄錯誤”提示信息。

設置時間

Unix系統的運行依賴精確的計時,而內核則負責維護系統時鐘。可以使用date命令來查看,還可以用它設置時間

因爲設置的時間有可能不精準,而你的系統時間應該儘可能精準。

計算機硬件有一個使用電池的實時時鐘(Real-time Clock,以下簡稱RTC)。RTC並不是最精準的,但是聊勝於無。內核通常在啓動時使用RTC來設置時間。

最好將你的硬件時鐘設置爲通用協調時間(UniversalCoordinated Time,以下簡稱UTC),這樣可以避免不同時區和夏令時帶來的問題。

hwclock --hctosys --utc

不要試圖使用hwclock來修復時間誤差,因爲這會影響那些基於時間的系統事件。你可以運行adjtimex來更新系統時鐘,不過最好的辦法是使用守護進程來使你的系統時間和網絡上的時間保持同步。

內核時間和時區

內核將當前的系統時間顯示爲以秒爲單位的一串數字,自UTC時間1970年1月1日12:00時起開始。你可以使用以下命令來查看:

$ date +%s

爲了保證易讀性,用戶空間程序會將這組數字轉換爲本地時間,並且將夏令時和其他因素(比如印第安納州時間)都考慮在內。文件/etc/localtime(二進制文件)用來控制本地時區。

時區信息在/usr/share/zoneinfo目錄中,其中包含了時區及其別名等信息。

如果要手動設置時區,可以將/usr/share/zoneinfo中的某個文件複製到/etc/localtime(或者創建一個符號鏈接)中,或者使用系統自帶的時區工具。(你可以使用tzselect命令尋找時區文件。)

網絡時間

如果你的主機連接到互聯網,你可以運行網絡時間協議(Network Time Protocol,以下簡稱NTP)守護進程,藉助遠程服務器來更新時間。很多Linux系統自帶NTP守護進程,但是不一定默認開啓。你可以安裝ntpd包來運行它。

使用cron來調度日常任務

Unix的cron(意思是定時)服務能夠按照日程安排來重複運行程序。cron對多數富有經驗的系統管理員來說非常重要,因爲它可以完成很多自動化的系統維護工作。

你可以使用cron在任何時間運行任何程序。通過cron運行的程序我們稱爲定時任務。要添加一個定時任務,可以在crontab(意爲定時任務)文件中加入一行,通常是通過執行crontab命令來完成。

例如,你若想將/home/juser/bin/spmake命令安排在每天9:15AM運行,可以加入以下一行:

15 09 * * * /home/juser/bin/spmake

最開始的5列用空格分隔

  • 分 (0-59)
  • 時(0-23)
  • 天(1-31)
  • 月(1-12)
  • 星期(0-7)

在這裏插入圖片描述

安裝arontab文件

每個用戶都可以有自己的crontab文件,所以系統中經常會有很多個crontab,通常保存在/var/spool/cron/crontabs目錄中。普通用戶對該目錄沒有寫權限,crontab命令負責安裝、查看、編輯和刪除用戶的crontab。

安裝crontab最簡便的方法是將crontab條目放入一個文件(如file),然後運行crontab file命令將file文件安裝爲你的crontab。crontab命令會檢查文件的格式,確保沒有錯誤。你可以使用crontab -l列出你的cron任務。使用crontab -r刪除crontab文件。

系統crontab文件

Linux系統通常使用/etc/crontab文件來安排系統任務的運行,而不是使用超級用戶的crontab。不要使用crontab命令來編輯該文件,因爲它有一個額外的列來設置運行任務的用戶。

使用at進行一次性任務調度

要想在將來的某一時刻一次性運行任務,如果不使用cron的話,可以使用at服務。例如要在10:30PM運行myjob,可以使用以下命令:

$ at 22:30
at> myjob

使用CTRL-D結束輸入。(at從標準輸入讀取命令。)

瞭解用戶ID和用戶切換

sudo和su這樣的setuid程序允許你切換用戶,login這樣的系統組件負責控制用戶訪問。

更改用戶ID有兩種方式,均由內核負責完成。第一種是運行setuid程序。第二種是通過setuid()系統調用,該系統調用有很多不同版本,用來處理和進程關聯的所有用戶ID。

下面是三個基本規則:

  • 以root(userid 0)身份運行的進程可以調用setuid()來切換其他用戶。
  • 沒有以root身份運行的進行在調用setuid的時候有一些限制。大多數的情況下是不能調用setuid的。
  • 任何進程,只要有足夠的文件訪問權限,都可以運行setuid程序。

進程歸屬、有效UID、實際UID和已保存UID

到目前爲止,本書所講的有關用戶ID的內容都是簡化過的。實際上每個進程都有超過一個用戶ID。

我們提到過的有效UID(effective user ID,euid)是用來設定某一進程的訪問權限。另外還有一個UID是實際UID(real user ID,ruid),即實際啓動進程的UID。當你運行setuid程序時,Linux將有效UID設置爲程序文件的擁有者,同時將實際UID設置爲你的UID。

我們可以將有效UID看作執行者,將實際UID看作所有者。實際UID是可以與進程進行交互的用戶,可以終止進程,向進程發送信號。

在Linux系統中,大多數進程的有效UID和實際UID是相同的。ps和其他系統診斷命令默認顯示有效UID。要想查看你係統上的有效UID和實際UID,可以使用以下命令,但你會發現,你的系統中的所有進程幾乎擁有相同的有效UID和實際UID。

$ ps -eo pid,euser,ruser,comm

除了有效UID和實際UID外,還有一個已保存UID(saved user ID,通常沒有簡寫形式)。進程在運行過程中可以從有效UID切換到實際UID和已保存UID。(實際上Linux還有另外一個UID,即文件系統UID,但很少用到,代表訪問文件系統的用戶。)

相關安全性

因爲Linux內核通過setuid程序和相關係統調用來處理用戶切換(以及相關的文件存取權限),系統管理員和開發人員必須特別注意以下兩點。

  • 有setuid權限的程序。
  • 這些程序所執行的功能。

攻擊Linux系統的常見方式之一就是利用那些以root名義運行的程序的漏洞,這樣的例子數不勝數。

由於攻擊系統的手段衆多,因此防止系統受到攻擊也是一項十分繁重的任務。其中最有效的方式之一是強制使用用戶名和密碼進行驗證。

用戶標識和認證

多用戶系統必須支持用戶標識(identification)和用戶認證(authentication),以保證基本的用戶安全。

  • 用戶標識判定用戶的身份,即詢問你是哪一位用戶
  • 用戶認證讓用戶來證明自己就是聲稱的那位用戶。
  • 用戶授權(authorization)用來限定用戶的權限

對於用戶標識,Linux內核通過用戶ID來管理進程和文件的權限。對於用戶認證,Linux內核控制如何執行setuid,以及如何讓用戶ID執行setuid()系統調用來切換用戶。

在傳統的Unix系統中,進程會通過以下步驟獲得用戶名。

  1. 進程使用geteuid()系統調用從內核處獲得它有效的UID。
  2. 進程打開並瀏覽/etc/passwd文件
  3. 進程從/etc/passwd 文件中讀取其中的一行。如果沒有可讀取的內容,則進程獲取用戶名失敗
  4. 進程將整行內容解析成字段,用冒號分隔的列。第3列即是當前行的用戶ID。
  5. 進程將第4步中獲得的用戶ID和第1步中的用戶ID進行匹配。如果匹配成功,則該行的第1列即爲要找的用戶名。整個過程結束。
  6. 進程繼續讀取/etc/passwd文件中的下一行,並返回第3步。

實際的過程要比這個複雜。

PAM

爲了提高用戶驗證的靈活性,Sun Microsystems公司在1995年提出了一個新的標準,叫作可插入驗證模塊(Pluggable Authentiation Module,以下簡稱PAM)。它是一個共享的驗證庫(由Open Source Software Foundation RFC 86.0組織於1995年10月提出)。

進行用戶驗證的時候,用戶被提交給PAM來決定該用戶是否能夠成功完成驗證。這樣比較容易加入新的驗證方式和技術,比如兩段式驗證和物理鑰匙。

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