第5章Linux安全机制 5.1Linux安全机制概述 Linux是UNIX克隆(UNIX clone)或UNIX风格(UNIX alike)的操作系统,能运行主要的UNIX工具软件、应用程序,是一个支持多用户、多进程、多线程、实时性较好的功能强大而稳定的操作系统。 5.1.1用户标识和鉴别 Linux中权限最高的是超级用户root,其在系统中的地位类似于Windows NT的管理员Administrator用户,可以执行任何操作,管理一切资源,root用户一般在安装系统时创建。其他用户通常是在系统安装完成后由root用户创建,这类用户只能访问和管理有限资源,也称受限用户。 在系统内部具体实现中,系统会为每个用户分配一个唯一的标识号UID(User ID),UID是一个数值,比如root用户的UID为0,普通用户的UID通常从500开始顺序编号,小于500的UID是系统保留用以启动某些服务。具有相似属性的多个用户可以分配到同一组内,用组标志符(Group ID,GID)来唯一标识,每个用户可以属于一个或多个用户组。用户号(UID)和用户组号(GID)决定了用户的访问权限。 所有与用户相关的信息存储在系统中的/etc/passwd文件中,包含用户的登录名、UID、GID等。通过执行系统命令“ls l /etc/passwd”可以看到,这个文件的拥有者是root用户,且具有读写该文件的权限,而普通用户只有读文件的权限。 #ls -l /etc/passwd #-rw-r--r-- root root 那么,在/etc/passwd文件中具体包含哪些内容呢?可以通过系统命令“cat /etc/passwd”查看。 如图5.1所示,该文件是一个文本文件,每一行都由7个部分组成,每两个部分之间用冒号分割开,这7个部分分别描述了以下信息: 用户名、口令、用户ID、组ID、用户描述、用户主目录、用户的登录Shell。 图5.1/etc/passwd文件内容 在用户登录时,输入用户名、口令信息,用户名是标识,它告诉计算机该用户是谁,而口令是确认数据,Linux使用改进的DES算法(通过调用crypt()函数实现)对其加密,并将结果与存储在数据库中的用户加密口令进行比较,若两者匹配,则说明该用户为合法用户,否则为非法用户。 为了防止口令被非授权用户盗用,对口令的设置应以复杂、不可猜测为标准。一个好的口令应该满足长度和复杂度要求,并且定期更换,通常,口令以加密的形式表示,由于/etc/passwd对任何用户可读,故常成为口令攻击的目标,在后期的UNIX版本以及所有Linux版本中,引入了影子文件的概念,将密码单独存放在/etc/shadow中,而原来/etc/passwd文件中存放口令的域用x来标记。文件/etc/shadow只对root用户拥有读权,对普通用户不可读,以进一步增强口令的安全。 /etc/shadow每一行记录包含9个字段,用分号隔开,如图5.2所示,分别描述用户名、加密后的口令信息、口令的有效期等信息。 图5.2/etc/shadow 5.1.2访问控制 Linux系统的访问控制是基于文件的,在Linux系统中各种硬件设备、端口甚至内存都是以设备文件的形式存在的,虽然这些文件和普通文件在实现上是不同的,但它们对外提供的访问接口是一样的,这样就给Linux系统资源的访问控制带来了实现上的方便。 Linux提供的访问控制机制为自主访问控制,早期的Linux将用户进行分组授权,一般分为属主用户、同组用户和其他用户三类,这种访问控制的粒度比较粗,无法实现对单个用户的授权。目前的Linux在支持粗粒度自主访问控制的基础上,利用访问控制列表(Access Control List,ACL)机制,能够实现对单个用户的授权。 1. 访问权限 命令ls可列出文件(或目录)对系统内不同用户所给予的访问权限,如: -rw-r--r-- 1 root root 1397 Mar 7 10:20 passwd 图5.3给出了文件访问权限的图示解释。 图5.3Linux自主访问控制 访问权限位共有9位,分为3组,用以指出不同类型的用户对该文件的访问权限。 权限有3种: (1) r,允许读; (2) w,允许写; (3) x,允许执行。 用户有3种类型: (1) owner,文件的属主,表示文件是由该用户创建的; (2) group,与该文件属主同组的用户,即同组用户; (3) other,除以上两者外的其他用户。 图5.3表示文件的属主具有读、写及执行权限(rwx),同组用户允许读和执行操作(rx),其他用户没有任何权限。在权限位中,-表示相应的访问权限位不允许。为操作方便,可以通过数字表示法对文件权限进行描述,这种方法将每类用户的权限看作一个3位二进制数值,具有权限的位置用1表示,没有权限的位用0表示,图5.3中的rwxrx用数字表示为750。 上述授权模式同样适用于目录,目录的文件类型为d。目录的读权限是指用ls列出目录中内容的权限; 写权限是指在目录中增删文件的权限; 执行权限是指进入目录或将该目录作路径分量的权限。因此要使用任一文件,必须要有搜索该文件所在路径上所有目录分量的权限,仅当要打开一个文件时,文件的权限才开始起作用,而rm、mv只要有目录的搜索和写权限,并不需要有文件的权限,这一点应尤为注意。 root用户对任何文件或目录均可进行任何操作,具有最高权力,这样方便了管理员对系统的管理,但同时也是一个潜在的安全隐患,对于root账户的使用,需要注意以下几点: (1) 除非必要,尽量避免以root用户身份登录; (2) 不要随意将root shell留在终端; (3) 不要以root身份运行其他用户的或来源不明的程序。 2. 改变权限 改变文件的访问权限可使用chmod命令,并以新权限和该文件名为参数,格式为: chmod [-Rfh] 访问权限 文件名 chmod也有其他方式可直接对某组参数进行修改,详见Linux系统的联机手册。合理的文件授权可防止偶然性的覆盖或删除文件,改变文件的属主和组名可用chown和chgrp,但修改后原属主和组员就无法修改回来了。 文件的授权可用一个4位的八进制数表示,后3位对应图5.3所示的三组权限,授以权限时相应位置为1,不授以权限时则相应位置为0。最高的一个八进制数分别对应SUID位、SGID位、sticky位。 umask(Linux对用户文件模式屏蔽字的缩写)也是一个4位的八进制数,Linux用它确定一个新建文件的授权。每一个进程都有一个从它的父进程中继承的umask。umask说明要对新建文件或新建目录的默认授权加以屏蔽的部分。 新建文件的真正访问权限=(~umask)&(文件授权) Linux中相应有umask命令,若将此命令放入用户的.profile文件,就可控制该用户后续所建文件的访问许可。umask命令与chmod命令的作用正好相反,它告诉系统在创建文件时不给予哪些访问权限。 3. 特殊权限位 Linux系统中文件的属性还包括SUID、SGID以及sticky属性,用来表示文件的一些特殊性质。 1) SUID 有时用户需要完成只有拥有特定权限才能完成的任务,如对于普通用户,当通过/usr/bin/passwd命令修改自己的口令时会涉及对/etc/passwd文件的修改操作,而普通用户不拥有修改/etc/passwd文件的权限,通过对可执行文件/usr/bin/passwd设置SUID(Set User ID)可以解决这个问题。 # ls -a /usr/bin/passwd # -rwsr-xr-x 1 root root /usr/bin/passwd就是一个设置了SUID的程序,有时又称为s位程序,普通用户执行该程序时,将暂时拥有/usr/bin/passwd这个可执行文件的属主root的权限,因此可以修改自己的口令。 用“chmod u+s文件名”和“chmod us文件名”来设置和取消SUID权限位。 SUID程序会使普通用户权限得到提升,从而给系统安全带来威胁,为了保证SUID程序的安全性,系统管理员应对系统中所有设置SUID的程序进行定期的检查和监视,严格限制功能范围,不能有违反安全性规则的SUID程序存在,并且要保证SUID程序自身不能被任意修改。 2) SGID 该属性既可作用在可执行文件上也可作用在目录上,当作用在可执行文件上时,它将使执行该文件的进程拥有同组用户的权限,但这个功能几乎不用。当SGID属性作用到目录时,可以用于设置该目录下创建的文件和子目录的默认组权限。 默认情况下,一个用户创建一个文件,用户的有效主组就设置为该文件的组属主,这种默认设置在有些情况下并不方便。想象这样的场合,用户linda和lori在会计部门工作,共享目录/account,为授权方便,将他们都设置为组account的成员。默认情况下,这些用户是以用户名命名的组的成员,两个用户又同时是account组的成员,但account组只能是这些用户的第二备选组。当一个用户在/account目录下创建了文件,用户主组成为文件的组拥有者,但是如果为该/account目录设置了SGID权限,并且设置组account作为目录的主组,所有在该目录下创建的文件和子目录将组account作为默认的组拥有者,这样通过为account组设置文件操作权限,方便文件在同组用户之间共享。 可以利用“chmod g+s文件名”和“chmod gs文件名”命令来设置和取消SGID权限位。 3) sticky 该权限位的主要作用是当有多个用户对同一目录具有写权限时,为了防止某个用户的误操作而删除其他用户创建的文件。当为共享目录设置了sticky属性时,用户仅可在以下情况下删除文件: (1) 用户是文件的属主; (2) 用户是文件所在目录的属主。 5.1.3审计 审计是Linux安全机制的重要组成部分,它通过对安全相关事件进行记录和分析,发现违反安全策略的活动,确保安全机制正确工作并能对系统异常及时报警提示。审计记录常写在系统的日志文件中,丰富的日志为Linux的安全运行提供了保障。常见的日志文件如表5.1所示。 表5.1审计文件 日 志 文 件说明 acct或pacct记录每个用户使用过的命令 aculog筛选出modems(自动呼叫部件)记录 lastlog记录用户最后几次成功登录事件和最后一次登录失败的事件 loginlog记录不良的登录尝试 messages记录输出到系统主控台及由syslog系统服务程序产生的信息 sulog记录su命令的使用情况 utmp记录当前登录的每个用户 wtmp记录每一次用户登录和注销的历史信息,以及系统关和开 xferlog记录ftp的访问情况 Linux系统中传统的审计机制是Syslogd和Klogd。Syslog是一个应用层的审计机制,允许应用程序将审计信息传递给系统日志守护程序Syslogd, 图5.4审计机制 由Syslogd根据配置文件(/etc/syslogd.conf)将收到的信息按类型作相应处理,写入不同的日志文件,如图5.4所示。另外,也允许内核消息守护进程Klogd将内核中通过Printk打印出的消息写入日志文件。 Linux传统的审计方式具有很大的局限性。首先,它不能提供系统级审计记录。Syslogd只能接收由应用程序产生的日志信息,而Klogd只能接收内核中由Printk打印出的消息,这两种方式审计信息量获取有限,审计记录不够详细。其次,就应用层审计而言,Syslog也是有局限性的。Syslog产生的审计信息完全依赖于应用程序。如果入侵者熟悉Syslog的工作方式,就可以模仿与某个应用程序相同的方式写入日志,伪造出虚假的审计数据。一旦某个收集审计数据的外部服务程序被恶意用户杀掉后,由该服务程序所收集的某类审计记录就不会产生,这样审计系统也就达不到记录所有安全相关系统活动的目的。 为了达到TCSEC所规定的C2级的审计标准,当前的UNIX/Linux系统都对传统审计机制进行了改进和增强。 5.2Linux标识和鉴别实验 5.2.1实验目的 掌握用户账户安全设置方法; 掌握账户锁定策略、账户注销策略的设置方法。 5.2.2实验内容及环境 1. 实验内容 在Linux安装完成后,需要对用户账户进行适当的配置以提高系统的安全性,主要涉及清除多余账户、清除多余用户组、锁定系统伪账户、检查是否存在空口令账户、对root账户进行保护等; 当前Linux采用的最常用的身份认证方式是口令认证,为防范对于口令的字典攻击和暴力破解,需要对用户鉴别机制进行相应的安全设置,包括设置账户锁定策略、设置账户注销策略等。 2. 实验环境 主流配置计算机一台,安装Ubuntu14.04。 5.2.3实验步骤 1. 清除多余账户 账户是黑客入侵系统的突破口,系统的账户越多,黑客们得到合法用户权限的可能性一般也就越大。我们需要定期查看账户、口令文件,与系统管理员确认后删除一些不必要的账户,删除用户的命令为userdel,利用该命令删除sync、news、uucp、games等账户,这些账户为系统默认创建但很少使用的账户,具体用法如图5.5所示。 图5.5删除用户 删除用户通常由管理员账户root执行,在Ubuntu 14.04中,root用户默认没有启用,可以参考相应的资料查看如何开启root用户,也可通过sudo命令临时以root用户的权限执行部分操作,这种方式更符合安全策略的要求。 2. 清除多余的组 同样,应该删除系统安装时默认创建但很少使用的组账号,如adm、dip等以减少系统受攻击的风险,删除组用命令groupdel,其用法如图5.6所示。 图5.6删除用户组 3. 锁定账户登录 如果某些账户一段时间内不用,为了防止被恶意用户利用,可以锁定这些账户以禁止其登录,在需要时可以解锁。锁定账户的命令为passwd l <用户名>; 解锁账户的命令为passwd u <用户名>,可以用passwd S查看用户状态,如图5.7所示。 图5.7锁定用户 4. 禁用root之外的超级用户 执行命令: #cat /etc/passwd 检查账户文件中的用户ID,若用户ID=0,则表示该用户拥有超级用户权限,禁用除root之外的超级用户。 5. 保护root账户的安全策略 由于root账户具有最高权限,一旦被攻击者获取root权限,将对系统造成巨大的危害,用户需要具备以下对root账户的保护意识: (1) 除非必要,避免以超级用户登录; (2) 严格限制root只能在某一终端登录,远程用户可以使用/bin/su l来成为root; (3) 不要随意把root shell留在终端; (4) 若某人确实需要以root来运行命令,则考虑使用sudo命令临时以root身份来运行命令; (5) 不要把当前目录(“./”)和普通用户的bin目录放在root账户的环境变量PATH中; (6) 不以root运行其他用户或来源不明的程序。 6. 用户口令策略的设置 为了防范字典攻击和暴力破解,用户应该设置强口令,为了强制用户设置安全口令,Linux系统提供了类似Windows的密码策略,在配置文件/etc/login.defs中进行设置,如图5.8所示,口令策略涉及如下参数: (1) PASS_MAX_DAYS 99999##密码设置最长有效期(默认值); (2) PASS_MIN_DAYS 0 ##密码设置最短有效期; (3) PASS_MIN_LEN 5 ##设置密码最小长度; (4) PASS_WARN_AGE 7 ##提前多少天警告用户密码即将过期。 图5.8设置密码策略 其中,口令的最小长度设置可以在/etc/login.defs文件中通过设置参数PASS_MIN_LEN进行限制,也可以利用Linux PAM机制,下载libpan_cracklib模块,基于该模块在/etc/pam.d/commonpassword文件中可以设置更加精细的口令策略,比如口令必须包含大小写字母的个数、特殊字符的个数、口令由几种类型的字符组成、新口令与旧口令不同的位数等。 7. 修改自动注销账号时间 在Linux系统中root账户具有最高特权,如果系统管理员在离开系统之前忘记注销root账户,将会带来很大的安全隐患,安全起见,应该让系统自动注销用户。通过修改账户中TIMOUT参数,可以实现此功能,编辑你的profile文件/etc/profile后加入下面这行: export TIMEOUT=300 300表示300秒,也就是表示5分钟,如图5.9所示。这样,如果系统中登录的用户在5分钟内都没有动作,那么系统会自动注销这个账户。 图5.9设置用户注销时间 而在Redhat等版本的Linux中,打开/etc/profile文件,找到配置项HISTSIZE,在它的下一行添加TIMEOUT=300即可。 8. 设置账户登录失败锁定次数、锁定时间 在Ubuntu 14.04中账户登录失败锁定的次数也是在配置文件/etc/login.defs中设置,如图5.10所示,但是如果系统启用PAM登录机制的话,相应的锁定策略由PAM机制设置。 图5.10设置用户登录失败次数 而在Redhat等版本的Linux中,可以编辑文件/etc/pam.d/systemauth,设置auth required pam_tally.so为需要的策略: auth required pam_tally.so onerr=fail deny=6 unlock_time=300 设置密码连续错误6次锁定账户,且锁定时间为300秒。 5.3Linux访问控制实验 5.3.1实验目的 掌握自主访问控制的概念; 掌握文件和目录自主访问控制的设置。 5.3.2实验内容及环境 1. 实验内容 利用Linux自主访问控制机制实现用户授权; 利用Linux访问控制列表实现用户授权; 目录文件的访问权限控制。 2. 实验环境 主流配置计算机,安装Ubuntu14.04。 5.3.3实验步骤 1. 利用Linux自主访问控制机制实现用户授权 (1) 以root创建用户linda和lucy,并分别为两个用户设置密码,如图5.11所示。 图5.11新建用户 (2) 用户linda用touch命令创建文件helloworld,查看helloworld的文件权限,测试用户lucy能否写,可以看到文件写入失败,请求被拒绝,如图5.12所示。 图5.12创建文件并测试文件默认权限 (3) 用户linda用chmod命令修改文件helloworld的权限,使得lucy能写文件,如图5.13所示。 图5.13修改文件权限并测试 2. 利用Linux访问控制列表实现用户授权 (1) 以lucy用户身份创建文件worldhello,查看文件权限,可以看到用户linda对文件worldhello没有写权限。lucy利用setfacl设置用户linda的权限,并通过getfacl查看文件worldhello权限。切换到linda用户,尝试往该文件中写入内容,可以看到文件写入成功,如图5.14所示。 图5.14设置单个用户访问权限并测试 (2) 使用x选项删除linda对文件worldhello的访问权限,然后再次尝试以linda用户身份对文件worldhello进行写操作,可以看到写操作被拒绝,如图5.15所示。 图5.15删除单个用户访问权限并测试 3. 目录文件的访问权限控制 (1) 用户linda在/tmp目录下创建目录/tmp/data,查看目录权限,可以看到用户lucy对于目录/tmp/data拥有读和执行的权限。在新建目录下用touch helloworld创建文件,切换当前用户为lucy,由于拥有对data目录的读权限,因而可以利用ls列出目录/tmp/data的内容。由于具有对data目录的执行权限,因而利用cd进入目录,但由于不具有对目录的写权限,所以不能在该目录下创建文件worldhello,如图5.16所示。 图5.16创建目录并测试默认访问权限 (2) 用户linda修改用户对目录/tmp/data的权限,依次去掉其他用户对目录的读权限和执行权限,验证lucy是否能执行ls和cd操作,由此可见对于目录的读权限对应的是列出目录下内容的权限,目录的执行权限是进入目录的权限,如图5.17所示。 图5.17验证目录权限含义 (3) 用户linda修改用户对目录/tmp/data的权限,使其他用户具有对目录的读、写和执行权限,并验证,如图5.18所示。 图5.18修改目录访问权限并测试 5.4Linux特殊权限实验 5.4.1实验目的 掌握Linux中SUID、SGID、Sticky 3种特殊权限的含义和配置方法。 5.4.2实验内容及环境 1. 实验内容 SUID、SGID、Sticky 3种特殊权限的设置。 2. 实验环境 主流配置计算机一台,安装Ubuntu14.04。 5.4.3实验步骤 1. SUID特殊权限 1) 查找系统中所有设置了SUID权限位的可执行文件 Linux中有一类具有特殊权限的可执行文件,当执行该类文件时会使普通用户的权限得到提升,给系统带来很大的安全隐患,这样的特殊权限是通过给可执行文件设置SUID位(有时简称s位)来实现的。 find path perm用于根据文件权限在指定路径下查找文件,有3种形式: (1) find path perm mode; (2) find path perm mode; (3) find path perm +mode。 其中find path perm mode表示严格匹配,也即文件权限必须跟mode完全一致才能匹配成功; find path perm mode表示文件权限包含mode权限的文件都能匹配成功; find path perm +mode表示文件权限被mode权限包含的文件都能匹配成功。 在5.1.2节中介绍过用户的普通权限可以表示成3位十进制数值型,分别表示属主、同组用户和其他用户的权限,而对于特殊权限SUID、SGID、Sticky,也可以表示成十进制值,其中4表示SUID、2表示SGID、1代表Sticky权限值,这里我们查找的是设置了SUID位的所有程序,可以通过用find / perm 4000命令找到所有具有s位权限的文件。 2) 关闭/usr/bin/gpasswd的s位权限 利用chmod命令可以关闭可执行文件的s位权限,如图5.19所示。 图5.19关闭/usr/bin/gpasswd的s位权限 2. Sticky特殊权限 如果多个用户对同一目录具有写权限,则一个用户可以删除另一个用户创建的文件,给系统带来安全隐患。如果在目录上设置Sticky特殊权限,则可以防止一个用户删除另一个用户创建的文件,而只有文件或目录的属主可以删除该文件。 (1) root用户创建目录/tmp/bookstore,查看目录权限,可以看到在默认情况下目录对非同组的其他用户只有读和执行的权限,因而其他用户无法在该目录下新建文件或子目录,通过指令“chmod 777”修改新建目录的权限,使得所有用户都具有所有权限。以linda用户的身份登录系统,进入/tmp/bookstore目录后创建文件helloworld,切换lucy用户,可以看到lucy可以删除linda创建的文件,存在安全隐患,如图5.20所示。 图5.20目录没有设置Sticky位带来的安全隐患 (2) root用户利用chmod 1777 命令或chmod o+s命令设置/tmp/bookstore目录的Sticky权限,用户linda再次在该目录下创建helloworld文件,可以发现lucy无法删除该文件,如图5.21所示。 图5.21目录设置Sticky位可防止文件被其他用户删除 5.5练习题 (1) 在5.3.1节实验中分别利用自主访问控制机制和访问控制列表为用户授予对文件的写权限,两种授权有何不同,哪种更安全? (2) 在5.3.1节实验中,用户test创建了文件aa,通过授权允许zhang读写,但不允许用户Li读写,用户Li能绕过访问控制最终读取到文件aa的内容吗?请通过实验验证你的结论。 (3) 查找资料进一步学习find指令的用法,利用该指令查找所有设置了SGID位、Sticky位的文件或目录。 (4) SGID通常设置在目录上,设置了SGID的目录下创建的文件或子目录的GID为目录的GID,请设计实验验证SGID的权限。