在上一部分内容中,我们总结了系统在开机启动流程中所应考虑的安全内容。
那么当系统启动完毕后,我们需要做的第一件事情是什么呢?答案很明显,登录系统!登录系统就需要使用用户和密码,那么我们就要考虑用户究竟是什么?为什么需要用户?用户具有哪些特性?用户是怎么使用密码登录到系统的?这些问题的答案将在本部分中给出。
谈到用户,很容易明白,用户就是计算机的使用者。
但是出于安全的角度的考虑,一个用户究会使用什么系统资源,又会怎样使用系统资源,这是系统管理员需要了解的事情。
那么好吧,从头开始,我们还是从用户登录到系统这个过程说起吧。
第六章用户登录流程系统完成启动后,会给出一个“login:”的提示符,来等待用户的登录。
用户通过输入用户名与密码进行验证以登录到操作系统上。
这个验证的动作其实是由第三方软件PAM的一个login模块所实现的,login模块根据PAM的配置文件以及模块的设置,通过检查是否存在/etc/nologin文件,比对/etc/passwd用户名与/etc/shadow文件中的密码信息,检验用户是是否存在并可登录,用户的密码是否有效并且未过期。
若通过这些验证,则用户就可以登录到系统中了用户通过验证后,可以看到提示符变为~,表示用户进入了家目录,这是我们所看到的事情。
那么用户进入家目录后又做了什么呢?当用户成功通过验证并进入到用户家目录后,会首先运行家目录中的.bash_profile脚本。
在这个脚本中可以看到以下内容:可以看到,在这个脚本中又执行了~/.bashrc文件,打开~/.bashrc好吧,打开/etc/bashrc看一看里面的内容。
99002022现在我们知道了,用户登录后所执行的有这些:首先用户登录家目录,运行.bash_profile,之后跳转到.bashrc,再跳转到/etc/bashrc脚本,再跳到/etc/profile.d/目录中运行所有脚本,最后回到.bash_profile运行该脚本下面的内容。
章节总结:可以看到,这些脚本都是先于用户操作的操作,是用以生成用户的系统环境的。
所以在登录系统后,首先要关注这些文件是否嵌入了恶意的代码。
但是为什么需要使用用户,我们将在下一章的内容中进行介绍。
第七章用户和组首先,我们来回答在这部分开头提出的一个问题,也就是为什么需要用户的存在。
其实这个问题的答案很简单,用户的存在,其实就是为了控制程序运行的权限范围的需要!用户那么对于系统来讲,用户究竟在怎么其着他的作用呢?在系统中识别用户,以uid为识别标识。
每个用户和唯一的正整数关联叫做用户的ID(uid)。
每一个进程与一个用户ID关联,用来识别运行这个进程的用户。
运行程序的用户,其程序的权限为其用户的权限。
可以查看/etc/login.defs文件,其中指定了生成用户的相关设置信息。
进程中用户的属性我们知道,系统中每个进程都有着自己的用户。
其实每一个进程都具有四个用户属性,分别为:真实UID(real uid):启动进程的用户有效UID(effective uid):用fork()函数指定的进程运行用户 ps –ef 查看的结果是显示有效uid。
当使用apache时,是使用root权限启动的,但其fork()出普通权限的用户,创建子进程,赋值相应关系给apache用户。
fork()只能由高权限派生低权限。
保留UID:在进程运行时保存原有效UID,用以在多个有效UID间切换文件系统UID :相应进程在对文件操作时所使用的用户知道了用户的作用,那么我们再来看一看与用户息息相关的内容:组!组一个用户可以属于多个组,其中分为基本组(默认组、登录组),写作g;候选组(其他组),写作G。
组可以给多个用户赋予相同的权限,用户可以在自己的默认组(gid)和候选组(groups)中进行切换。
当用户对文件进行操作时,首先比对用户的uid是否为该文件的uid,然后再比对用户的默认组(gid)是否为文件的gid(若为非,则将候选组依次调出逐一比对),在程序运行过程中,进程中的组为替换的默认组。
所以说,组所扮演的角色与用户大同小异,本质上也是为了限制对系统操作权限的。
只不过一个组中可以具有多个用户,这些用户继承了该组所有的权限。
用户在系统中的应用其实用户的生效并非在login提示符出现的时候才开始的,而是在加载initrd之后,由rc.sysinit就开始应用用户的设定了。
所以说,用户依操作范围不同,可以分为用系统用户、服务进程用户与服务内建用户。
章节总结:知道了什么是用户,并且也知道了用户的分类,那么如何设定一个程序的验证机制呢?如果想让一个程序的用户验证由系统用户改变为服务内建用户,又如何实现呢?这些内容可以通过一个强大的第三方程序PAM来实现。
第八章 PAM的结构与应用之前提到了Linux系统在用户登录时需要进行验证,而验证时使用的程序就是PAM,那么PAM究竟是个什么东西呢?pam的全名为“可插入式安全验证模块”,作为第三方软件来判断用户与密码。
PAM的结构了解一个程序的最简单方法就是分析法,这里根据PAM的结构,将其分为了三个部分进行了解。
最底层:pam的应用程序,支持pam的应用程序,看软件的程序链接,是否调用libpass_pam 第二层:pam的api,由pam的api接口和pam的配置文件(/etc/pam.d/中,UNIX中为4列,描述所使用的程序;LINUX中为三列,每个程序单独一个配置文件)所组成。
可以使用ldd /bin/xx来查看应用程序所调用的动态链接库(程序是否调用libpam.so),从而查看应用程序是否支持pam。
之后通过配置文件,进行关于pam的配置。
第三层:PAM模块,REDHAT系统保存在/lib/sercurity/目录中。
PAM的配置文件第一列:模块类型auth:鉴定类型account:账号类型:长度,大小写,是否存在,账号的权限session:会话类型:在当前会话中能够做的事情password:口令类型,密码过期否,长度,复杂度,注意:每行验证的类型是相对独立的第二列模块处理方式处理模块执行后成果或失败对整个配置的影响required:必要条件,必须通过验证,否则失败,无论通过与否,后续继续判断requisite:必要条件,不通过直接跳出optional:可选条件,一般来完成记账或触发事件sufficient:充分条件,与required合用,通过该条直接通过第三列模块路径和模块参数默认为/lib/security/目录中,若放置在其他位置,应注明绝对路径大部分模块带有运行条件参数,可使用“模块”空格“参数”的方式运行pam的文档在/usr/share/doc/pam-* 中各种不同模块pam模块具有很多特点,其本质是为上层接口提供具体的服务实现的。
所有的模块均为第三方编写,所以针对不同的情况,产生了多种多样的pam模块。
下面是具体模块的功能介绍。
pam_unix是UNIX的基本认证模块,主要用于检测libc中定义的认证范围loginauth include system-authpam_permit总是认证正确的模块pam_deny总是认证错误的模块pam_stack引用其他pam配置文件完成此语句条目的检测。
(类似include但又不是include,调用另一个判断的整体为该行结果)pam_cracklib检测用户密码相关输入与规则是否相符,如新密码的长度、新密码与老密码是否一致、新密码是否健壮、认证时密码的重输次数、密码的加密方式见/etc/pam.d/vsftpdpam_shells检测用户的shell是否在/etc/shells中定义见/etc/pam.vsftppam_securetty对非root用户无效,检测root用户是否在允许的tty上登录/etc/securettypam_listfile指定特殊列表文件为验证列表文件见/etc/pam.d/vsftpdpam_rootok判断是否为root用户见/etc/pam.d/supam_limit限制用户可以使用的系统资源,调用/etc/security/limits.conf文件,限制用户使用的内存、可以开启多少进程等。
但受到kernel配置的制约。
见/etc/pam.d/login应用给支持pam的程序制作黑名单,见vsftpd的pam配置文件etc/pam.d/su中关于pam_wheel模块的使用pam_wheel.so 判断用户是否处于wheel组·pam_wheel.so trust use_uid 若用户在wheel组,则可以随意supam_wheel.so use_uid 若用户在wheel组,才可以使用su命令PAM高级控制符编写pam模块时使用,各种不同的情况具有各种不同的返回值。
控制符多用于在软件开发过程中,开发人员调试时所使用。
这里就不多做介绍了。
章节总结:本章了解了PAM的运作原理与应用程序是如何使用PAM的模块进行验证的。
这里我们可以知道,只要修改相关的PAM配置文件,就可以改变用户的验证方式。
所以,出于安全的角度,对于PAM的配置文件一定要做到万无一失,保存其完整性。
下一章通过一个实验,进一步了解PAM的验证方法与对软件的协同性。
第九章改变VSFTPD的验证方式实验原理vsftpd的验证方式本身是通过系统账户来进行验证的,处于安全与管理的需求,这里将vsftpd的验证方式改变为使用服务内建账户来进行验证,并将服务的内建账户信息保存在mysql数据库当中。
整个服务流程的原理为:用户通过广域网连接vsftpd服务,ftp服务器通过加载并调用pam_mysql模块,连接MySql数据库,并从中提取出用户信息比对用户所输入的信息来进行验证,由pam_mysql 模块判断用户是否能够登录,然后将验证结果返回给ftp服务器。
实施流程编辑vsftpd的配置文件,放入到/etc/vsftpd/目录中,使vsftpd支持pam_mysql的验证方式。
编译pam_mysql模块,添加vsftpd.mysql服务的pam配置文件首先将pam_mysql模块包准备好在模块源代码包中的readme文件中,注明了配置文件书写格式与具体参数的意义,如认证方式,加密格式等等。
在编写vsftpd.mysql的配置文件时可以进行参考。
这里不应该将密码的加密方式设置为3,因为REDHAT5的md5头部不完整,需要另外编译openssl 包。
另外要注意编译安装后模块所放置的位置,若模块放置在/usr/lib/security中,需要在配置文件中指定绝对路径(默认模块放置在/lib/security/目录中)。
/etc/pam.d/vsftpd.mysql的配置文件的内容如下:注意:这里是两行,后面跟的都是参数在mysql中创建相应的vsftpd库与users和logs的表,这里所保存的二进制文件mysql_pam.sql文件内容如下:CREATECREATE TABLENULLchar16NULLchar48NULLCREATE TABLEvarchar255user char16char32char32之后就可以在mysql中创建相应的用户名与密码了,登录ftp方式如下:速度很慢的原因:从MYSQL中读取的问题(可能)。