在本文中,我獎為大家介紹Linxu的安全機制(只是簡單介紹下,本人太菜,很深的的東東我也寫不出,呵呵) 1 PAM機制 PAM是一套共享庫,它提供了一個框架和一套編程接口,把認證工作從程序員那裡轉到ADMIN那裡。PAM允許ADMIN在多種認證方式之間進行選擇,能夠改變本地的認證方法而不需要重新編譯有關認證的應用程序。 PAM包括如下功能: **加密口令 **允許隨意Shandow口令 **對用戶進行資源限制以防止DOS攻擊 **限制用戶在特定時間內從特定地點登陸 **引入概念“client plug-in agents”,使PAM支持C/S應用中的機器——機器認證成為可能。 PAM機制為一些更高級的認證方法提供了便利的基礎,在此基礎上很容易開發出例如智能卡,指紋識別認證等高技術認證方法。 2 入侵檢測系統(IDS) 這是一種比較新的技術,現在的服務器很少有安裝IDS系統的,Linux也只有最近發布的新版本才陪上這種工具。管入侵檢測系統的歷史很短,但發展卻很快,目前比較流行的入侵檢測系統有Snort、Portsentry、 Lids等。 (以後我會為大家專門介紹入侵檢測系統) 利用LINUX本身配備的工具和從INTERNET上DOWN下的工具,可以使LINUX系統具備高級的入侵檢測能力,這些能力包括: **記錄入侵企圖,當攻擊發生時及時通知管理員; **在規定情況的攻擊發生時,采取事先規定的措施; **發送一些錯誤信息,比如偽裝成其他*作系統,這樣攻擊者會認為他們正在攻擊一個Windows NT 或Solaris系統。(我們可不可以說這是一種網絡欺騙技術呢?) 3 加密文件系統 加密文件系統就是將加密服務引入文件系統,從而提高計算機系統的安全性。有太多的理由需要加密文件系統,比如防止硬盤被偷竊、防止未經授權的訪問等。目前開發的LINUX中已經有多種加密文件系統,例如 CFS、TCFS、CRYPTFS等,其中比較有代表性的是TCFS, 它通過將加密服務和文件系統緊密集成,使用戶感覺不到文件的加密過程。TCFS不修改文件系統的數據結構,備份與修復以及用戶訪問保密文件的語義也不變。TCFS可以作到讓以下用戶不可讀加密文件: **合法擁有者以外的用戶; **用戶和遠程文件系統通信線路上的偷聽者; **文件系統服務器的超級用戶。 對於合法用戶,訪問保密文件與訪問普通文件幾乎沒有區別。 4 安全審計 即使系統管理員十分精明地采取了各種安全措施,但是新漏洞是層出不窮的,攻擊者在漏洞被修補之前會迅速抓住機會攻破盡可能多的機器。雖然LINUX不能預測何時主機會受到攻擊,但是它可以記錄攻擊者的行蹤。LINUX系統也可以進行檢測、記錄時間信息和網絡連接情況。這些信息將被重定向到日志中備查。日志是Linux安全結構中的一項非常重要的內容,它是提供攻擊發生的唯一真實的證據(入侵者往往刪除或者偽造日志也就是這個原因)。因為現在的攻擊方法多種多樣,所以Linux提供網絡、主機和用戶級的日志信息。LINUX可以記錄以下內容: **記錄所有系統和內核信息; **記錄遠程用戶申請訪問哪些文件; **記錄用戶可以控制哪些進程; **記錄具體用戶使用的每條命令; **記錄每一次網絡連接和它們的源IP地址、長度,有時還包括攻擊者的用戶名和使用的*作系統。 5 強制訪問控制 強制訪問控制(MAC,這個MAC可不是以台技術裡的MAC,大家一定要分清楚),是一種由系統管理員從全系統的角度定義和實施的訪問控制,它通過標記系統中的主客體,強制性地限制信息的共享和流動,使不同的用戶只能訪問到與其有關的、指定范圍的信息,從根本上防止信息的失洩密和訪問混亂的現象。 傳統的MAC實現都是基於TCSEC中定義的MLS策略,但因MLS本身存在著不少缺點(不靈活、兼容性差、難於管理等),研究人員已經提出了多種MAC策略,如DTE、RBAC等。由於LINUX是一種自由*作系統,目前在其上實現強制訪問控制的就有好幾家,其中比較典型的包括SElinux、RSBAC、MAC等,采用的策略也各不相同。 NSA推出的SELinux安全體系結構稱為 Flask,在這一結構中,安全性策略的邏輯和通用接口一起封裝在與*作系統獨立的組件中,這個單獨的組件稱為安全服務器。SELinux的安全服務器定義了一種混合的安全性策略,由類型實施 (TE)、基於角色的訪問控制 (RBAC) 和多級安全(MLS) 組成。通過替換安全服務器,可以支持不同的安全策略。SELinux使用策略配置語言定義安全策略,然後通過checkpolicy 編譯成二進制形式,存儲在文件 /ss_policy中,在內核引導時讀到內核空間。這意味著安全性策略在每次系統引導時都會有所不同。策略甚至可以通過使用 security_load_policy 接口在系統*作期間更改(只要將策略配置成允許這樣的更改)。 RSBAC的全稱是Rule Set Based Access Control(基於規則集的訪問控制),它是根據Abrams和LaPadula提出的Generalized Framework for Access Control(GFAC)模型開發的,可以基於多個模塊提供靈活的訪問控制。所有與安全相關的系統調用都擴展了安全實施代碼,這些代碼調用中央決策部件,該部件隨後調用所有激活的決策模塊,形成一個綜合的決定,然後由系統調用擴展來實施這個決定。RSBAC目前包含的模塊主要有MAC、RBAC、ACL等。 6 防火牆 防火牆是在被保護網絡和因特網之間,或者在其他網絡之間限制訪問的一種部件或一系列部件。 LINUX的防火牆有以下功能: **訪問控制,可以執行基於地址,時間和用戶的訪問控制策略,從而可以杜絕非授權的訪問,同時保護內部用戶的合法訪問不受影響。 **審計,對通過它的網絡訪問進行記錄,建立完備的日志、審計和追蹤網絡訪問記錄,並可以根據需要產生報表。 **抗攻擊,防火牆系統直接暴露在非信任網絡中,對外界來說,受到防火牆保護的內部網絡如同一個點,所有的攻擊都是直接針對它的,該點稱為堡壘機,因此要求堡壘機具有高度的安全性和抵御各種攻擊的能力。 **其他附屬功能,如與審計相關的報警和入侵檢測,與訪問控制相關的身份驗證、加密和認證,甚至VPN等 ######################################################################## ######################################################################## 補上一篇作為對PAM機制的深入了解: 使用PAM進行統一身份的認證 發布日期:2000-8-8 來源:Bricks Team ; 作者:bricks PAM是 PLUGGABLE AUTHENTICATION MODULES 的縮寫.可插入的認證模塊(並不是Linux指的模塊)用於實現應用程序的認證機制,是程序員或管理員不需要重新編寫或編譯程序就可以改變認證機制. 在linux它已經被廣泛的應用了, 例如: /etc/securitty /etc/onlogin/etc/FTPusers 實際上都是給它用的.你在登陸的時候的輸入密碼和你修改密碼時也都用的是它./etc/pam.conf和/etc/pam/* 都是它的配置文件. 它最大的優點是它的彈性和可擴充性. 你可以隨意修改認證機制, 按你的實際需要來定制系統.你了解後就會非常清楚了. DESIGN GOALS(設計目標) (a) 管理員可以選擇認證方式, 從簡單的密碼到智能卡系統. (b) 可以為不同的程序配置不同的認證機制.如 使telnet使用 S/Key認證. 而本機的 login 缺使用一般的 UNIX passWord. (c) 支持程序的顯示方式的需求. 如login 需要基於終端的顯示, 而dtlogin 需要 X 顯示, 而`ftp' 和 `telnet'需要透過網絡來認證. (d) 支持為一個程序配置同時使用多種認證機制. (e) 可是用戶在使用多種認證機制時,不必為同一個密碼敲入多次. (f) 可是用戶在認真時需要輸入多個密碼. (g) 當底層的認證機制改變時上層軟件不需要修改. (h) 結構為system authentication提供一個 _pluggable_ model. (i) 必須能滿足現有的服務需要. 4. OVERVIEW OF THE PAM FRAMEWORK (縱覽PAM的框架)其核心實際上是一些庫函數. 你寫的應用程序要調用它們.PAM為你提供了一套入口(the front end). 而這套函數互調用 特定認證機制所定義的模塊 (the back end). 簡單的說是這樣的: 你調用一個函數僅僅告訴它你要認正,這就足夠了.至於用那一種機制來認證是由配置文件規定的. 你只需要看一看返回值就知道認證是否成功了. 對於開發應用程序的人來說只需要記住幾個函數. ftp telnet login (Applications) +--------+--------+ +-----+-----+ PAM API <-- pam.conf file +-----+-----+ +--------+--------+ UNIX Kerberos Smart Cards (Mechanisms) Figure 1: 基本的 PAM 結構PAM的功能被分為四個部分: (1) authentication(認證), (2)account(賬號管理), (3) session (對話管理), 和 (4) password (密碼管理).這四個東東都是什麼呢? (a) Authentication management: 包括 `pam_authenticate()' 來認證用戶, `pam_setcred()' 來設置刷新和銷毀用戶的 credentials. (b) Account management: 包括 `pam_acct_mgmt()' 來檢查用的賬號是否還有效.可以被用來檢查用戶是否超時或賬號是否過期. (c) Session management: 包括 `pam_open_session()' 和 `pam_close_session()' 用於對話過程的管理. 例如: 可以用來紀錄用戶的連接時間. 一次telnet過程實際上也是一個session. (d) Password management:`pam_chauthtok()' 用來修該密碼. 程序通過調用 `pam_start()'和 `pam_end()' 來開始或結束一次PAM 事務.`pam_get_item()' 和 `pam_set_item()' 讀寫有關事務的信息.可以用`pam_strerror()'來取得錯誤信息. 如何配置你的系統呢? pam.conf的一個例子: #服務名 模塊類型 控制標志 模塊的名字 選項 #------- ----------- ------------ ----------- ------- login auth required pam_unix_auth.so nowarn login session required pam_unix_session.so login account required pam_unix_account.so ftp auth required pam_skey_auth.so debug ftp session required pam_unix_session.so telnet session required pam_unix_session.so login password required pam_unix_passwd.so passwd password required pam_unix_passwd.so OTHER auth required pam_unix_auth.so OTHER session required pam_unix_session.so OTHER account required pam_unix_account.so `OTHER' 被用來為沒有它數指定的服務用的. 選項是隨著模塊的參數.為一個服務是可以指定多個auth模塊的.它們一次被調用來驗證用戶的身份.這叫做 Stacked Modules. 下面的例子為LOGIN指定了三個模塊. login +--------+--------+ session auth account +--+--+ +--+--+ +--+--+ PAM PAM PAM +--+--+ +--+--+ +--+--+ UNIX UNIX UNIX session auth account Kerberos auth RSA auth Figure 2: Stacking With the PAM Architecture pam.conf中的 `控制標志' 實際上是指明這些 Stacked module 的工作方式. 它可取的值如下: (a) `required': 該模塊的讓正必須通過,失敗者立即返回錯誤信息. (b) `optional': 表示可以忽略它的錯誤而繼續下面一個模塊. (c) `sufficient': 表明該模塊的讓正已經是足夠了,下面的模塊就不用調用了.立即返回成功的消息. Password-Mapping 密碼的映射多層的模塊認證可能會需要多個密碼. 則會使用戶感到厭煩.一簡單的方法是是用戶使用同一個密碼而透過mapping機制來加強安全性. 其實是通過一個密碼來產生另一個密碼,使一個密碼可被多個模塊使用. 當然要保證第一個密碼是強壯的. auth的模塊多有下列 `選項': (a) `use_first_pass': 使用第一個模塊要求輸入的密碼.不再向用戶提示要密碼. (b) `try_first_pass': 先試著使用第一個模塊要求輸入的密碼, 不對再要求用戶輸入. (c) `use_mapped_pass': 使用 password-mapping 來得到密碼, 不再向用戶提示要密碼. (d) `try_mapped_pass': 先試著使用 password-mapping 來得到密碼, 不對再向用戶提示要密碼. 下面的例子可以看懂了吧: pam.conf login auth required pam_unix.so debug login auth required pam_kerb.so use_mapped_pass login auth optional pam_rsa.so use_first_pass 這種設計使你沒有辦法來知道執行的具體情況. 當然它也是與應用程序無關的. Notes: 在linux下, 也可以用/etc/pam.d中的文件來配置.這些文件的格式pam.conf類似,只是沒有服務名. 其服務名就是它的文件名.入上述的login也可以配置如下: /etc/pam.d/login auth required pam_unix.so debug auth required pam_kerb.so use_mapped_pass auth optional pam_rsa.so use_first_pass APPENDIX A. PAM API'S A.1. Framework Layer API's int pam_start( char *service_name, // pam.conf中的服務的名字 char *user, // 用戶名 strUCt pam_conv *pam_conversation, // 一個用於互交的函數 pam_handle_t **pamh // 一個句柄 ); `pam_start()' 用於初始化一次pam事務 PAM modules 透過struct pam_conv *pam_conversation中定義的函數來與應用程序通信. int pam_end( pam_handle_t *pamh, int pam_status //上一個pam函數的返回值 ); pam_end()' 結束一次PAM 事務, 釋放相關的內存. int pam_set_item( pam_handle_t *pamh, int item_type, void *item ); int pam_get_item( pam_handle_t *pamh, int item_type, void **item ); `pam_get_item()' 和 `pam_set_item()' 用於一些特殊處理.讀一些信息. Table 5: Possible values for Item_type Item Name Des cription PAM_SERVICE The service name PAM_USER The user name PAM_TTY The tty name PAM_RHOST The remote host name PAM_CONV The pam_conv structure PAM_AUTHTOK The authentication token (password) PAM_OLDAUTHTOK The old authentication token PAM_RUSER The remote user name char * pam_strerror( int errnum ); int pam_set_data( pam_handle_t *pamh, char *module_data_name, char *data, (*cleanup)(pam_handle_t *pamh, char *data, int error_status) ); int pam_get_data( pam_handle_t *pamh, char *module_data_name, void **datap ); 用於讀取與模塊相關的數據. A.2. Authentication API's int pam_authenticate( pam_handle_t *pamh, int flags ); int pam_setcred( pam_handle_t *pamh, int flags ); A.3. Account Management API int pam_acct_mgmt( pam_handle_t *pamh, int flags ); A.4. Session Management API's int pam_open_session( pam_handle_t *pamh, int flags ); int pam_close_session( pam_handle_t *pamh, int flags ); A.5. Password Management API's int pam_chauthtok( pam_handle_t *pamh, int flags ); APPENDIX B. SAMPLE PAM APPLICATION /* /etc/pam.conf check_user auth required /lib/security/pam_unix_auth.so check_user account required /lib/security/pam_unix_acct.so 注意要和你的系統一致redhat是這樣 編譯時要這樣: gcc check.c -ldl -lpam -lpam_misc -o check_user */ #include #include #include static struct pam_conv conv = { misc_conv, //定義在pam_misc.h中, 方便你編程 NULL }; int main(int argc, char *argv[]) { pam_handle_t *pamh=NULL; int retval; const char *user="nobody"; if(argc == 2) { user = argv[1]; } if(argc > 2) { fprintf(stderr, "Usage: check_user [username]\n"); exit(1); } retval = pam_start("check_user", user, &conv, &pamh); /* 開始 */ if (retval == PAM_SUCCESS) retval = pam_authenticate(pamh, 0); /* 認證是不是該用戶? 提示你輸入一個密碼 */ if (retval == PAM_SUCCESS) retval = pam_acct_mgmt(pamh, 0); /* 賬號是否有效? */ if (retval == PAM_SUCCESS) { fprintf(stdout, "Authenticated\n"); } else { fprintf(stdout, "Not Authenticated\n"); } if (pam_end(pamh,retval) != PAM_SUCCESS) { /* 結束 */ pamh = NULL; fprintf(stderr, "check_user: failed to release authenticator\n"); exit(1); } return ( retval == PAM_SUCCESS ? 0:1 ); /* indicate success */ }