当前位置:Linux教程 - Linux综合 - Linux安全小谈 (3)

Linux安全小谈 (3)

在本文中,我奖为大家介绍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 */  }  


[1] [2] 下一页 

 

(出处:http://www.sheup.com)


上一页 [1] [2]