關於Linux賬戶資訊保安最深入的剖析了,安芯網盾技術人員ZP工作之餘整理總結,不看後悔喲!
背景
賬戶是任何系統必不可少的基礎,也是主機安全的第一道防線,使用者許可權配置不合理會帶來嚴重的安全問題。在類Unix系統中,一切皆檔案,擁有了許可權即可讀取一切想要的內容。所以使用者許可權配置是保障系統安全的基石。2019年07月27日公佈的漏洞CVE-2019-14287,是一個針對於1.8.28之前版本的sudo漏洞,破壞者可以透過此漏洞得到作業系統的最高許可權。
賬戶安全的意義
什麼是賬戶
GNU/Linux 透過使用者和使用者組進行訪問控制,Linux 預設的訪問控制機制相對簡單直接。
使用者一般指使用計算機的人。計算機給每個使用者分配了使用者名稱,使用者使用這些名稱訪問計算機。除了人之外,一些系統服務也會建立賬戶,用於管理服務程式。
Linux預設會存在root使用者,root使用者擁有系統的最高許可權,可以進行一切操作,而其他賬號只能擁有部分許可權。
Linux有組的概念,使用者可以透過修改組的許可權對更多成員進行訪問控制,每個使用者必須是一個組的成員,這個組成為主屬組,每個使用者只能擁有一個主屬組,但可以擁有多個從屬組。
Linux透過useradd命令新增使用者,透過userdel刪除使用者。UNIX中一切皆檔案,所以最後所有的修改最終都會以檔案的形式展示。你可以透過命令pwck –s檢查使用者配置檔案(資料庫)的完整性。
賬戶安全配置保證資產安全
Linux透過訪問許可權控制使用者可以檢視的內容,使用ls –l命令可以看到如下內容:
裡面標識了每個檔案的所屬使用者,所屬組,使用者訪問許可權,組訪問許可權,非所屬使用者和所屬組訪問許可權,檔案大小,最後修改時間的資訊。訪問許可權包括檔案的讀(r)寫(w)執行(x)許可權。控制好檔案的訪問許可權可以有效防止資料洩露。
有時候安裝一個新的軟體都會自動建立一個使用者和同名的組,這些軟體一般是為使用者提供服務的或者為網路上的使用者提供Web服務、郵件服務等,這些軟體就執行在它的組裡,這樣即便是軟體受到了外界的攻擊,也無法破壞非軟體所屬使用者之外使用者的檔案。同樣它也會建立一個只屬於這個賬戶的目錄,防止別的使用者篡改。這些使用者一般都是不可登入,並且不能使用密碼,杜絕了透過爆破密碼進入計算機。下表是一些使用者組和其影響檔案的資訊。
下面這些檔案不建議手動編輯。用相關工具編輯更好,這樣可以避免檔案錯誤。
賬戶配置
賬戶基本資訊
賬號的基本資訊儲存在/etc/passwd。在這個檔案中每個使用者的帳號資訊儲存一行,帳號資訊由七個欄位組成,欄位之間用冒號(":")分隔,從左至右分別表示為:帳號,密碼,使用者ID,組ID,使用者介紹, home目錄,預設shell。
1. name:password:UID:GID:GECOS:directory:shell
欄位的詳細描述如下:
· 賬號:使用者名稱,不能為空,不能包含大寫字母,而且要符合標準的UNIX命名規則;
· 密碼:加密的使用者密碼,或者星號,但實際上這個位置通常為"x",這裡有所特殊,後面會詳細介紹
· 使用者ID:每個使用者和組有一個對應的UID和GID(使用者ID和組ID)。一般情況,第一個非root使用者的預設UID是1000,後續建立的使用者UID也應大於1000,特定使用者的GID應該屬於指定的首要組,組的ID數值列在/etc/group檔案裡。
· 組ID:使用者的主要組ID
· 使用者介紹:可為空,通常為賬號使用者的資訊,如使用者姓名,Email等,使用英文逗號(",")分割
· home目錄:用於登入命令設定$HOME環境變數。某些服務的使用者主目錄設定為"/"是安全的,但不建議普通使用者設定為此目錄。
· 預設shell:登入時執行的程式(如果為空,則使用 /bin/sh作為預設shell)。 如果設為不存在的執行(程式),使用者不能透過login登入。
在新版Linux中使用shadow檔案儲存密碼。passwd檔案對所有人可讀,在裡面儲存密碼(無論是否加密過)是很不安全的。在password欄位,通常使用一個佔位字元(x)代替。加密過的密碼儲存在/etc/shadow檔案,該檔案對普通使用者限制訪問。
示例:
1. jack:x:1001:100:Jack Smith,some comment here,,:/home/jack:/bin/bash
分解說明:使用者登入名為jack,密碼儲存在/etc/shadow,UID為1001,首要組的ID是100 (users組),全名Jack Smith並加了一些註釋,主目錄是/home/jack,使用Bash作為預設shell。
賬戶密碼資訊
/etc/shadow是使用者儲存賬號安全資訊的檔案,其中包括密碼、賬號過期時間等設定,此檔案是普通使用者無法進行任何操作,在一定程度上保證了安全。
/etc/shadow檔案每行包含9個欄位,同樣使用冒號(":")分隔,分別為登入名,加密密碼,上次密碼更改時間,密碼不得更改天數,最長密碼使用天數,密碼警告期,密碼閒置期,賬戶到期時間,保留欄位。下面詳細介紹每個欄位的意義:
· 登入名:與/etc/passwd的賬號相同,用於登入使用;
· 加密密碼:經過crypt加密後的密碼;
· 上次密碼更改時間:最後一次修改密碼的時間,表示自1970年1月1日以來的天數。值0具有特殊含義,即使用者下次登入系統時應更改其密碼。空欄位表示密碼老化功能已禁用。
· 密碼不得更改天數:此欄位表示在此天數之前不能修改密碼,是與上次密碼更改時間的間隔天數。空欄位和值為0表示沒有任何時間都可以修改。
· 最長密碼使用天數:使用者經過此天數必須修改密碼。經過此天數後,密碼可能仍然有效。需要使用者在下次登入時更改其密碼。空欄位表示沒有最長密碼使用期限,沒有密碼警告期和密碼閒置期(請參閱下文)。如果最大密碼使用期限小於最小密碼使用期限,則使用者無法更改其密碼。
· 密碼警告期:在此期間提醒使用者修改密碼,空欄位和值為0表示沒有密碼警告期。
· 密碼閒置期:密碼過期後的天數(請參見上面的最長密碼使用期限),在此期間仍應接受密碼(使用者應在下次登入時更新其密碼)。密碼過期且經過了此過期時間後,將無法使用當前使用者的密碼登入。使用者應聯絡管理員。
· 賬戶到期時間:此欄位表示自1970年1月1日以來的天數。請注意,賬戶有效期與密碼有效期不同。如果賬戶到期,則不允許使用者登入。如果密碼到期,則不允許使用者使用其密碼登入。空欄位表示該賬戶永不過期。不應使用值0,因為它將被解釋為賬戶於1970年1月1日到期。
· 保留欄位:該欄位保留供將來使用,現在暫未啟用。
示例:
1. jack:$6$atIauuQ5$mh6ombrRsUxHxJ8uZGerdSUXSuBiOAzkfRgn2wrR69K5IbOANpHlBeY43BqmNkPy7Ho3XrGKu6CGIxc9nqjiS/:18303:1:10:7:7::
分解說明:登入名為jack,加密後的密碼為$6$atIauuQ5$mh6ombrRsUxHxJ8uZGerdSUXSuBiOAzkfRgn2wrR69K5IbOANpHlBeY43BqmNkPy7Ho3XrGKu6CGIxc9nqjiS/,最後一次修改密碼時間為2020年02月11日,2020年02月12日前不能修改密碼,2020年02月21日後必須要修改密碼,從2020年02月14日起登入系統會要求必須修改密碼,在2020年02月28日前密碼仍能使用,但登入系統後必須修改密碼,否則在2020年02月28日後賬戶再也不能登入,未設定賬戶到期時間。
使用者組資訊
Linux中每個使用者都必須有一個所屬組,並且只能有一個,但可以有多個從屬組。所屬組在passwd檔案中的第四個欄位設定,從屬組在group檔案中設定。
Group檔案介紹
與其他檔案類似,group檔案同樣是每個組佔用一行,並使用冒號分割為4個欄位。分別為組名,密碼,組ID,組中使用者。下面詳細介紹每個欄位的意義:
· 組名:組名
· 密碼:與passwd檔案類似,加密的組使用者密碼,或者星號,但實際這個位置通常為"x"有所特殊。
· 組ID:組的數字標識。
· 組中使用者:組內所有成員的使用者名稱,以逗號分隔。
Gshadow檔案介紹
Gshadow檔案同樣是每個組佔用一行,並使用冒號分割為4個欄位。分別為組名,加密密碼,管理員,成員。
· 組名:必須是系統中已經存在的有效組;
· 加密密碼:經過crypt加密後的密碼;
· 管理員:必須是一個逗號分隔的使用者名稱列表。管理員可以更改組密碼和成員。管理員也有成員一樣的許可權
· 成員:必須是一個逗號分隔的使用者名稱列表。成員可以免密碼訪問組。
檢視系統被暴力破解的資訊
每個使用者的登入資訊都會被記錄,無論是成功還是失敗,可以透過命令last命令檢視登入歷史,lastb命令檢視登入失敗的記錄。它們最終是透過讀取/var/log/wtmp和/var/log/btmp檔案獲得的,這兩個檔案都是二進位制檔案,裡面儲存的是utmp(在Linux C標頭檔案<utmp.h>中)結構體。
下圖是部分透過lastb命令查到的嘗試登入伺服器的部分失敗記錄,其中發現一臺IP為39.105.202.21的主機在3月7日12點到14點之間多次次嘗試登入主機,透過命令sudo lastb | grep "39.105.202.21" | wc -l可以檢視其一共進行了2213次嘗試,可以推測其在嘗試暴力破解登入密碼。
也可以同last命令檢視這個IP是否成功登入,如果有則說明使用者密碼一定被成功破解了,如果沒有不排除檔案被篡改過。
Linux密碼防護
在登入輸入密碼時比較容易出現密碼洩露,傳統的加密方法,透過彩虹表可以很容易猜解密碼,即使是SHA256/SHA512也可以在網際網路上搜尋到線上解密網站進行解密,這類加密方式只要密碼一樣加密結果必然雷同,所以密碼被計算一次,想要破解的時候再查表就可以了。如今,MD5/SHA1 雜湊演算法已經被攻破,即使在加密密碼前加上鹽以後也不再保險 。
而在Linux中使用crypt演算法對密碼進行加密,這種加密方式即使每次都使用相同的密碼,最後加密的結果都是不同的。salt是[a-zA-Z0-9./]中隨機挑選的最多16位字串,總共4096種的干擾方式,這就使得透過字典破解密碼變得比較困難,每次破解一個密碼都需要重新計算一遍。
Linux中的密碼按固定的格式儲存:
$id$salt$encrypted
id是一個數字,表示以何種方式對密碼和salt生成隨機數:
salt是由大小寫字母、數字、英文句號(.)和“/”組成的不超過16位元組的隨機字串。
encrypted:是由明文密碼和隨機salt透過組合,再透過雜湊函式後生成的密文,不同雜湊演算法的密文長度如下: