Archive for 十一月, 2009

十一月 30th, 2009

CSS背景属性5个应用实例

No Comments, 前端开发, by admin.

来源:http://www.cssrain.cn/article.asp?id=1410
背景(background)在项目中经常会使用。这篇文章主要讲解的是实际项目中的5个实例。通过具体的分析来达到学习的目的。
1,Li列表
通过ul 和 li 的方式,我们可以构造出一些无序列表。通过ul+li,我们不仅可以做出一些漂亮的菜单,也可以做出一些完美的树形结构。 ul+li默认样式在前面有个小黑点,实际项目中我们可以通过背景来代替这个小黑点。
下面我们看2个实例:
http://www.cssrain.cn/demo/cssbackground/a1/demo1.html
http://www.cssrain.cn/demo/cssbackground/a1/demo2.html
2,文本替换
文本替换也是项目中比较常见的技术。实际开发中经常需要使用图片来替换文本。通过背景来代替文本。
下面我们看3个实例:
http://www.cssrain.cn/demo/cssbackground/a2/demo1.html
http://www.cssrain.cn/demo/cssbackground/a2/demo2.html
http://www.cssrain.cn/demo/cssbackground/a2/demo3.html
当然我需要对前面的2个实例进行一下补充说明:
在例2中,通过text-indent:-9999px;属性把 文字隐藏到看不到的地方。当然有一缺点:禁止图片下载时,什么都没有了。
在例3中,通过添加额外标签,然后使用定位方式把背景定位在上层,来遮住文字。也有一缺点:图片需要能完全遮住文字,要实底的图片。
3,自适应按钮
自适应在实际中也经常使用,通过自适应,我们不需要做额外的图片。我以前看过一些老的项目,给不同文字的按钮做了好多不同的图片,然后每个按钮的样式有btn2word,btn4word,btn6word…. 可见非常不灵活。自适应按钮能从根本上解决这个问题。
我们来看1个实例:
http://www.cssrain.cn/demo/cssbackground/a3/demo1.html
你已经看到了,自适应需要至少2个闭合元素。通过一个背景左对齐和另一个背景图片的右对齐 来做成自适应按钮。
4,圆角
以前很多项目都是方角,不知什么时候起,流行起圆角了。就像汽车一样,以前的桑塔纳的边角都是方角的,现在的车都是圆角的了。
圆角的实现方式跟自适应有点类似,只不过背景的对齐方式有点区别罢了。
http://www.cssrain.cn/demo/cssbackground/a4/demo1.html
5,等高栏
这个是最近在看 无懈可击的Web设计 中的一个例子,的确作者也讲解的非常不错。而且以前在做项目中,的确遇到过这个问题。不过解决方式貌似没作者这么简单。
话不多说,先看3个实例:
http://www.cssrain.cn/demo/cssbackground/a5/demo1.html
http://www.cssrain.cn/demo/cssbackground/a5/demo2.html
http://www.cssrain.cn/demo/cssbackground/a5/demo3.html
或许你已经看明白了 我将要讲解什么。对了,就是侧边栏跟主体栏的高度问题。实际应用中,我们经常要使他们2个呈现一样的高度。通过对最外层元素使用背景图片来达到了这种效果。

下载:
background.rar
扩展阅读:
http://www.qianduan.net/everthing-about-css-background.html

十一月 30th, 2009

记得使用try+catch

No Comments, 前端开发, by admin.

来源:http://www.cssrain.cn/article.asp?id=1417
在动态删除iframe时,同时把iframe里嵌套的iframe 删除,遇到了问题。
本来之前都没报错,突然昨天他们嵌套了一个 跨域 的网页,导致程序报错了。
var ii = eqdiv.children(“iframe”).contents().find(“iframe”);
var ilen  = ii.length;
for(var m = 0 ; m < ilen ; m++){
ii[m].contentWindow.location.replace(“about:blank”);
ii.eq(m).remove();
}
所以我给代码加了一段 try catch  :
try{
var ii = eqdiv.children(“iframe”).contents().find(“iframe”);
var ilen  = ii.length;
for(var m = 0 ; m < ilen ; m++){
ii[m].contentWindow.location.replace(“about:blank”);
ii.eq(m).remove();
}
}catch(err){ };
得提醒大家的是:contents()方法在iframe中使用时,涉及到跨域问题,请注意下。

摘要:Unix系统下pureftpd使用详解。特别是解决了很多人匿名用户无法登录的问题。与数据库的结合使得管理成千上万的用户很轻松。
基础篇
一、安装
二、启动
三、匿名登录
四、系统真实用户登录
五、puredb虚拟用户支持
六、技巧
进阶篇
七、匿名用户的权限
八、真实用户和虚拟用户的权限
高级篇
九、PureFTPd和MySQL的结合
十、pureftpd与其它工具的结合
基础篇
1. 安装
我是以FreeBSD为平台的,其它Unix/Linux平台请参考相关shell命令。在shell提示符下输入:
# cd /usr/ports/ftp/pure-ftpd
# make install clean
# rehash
FreeBSD会以ports方式安装pureftpd。其它平台的安装方法参看相关文章。
2. 启动
将pureftpd配置文件的样例文件复制为配置文件:
# cp /usr/local/etc/pure-ftpd.conf.sample /usr/local/etc/pure-ftpd.conf
用配置文件启动 PureFTPd :
# /usr/local/sbin/pure-config.pl /usr/local/etc/pure-ftpd.conf
注意:如果是其它平台,或者采用编译方式安装,路径可能与上面的不同。
3. 匿名登录
经过上面的步骤,pureftpd已经启动。用 flashfxp 连接,只能系统用户连接(用“/etc/passwd”文本文件中的用户认证)。 这是因为默认的配置文件中是允许匿名用户和系统用户(根帐号 root 除外)都可以访问的。但这时匿名用户还无法访问,出现“421 无法建立安全匿名 FTP”错误。还需要几个步骤才能实现匿名登录。
pureftpd 的官方文件(http://download.pureftpd.org/pub/pure-ftpd/doc/README)说:
———————— SETTING UP AN ANONYMOUS FTP ————————
If a ’ftp’ user exists and its home directory is reachable, Pure-FTPd will
accept anonymous login, as ’ftp’ or ’anonymous’. Files have to be located in
the home FTP directory. There’s no need for ’bin’, ’lib’, ’etc’ and ’dev’
directories, nor any external program. Don’t chown the public files to
‘ftp’, just writable directories (‘incoming’) .
就是说需要存在一个名称必须为“ftp”的系统用户,并且它的主目录可用。就可以实现匿名用户登录了。
心得:很多人在问为什么不能匿名登录,原因就在于没有“ftp”系统帐号,以及没有创建主目录()这里。
(1)、为匿名用户添加系统帐号和组。
增加一个“ftp”组:
# pw groupadd ftp
如果组存在,直接添加用户即可。
添加“ftp”系统用户:
# pw useradd ftp -g 14 -d /var/ftp -s /sbin/nologin
其中的 “/var/ftp”就是匿名用户的主目录,你可以指定为其它目录,比如“/home/ftp”等。
14是“ftp”组的组id 。其它的,比如 www 系统用户的 uid/gid 是:“80/80”,等等(见 /etc/passwd )。
如果发现帐号是存在的,那么请检查帐号的主目录是否存在,如果不存在,也会提示上述错误。
(2)、建立匿名用户的主目录。
# mkdir /var/ftp
# mkdir /var/ftp/readme
其中“mkdir /var/ftp/readme”是给个参照,因为“/var/ftp”是空的。
马上用 flashfxp 匿名登录,见到 readme 文件夹了,成功,激动!但是上传、下载、建目录什么的都不允许,要实现这些功能需要进一步修改配置文件,这个后面再说。
4. 系统真实用户登录
(1)、默认配置文件允许匿名用户登录,同时允许系统真实用户登录。经过上面的步骤后,这时我们用系统用户登录,是可以登录,并且可以上传、下载、建目录和删除等。
(2)、如果要让 FTP 只支持系统真实用户登录,你只要稍微修改一下 pureftpd 的配置文件就可以了。
# ee /usr/local/etc/pure-ftpd.conf
ChrootEveryone yes
NoAnonymous  yes
UnixAuthentication yes //用“/etc/passwd”中的用户认
只需以上三行就可以实现只允许系统真实用户登录 FTP 。系统真实用户会登陆到自己的系统主目录中,可下载,可上传,可删除,没有任何限制。但是由于有 chroot 的限制,所以无法去真实系统的其它目录而已。在实际应用中,这种用法并不多见,我也就不费篇幅介绍了。
5. puredb虚拟用户支持
(一)建立 FTP 专用的系统用户。
自从 0.99.2  版本开始,pure-ftpd 就开始支持虚拟用户。
虚拟用户方式是一个简单的用户列表机制,类似于“/etc/passwd”,它将用户的相关信息,如口令、姓名、 uid、gid、主目录等,存入一个文本文件。但是该文本文件文件只适用于 FTP 。这意味着,你可以很容易地设置 FTP 虚拟帐号,而不需要在系统中添加系统用户,以免和系统用户混淆在一起。
同时,可以为这些虚拟用户单独设置配额、ratio、带宽等限制,这些功能是系统用户认证无法实现的。很多虚拟用户可以共享同一个系统用户的属性,因此建议为这些虚拟用户单独创建一个系统用户,从而方便管理。
你可以使用系统已经存在的帐号,比如“nobody”用户,作为虚拟用户的系统帐号。但最好使用一个单独的帐号,专门对应 FTP 。我们选择新建系统用户(经测试,在 linux 系统中如果用 linux 系统自带的 ftp 用户,在用虚拟用户登陆时会出现不被信任的提示。大家也可以做做实验,看是不是这样)。建立方法如下:
对于 Linux/OpenBSD/NetBSD/Solaris/HPUX/ 或其它的类 Unix 系统,使用下面的命令:
groupadd ftpgroup
useradd -g ftpgroup -d /home/ftp -s /sbin/nologin ftpuser
对于 FreeBSD ,用下面的命令:
# pw groupadd ftpgroup
# pw useradd ftpuser -g ftpgroup -d /home/ftp -s /sbin/nologin
系统帐号建立好后,我们就开始着手准备虚拟用户了。
(二)建立虚拟用户。
使用 ”pure-pw”命令实现创建、修改和删除虚拟用户等操作。虚拟用户的信息以每个用户一行的方式存放在相应的文本文件中。你也可以手工编辑这个文件。其存储格式如下:
<account>:<password>:<uid>:<gid>:<gecos>:<home directory>:<upload bandwidth>:<download bandwidth>:<upload ratio>:<download ratio>:<max number of connections>:<files quota>:<size quota>:<authorized local IPs>:<refused local IPs>:<authorized client IPs>:<refused client IPs>:<time restrictions>
除了帐号、口令、uid、gid 和 home directory 之外,其它的可以是空值。
下面是 pure-pw 命令用法。
1、创建新用户。
要创建一个新用户,用下列的语法。
pure-pw useradd <login> [-f  <passwd file>] -u <uid> [-g <gid>]
-D/-d <home  directory> [-c <gecos>]
[-t <download  bandwidth>] [-T <upload bandwidth>]
[-n <max number of  files>] [-N <max Mbytes>]
[-q <upload ratio>]  [-Q <download ratio>]
[-r <allow client  host>[/<mask>][,<allow client host>[/<mask>]]…]
[-R <deny client  host>[/<mask>][,<deny client host>[/<mask>]]…]
[-i <allow local  host>[/<mask>][,<allow client host>[/<mask>]]…]
[-I <deny local  host>[/<mask>][,<deny local host>[/<mask>]]…]
[-y <max number of  concurrent sessions>]
[-z  <hhmm>-<hhmm>] [-m]
假设我们要创建“tim”这样一个虚拟用户,则可以使用如下命令:
# pure-pw useradd tim -u ftpuser -d /home/ftp/tim
其中:
-u 将虚拟用户 tim 同系统用户 ftpuser 关联在一起。
-d 参数使 tim 只能访问其 home 目录。而如果想让他访问整个文件系统,可以用 -D 选项。
执行完上述命令后,会提示输入密码,两次输入 tim 用户的密码即可。用户的口令会根据系统对加密方式的支持情况,选择一个最安全的方式进行加密。
然后需要建立“/home/ftp/tim”目录,并修改它的属性。
# mkdir /home/ftp
# mkdir /home/ftp/tim
注意:在配置文件中有选项自动建立主目录。
CreateHomeDir     yes //设置为 yes 创建新虚拟用户时 pureftpd 自动创建用户的主目录。
但是有一点需要大家注意,就是它只支持二层目录的建立而不支持三层以上目录的建立。举个例子,如果我们创建虚拟用户是用如下语句:
# pure-pw useradd test -u ftpuser -d /home/ftp
而这时系统只有“/home”目录而没有“/home/ftp”目录,那么在 test 用户第一次登陆时 pureftpd 会创“/home/ftp”目录。
如果我们改变以上命令如下:
# pure-pw useradd test -u ftp -d /home/ftp/test
而这时系统只有“/home”目录或“/home/ftp”目录,而没有“/home/ftp/test”目录,那么我们登陆时会得到没有主目录的提示。
其他参数含义:
-z 选项运用用户在一天当中指定的时间段连接服务器。如 -z 0900-1800 ,则该用户只能在上午 9 点到晚上 6 点之间连接服务器。
-r 选项或 -R 选项,可以限制用户从指定 IP 和掩码连入服务器。如,单一的 IP/掩码对(-r 192.168.1.0/24)。多个IP/掩码对用英文逗号隔开(-r 192.168.1.0/24,10.1.0.0/16,127.0.0.1/32)。仅 IP (-r 192.168.1.4,10.1.1.5)。主机名(-r bla.bla.net,yopcitron.com)。或者以上形式的任何组合。(-r,允许;-R拒绝)
-y ,用户同一时间的并发连接数。或者 0 意味着不限制。也就是同一 IP 的连接数。
-f ,默认虚拟用户的信息会被存放在“./etc/pureftpd.passwd”文件中,通过该选项可以改变该文件的位置。
默认的存储用户信息的文件存放在“./etc/pureftpd.passwd”,我用 ports 方式安装的 pureftpd ,其存放位置在“/usr/local/etc/pureftpd.passwd”。
我们看下这个文本文件的内容。
# cat /usr/local/etc/pureftpd.passwd
tim:$1$LX/3.F60$bYdYwsQOYIaWq.Ko.hfI3.:500:101::/home/ftp/tim/./:::::::::::::
密码是系统自己加密的。
2、更改用户。
与 pure-pw adduser 不同的是,使用 pure-pw usermod 不是创建一个用户,而是更改已存在用户的某些属性。
例如,我们给 joe 用户添加一个限额,限制 joe 用户最多拥有1000个文件,最大10 Megabytes 空间。命令如下:
# pure-pw usermod joe -n 1000 -N 10
重置某些属性的语法如下:
pure-pw usermod <user> -n ”       :禁用文件配额
pure-pw usermod <user> -N ”      :禁用文件大小配额
pure-pw usermod <user> -q ” -Q ”    :禁用 ratio
pure-pw usermod <user> -t ”       :禁用下载带宽限制
pure-pw usermod <user> -T ”      :禁用上传带宽限制
pure-pw usermod <user> <-i,-I,-r or -R> ”  :禁用 IP 过滤
pure-pw usermod <user> -z ”      :禁用时间段约束
pure-pw usermod <user> -y ”      :禁用并发数限制
3、删除用户。
删除一个用户的命令语法是:
# pure-pw userdel <login> [-f <passwd file>] [-m]
这时,用户的信息会被从指定的 passwd 文件中删除,但是用户的 home 目录会被保留,需要手工删除。
4、修改口令。
更改一个用户口令的语法是:
# pure-pw passwd <login> [-f <passwd file>] [-m]
5、显示用户信息。
“ ./etc/pureftpd.passwd” 文件中记录的信息不方便用户的阅读,因此 pure-ftpd 提供了显示用户信息的命令。其语法是:
# pure-pw show <login> [-f <passwd file>]
例如:
# pure-pw show joe
Login              : joe
Password           : $1$LX/3.F60$bYdYwsQOYIaWq.Ko.hfI3.
UID                : 500 (ftpuser)
GID                : 101 (ftpgroup)
Directory          : /home/ftpusers/joe/./
Full name          :
Download bandwidth : 0 Kb (unlimited)
Upload   bandwidth : 0 Kb (unlimited)
Max files          : 1000 (enabled)
Max size           : 10 Mb (enabled)
Ratio              : 0:0 (unlimited:unlimited)
Allowed local  IPs :
Denied  local  IPs :
Allowed client IPs : 192.168.0.0/16
Denied  client IPs : 192.168.1.1,blah.verybadhost.com
Time restrictions  : 0900-1800 (enabled)
Max sim sessions   : 0 (unlimited)
主目录后面的“/./”表示用户目录是被锁定的。
(三)、提交更改。
重要:
通过上面提到的命令,你可以创建、修改和删除虚拟用户,甚至可以手工方式编辑“/usr/local/etc/pureftpd.passwd”文件。但是,只有提交这些更改,pure-ftpd 访问才能生效。类似数据库中的事务处理。
提交更改,意味着系统会根据(或者指定的其它文件)来创建一个 pure-ftpd 可读的二进制格式的文件。 该二进制文件中的帐号是分类存储并索引优化了的,可以加快访问速度。
创建 PureDB 文件的命令如下:
# pure-pw mkdb
运行命令后,系统会在“/usr/local/etc/pureftpd.passwd”文件所在目录自动生成“/usr/local/etc/pureftpd.pdb”索引文件。
如果你想从你指定的 passwd 文本文件中生成PureDB 文件,用“-f”选项。
# pure-pw mkdb /etc/accounts/ftpusers.pdb -f /etc/accounts/ftpusers.txt
创建了 PureDB 文件(也就是提交)后,不必重启 pure-ftpd 服务,对虚拟用户进行的创建、修改和删除等操作立即生效。
同时,也可以通过“-m”选项,让“/usr/local/etc/pureftpd.passwd”文本文件在修改(如添加用户、修改密码、删除用户等等)后自动提交。命令格式如下:
# pure-pw passwd joe –m
这个命令将修改“/usr/local/etc/pureftpd.passwd”文本文件中的用户密码,并将更改提交给“/usr/local/etc/pureftpd.pdb”。
(四)更改配置文件让虚拟用户生效
将配置文件中的 PureDB 文件路径改为你的PureDB 文件路径。
# ee /usr/local/etc/pure-ftpd.conf
PureDB   /usr/local/etc/pureftpd.pdb  //Puredb路径
通过以上建立的用户,可上传,可下载,可删除,拥有全部权限。可以通过对目录的限制来达到对用户权限的限制,以后再讲解。
开启虚拟用户后,如果在配置文件中设置“UnixAuthentication no”,pureftpd就只支持虚拟用户登录,不支持系统真实用户登录。如果设置“UnixAuthentication yes”,pureftpd只支持虚拟用户登录,同时支持系统真实用户登录。
6. 技巧
(一)将系统用户转换为虚拟用户。
你可以用“pure-pwconvert”命令,将系统(/etc/passwd)用户转换为虚拟用户。
命令如下:
# pure-pwconvert >> /usr/local/etc/pureftpd.passwd
如果你以非特权的系统用户身份运行该命令,密码栏将是空的。如果你以 root 用户身份运行该命令,所有特性都被复制过来,甚至是经过哈希函数加密的密码。
这个转换只会把有 shell 访问权的用户转换过来,shell 访问设置为 nologin 的将不被转换。
系统用户转化为虚拟用户的意义在于,同一个用户名可以用不同的密码访问 FTP 和 Telnet 。
(二)环境变量
默认的情况下,如果指定了环境变量 PURE_PASSWDFILE ,则虚拟用户的 passwd 文件位置由该变量的值指定。否则,默认是位置是“/usr/local/etc/pureftpd.passwd”(Linux 中是“/etc/pureftpd.passwd”)。
同样,PURE_DBFILE 环境变量用来指定 pdb 文件的位置。默认是“/usr/local/etc/pureftpd.pdb”(Linux中“/etc/pureftpd.pdb”)。

十一月 23rd, 2009

SElinux关闭方式

No Comments, 随笔记录, by admin.

修改和关闭selinux的两种办法:1 在lilo 或者  grub的启动参数中增加:selinux=02 修改  /etc/selinux/config文件(redhat 类似系统下)中的SELINUX=”” 为 disabled ,然后重启。如果不想重启系统,使用命令setenforce 0注:setenforce 1 设置SELinux 成为enforcing模式setenforce 0 设置SELinux 成为permissive模式
#—————————————————————查看selinux状态:/usr/bin/setstatus -v
如下:SELinux status:                 enabledSELinuxfs mount:                /selinuxCurrent mode:                   permissiveMode from config file:          enforcingPolicy version:                 21Policy from config file:        targeted

十一月 23rd, 2009

Selinux是什么?

No Comments, 随笔记录, by admin.

在新的基于RHEL一般都自带了selinux,多数情况下我们把selinux禁用了,事实上既然RHEL要集成它,必然有他的优点和长处,我们通过下文来了解selinux,也许你会喜欢用上它。英文原文来自www.RedHat.comby Russell Coker翻译:胡智江主要内容介绍:SELinux概览:SELinux深入研究:Fedora中策略的实现:Fedora的缺省SELinux策略:更多关于SELinux的资料:关于作者和译者:

介绍:当今世界,无处不在高速互联网连接、如备有无线接入点的咖啡馆和在网上到处传播的各种黑客工具使得出于对计算机安全的考虑成为老生常谈。出于解决安全问题,NSA在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。这种体系叫做 Security-Enhanced Linux或简化为SELinux。

SELinux概览:

SELinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。

众所周知,标准的UNIX安全模型是”任意的访问控制”DAC。就是说,任何程序对其资源享有完全的控制权。假设某个程序打算把含有潜在重要信息的文件仍到/tmp目录下,那么在DAC情况下没人能阻止他!

而MAC情况下的安全策略完全控制着对所有资源的访问。这是MAC和DAC本质的区别。

SELinux里实现的MAC允许程序在/tmp目录下建立文件,也允许这个文件按照UNIX权限字的要求对全世界可读,但是当UNIX许可检查应用后, SELinux许可检查还要进一步判断对资源的访问是否被许可。换句话说,尽管某些UNIX文件的权限被设定为0777但是你也许仍然会被禁止读,写和执行该UNIX文件。在只有DAC的情况下,用户可以查看或更改属于他的任何文件。SELinux则可以限制每一个进程对各种资源的访问,和访问的权级。就是说当一个程序在使用含有敏感数据时,这些数据会被禁止写入那些低权级进程可读的文件中。

SELinux提供了比传统的UNIX权限更好的访问控制。

例如,管理员可以只允许一个应用程序添加记录到一个日志文件但不允许其重写或者删除该日志文件的内容。虽然ext2和ext3文件系统有一个append-only标签(使用chattr设置),但是这属性不区分某一个进程(不能在为一个访问 append-only的同时,又允许另一个进程据有完全可写的权利);另一方面,一个应用程序可以被允许在一个文件夹中建立文件和向其写入数据,但不能删除文件:这种特性是没有SELinux的普通的Linux内核所不能做到的。还有,网络应用程序可以绑定到其需要的端口上(如BIND的53端口),但不能绑定其它端口。

域-类型模型意味着在安全域中运行着的每一个进程和每一个资源(一般文件、目录文件和套接字等)都有一个与之相联系的”类型”(type)。

在这基础之上建立了一系列规则,这些规则列出了某个域可以在每一个类型上执行的所有动作。 域-类型模型的一个优点就是我们可以对策略进行分析,从而判断出哪些信息有可能外溢。在标准的UNIX环境中,用户一般可以使用ps命令来互相查看彼此的进程列表,然而这也会为攻击者提供有价值的信息。甚至就算完全阻止用户使用ps命令,信息还是会意外的或故意的泄露,其实在一个给定的UNIX环境中,哪些信息会发生泄露是无法判断的。

而在SELinux情况下,我们会有很多工具用来分析SELinux策略并判断哪些信息泄露是可能的。举个例子,假如有两个应用程序被允许向一个日志文件添加数据,且他们互相不能直接通信。那么如果一个其中进程又获得了对该日志的读权限的话,那么一个单方通信就有可能形成。

对访问/etc/shadow文件做访问限制是个很好的例子,通过该例子我们可以看出策略分析的好处。如果你装了Fedora Core 3,并且选择了严格的SElinux策略配置,那么将会有17个域被允许访问shadow_t(/etc/shadow的type),其中有9个域据有写权利。这17个域中有2个可以从用户域(user domain)进入,他们是/usr/bin/passwd和 /sbin/unix_chkpwd(一个为无特权应用程序提供密码检查的辅助程序,比如向锁屏程序就需要使用到unix_chkpwd)。这17个域中的某些域是为一些不常见的应用程序准备的(如radius_t域就是为RADIUS服务器准备的),所以,也就是说,就算除去这个不常用的域,一般的系统中还有16个可访问的域能够访问/etc/shadow呢!

值得注意的是,Fedora发型版的SELinux策略已经变得越来越灵活;未来版本的策略也许会使何以访问/etc/shadow的域超过17个,这取决于可调节选项的实际配置。还要注意的是,17这个数字是基于严格的策略设定之后而得出的,实际上一个默认的安装会大于这个数字。

在一个没有SE的机器上,任何以root身份运行的进程都可以访问/etc/shadow文件。这意味着任何被”SETUID root”的二进制代码或以root身份运行的网络服务守护进程,它们所产生的任何安全问题都将会是灾难性的。

SELinux允许我们限制这些守护进程只访问其所需:BIND只能在53端口提供服务、DHCP服务器可以使用原始套接字(raw network access)、DHCP客户端也可以使用原始套接字并可以改变网络接口,但是它们谁都别想访问/etc/shadow,/home,/root等等这些重要的资源。所以,在SElinux的情况下,如果BIND受到了危害,它最多也就是发送一些伪造的报文罢了。如果DHCPD受到了危害,最坏的可能就是你的ip地址分配被搞乱。这比root权力被远程滥用好多了!

大家很清楚,一个进程可以援引另一个进程。

在这种情况下,拿DHCPD为例,DHCPD也许会尝试援引 /sbin/unix_chkpwd对密码进行强力攻击。(But even that potential vulnerability is closed):SELinux能够提供”过渡”规则,这种规则可以用来判断各种域间过渡是否合法。有了”过渡”规则以后,由用户执行的屏幕保护程序可以顺利过渡到/sbin/unix_chkpwd这样一个特权域,然而DHCPD就别想了。

上述这些限制功能可以使你对系统的状态了如指掌。如果你发现你的DHCP服务器有BUG,那你只要简单的升级DHCP服务器到新版本并且确定每一个客户端都能正常获得IP地址就可以了。可是如果没有SE的话,你还要考虑你的新服务器是否已被黑客入侵并擦除了痕迹。

SElinux 对不同的域做了严格的隔离。我以前运行一个Debian系统有两年时间,在这期间我开放了他的root密码。最近两个月我在一个Fedora系统上做同样的事情。但这两个系统已经抵抗住了很多次以root身份的攻击(见httphttp://www.coker.com.au/selinux/play.html)。(译者注:这里有一些作者对其playmachine的介绍被忽略了)

为了给RHEL4做代码测试,Fedora core 2已经尝试集成了SELinux,但是默认是关闭的。而且将来RHEL和Fedora Core的SE还会有非常大的差别的。我们计划在RHEL中,将把SELinux的策略设置的比Fedora Core要严格,我们相信这样做也符合用户的要求。未来的Fedora版本的SELinux策略将会越来越严格,但再严格也不会超过RHEL。

SELinux深入研究:

SELinux的策略数据库控制着SELinux的方方面面。它可以判断一个程序可能会运行在哪个域中,还可以说明某个域可以访问哪些资源。这种规定被叫做规则,一个典型的策略往往拥有100,000条规则。别被这数字吓坏,我们根本不必去关心它,因为当我们撰写策略时,我们可以使用高级宏,这些高级宏的一行就能生成10,000条规则。除了宏以外,还有一些工具,使用他们可以分析这些生成的规则是否能达到你对安全的要求。其实再和设置每个文件的UNIX 权限位这样的工作比起来,这100,000个规则也是相当小的工作量了。

Fedora Core 2安全策略的目标是满足大多数用户无需改动就可以工作的要求,但也有一些普通的简单的选项可以调节策略,一般都是简简单单的一行选项。比如是否允许用户通过dmesg阅读内核的日志,是否允许管理员(sysadm_r)直接通过SSH登陆或登陆图形会话,还有是否允许用户绑定TCP套接字。那100,000个左右的规则存储在一个大约2.6MB的文件中,当系统启动时随内核一起装入内存并占用同样大小(大约2.6MB)的内核空间。 Fedora Core 3默认的strict策略有着多余290,000条规则,占用7MB的内核空间。Fedora Core 3默认的target策略有大约5,000条规则,占用150K的内核空间。

目前,SELinux并没有在内存使用方面进行优化;但现在对这些优化工作已经有了计划和一些降低内存使用的方法。如果你不打算使用某些守护进程,你可以简单的将其对应的策略文件删除以便获得占用空间更少的策略。2003年,在Ottawa举办的一次Linux讨论会上,我提交过一篇文章,那是关于我在把 SELinux移植到HP iPAQ PDA上所做的工作的文章(在http //archive.linuxsymposium.org/ols2003/Proceedings/可以获得)。

证明我可以使SELinux(且选择 strict策略)很好的工作在一台只有 64 MBs的RAM 和32 MBs 存储空间的小平台上,并且我相信我还可以使它运行在更小的平台上。针对Fedora Core2系统,我们只把目光定位在目前最常见的硬件平台,从而得出了默认的策略配置。但那些使用老机器的用户们也许会希望配置出最小限度的策略以便减少内存使用和提高性能。

在使用了SELinux的系统中,每一个进程的上下文都包含三个组成部分:一个ID(identity),一个角色(role)和一个域(domain)

ID是指这个进程的所有者,就是UNIX账户,但前提是这个账户必须被预先编译到SELinux策略中去使SELinux认识这个账户,不然的话SELinux默认地将那些未知的系统进程ID记为 system_u ,将那些未知的用户进程ID记为 user_u;角色用来判断某个处于此角色的ID可以进入哪些域,还用来防止某个处于此角色的ID进入其它不该进入的域。比如, user_r角色就不允许进入 sysadm_t (重要的系统管理域)。

换句话说就是,那些只有 user_u [...]