构建LINUX下的入侵检测系统——LIDS 系统管理命令--vlock
http://blog.chinaunix.net/uid-306663-id-2440200.html
LIDS官方网站:http://lids.luky.org/
Who's new
hkbadu
harpo_marx
arthit75
lbcoqkf
kravciak
Who's online
There are currently 0 users and 2 guests online.
LIDS 2.2.3rc3 is released for kernel 2.6.23
Thu, 01/24/2008 - 01:37 — omo 已经无更新
lids-2.2.3rc3-2.6.23 which included TPE/NFMark feature is
already available.
You can download it from
http://www.secureos.jp/LIDS-JP/develop/
You must completely re-install lidstools to lidstools-2.2.7.3 also.
(It means you must erase /etc/lids directory and re-make ACL with
new version of lidsconf command.)
Also, now I'm developing lids-2.2.3rc4-2.6.23 which will inclide TDE/Sandbox feature. Stay tuned.
OMO
omo's blog
LIDS 2.2.3rc1 is released for kernel 2.6.21
Thanks to Kazuki Omo , We have this new version for kernel 2.6.21, you can download it from lids-2.2.3rc1-2.6.21.patch and the related lidstools-2.2.7.2.tar.gz
ChangeLog
* moved CAP_PROTECTED/CAP_KILL_PROTECTED to LIDS_CAP_PROTECTED/LIDS_CAP_KILL_PROTECTED.
Then above 2 capabilities syntaxes are changed to lidsconf -A -s "Subject" -o LIDS_CAP_PROTECTED -j ENABLE
Read more
Welcome to the LIDS new site
We are starting a new LIDS site as well as a fresh LIDS software..stay tune.
Cytrun Linux use LIDS
Cytrun Linux https://sourceforge.net/projects/cytrun is based on the Slackware, possesss Kernel 2.6.13 + LIDS, Snort Inline(A modified version of Snort that accepts packets from
iptables). Servers: WEB, EMAIL, SQL, PROXY, SSH, DHCP and DNS, Interface of Remote Administration based on Webmin.
Thanks to Michell L. Garcia, I am autor of the Cytrun Linux.
Syndicate content
Download
补丁名称是lids-x.xx-y.y.y.tar.gz, x.xx代表lids的版本, y.y.y代表Linux内核版本
lidstools-2.2.7.2.tar.gz
lids-2.2.3rc1-2.6.21.patch
Sponsor
LIDS的组成
两个用户态工具和一些文件,和一个内核补丁
/sbin/目录 存放LIDSADM命令和LIDSCONF命令
/etc/lids/lids.conf #ACLS配置文件
/etc/lids/lids.cap #LIDS capabilities(功能)配置文件
/etc/lids/lids.pw #LIDS密码文件
/etc/lids/lids.net # LIDS邮件警告配置文件
一、什么是LIDS
LIDS全称为Linux Intrusion Detection System,是一种基于LINUX内核补丁模式的入侵检测系统,它也是一种基于主机的入侵检测系统。它集成在LINUX内核中,来进一步加强LINUX内核的安全性,为LINUX内核提供实现一种安全模式、参考模式和强制存取控制模式。
(1)、LIDS的主要功能:
1、保护:保护硬盘上任何类型的重要文件和目录,如/bin、/sbin、/usr/bin、/usr/sbin、/etc/rc.d等目录和其下的文件,以及系统中的敏感文件,如passwd和shadow文件,防止未被授权者(包括ROOT)和未被授权的程序进入,任何人包括ROOT都无法改变,文件可以隐藏。保护重要进程不被终止,任何人包括root也不能杀死进程,而且可以隐藏特定的进程。防止非法程序的RAW IO 操作,保护硬盘,包括MBR保护等等。
2、检测:集成在内核中的端口扫描器,LIDS能检测到扫描并报告系统管理员。 LIDS还可以检测到系统上任何违反规则的进程。
3、响应:来自内核的安全警告,当有人违反规则时, LIDS会在控制台显示警告信息,将非法的活动细节记录到受LIDS保护的系统log文件中。 LIDS还可以将log信息发到你的信箱中。LIDS还可以马上关闭与用户的会话。
(2)、在LINUX上应用LIDS的必要性。
随着LINUX进一步的推广,现在,有很多中小企业都把自己的重要服务迁移到LINUX上。借着LINUX系统强大的安全性和较少的成本,架设在LINUX系统上的各种企业服务为这些中小企业提供了更大的发展和更强的竞争力。但是,在当前网络环境下,随着黑客技术的不断提高,以及黑客数量的不断增加,加上黑客工具的不断推陈出新,网络攻击事件也越来越多。LINUX系统的安全性正在一次次地经受着考验,LINUX系统的安全缺陷也越来越多突现出来。对于这些应用LIUNX系统在网络中提供企业相关业务的中小企业来说,如何保证这些暴露在网络中的服务器数据的安全性是一个迫在眉急的问题。虽然,网络防火墙能够阻止大部份的网络攻击,但是,一旦这种攻击穿透了防火墙,系统上的重要数据就会有完全控制的危险。因此,在LINUX系统上布置LIDS是很有必要的。它能够保证LINUX系统上的重要目录及文件不被复制、删除,重要的服务不被删除或停止,不能修改系统登录方式等等,为LINUX系统数据安全提供一种全方位的保护,也可作为防火墙的一种后备保护方式存在。
二、获取并安装LIDS补丁包及LIDS工具包
LIDS是基于开源方式,用户使用是安全免费的。可以直接到LIDS官方网站(www.lids.org)上下载,包括LIDS的内核补丁包和LIDS工具包。但一定要保证下载的LIDS补丁包与你当前所使用的LINUX系统内核版本相一致,LIDS工具包可以下载最新版本的,现在的最新版本是:lids-2.2.7.2.tar.gz,LIDS补丁包的最新版本是:lids-2.2.3rc-2.6.21.patch。 打patch
1、 应用LIDS内核补丁包。
现在以上述最新版本的LIDS内核为例。将下载的LIDS内核补丁包保存到/usr/src下,以根用户的权限进入字符模式。现在假设内核在/usr/src/linux下:
# cd /usr/src/linux
# patch p1 < /usr/src/ lids-2.2.3rc-2.6.21.patch
重新配置此内核:
# makemenuconfig
把有关LIDS的所有项都选中。这样的话,不仅对于不太熟习的用户能省去很多不必要的麻烦,同时,它也不是很大,并不会影响多少系统性能的。
在选择好后就是重新编译内核:
# make
# make install
这样一个加入了LIDS的内核就重新编译好了,但要应用LIDS还应做相应设置。要使加入了LIDS的新内核工作,得重新启动系统(因为LIDS是一个内核补丁,在选择好后就是重新编译内核。)。
2、安装LIDS工具包。
现在也以它的最新版本作例子,把下载的LIDS工具包保存的到/home/用户名(用户名是你系统上登录的用户名)目录中后,按如下方式安装:
# cd /home/用户名
# tar -zxvf lids-2.2.7.2.tar.gz
# cd lids-2.2.7.2
# ./configure
# make
# make install
这样会安装LIDSADM和LIDSCONF这两个工具到/sbin/目录中,同时会创建一个/etc/lids的目录,并在此目录下生成一个默认的配置文件。在使用LIDS前应先用“lidsadm –U”命令更新这个默认的配置文件。
(注意:如果在编译LIDS工具包时出现GCC报LIDSTEXT.h文件不存在的错误提示,应修改LIDS工具包的安装目录下的MAKEFILE文件,在在其中的CFLAGS选项中加入“-I/usr/src/linux/include”,然后就可以重新编译了。)
3、LIDSADM和LIDSCONF命令工具解释。
(1)、LIDSADM工具及其选项:
LIDSADM是LIDS的管理工具单元,可以用它在你的系统中管理LIDS,包括启用或停用LIDS、封存LIDSADM到内核中和查看LIDS状态。
使用如下命令可以列出所有可用的选项:
# lidsadm -h
它会返回下列信息:
......
lidsadm -[s/I] -- [+/-] [LIDS_FLAG] [...]
lidsadm -v
lidsadm -h
命令参数:
-s:开关某些保护选项时指示应提交密码;
-I:开关某些保护选项时不提交密码;
-v:显示版本;
-V:查看现在LIDS状态;
-h:列出所有选项。
可用功能,只列出了它的一部分(Availabe capabilities):
CAP_CHOWN:chown/chgrp
CAP_NET_BROADCAST:监听广播
CAP_NET_ADMIN:接口、防火墙、路由器改变
CAP_IPC_LOCK:锁定共享内存
CAP_SYS_MODULE:插入和移除内核模块
CAP_HIDDEN:隐藏进程
CAP_SYS_RESOURCE:设置资源限制
CAP_KILL_PROTECTED:杀死保护进程
CAP_PROTECTED:保护进程为单用户方式
可用的标志(Available flags):
LIDS:禁止或激活本地LIDS
LIDS_CLOBAL:完全禁止或激活LIDS
RELOAD_CONF:重新加载配置文件
(2)、LIDSCONF工具及其选项:
LIDSCONF为LIDS配置访问控制列表(ACLS)和设置密码。
输入以下命令能显示所有可用的选项:
# lidsconf -h
它会返回以下信息:
......
lidsconf -A [-s subject] -o object [-d] [-t from-to] [-i level] -j Accept
lidsconf -D [-s file] [-o file]
lidsconf -E
lidsconf -U
lidsconf -L
lidsconf -P
lidsconf -v
lidsconf -[h/H]
命令参数:
-A:增加一条指定的选项到已有的ACL中
-D:删除一条指定的选项
-E:删除所有选项
-U:更新dev/inode序号
-L:列出所有选项
-P:产生用Ripemd-160加密的密码
-V:显示版本
-h:显示帮助
-H:显示更多的帮助
子对像(subject):
-s [--subject]:指定一个子对像,可以为任何程序,但必须是文件;
目标(object):
-o[object]:可以是文件、目录或功能(capabilities)和socket名称。
动作:
-j:它有以下在个参数:
DENY:禁止访问
READONLY:只读
APPEND:增加
WRITE:可写
GRANT:对子对像授与能力
ignore:对设置的对像忽略所有权限
disable:禁止一些扩展特性
其它选项:
-d :目标的可执行domain
-i:继承级别
-t:指定从某一时段到某一时段可以进行怎样的操作
-e:扩展列表
三、应用LIDS
1、LIDS的启用与设置。
首先, 要想使LIDS设置的ACLS发挥作用,应在系统引导时把LIDS封装进内核中。这样每次系统启动到最后阶段(启动最后加载内核模块),此设置会根据你的系统上的/etc/lids/lids.cap文件中的内容来设置全局功能,此文件中保存的是你设置ACLS。设置封装内核,在你的/etc/rc.d/rc.local文件的未尾加入如下内容:
/sbin/lidsadm –I
在开始应用LIDS前,如果在安装命令时没有询问你设置密码,那么还应为它设置一个进入终端会话模式的密码,使用如下命令:
# lidsconf -P
你将被提示输入密码,两次输入密码后,系统将你设置的密码保存到/etc/lids/lids.pw文件中,此密码已通过Ripemd-160加密。设置了密码后,如果你想修改ACLS、Capabilities或当你开始LIDS会话时,就需要你提交此密码。你也可以在以后再次通此命令来修改已设定的密码,并在修改完成后用以下命令重新更新LIDS的配置文件:(注意:在修改密码时不会提示输入旧密码。)
lidsadm -S -- +RELOAD_CONF
特别要注意的是,在对LIDS做了任何修改后,都应使用上述命令重新更新LIDS的配置文件,它将重新加载下列配置文件:
/etc/lids/lids.conf #ACLS配置文件
/etc/lids/lids.cap #LIDS capabilities(功能)配置文件
/etc/lids/lids.pw #LIDS密码文件
/etc/lids/lids.net # LIDS邮件警告配置文件
然后重新启动系统服务使应用改变生效。
2、 通过LIDS来保护系统。
首先要明白,在通过LIDS保护的LINUX的系统中,可以通过一个LIDS的*会话终端模式来修改那些已经加入到保护中的数据,所有的LIDS设置工作也可在这个*会话终端中进行。使用如下命令打开一个LIDS终端会话:
# lidsadm -S -- -LIDS
按提示输入密码后,就建立了一个lids *会话终端,在此终端你可以启用或停用LIDS和退出此终端。此时,LINUX系统中的任何数据都是不受LIDS保护的。在完成对文件或数据的修改后,你应通过如下命令重新启用LIDS:
# lidsadm -S -- +LIDS
另外要清楚的是,在一个增加了LIDS的内核的系统中,一个叫/etc/lids/lids.cap文件中包括了所有的功能描述列表。每一个功能项前通过使用“+”号来启用此功能,使用“-”号来禁用此功能,完成设置后你必须重新加载配置文件。
下面我们就来通过运用这些功能项对要保护的重要数据进行设置。
(1)、保护文件为只读。
# lidsconf -A -o /some/file -j READONLY
此命令保证一旦LIDS启用,任何人都不能修改或删除此文件。如果你在lids*会话终端方式下,你就可以修改/some/file指定的文件,只要此分区不是挂载为只读方式。应用时用实际的文件路径代替/some/file。
(2)、保护一个目录为只读。
# lidsconf -A -o /some/directory -j READONLY
此命令用保证一旦LIDS启用,任何人都不能列出或删除此目录及其中的内容。如果你在*会话终端方式下,你就可以修改/some/directory目录,只要分区不是挂载为只读方式。例如,你可以设置保护/etc/目录为只读方式:
lidsconf -A -o /etc -j READONLY
这里要告别注意的是:当你设定/etc目录为只读后,当你想挂载文件系统时,你应该删除/etc/mtab文件,然后使用它的一个符号连接/proc/mounts。同时,你必须修改你的初始化脚本,使用“-n”选项来设置任何mount和umount命令。这个选项告诉mount和umount不更新/etc/mtab文件。例如,你发现在你的初始化脚本中有一行:mount -av -t nonfs,nproc,应把它改为:mount -av -n -t nonfs,nproc。
(3)、隐藏任何人都看不到的文件或目录。
# lidsconf -A -o /some/file_or_directory -j DENY
此设置将使用任何人甚至root用户都不能访问它,如果是一个目录,那么此目录下的文件、目录都将隐藏,文件系统也一样。
(4)、指定某些特定的程序以只读方式访问一些非常敏感的文件。
比如在系统登录时要访问/etc/shadow文件,我可以指定某些程序能在系统认证时使用它,如login、ssh、su和vlock。例如,你可以只允许login以只读方式访问/etc/shadow文件:
# lidsconf -A -s /bin/login -o /etc/shadow -j READONLY
(5)、以根用户身份启动一个服务在指定的端口上运行。
服务运行在指定的端口(1024以下)上需要CAP_NET_BIND_SERVICE功能。如果你禁止了此功能在/etc/lids/lids.cap文件中,你就不能以根用户身份启动任何一个服务运行在指定的端口上。你可以授与某个程序有此功能:
# lidsconf -A -s /usr/local/bin/apache -o CAP_NET_BIND_SERVICE 80 -J GRANT
或者在LIDS_GLOBAL被禁止时启用此服务。
(6)、在LIDS启用时,保证X Windows系统能工作。
X server必须使用CAP_SYS_RAWIO功能才能在LIDS启用时工作。
# lidsconf -A -s /path/to /your/x-server -o CAP_SYS_RAWIO -j GRANT
(7)、启用ssh和scp。
缺省状态下,ssh和scp通过指定的端口创建远程连接,它需要CAP_NET_BIND_SERVICE功能,因此你可以授与CAP_NET_BIN_SERVICE功能给ssh:
# lidsconf -A -s /usr/bin/ssh -o CAP_NET_BIN_SERVICE 22 -J GRANT
(8)、设置限制访问时间
例如,只允许用户从早上8:00到下午6:00这段时间能登录:
# lidsconf -A -s /bin/login -o /etc/shadow -t 0800-1800 -j READONLY
你也可以在“-t”选项中使用“!”,即除指定时间外所有时间能做某项工作。
(9)、通过网络发送安全警报。
在/etc/lids/lids.net文件中指定通过网络发送安全警报的接收邮箱。要特别要注意的是:在指定e-mail时在E-MAIL地址的前后不能有任何空格。同时,在修改完后必须重新加载它的配置文件。
这篇文章我已经发给网管员世界杂志刊登了,在这里贴出只是想可能有更多的朋友需要这方面的内容。
Linux入侵监测系统LIDS原理(2)
http://tech.sina.com.cn/s/2008-09-06/1214796394.shtml
LIDS保护数据结构
在分析完Linux文件系统后,让我们来看看LIDS是如何容VFS来保护文件和目录的。
在/usr/src/Linux/fs/lids.c
struct secure_ino {
unsigned long int ino; /* the inode number */
kdev_t dev; /* the dev number */
int type; /* the file type */
};
上面的结构用一对来存储保护文件或目录的结点。“type”是用来标明保护结点文件类型的。
LIDS有4种类型
在/usr/src/Linux/include/Linux/fs.h
#define LIDS_APPEND 1 /* APPEND ONLY FILE */
#define LIDS_READONLY 2 /* Read Only File */
#define LIDS_DEVICE 3 /* Protect MBR Writing to device */
#define LIDS_IGNORE 4 /* Ignore the protection */
通过secure_ino结构,我们能很容易的初使化保护的文件或是在内核里执行以下函数。
在/usr/src/Linux/fs/lids.c
int lids_add_inode(unsigned long int inode ,kdev_t dev , int type)
{
if ( last_secure == (LIDS_MAX_INODE-1))
return 0;
secure[last_secure].ino = inode;
secure[last_secure].dev = dev;
secure[last_secure].type = type;
secure[++last_secure].ino = 0;
#ifdef VFS_SECURITY_DEBUG
printk("lids_add_inode : return %d
",last_secure);
#endif
return last_secure;
}
就象你在上面代码上可以看到的,给secure_ino加到一个结点上是非常容易的。被保护的结点会在系统启动的时候初使化。初使化程序在/usr/src/Linux/fs/lids.c的init_vfs_security()里。
现在,让我们看看LIDS是如何来检查是否一个结点已经受到保护。
在/usr/src/Linux/fs/open.c
int do_truncate(struct dentry *dentry, unsigned long length)
{
struct inode *inode = dentry->d_inode;
int error;
struct iattr newattrs;
/* Not pretty: "inode->i_size" shouldnt really be "off_t". But it is. */
if ((off_t) length < 0)
return -EINVAL;
#ifdef CONFIG_LIDS
if (lids_load && lids_local_load) {
error = lids_check_base(dentry,LIDS_READONLY);
if (error) {
lids_security_alert("Try to truncate a protected file (dev %d %d,inode %ld)",
MAJOR(dentry->d_inode->i_dev),
MINOR(dentry->d_inode->i_dev),
dentry->d_inode->i_ino);
.....................
这个是LIDS加到内核里做检测的一个例子。你会看到lids_check_base()是LIDS保护方法的一个核心函数。
你可以在LIDS要保护的地方看到很多LIDS保护方法用到lids_check_base()函数,特别是在Linux内核的子目录下。
在/usr/src/Linux/fs/lids.c
int lids_check_base(struct dentry *base, int flag)
{
..................
inode = base->d_inode; /* get the inode number */
parent = base->d_parent; /* get the parent diretory */
.................
----> do {
if ( inode == parent->d_inode)
break;
if ((retval = lids_search_inode(inode))) {
if ( retval == LIDS_IGNORE
(retval == LIDS_DEVICE && flag != LIDS_DEVICE))
break;
if ( flag == LIDS_READONLY
( flag == LIDS_APPEND && retval >flag )
( flag == LIDS_DEVICE && flag == retval )) {
return -EROFS;
}
break;
}
inode = parent->d_inode;
} while( ((parent = parent->d_parent ) != NULL) );
return 0;
}
lids_check_base()会检查一个给定文件的dentry和它的父目录是否被保护。
注意:如果它的父目录被保护,它下面的文件也会被保护。
例如,如果“/etc/”被保护,“/etc/passwd”也一样被保护。
在内核保护系统调用
为了保护系统,LIDS会在一些检查临界的系统调用的时候做检查。因此,我们可以保护系统调用和限制文件系统的用户调用。
这些是一些例子,
open(),open是通过禁止一些权利来保护文件的打开。 你可以在打开调用open_namei()调用的时候LIDS在检测它。
mknod(),mknod是用来在指定目录下保护mknod。
unlink(), 在内核代码检查do_unlink()。
用LIDS增强Linux系统安全(转)
http://blog.itpub.net/10617731/viewspace-961062/
用LIDS增强Linux系统安全(转)[@more@] LIDS( Linux入侵侦察系统)是Linux内核补丁和系统管理员工具(lidsadm),它加强了Linus内核。 它在内核中实现了一种安全模式 -- 参考模式以及内核中的Mandatory Access Control 模式(MAC系统)。本文将阐述LIDS的功能和如何使用它来建立一个安全的Linux系统。
3.1 下载LIDS补丁和相关正式的Linux内核
可以从LIDS Home,LIDS Ftp Home或最近的LIDS Mirror获得LIDS补丁和系统管理工具。
补丁名称是lids-x.xx-y.y.y.tar.gz, x.xx代表lids的版本, y.y.y代表Linux内核版本
例如, lids-0.9.9-2.2.17.tar.gz代表lids 版本是0.9.9 以及相关的内核版本是2.2.17.。
必须下载相关的内核版本。例如,你下载了lids-0.9.9-2.2.17.tar.gz,那你就应该下
载Linux内核2.2.17的原代码。可以从Kernel FTP Site或其他镜象获得内核原码。
然后,将内核原码和LIDS tar解压.例如,从 www.lids.org得到lids-0.9.9-2.2.17.tar.gz,从ftp.us.kernel.org得到linux-2.2.17.tar.bz2后
Linux入侵监测系统LIDS原理
http://netsecurity.51cto.com/art/200511/12114.htm
一、入侵
随着Internet上的Linux主机的增加,越来越多的安全漏洞在当前的GNU/Linux系统上发现。你也许在Internet上听说过 在Linux下发现bug,它会导致系统很容易的被黑客攻击。
因为Linux是一个开放代码的系统,漏洞很容易发现,并且也会很快的有补丁出来。但是当漏洞没有公布的时候,并且管理员很懒,没有去打补丁。黑客就会很容易的攻击这个系统,取得root权限,在现有的GNU/Linux下,他就可以做任何他想做的事情。现在你可以问,我们现在到底可以做些什么呢?
1.1 现在的GNU/Linux错误在哪里?
超级用户会滥用职权,他能够做所有他要做的事情。作为root。他会改变所有的东西。
许多系统文件很容易被更改。这些文件可能是很重要的文件,如/bin/login,如果一个黑客进入,他可以上传一个login程序来覆盖/bin/login,这样他就可以不用登陆名和密码来登陆系统。但是这些文件不需要经常改动,除非你要升级系统。
模块modules很容易用来中断内核。模块是为了让Linux内核更模块话和更高效而设计的。但是当模块加入到内核,它就会成为内核的一部分并且能做原始内核能做的工作。因此,一些不友好的代码可以写成模块来加入到内核里,这些代码就会重定向系统调用并且作为一个病毒来运行。
进程是不受保护的,一些进程,如后台的web服务器,一直都认为是没有严格保护的程序。因此,他们就会很容易被黑客攻击。
1.2 LIDS的设想是什么。
保护重要文件。因为文件很容易被root更改,为什么不严格文件操作呢?因此,LIDS改变了文件系统在内核里的安全系统调用。如果某个时候一些人访问一个文件,他就会进入系统调用然后我们就可以检查文件名并且看她们是否被保护。如果它已经被保护,我们就可以拒绝这个访问者的要求。
保护重要的进程。这个和上面的保护进程的想法不是一样的。当一个系统里运行一个进程,它会在/proc 文件系统里有一个用pid作为路径名的入口。所以,如果你用“ps –axf”你就可以显示出当前运行的进程。你可以问如果保护这些进程。如果你要杀死一个进程的话,首先,你键入“ps”来得到进程的PID,然后,你键入“kill 〈pid〉”来杀死它。但是,如果我不让你看到进程,你怎么来杀死这个进程呢?因此,LIDS是用隐藏进程来保护它的。
另外一个重要的方法就是不让任何人可以杀死进程,包括root用户。LIDS能够保护父进程是init(pid=1)的所有进程 。
封装内核。有时候我们需要要把一些必要的模块加入到内核里来使用,另外,我们也要拒绝任何人包括root用户向内核插入模块。那么如何来平衡这个矛盾的问题呢?我们可以只允许在系统启动的时候插入模块,然后我们封装模块,在封装后,内核不允许任何人插入模块到内核里。通过这种封装功能,我们能用它来保护重要的文件,进程,我们可以在系统启动的时候只允许必要的进程,只改变必要的文件。在封装内核后,我们就不能在对文件有任何的修改。
二、保护文件系统
2.1 保护文件系统是LIDS的重要功能之一。这个功能是在内核的VFS(虚拟文件系统)层实现的,我们可以保护任何种类的文件系统,如EXT2,FAT。
在LIDS,保护的文件按种类分为以下几种:
只读的文件或目录。只读文件意味着它们不被允许改写,如,在目录/usr/bin,/sbin。这些类型的文件大多数都是二进制系统程序或是系统配置文件,除了在升级系统的时候,我们不需要改变它们。
只可增加文件或目录。这些文件是那些只可以增加大小的文件。大多数是系统的日值文件,如在/var/log里的只可增加文件。
额外的文件或目录,这些文件没有被保护。一般来说,你想要保护目录下的所有文件,但是,还需要有一些特殊的文件不要被保护。所以我们可以定义这些文件作为额外的其他的只读文件。
保护挂载或卸载文件系统。当你在启动的时候挂载文件系统的时候,你可以禁止所有人,甚至是root,去卸载文件系统。你也可以禁止任何人在当前文件系统下挂载文件系统来覆盖它。
2.2 LIDS如何在内核保护文件
在这部分,我们会看到一些内核的代码来理解LIDS是如何保护文件的。
Linux文件系统数据结构程序
首先,我们必须了解Linux的虚拟文件系统。
在Linux里的每一个文件,不管是什么样子的,都有一个结点inode数,文件系统提供了以下数据结构。
在/usr/src/Linux/include/Linux/fs.h
struct inode {
struct list_head i_hash;
struct list_head i_list;
struct list_head i_dentry;
unsigned long i_ino; ----> inode number.
unsigned int i_count;
kdev_t i_dev; ----> device number.
umode_t i_mode;
nlink_t i_nlink;
uid_t i_uid;
......
}
注意:用来鉴定一个结点inode。这个意思是你可以用一对来得到一个系统里独一无二的inode。
在/ur/src/Linux/cinclude/Linux/dcache.h里
struct dentry {
int d_count;
unsigned int d_flags;
struct inode * d_inode; /* Where the name belongs to - NULL is negative */
struct dentry * d_parent; /* parent directory */
struct dentry * d_mounts; /* mount information */
struct dentry * d_covers;
struct list_head d_hash; /* lookup hash list */
struct list_head d_lru; /* d_count = 0 LRU list */
struct list_head d_child; /* child of parent list */
struct list_head d_subdirs; /* our
......
}
dentry是一个目录文件的入口。通过这个入口,我们可以很容易的在文件的父目录下移动。
例如,如果你一文件的inode是(struct inode*)file_inode,如果你可以用file_inode->d_entry来得到它的目录入口并且用file_inode->d_entry->d_parent来得到父目录的目录入口。
LIDS保护数据结构
在分析完Linux文件系统后,让我们来看看LIDS是如何容VFS来保护文件和目录的。
在/usr/src/Linux/fs/lids.c
struct secure_ino {
unsigned long int ino; /* the inode number */
kdev_t dev; /* the dev number */
int type; /* the file type */
};
上面的结构用一对来存储保护文件或目录的结点。“type”是用来标明保护结点文件类型的。
LIDS有4种类型
在/usr/src/Linux/include/Linux/fs.h
#define LIDS_APPEND 1 /* APPEND ONLY FILE */
#define LIDS_READONLY 2 /* Read Only File */
#define LIDS_DEVICE 3 /* Protect MBR Writing to device */
#define LIDS_IGNORE 4 /* Ignore the protection */
通过secure_ino结构,我们能很容易的初使化保护的文件或是在内核里执行以下函数。
在/usr/src/Linux/fs/lids.c
int lids_add_inode(unsigned long int inode ,kdev_t dev , int type)
{
if ( last_secure == (LIDS_MAX_INODE-1))
return 0;
secure[last_secure].ino = inode;
secure[last_secure].dev = dev;
secure[last_secure].type = type;
secure[++last_secure].ino = 0;
#ifdef VFS_SECURITY_DEBUG
printk("lids_add_inode : return %d
",last_secure);
#endif
return last_secure;
}
就象你在上面代码上可以看到的,给secure_ino加到一个结点上是非常容易的。被保护的结点会在系统启动的时候初使化。初使化程序在/usr/src/Linux/fs/lids.c的init_vfs_security()里。
现在,让我们看看LIDS是如何来检查是否一个结点已经受到保护。
在/usr/src/Linux/fs/open.c
int do_truncate(struct dentry *dentry, unsigned long length)
{
struct inode *inode = dentry->d_inode;
int error;
struct iattr newattrs;
/* Not pretty: "inode->i_size" shouldnt really be "off_t". But it is. */
if ((off_t) length < 0)
return -EINVAL;
#ifdef CONFIG_LIDS
if (lids_load && lids_local_load) {
error = lids_check_base(dentry,LIDS_READONLY);
if (error) {
lids_security_alert("Try to truncate a protected file (dev %d %d,inode %ld)",
MAJOR(dentry->d_inode->i_dev),
MINOR(dentry->d_inode->i_dev),
dentry->d_inode->i_ino);
.....................
这个是LIDS加到内核里做检测的一个例子。你会看到lids_check_base()是LIDS保护方法的一个核心函数。
你可以在LIDS要保护的地方看到很多LIDS保护方法用到lids_check_base()函数,特别是在Linux内核的子目录下。
在/usr/src/Linux/fs/lids.c
int lids_check_base(struct dentry *base, int flag)
{
..................
inode = base->d_inode; /* get the inode number */
parent = base->d_parent; /* get the parent diretory */
.................
----> do {
if ( inode == parent->d_inode)
break;
if ((retval = lids_search_inode(inode))) {
if ( retval == LIDS_IGNORE ||
(retval == LIDS_DEVICE && flag != LIDS_DEVICE))
break;
if ( flag == LIDS_READONLY ||
( flag == LIDS_APPEND && retval >flag ) ||
( flag == LIDS_DEVICE && flag == retval )) {
return -EROFS;
}
break;
}
inode = parent->d_inode;
} while( ((parent = parent->d_parent ) != NULL) );
return 0;
}
lids_check_base()会检查一个给定文件的dentry和它的父目录是否被保护。
注意:如果它的父目录被保护,它下面的文件也会被保护。
例如,如果“/etc/”被保护,“/etc/passwd”也一样被保护。
在内核保护系统调用
为了保护系统,LIDS会在一些检查临界的系统调用的时候做检查。因此,我们可以保护系统调用和限制文件系统的用户调用。
这些是一些例子,
open(),open是通过禁止一些权利来保护文件的打开。 你可以在打开调用open_namei()调用的时候LIDS在检测它。
mknod(),mknod是用来在指定目录下保护mknod。
unlink(), 在内核代码检查do_unlink()。
三、保护设备
Linux的设备会在/dev/目录下以文件的形式列出,我们可以用上面保护文件的方法来保护设备。但是在一些情况下,用户也可以用IO操作来旁路文件系统来读写设备,我们必须注意这个问题。
3.1 设备,内核I/O
在GNU/Linux系统下的设备会以文件的形式表达,所以我们可以用保护文件系统那样来保护设备。
用户的I/O访问是通过系统调用sys_operm和sys_iopl来实现的。你可以看看/usr/src/Linux/arch/i386/kernel/ioport.。这个是要基于系统结构的,要是到其他平台,就需要注意它们的变化。
3.2 如何用LIDS来保护
大多数情况下,程序不需要通过在/dev的设备文件名称来访问设备。但是,一些特殊的程序需要直接访问,如X Server,这个会写到/dev/mem和甚至是I/O设备。我们需要一些额外的东西来保护设备。LIDS会在配置内核的时候来定义这个功能。
CONFIG_LIDS_ALLOW_DEV_MEM,如果你选择了开启这个功能,你就可以允许一些特殊程序来访问/dev/men和/dev/kmen这些内核临界的设备。如果你想要用内核的X Server,选择这个功能就会在配置内核的时候提供整个路径和文件名。
CONFIG_LIDS_ALLOW_RAW_DISKS,如果选择这个开启,你就可以允许一些特殊的程序来访问物理磁盘。
CONFIG_LIDS_ALLOW_IO_PORTS,如果你选择了开启这个功能,你就可以允许一些特殊的程序来访I/O端口。
当系统运行fs/lids.c里的init_vfs_security()的时候初使化就被调用。
#ifdef CONFIG_LIDS_ALLOW_DEV_MEM
lids_fill_table(allow_dev_mem,&last_dev_mem,LIDS_MAX_ALLOWED,CONFIG_LIDS_DEV_MEM_PROGS);
#endif
#ifdef CONFIG_LIDS_ALLOW_RAW_DISKS
lids_fill_table(allow_raw_disks,&last_raw_disks,LIDS_MAX_ALLOWED,CONFIG_LIDS_RAW_DISKS_PROGS);
#endif
#ifdef CONFIG_LIDS_ALLOW_IO_PORTS
lids_fill_table(allow_io_ports,&last_io_ports,LIDS_MAX_ALLOWED,CONFIG_LIDS_IO_PORTS_PROGS);
#endif
如果一个进程或是程序要直接访问ip端口或是磁盘设备,LIDS就会检查它在数组 allow_raw_disk,last_io_ports,等)。这个检查是通过调用lids_check_base()里的lids_search_inode(inode)来实现的。
如,让我们看看CONFIG_LIDS_ALLOW_DEV_MEM
/* in lids_search_inode() */
#ifdef CONFIG_LIDS_ALLOW_DEV_MEM
for( i = 0 ; i < last_dev_mem ;i++ ) {
if ( allow_dev_mem[i].ino == ino && allow_dev_mem[i].dev == dev) {
return LIDS_READONLY;
}
}
#endif
#ifdef CONFIG_LIDS_ALLOW_RAW_DISKS
在allow_dev_mem包括了哪一个程序结点在系统启动的时候在init_vfs_security()里初使化。用同样的方法,除了一些特殊程序,我们可以保护设备,I/O访问等等。
四、保护重要进程
进程是操作系统的动态入口。内核里有两个特殊进程,进程ID 0 (swapd) 和进程ID 1(init)。Init进程是在系统启动的时候所有进程的父进程。
4.1 不可杀死的进程。
就象你可以看到是否有人要夺得root特权一样,我们可以很容易的杀死那些该内核发送特别信号的进程。为了杀死一个进程,你必须得到进程的ID,然后用kill命令来杀死它。
系统杀死进程的调用是kill,是在内核里的sys_kill()命令里的调用。
让我们看看LIDS的保护代码
在/usr/src/Linux/kernel/signal.c里
asmlinkage int
sys_kill(int pid, int sig)
{
struct siginfo info;
#ifdef CONFIG_LIDS_INIT_CHILDREN_LOCK pid_t this_pid;
int i;
#ifdef CONFIG_LIDS_ALLOW_KILL_INIT_CHILDREN
if (!(current->flags & PF_KILLINITC))
#endif
if (lids_load && lids_local_load && LIDS_FISSET(lids_flags,LIDS_FLAGS_LOCK_INIT_CHILDREN)) {
this_pid = pid>0?pid:-pid;
for(i=0;i if( this_pid == lids_protected_pid[i]) {
lids_security_alert("Try to kill pid=%d,sig=%d
",pid,sig);
return -EPERM;
}
}
}
#endif
...
}
你可以在内核里看到两个标签,,CONFIG_LIDS_INIT_CHILDREN_LOCK 和CONFIG_LIDS_ALLOW_KILL_INIT_CHILDREN.
在CONFIG_LIDS_INIT_CHILDREN_LOCK的开启状态,LIDS能保护初使的运行程序。如,如果你在系统里运行inetd程序,你可以在隐藏内核前运行它,然后,你还可以杀死它。但是一些人如果telnet到你的机器,inetd就会创造子进程来为用户服务,这个子进程不会被LIDS保护,因为用户在任何时候退出和杀死程序。
4.2 隐藏进程
另外一个保护进程的方法就是隐藏进程。当一个黑客危机你的系统。他会登陆,然后会看看有没有一些已知的进程在监视它。然后他就杀死它。如果你隐藏了这个功能的进程,黑客就不会知道进程的所有情况并且你可以记录他在你系统上做的任何事情。
如何隐藏进程
为了隐藏进程,你必须在配置内核的时候提供一个完全的路径名。
当内核启动的时候琇IDS会访问文件结点到一个叫proc_to_hide[]的结构里。
在include/Linux/sched.h里
#ifdef CONFIG_LIDS_HIDE_PROC
#define PF_HIDDEN 0x04000000 /* Hidden process */
#endif
/* in fs/lids.c */
#ifdef CONFIG_LIDS_HIDE_PROC
struct allowed_ino proc_to_hide[LIDS_MAX_ALLOWED];
int last_hide=0;
#endif
....
/* in fs/lids.c , init_vfs_security(),
fill up the hidden process in proc_to_hide[]
*/
#ifdef CONFIG_LIDS_HIDE_PROC
lids_fill_table(proc_to_hide,&last_hide,LIDS_MAX_ALLOWED,CONFIG_LIDS_HIDDEN_PROC_PATH);
#endif
PF_HIDDEN是否用户可以用显示进程的命令(如“ps –a”)来显示和检查进程,如果一个进程被LIDS隐藏,当他执行的时候,进程就会得到一个PF_HIDDEN的属性。然后,当系统输出系统进程信息到用户的时候,它就会可以检查当前输出进程是否有PF_HIDDEN标志。如果发现了,它就不会输出这个进程的信息。
在in fs/exec.c
int do_execve(char * filename, char ** argv, char ** envp, struct pt_regs * regs)
{
...
if (retval >= 0) {
#ifdef CONFIG_LIDS_HIDE_PROC
if (lids_search_proc_to_hide(dentry->d_inode))
current->flags |= PF_HIDDEN;
...
因为每一个Linux的进程都有一个在/proc文件系统的入口,我们为了隐藏进程也需要修改proc的文件入口。
在fs/proc/root.c
static struct dentry *proc_root_lookup(struct inode * dir, struct dentry * dentry)
{
...
inode = NULL;
#ifdef CONFIG_LIDS_HIDE_PROC
if ( pid && p && (! ((p->flags & PF_HIDDEN) && lids_load && lids_local_load)) ) {
#else
if (pid && p) {
#endif
unsigned long ino = (pid >> 16) + PROC_PID_INO;
inode = proc_get_inode(dir->i_sb, ino, &proc_pid);
if (!inode)
return ERR_PTR(-EINVAL);
inode->i_flags|=S_IMMUTABLE;
}
...
}
然后如果进程被PF_HIDDEN标记,它就不会在proc文件系统里显示。
Linux 指令篇:系统管理--vlock
http://www.jb51.net/linux/vlock.htm
vlock(virtual console lock)
功能说明:锁住虚拟终端。
语 法:vlock [-achv]
补充说明:执行vlock指令可锁住虚拟终端,避免他人使用。
参 数:
-a或--all 锁住所有的终端阶段作业,如果您在全屏幕的终端中使用本参数,则会将用键盘
切换终端机的功能一并关闭。
-c或--current 锁住目前的终端阶段作业,此为预设值。
-h或--help 在线帮助。
-v或--version 显示版本信息。