閱讀688 返回首頁    go 搜狐 go 中電雲集


Linux係統中內部和外部安全性概述

簡介
  維護一個完全安全的係統是不可能的。然而,隻要勤奮,則有可能使 Linux 機器足夠安全,並讓大多數偶爾出現的駭客、腳本小子(script- kiddies)及其他的“壞家夥”止步而去騷擾其他人。請記住:僅僅遵循本教程不會產生一個安全的係統。相反,我們希望你接觸到主要主題的多個方麵,並向你提供一些有關怎麼入門的有用示例。
  Linux 係統安全性可分為兩個部分:內部安全性和外部安全性。內部安全性指預防用戶無意或惡意地破壞係統。外部安全性指防止未授權用戶獲得對係統的訪問。
  本章將首先介紹內部安全性,然後介紹外部安全性,最後介紹一些常規指導原則和技巧。
  日誌文件的文件權限
  內部安全性能是非常大的任務,這要看你對用戶的信任程度。這裏介紹的指導原則是設計用來防止偶然用戶訪問敏感信息和防止不公平地使用係統資源。
  至於文件權限,你可能希望修改以下三種情況的權限:
  首先,/var/log 中的日誌文件不必是所有人都能讀取的。沒有理由讓非 root 用戶窺視日誌。為了創建具有適當權限的日誌。
  root 用戶其他文件的文件權限
  其次,root 用戶的點文件對於普通用戶應是不可讀的。檢查 root 用戶主目錄中的文件(ls -la)以確保他們受到適當的保護。甚至能使整個目錄僅對 root 用戶可讀:
    # cd
    # pwd
    /root
    # chmod 700 .
  用戶文件的文件權限
  最後,用戶文件在缺省情況下通常被創建為所有人可讀。那可能不是用戶所期望的,而且他當然不是最佳的策略。應該使用和下麵類似的命令在 /etc/profile 中設置缺省的 umask:
    if [ "$UID" = 0 ]; then
    # root user; set world-readable by default so that
    # installed files can be read by normal users.
    umask 022
    else
    # make user files secure unless they explicitly open them
    # for reading by other users
    umask 077
    fi
  應該查詢 umask(2) 和 bash(1) 手冊頁以獲取有關設置 umask 的更多信息。請注意:umask(2) 手冊頁涉及 C 函數,但他所包含的信息也適用於 bash 命令。
  查找 SUID/SGID 程式
  尋求 root 訪問權的惡意用戶總是會在係統上尋找設置了 SUID 或 SGID 位的程式。就象我們在 LPI 101 係列第 3 部分中討論的那樣,這些位使程式始終作為擁有該文件的用戶或組運行。有時這是程式正確運行所必需的。問題是所有程式都可能包含允許用戶在不正確地使用程式時獲得特權的錯誤。
  應該仔細考慮每個程式以確定是否需要將其 SUID 或 SGID 位打開。係統上有些 SUID/SGID 程式可能是根本不必的。
  要搜索具有這樣性質的程式,可使用 find 命令。例如,能在 /usr 目錄中啟動對 SUID/SGID 程式的搜索:
    # cd /usr
    # find . -type f -perm +6000 -xdev -exec ls {} \;
    -rwsr-sr-x 1 root root 593972 11-09 12:47 ./bin/gpg
    -r-xr-sr-x 1 root man 38460 01-27 22:13 ./bin/man
    -rwsr-xr-x 1 root root 15576 09-29 22:51 ./bin/rcp
    -rwsr-xr-x 1 root root 8256 09-29 22:51 ./bin/rsh
    -rwsr-xr-x 1 root root 29520 01-17 19:42 ./bin/chfn
    -rwsr-xr-x 1 root root 27500 01-17 19:42 ./bin/chsh
    -rwsr-xr-x 1 lp root 8812 01-15 23:21 ./bin/lppasswd
    -rwsr-x— 1 root cron 10476 01-15 22:16 ./bin/crontab
  在這個清單中,我已發現了需要更仔細檢查的侯選對象:lppasswd 是 CUPS 打印軟件分發版的一部分。因為沒有在係統上提供打印服務,所以我會考慮除去 CUPS,那也會除去 lppasswd 程式。lppasswd 中可能沒有危及安全性的錯誤,但為什麼要在不使用的程式上冒險呢?同樣地,應該關閉所有不使用的服務。你總是能在需要時再啟用他們。
  用 ulimit 設置用戶限製
  bash 中的 ulimit 命令提供了限製特定用戶的資源使用情況的方法。一旦限製降低,則在進程的生命期內無法提高該限製。此外,該限製會被所有子進程繼承。結果是:能在 /etc/profile 中調用 ulimit,而限製將以不能撤消的方式應用於所有用戶(假設用戶正在運行 bash 或另一個 shell,該 shell 在登錄時運行 /etc/profile)。
  要檢索當前限製,可使用 ulimit -a:
    # ulimit -a
    core file size (blocks, -c) 0
    data seg size (kbytes, -d) unlimited
    file size (blocks, -f) unlimited
    max locked memory (kbytes, -l) unlimited
    max memory size (kbytes, -m) unlimited
    open files (-n) 1024
    pipe size (512 bytes, -p) 8
    stack size (kbytes, -s) unlimited
    cpu time (seconds, -t) unlimited
    max user processes (-u) 3071
    virtual memory (kbytes, -v) unlimited
  以一種能實際提高係統安全性而不會對合法用戶造成麻煩的方式設置這些限製是相當複雜的,所以調整這些設置時要小心。
  用 ulimit 設置 CPU 時間限製
  作為 ulimit 的一個示例,我們嚐試將一個進程的 CPU 時間設置為 1 秒鍾,然後用一個忙循環使他超時。一定要確保啟動新的 bash 進程(象我們在下麵做的那樣),以在其中進行嚐試;否則將被注銷!
    # time bash
    # ulimit -t 1
    # while true; do true; done
    Killed
    real 0m28.941s
    user 0m1.990s
    sys 0m0.017s
  在上麵的示例中,“user”時間加上“sys”時間等於該進程所用的全部 CPU 時間。當 bash 進程到達 2 秒標記時,Linux 斷定他超過 1 秒的限製,因此該進程被殺掉。酷吧?
  注:一秒鍾隻是示例而已。不要對你的用戶這樣做!即使幾小時也是不對的,因為 X 真地非常消耗時間(我當前的會話已用掉了 69+ 小時的 CPU 時間)。在實際的實現中,你可能要對某些項而不是 CPU 時間執行 ulimit。
  入侵預防
  外部安全性可分為兩類:入侵預防和入侵檢測。采取入侵預防手段是為了防止未授權用戶訪問係統。如果這些手段失敗,那麼入侵檢測在確定何時發生未授權訪問及造成什麼損壞方麵或許有用。
  完全的 Linux 安裝是巨大且複雜的係統。跟蹤已安裝的每一項是非常困難的,而設置每個包的安全性特征就更困難了。安裝的包越少,則問題就變得越簡單。入侵預防的第一步是除去不必的包。
  關閉未使用的網絡服務(終極服務器)
  關閉未使用的網絡服務一直是提高入侵預防能力的好方法。例如,如果正在運行因特網終極服務器(如本教程前麵描述的 inetd 或 xinetd),那麼 in.rshd、in.rlogind 和 in.telnetd 通常都在缺省情況下啟用。這些網絡服務幾乎都已被更安全的替代項(如 ssh)所取代。
  要在 inetd 中禁用服務,隻需在 /etc/inetd.conf 中在適當的行前麵加上“#”將其注釋掉;然後重新啟動 inetd 即可。(這在本教程前麵已有描述,若需要複習,可返回幾頁快速瀏覽。)
  要在 xinetd 中禁用服務,能執行和 /etc/xinetd.d 中適當的代碼片段相似的工作。例如,要禁用 telnet,能將 /etc/xinetd.d/telnet 文件的整個內容注釋掉,或簡單地刪除該文件。重新啟動 xinetd 以完成此過程。
  如果正在結合 inetd 使用 tcpd,或如果正在使用 xinetd,還能選擇限製和可信的主機進行的進入連接。對於 tcpd,可參閱本教程的前幾章。對於 xinetd,可在 xinetd.conf(5) 手冊頁中搜索“only_from”。
  關閉未使用的網絡服務(獨立服務器)
  有些服務器並不由 inetd 或 xinetd 啟動,但卻作為“獨立”服務器始終運行著。這樣的服務器通常是 atd、lpd、sshd、 nfsd 和其他服務器。事實上,inetd 和 xinetd 本身都是獨立服務器,如果在他們各自的設置文件中注釋掉所有的服務,就選擇了將他們完全關閉。
  獨立服務器通常在係統引導或更改運行級別時由 init 係統啟動。如果不記得運行級別是怎麼工作的,能看看 LPI 101 係列第 4 部分。
  要使 init 係統不再啟動服務器,在每個運行級別目錄中找到指向該服務器啟動腳本的符號鏈接,然後刪除他。運行級別目錄的名稱通常為 /etc/rc3.d 或 /etc/rc.d/rc3.d(針對運行級別 3)。還需要檢查其他運行級別。
  除去服務的運行級別符號鏈接後,仍需要關閉當前運行的服務器。最佳用服務的初始化腳本完成這一操作,通常能在 /etc/init.d 或 /etc/rc.d/init.d 中找到這一腳本。例如,要關閉 sshd:
    # /etc/init.d/sshd stop
    * Stopping sshd… [ ok ]
  測試更改
  在修改 inetd 或 xinetd 設置以禁用或限製服務,或用服務器初始化腳本關閉該服務器後,應該對所做的更改加以測試。能使用 telnet 客戶機通過指定服務名稱或號碼來測試 tcp 端口。例如,要驗證 rlogin 已被禁用:
    # grep ^login /etc/services
    login 513/tcp
    # telnet localhost 513
    Trying 127.0.0.1…
    telnet: Unable to connect to remote host: Connection refused
  除了標準 telnet 客戶機以外,還應考慮使用實用程式以測試係統“開放程度”的可能性。我們推薦使用 netcat 和 nmap。
  ncat 是“網絡瑞士軍刀”:他是使用 TCP 或 UDP 協議、跨越網絡連接讀寫數據的簡單 UNIX 實用程式。nmap 是用於網絡探測或安全性審計的實用程式。具體而言,nmap 掃描端口以確定哪個端口打開了。

最後更新:2017-01-04 22:34:55

  上一篇:go IIS限製附件大小無法上傳問題解決
  下一篇:go percona-toolkit使用教程