3 Perl语言的操作系统基础信息采集上的实现
根据上文所描述的问题,在当前风险评估实践中,大量类UNIX系统下的基础信息搜集都是手工完成的。脚本程序由于具有编程灵活、开发速度快和跨平台能力强的特点,在这些工作中具有巨大的技术优势和应用前景。
3.1 UNIX操作系统的特点
UNIX操作系统的特点和优势很多,其中与信息采集有关的特点就是其绝大多数功能和性能的配置和管理都可以通过修改某些纯文本格式的配置文件实现。由于这个特点,使得通过分析配置文件掌握操作系统基础安全信息成为可能。
除了操作系统自身,主要的应用程序也有各自的以纯文本方式保存的配置文件。表2列出了RedHat Linux release 8中典型的系统管理项和典型应用及其配置文件。
表格 2 Linux操作系统中典型的系统管理和应用
类别 | 名称 | 配置文件情况 | 备注 |
系统管理 | 用户基本管理 | /etc/passwd /etc/shadow | 设置系统用户账号、口令、主目录等 |
用户登录管理 | /etc/login.defs | 用户口令长度、修改频度等 |
系统日志 | /etc/syslogd.conf |
|
本机防火墙规则 | /etc/sysconfig/iptables |
|
系统日志 | /etc/syslogd.conf |
|
应用软件 | Web应用 | /etc/httpd/conf/* | 该目录下多个文本文件 |
MySQL数据库 | /etc/my.cnf |
|
文件共享 | /etc/samba/smb.conf |
|
vsftpd | /etc/vsftpd.conf /etc/vsftpd.ftpusers /etc/vsftpd.user_list |
|
这些类UNIX系统中配置文件的格式主要有两种类型,赋值型和记录型。
(1)赋值型
赋值型配置文件实现对应用关键属性的定义,例如,操作系统中对于新创建用户有初始设置,其配置文件如表2所示,为根目录下etc目录下的login.defs文件,其文件格式如下。
###### /etc/login.defs##########
……
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
……
在此文件中定义了一系列参数及这些参数的值。比如定义了PASS_MAX_DAYS参数,该参数的意义为新创建用户密码最大使用时间(以天为单位)。该变量的值被赋为99999,意思用户可永不修改密码。这种默认情况对于重要系统来说是存在安全隐患的。通过读取login.defs可以获知这些基础信息。
(2)记录型
记录型配置文件的典型特征是配置文件中有若干条记录,每一条记录具有相同的结构特点,例如系统账号/etc/passwd:
###### /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
……
在这类文件中,每一行为一条记录,每一条记录的不同字段用特定的字符隔离。对于上述实例,用于字段隔离的字符为冒号。
3.2 Perl语言的优势
Perl语言是类UNIX系统下的脚本语言之一。Perl的设计目标是帮助UNIX用户完成一些常见的任务,这些任务对于普通的SHELL来说过于沉重或对移植性要求过于严格。Perl编程语言对进程、网络、文字有很强的识别、处理、变换能力,因此凡是有关快速原型设计、系统工具、系统管理、数据库处理、图像程序设计、网络连接,和 WWW程序设计等之类的任务,都特别适合用 Perl 来做。
1、信息分析处理能力
Perl语言在信息分析处理上的能力来源于它对正则表达式支持程度。正则表达式赋予了Perl极大的处理和操作自由文本中的模式的能力。其他语言也有支持正则表达式的,但是没有一种能像Perl一样结合得这么好。
对于类似login.defs文件中信息的读取,仅需以下六行代码即可完成文件读取和信息提取。
open(FILE,"/etc/login.defs");
while(<FILE>){
next if(/^#/);
$config{$1}=$2 if(/(\w+)\s+(\w+)/);
}
close(FILE);
2、功能扩展能力
Perl语言不仅仅具有很强大的文本处理能力,同时由于其使用广泛,具有很好的技术支撑能力。其对模块的支持能力使得任何从都可以开发自已的功能模块,并提供给他人使用。
The Comprehensive Perl Archive Network(http://cpan.perl.org)是一个Perl资源的集散地,汇集了来自全世界Perl爱好者提供的Perl语言功能扩展模块,这些模块对Perl语言的功能起到了巨大的扩充,也使得Perl语言相比于python、shell等更具生命力的重要原因之一。
3.3 一个Perl语言实现的系统检测实例
以Linux系统用户管理中新建用户基础信息采集为例。关于新建用户的有关配置信息保存在/etc/login.defs文件中。该文件定义的常用变量及意义如表3所示。
表格 3 login.defs主要变量
变量名 | 意义 | 典型值 | 备注 |
MAIL_DIR | 用户邮件保存位置 | /var/spool/mail |
|
GID_MAX | 最大可用组id号 | 60000 |
|
GID_MIN | 最小可用组id号 | 500 |
|
PASS_MIN_LEN | 密码允许的最少字符数 | 5 |
|
PASS_MAX_DAYS | 密码最长使用时间 | 99999 | 99999意思是可以永远不改,属安全隐患 |
PASS_MIN_DAYS | 密码最短使用时间 | 0 | 0的意思是用户可以随时修改密码 |
PASS_WARN_AGE | 密码过期提前几天报警 | 7 | 当离密码过期还有7天时,系统向用户报警提示 |
UID_MAX | 最大可用用户id号 | 60000 |
|
UID_MIN | 最小可用用户id号 | 500 |
|
CREATE_HOME | 创建用户时是否同时创建用户主目录 | yes |
|
在表3中,关于密码长度、修改时间配置情况是影响安全的重要因素,假设做以下定义:
<!--[if !supportLists]-->l <!--[endif]-->密码长度
<!--[if !supportLists]-->n <!--[endif]-->长度小于6为非常危险
<!--[if !supportLists]-->n <!--[endif]-->长度小于或等于8为一般
<!--[if !supportLists]-->n <!--[endif]-->长度大于8为安全
<!--[if !supportLists]-->l <!--[endif]-->密码最长使用时间
<!--[if !supportLists]-->n <!--[endif]-->密码可以永不修改为非常危险
<!--[if !supportLists]-->n <!--[endif]-->密码可连续使用n天以上为较危险,其中n大于30
<!--[if !supportLists]-->n <!--[endif]-->密码必须在n天内修改为安全,其中n小于30
<!--[if !supportLists]-->l <!--[endif]-->密码最短使用时间
<!--[if !supportLists]-->n <!--[endif]-->密码随时可以修改为安全
<!--[if !supportLists]-->n <!--[endif]-->密码必须使用n天才能修改为危险,其中n小于30
<!--[if !supportLists]-->n <!--[endif]-->密码必须使用n天才能修改为非危险,其中n大于30
用Perl语言实现如下:
见附件iscLinux联盟
执行程序,得出以下结果:
非常危险!本系统中用户账号的密码可以永不修改。
安全。本系统中用户账号的密码修改没有时间限制。
非常危险!本系统中用户账号允许设定5个字符的密码。
4 结论
综上所述,在风险评估的基础信息采集工作中,尤其是针对类UNIX系统的基础信息采集,Perl语言具有突出的优势,可以在相关工作中发挥出应有的作用。iscLinux联盟
#####-----------以下为示例程序---------------#####
#!/usr/bin/perl
my $CONFIG="/etc/login.defs";
my %configs;
open(CONF,"<$CONFIG") or die "文件$CONFIG读取失败!\n";
while(<CONF>){
next if(/^\s*#/);
next if(/^\s*$/);
$configs{$1}=$2 if(/(.*?)\s+(.*)/);
}
close(CONF);
##判断系统账号密码使用的最长时间##
if($configs{'PASS_MAX_DAYS'} == 99999){
print "非常危险!本系统中用户账号的密码可以永不修改。\n";
}elsif(($configs{'PASS_MAX_DAYS'} >= 30) and ($configs{'PASS_MAX_DAYS'} < 99999)){
print "较危险。本系统中用户账号的密码可以连续使用达$configs{'PASS_MAX_DAYS'}天。\n";
}else{
print "安全。本系统中用户账号的密码最多只能连续使用$configs{'PASS_MAX_DAYS'} 天,短于建议的30天。\n";
}
##判断系统账号密码使用的最短时间##
if($configs{'PASS_MIN_DAYS'} == 0){
print "安全。本系统中用户账号的密码修改没有时间限制。\n";
}elsif(($configs{'PASS_MIN_DAYS'} > 0) and ($configs{'PASS_MIN_DAYS'} < 30)){
print "危险。本系统中用户账号的密码必须在设定使用后 $configs{'PASS_MIN_DAYS'} 天才能更改。\n";
}else{
print "非常危险!本系统中用户账号的密码必须在设定使用后 $configs{'PASS_MIN_DAYS'} 天才能更改。\n";
}
##判断系统账号密码最短字符长度##
if($configs{'PASS_MIN_LEN'} <= 6){
print "非常危险!本系统中用户账号允许设定$config{'PASS_MIN_LEN'}个字符的密码。\n";
}elsif(($configs{'PASS_MIN_LEN'} > 6) and ($configs{'PASS_MIN_LEN'} <= 8)){
print "一般。本系统中用户账号密码至少为$config{'PASS_MIN_LEN'}个字符。\n";
}else{
print "安全。一般。本系统中用户账号密码至少为$config{'PASS_MIN_LEN'}个字符。\n";
}
#####----------以上为示例程序-----------------#####