UNIX / LINUX 系统安全防护
一次性进群,长期免费索取教程,没有付费教程。
教程列表见微信公众号底部菜单
进微信群回复公众号:微信群;QQ群:16004488
微信公众号:计算机与网络安全
ID:Computer-network
UNIX 已有数十年的历史,在这期间,已经有了巨大的变化,出现了各种各样的不同的版本,应用面从微型嵌入式系统到超级计算机上。无可争论,没有两个实际的UNIX操作系统是完全相同的。
“UNIX”一词是属于Open Group的一个商标,该组织是一个要求符号得到正确归属的国际协会。在这数十年当中,该标识已经被冲淡到没有具体含义。虽然如此,Open Group仍发布了“The Single UNIX Specification”,这可以在http://www.UNIX-systems.org/online.html上看到。
“Unix”是双关语,表示名字Multics,它最初被写作“Unics”,表示UNiplexed Information and Computing System。“Unix”和“UNIX”在如今都被广泛使用。曾经有一段时间,Dennis Ritchie试图宣布用小写版本,因为“UNIX”不是开头字母组成。
许多运行Linux等类似UNIX系统的人认为他们运行的是UNIX。正式UNIX系统和非正式UNIX系统通常被认为属于一类——不论是书中、媒介、网上还是社会公认。
按照UNIX FAQ的定义,UNIX是“一个用C语言编写的操作系统,它有层次文件系统并集成了文件和设备I/O,其系统调用接口包括fork ( )和pipe ( )等服务,用户界面包括cc、troff、grep、awk等工具和一个被选择的 shell”。UNIX为多任务提供一致的方式,并内置有创建、同步和终止进程的操作,它可在不同种类计算机间进行移植。
由于UNIX的分支相当之复杂,远远不能完整地论述各种UNIX安全配置。我们重点介绍以下三个方面,即一般UNIX的安全配置,主要针对各种UNIX系统所共同的安全配置选项;然后将重点介绍Solaris和Linux操作系统安全管理和配置。
对于一般的UNIX系统,文件系统安全是其中重要的一部分。文件系统是UNIX系统安全的核心。在UNIX中,所有的对象都是文件。UNIX中的基本文件类型有正规文件、目录、特殊文件、链接、套接字、字符设备等。这些不同类型的文件以一个分层的树结构进行组织,以一个叫“root”的目录为起始位置(“/”)。整个就是一个文件系统。每个文件对应一个“i”节点,“i节点”包括UID(文件拥有者)、GID(文件所在组)、模式(文件的权限)、文件大小、文件类型、ctime(“i节点”上次修改时间)、mtime(文件上次修改时间)、atime(文件上次访问时间)、nlink(链接数)以及访问权限。这些属性构成了文件的基本属性。其中,文件权限是 unix 文件系统安全的关键。Unix 中的每个用户有一个惟一的用户名和 UID(用户ID号),每个用户属于一个或多个组。基本分组成员在/etc/passwd中定义,附加的分组成员在/etc/group中定义。例如,用户tiger的UID为225,分组为11(students),此外,他还是分组185(postgraduates)的成员。每个文件和目录有三组权限,一组是文件的拥有者、一组是文件所属组的成员、一组是其他所有用户。“r”表示可读,“w”表示可写,“x”表示可执行。一共9位(每组3位),合起来称为模式位(mode bits)。模式位通常由一列10个字符来表示,每个字符表示一个模式设置,第一个指明文件类型如d表示目录,-表示普通文件,l表示链接文件等。可以用chmod和umask命令来改变权限。
其中尤其值得注意的是文件的 SUID 位和SGID 位,这是因为一些入侵者利用这些文件入侵或者留下后门。当用户执行一个SUID文件时,用户ID在程序运行过程中被置为文件拥有者的用户ID。如果文件属于 root,那用户就成为超级用户。同样,当一个用户执行 SGID文件时,用户的组被置为文件的组。Unix实际上有两种类型的用户ID。实际ID是在登录过程中建立的用户ID,有效ID是用户运行进程时的有效权限,一般情况下,当一个用户运行一条命令时,进程继承了用户登录Shell的权限,这时实际ID和有效ID是相同的。当SUID位被设置时,进程则继承了命令拥有者的权限。通过创建一个SUID是root的shell拷贝,攻击者可以借此建立后门。因此,系统管理员应当定期查看系统中有哪些SUID和SGID文件。命令如下:
find / -type f \( -perm -4000 -o -perm -2000 \) -ls
保证在“/var/log”目录下的不同日志文件的完整性是保证系统安全所要考虑的非常重要的一个方面。如果我们在服务器上已经加上了很多安全措施,攻击者还是能够成功入侵,那么日志文件就是我们最后的防范措施。因此,很有必要考虑一下用什么方法才能保证日志文件的完整性。如果服务器上或网络中的其他服务器上已经安装了打印机,就可以把重要的日志文件打印出来。这要求有一个可以连续打印的打印机,并用syslog把所有重要的日志文件传到“/dev/lp0”(打印设备)。攻击者可以改变服务器上的文件、程序,等等,但是,把重要的日志文件打印出来之后,他就无能为力了。
可以通过如下设置将系统日志打印到连接在这台服务器上的打印机。编辑syslog.conf文件,在文件末尾加入:
authpriv.*;mail.*;local7.*;auth.*;daemon.info /dev/lp0
这样就保证将日志通过物理媒介保存了。由于日志量相当之大,因此更好的办法是只将重要的日志及时打印,而将其他的日志,通过配置转到网络上面的一台安全服务器上。例如如下设置:
authpriv.*;mail.*;local7.*;auth.*;daemon.info @other.secure.server
目前绝大多数的Syslogd已经实现了这一功能。如果syslogd不支持这一配置的话,可以改用ssyslog或者是syslog-ng,这两种服务器,都能够实现比原有syslog更复杂的审计选项。
另外,可以使用如下命令及其参数来增强对用户密码的管理:
passwd -n 30 user #强迫用户每30天修改一次密码;
passwd -f user #强迫用户在下一次登录时修改口令;
passwd -n 2 -x 1 user #禁止用户修改口令;
passwd -l user #封锁用户账号,禁止登录。
以上我们简单介绍了绝大多数UNIX所共有的一些问题,包括文件系统、审计以及用户账号和密码政策的管理。下面,我们重点介绍Solaris和Linux所独特的安全配置和管理。
一、Solaris系统安全管理
在文件系统方面, 提供了一种扩展的访问权限控制机制。当传统的UNIX文件访问权限不能够满足需要的时候,访问控制列表(ACLs)可以提供对文件访问权限更强的控制。普通UNIX的文件保护机制为三类用户,即拥有者、组用户和其他用户。访问权限为读、写和执行的权限。ACL 则可以为用户和组提供更加灵活的访问权限配置。注意只有在 UFS 文件系统中才支持 ACL。如果将含有 ACL 项的文件拷贝或者存储到/tmp 目录中(通常为TMPFS文件系统),这些ACL项将会丢失。如果想临时地存储带有ACL项的文件,可以使用/var/tmp目录。
ACL机制要解决的问题是也许会需要两个组来访问一个文件,一个组可以读它,而另一个组则具有写权限;或者,只将一个文件的读权限赋给一个组的两个用户。这些都是标准的UNIX访问权限控制所达不到的。
ACL是UNIX的标准文件许可控制的扩展。ACL的信息是分各个文件单独存储的。为了设定文件或者目录的ACL,Solaris提供了这样两个命令:
setfacl:显示文件的ACL项。
-a:显示文件名、组用户、拥有者和文件的ACL。
-d:显示文件名、拥有者、组用户。即使文件没有ACL,也可以显示以上信息。
setfacl:设置、增加、更改、删除文件的ACL项。
-s acl:设置文件的访问权限控制项。
-m acl:增加或者修改文件的访问权限控制项。
-d acl:删除一个文件访问权限控制项。
其中,每一个ACL项格式如下:
类型:UID 或者 GID(如果这一项为空,则说明是文件拥有者的用户或者组):权限类型通常有如下几种:(对于文件)
u:为某一用户设置访问权限,第二项是该用户的ID,如果第二项为空,则是文件的拥有者。
g:为某一组用户设置访问权限,第二项是该组的ID,如果为空则是文件所属的组。
m:设置对于所有用户的最大可能权限。也就是说,无论用户或组的访问权限如何设置,m所设置的是对这个文件的最大可能权限,所有的用户和组都不能超过这个访问权限。
可以为目录设置缺省的ACL,这样它影响在目录中创建的所有文件,在目录中创建的文件的缺省ACL和这个目录相同。当第一次为一个特殊的用户和组设置对目录的缺省ACL时,必须已经为拥有者、拥有者所在的组、其他的用户设计缺省ACL项并设置了掩码。以下的几个格式通常用于为目录设置ACL:
D:u::<perm>为目录的拥有者设置权限。
D:g::<perm>为目录拥有者所在的组设置权限。
D:o::<perm>为所有不是拥有者所在组的用户设置权限。
D:m::<perm>为ACL设置掩码。
D:u:uid:<perm>为一个特殊用户设置权限。
D:g:gid:<perm>为一个特殊的组设置权限。
在设置完ACL后,可以使用两种方法来确定一个文件是否带有ACL项,一种方法是使用1s –l命令,另一种方法是使用getfacl命令。使用ls -l命令时,含有ACL的文件会在made域右面加个+。如果只为一个文件定义了 ACL,但并没有声明另外的用户或组的话,即使文件含有基本的 ACL,在显示的时候也不会在权限项后跟一个+。只有另外的用户或组被添加到ACL中,才会被显示出来。以下我们用一个例子来说明这一系列命令的使用。
首先使用setfacl命令为文件设置 ACL许可权。可以将文件作为setfacl的一个输入参数或直接用命令行设置文件的ACL许可权。如以下语法:
setfacl –s u::<perm>,g::<perm>,o:<perm>,m:<perm>,u:<UID>:<perm>,g:<GID>:<perm>
UID可以是用户ID或者是用户名,GID可以是组ID或者是组名。如我们将将拥有者指定为完全的权限,而组用户只有读权限并禁止其他用户的访问。缺省的掩码为读写,而用户ray被指定了对文件foo有读写权。
首先,看一下当前文件的许可权:
ls –l foo
-rw-rw-rw- 1 abc staff 0 oct 3 14:22 foo
下面设置了拥有者、组用户和其他用户对文件的访问权限和掩码,并在ACL中加入了一个用户。
setfacl –s u::rwx,g::rwx,g::r--,o:---,mask:rw-,u:ray:rw- foo
下面确认权限已经被设置并且文件已经含有了一个ACL。
ls –l foo
-rwxrw----+ 1 abc staff 0 oct 3 14:22 foo
可以看到文件的许可权已经改变,+也表示文件已经含有了一个ACL。最后,使用getfacl命令来确认所有的权限已经被正确地设置了:
getfacl foo
#file: foo
#owner: abc
#group: staff
user::rwx
user:ray:rw- #effective:rw-
group::rw- #effective:rw-
mask: rw-
other:---
不管是使用什么形式在命令行中设置的文件许可权,命令getfacl的结果总是使用符号来表示ACL许可权。
下面介绍使用ACL配置文件来设置许可权。
可以建立一个 ACL 配置文件,在这个文件中包含所想要设置的许可权限。在 setfacl -s命令中可以将这个文件当做一个参数来设置 ACL 选项。只能在-s 选项中用文件作为输入参数。在用编辑器编辑文件之后,使用setfacl –f acl_filename即可。格式与getfacl的输出相同,因此可以使用管道操作符来拷贝一个文件的ACL到另外一个文件:
getfacl <file1> | setfacl –f - <file2>
这样file2的访问权限将和file1的访问权限相同。使用文件来设置ACL有一个好处,就是可以方便地为多个文件建立统一的访问权限控制。
使用setfacl -m命令可以为已经含有 ACL的UFS文件或目录增加或者修改访问控制权限。它的命令格式和-s相同。如果文件已经存在该 UID 或者 GID的项,那么所声明的权限将会替换它们,否则将会创建它们。删除一个文件的访问权限可以用-d选项,其语法也与以上相同。
以上我们简要介绍了Solaris操作系统对于文件系统的额外访问权限控制,为了保障系统的安全,除了建立严格完善的访问权限控制之外,还需要进行一系列的其他子系统的安全配置。以下我们将简要介绍Solaris系统更新、网络和服务的合理配置以及内核一些参数的合理调整。
1、操作系统更新
安装最新的系统补丁和随时更新系统,对于维护系统安全来说是至关重要的。这是因为操作系统厂商通常只有在出现严重安全问题的时候才发布系统更新。Solaris 系统在ftp://sunsolve.sun.com/pub/patches/下面有各个系统推荐的所有补丁,请下载相关的recommended.zip,这个文件中有所针对系统需要打的各个补丁。下载到本地的/tmp目录后,执行如下命令即可:
cd /tmp; unzip –qq<os>_recommended.zip; cd<os>_recommended; ./install_cluster –q –nosave
在这种打一批补丁的时候,其中一些可能会安装失败。系统管理员可以忽略那些返回值为2(已安装的补丁)或者8(所要修补的软件没有安装)的错误。如果有其他错误出现,那么系统管理员应该审查/var/sadm/install_data文件以获取更详细信息。
采用nosave方式的意思是说不必备份所修改的原有文件。如果用户需要知道打补丁过程修改了哪些文件的话,可以去掉这个选项,但是同时一定要确保/var下面有足够的空间。
2、网络参数的调整和服务配置
可以通过ndd命令来调整网络参数的配置。ndd命令能在不重新配置系统内核和重起系统的情况下,修改核心和 TCP/IP 的设备的一些参数。常见的用于使系统更强壮的 ndd配置如下:
(1)可以利用ndd命令来拒绝源路由数据报的通过。所谓源路由,就是数据报的发送方指定自己的路由情况,通过这种方式,攻击者可以进行IP伪装。使用的命令是:
ndd -set /dev/ip ip_forward_src_routed 0
(2)可以利用 ndd 命令防止系统成为 smurf 攻击的流量放大器。如果系统响应Directed_broadcast包的话,即系统将接受并转发目的地址为广播地址的数据包,那么可能被smurf攻击利用作为流量放大器。利用ndd命令即可进行安全配置:
ndd -set /dev/ip ip_forward_directed_broadcasts 0
另外,为了避免系统转发所接收到的包,可以通过如下方法禁止进行包转发:
ndd -set /dev/ip ip_forwarding 0
(3)重定向错误。攻击者能伪造重定向错误的报文从而给目标主机装载一个新的路由,这样达到路由欺骗的目的。由于大多数只有一条默认路由主机系统是不需要理会这种报文的,因此可以使用ndd命令忽略ICMP重定向错误报文(solairs默认是不忽略的)。命令如下:
ndd -set /dev/ip ip_ignore_redirect 1
(4)只有路由器才需要发送重定向错误,任何主机即使是多宿主主机也不需要发送重定向报文,因此可以使用ndd来禁止本机发送错误重定向报文。
#ndd -set /dev/ip ip_send_redirects 0
(5)SYN_flood攻击。TCP-SYN flood又称半开式连接攻击,每当我们进行一次标准的TCP连接(如WWW浏览,下载文件等)会有一个三次握手的过程,首先是请求方向服务方发送一个SYN消息,服务方收到SYN后,会向请求方回送一个SYN-ACK表示确认,当请求方收到SYN-ACK后则再次向服务方发送一个ACK消息,一次成功的TCP连接由此就建立,可以进行后续工作了,而TCP-SYN flood在它的实现过程中只有前两个步骤,当服务方收到请求方的SYN并回送SYN-ACK确认消息后,请求方由于采用源地址欺骗等手段,致使服务方得不到ACK回应,这样,服务方会在一定时间处于等待接收请求方ACK消息的状态,一台服务器可用的TCP连接是有限的,如果恶意攻击方快速连续地发送此类连接请求,则服务器可用TCP连接队列很快将会阻塞,系统可用资源、网络可用带宽急剧下降,无法向用户提供正常的网络服务。SYN攻击时只能填充后一条队列,而且,一旦队列满,将随机丢弃老的syn包。系统还会监控这个队列被短时间填充的情况,一旦怀疑是syn_flood,并在系统中记录。我们可以根据需要来调节新队列的大小,繁忙的Web服务器需要提高未连接队列的大小。默认的大小是1024。核心的队列增大,系统的内存所需也相应地增加。
ndd -set /dev/tcp tcp_conn_req_max_q0 4096
(6)另外,可以根据RFC1948建议在/etc/default/inetinit中增加如下的生成初始化序列号设置来为每个TCP连接产生更随机的初始序列号,以防止TCP序列号预测攻击(ip欺骗):
TCP_STRONG_ISS=2
(7)TCP/IP服务的配置。/etc/inetd/inetd.conf文件是系统的inetd服务的配置文件。因为其中的一些服务可能会方便入侵者的攻击,而且一些入侵者也喜欢通过这个文件来留下后门,因此建议将这个文件清空,然后逐项添加所需服务。在清空前,建议把原文件进行备份。为了记录 INETD 连接的所有信息,在 inetd 启动脚本的启动行中增加“-t”参数,即:/usr/sbin/inetd -s -t。
(8)初始服务的配置。可以采用如下的脚本来配置/etc/rc?.d下的各项服务。
cd /etc/rc2.d
for file in S30sysid.net S71sysid.sys S72autoinstall \
S73cachefs.daemon S93cacheos.finish S40llc2 \
S47asppp S70uucp S72slpd S75flashprom S80PRESERVE \
S85power S89bdconfig S90wbem S91afbinit S91ifbinit \
S94ncalogd S95ncad
do
[ -s $file ] && mv $file .NO$file
done
cd /etc/rc3.d
for file in S77dmi S80mipagent
do
[ -s $file ] && mv $file .NO$file
done
这些服务一般被认为是没有必要开的。将这些脚本命名为.NO(原文件名)的好处在于,如果发现需要其中的一些服务,那么还可以再将相应的文件恢复。
如果本机不是NFS服务器的话,那么还可以将/etc/rc3.d/S15nfs禁止掉。如果本机也不使用任何LDAP服务的话,那么可以将/etc/rc2.d/S71ldap.client也禁止掉。
(9)限制NFS服务的源端口范围。通常情况下,NFS客户端使用系统的保留端口范围(小于1024),但是一些攻击或者扫描NFS服务的程序所使用的端口则要大于1024。Solaris系统可以限制只接受来自于保留端口的服务请求。设置方法如下:编辑/etc/system 文件,加入:set nfssrv:nfs_portmon=1。
3、其他安全配置
(1)禁止产生内核印象文件(core)。当系统出现意外错误时,有时会产生内核印象文件,该文件通常具有进程崩溃时的系统状态信息。我们建议禁止产生内核印象文件,因为一方面这个文件会占用很大的硬盘空间,另一方面有的时候内存印象文件中会泄露一些系统敏感信息。禁止产生内核印象文件的配置方法是:编辑/etc/system 文件,加入这样一行:set sys:coredumpsize=0。
(2)进行堆栈保护。利用缓冲区溢出取得系统权限是攻击者攻击的一个重要手段。在缓冲区溢出程序中,通常要在系统的堆栈段运行指令。可以禁止在堆栈段运行代码。设置方法如下:编辑/etc/system文件,加入这样两行:
set noexec_user_stack=1
set noexec_user_stack_log=1
(3)磁盘共享(mount):为了减少木马和不授权的修改,可以在/etc/vfstab 文件中,在mount /时使用“remount,nosuid”选项;在/var上带上“nosuid”选项;在/tmp后加上“size=100m,nosuid”选项(允许/tmp只能使用100M空间及不允许执行SUID程序);如果软盘不需要的话再把“/dev/fd”行注释掉。
(4)openboot的配置
openboot分成如下安全级别: none级别,不需要任何口令,所有OpenBoot设置都可以修改,任何人只要物理接触到主控台,就可以完全控制;Command级别,除了boot和go之外所有命令都需要口令;full级别,除了go命令之外所有命令都需要口令。为了改变OpenBoot安全级别,首先使用eeprom security-password命令设置OpenBoot口令,然后在root登录状态使用eeprom security-mode=command命令改变安全级别为command级别或在OK状态敲入ok setenv security-mode=command的密码保护来实现。通过这些设置,可以保护系统的物理安全。
以上我们介绍了Solaris操作系统的安全防护。主要侧重介绍了它在文件系统权限控制上面引入的新特征以及其网络配置。
二、LINUX安全防护
经过多年的发展,Linux的功能在不断增强,其安全机制亦在逐步完善。下面我们来看一看 Linux已有的安全机制,这些机制有些已被标准的 Linux所接纳,有些只是提供了“补丁”程序。
1、PAM机制
PAM(Pluggable Authentication Modules)是一套共享库,其目的是提供一个框架和一套编程接口,将认证工作由程序员交给管理员,PAM允许管理员在多种认证方法之间作出选择,它能够改变本地认证方法而不需要重新编译与认证相关的应用程序。
PAM的功能包括:
加密口令(包括DES以外的算法);
对用户进行资源限制,防止DOS攻击;
允许随意Shadow口令;
限制特定用户在指定时间从指定地点登录;
引入概念“client plug-in agents”,使PAM支持C/S应用中的机器——机器认证成为可能。
PAM为更有效的认证方法的开发提供了便利,在此基础上可以很容易地开发出替代常规的用户名加口令的认证方法,如智能卡、指纹识别等认证方法。
2、加密文件系统
加密技术在现代计算机系统安全中扮演着越来越重要的角色。加密文件系统就是将加密服务引入文件系统,从而提高计算机系统的安全性。有太多的理由需要加密文件系统,比如防止硬盘被偷窃、防止未经授权的访问等。
目前Linux已有多种加密文件系统,如CFS、TCFS、CRYPTFS等,较有代表性的是TCFS (Transparent Cryptographic File System)。它通过将加密服务和文件系统紧密集成,使用户感觉不到文件的加密过程。TCFS 不修改文件系统的数据结构,备份与修复以及用户访问保密文件的语义也不变。
TCFS能够做到让保密文件对以下用户不可读:
合法拥有者以外的用户;
用户和远程文件系统通信线路上的偷听者;
文件系统服务器的超级用户。
而对于合法用户,访问保密文件与访问普通文件几乎没有区别。
3、安全审计
即使系统管理员十分精明地采取了各种安全措施,但还会不幸地发现一些新漏洞。攻击者在漏洞被修补之前会迅速抓住机会攻破尽可能多的机器。虽然Linux不能预测何时主机会受到攻击,但是它可以记录攻击者的行踪。
Linux 还可以进行检测、记录时间信息和网络连接情况。这些信息将被重定向到日志中备查。
日志是Linux安全结构中的一个重要内容,它是提供攻击发生的惟一真实证据。因为现在的攻击方法多种多样,所以 Linux 提供网络、主机和用户级的日志信息。例如,Linux 可以记录以下内容:
记录所有系统和内核信息;
记录每一次网络连接和它们的源 IP地址、长度,有时还包括攻击者的用户名和使用的操作系统;
记录远程用户申请访问哪些文件;
记录用户可以控制哪些进程;
记录具体用户使用的每条命令。
在调查网络入侵者的时候,日志信息是不可缺少的,即使这种调查是在实际攻击发生之后进行。
4、强制访问控制
强制访问控制(Mandatory Access Control,MAC)是一种由系统管理员从全系统的角度定义和实施的访问控制,它通过标记系统中的主客体,强制性地限制信息的共享和流动,使不同的用户只能访问到与其有关的、指定范围的信息,从根本上防止信息的失泄密和访问混乱的现象。
传统的MAC实现都是基于TCSEC中定义的MLS策略,但因MLS本身存在着这样或那样的缺点(不灵活、兼容性差、难于管理等),研究人员已经提出了多种MAC策略,如DTE、RBAC等。由于Linux是一种自由操作系统,目前在其上实现强制访问控制的就有好几家,其中比较典型的包括SElinux、RSBAC、MAC等,采用的策略也各不相同。
NSA推出的SELinux安全体系结构称为 Flask,在这一结构中,安全性策略的逻辑和通用接口一起封装在与操作系统独立的组件中,这个单独的组件称为安全服务器。SELinux 的安全服务器定义了一种混合的安全性策略,由类型实施(TE)、基于角色的访问控制(RBAC)和多级安全(MLS)组成。通过替换安全服务器,可以支持不同的安全策略。SELinux 使用策略配置语言定义安全策略,然后通过 checkpolicy 编译成二进制形式,存储在文件/ss_policy中,在内核引导时读到内核空间。这意味着安全性策略在每次系统引导时都会有所不同。策略甚至可以通过使用 security_load_policy 接口在系统操作期间更改(只要将策略配置成允许这样的更改)。
RSBAC的全称是Rule Set Based Access Control(基于规则集的访问控制),它是根据Abrams和LaPadula提出的Generalized Framework for Access Control(GFAC)模型开发的,可以基于多个模块提供灵活的访问控制。所有与安全相关的系统调用都扩展了安全实施代码,这些代码调用中央决策部件,该部件随后调用所有激活的决策模块,形成一个综合的决定,然后由系统调用扩展来实施这个决定。RSBAC目前包含的模块主要有MAC、RBAC、ACL等。
MAC是英国的Malcolm Beattie针对Linux 编写的一个非常初级的MAC访问控制,它将一个运行的Linux系统分隔成多个互不可见的(或者互相限制的)子系统,这些子系统可以作为单一的系统来管理。MAC是基于传统的Biba完整性模型和BLP模型实现的,但作者目前似乎没有延续他的工作。
为了保障LINUX系统的安全,可以进行如下的配置:
5、用户和文件配置
(1)删除所有不用的账户
删除所有不用的缺省用户和组账户(比如lp、sync、shutdown、halt、news、uucp、operator、games、gopher等),可以避免系统由于这些用户的存在所带来的安全风险。删除用户可以使用“userdel 用户名”命令。
(2)选择合适的密码策略
在缺省Linux安装过程中,默认的最短密码长度为5个字节,为了增强密码的强度,可以把最短密码长度设为 8 个字节以提供更强的安全保证。修改最短密码长度需要编辑login.defs文件,将
PASS_MIN_LEN 5
改为
PASS_MIN_LEN 8
即可。login.defs文件是login程序的配置文件。除此之外,还可以编辑login.defs文件,从而修改密码的最长时间 PASS_MAX_DAYS(缺省为 99999),以及密码的最短时间(缺省为0),以及密码过期前几天警告PASS_WARN_AGE(缺省为7天)。
(3)超级用户配置
在 unix 系统中 root 账户是具有最高特权的。如果系统管理员在离开系统之前忘记注销root账户,系统会自动注销。通过修改账户中“TMOUT”参数,可以实现此功能。TMOUT按秒计算。编辑/etc/profile文件(vi /etc/profile),在“HISTFILESIZE=”后面加入下面这行:
TMOUT=3600
3600,表示1小时。这样,如果系统中登录的用户在一个小时内都没有动作,那么系统会自动注销这个账户。也可以对其他用户的“.bashrc”文件中添加该值,以便系统对该用户实行特殊的自动注销时间。改变这项设置后,必须先注销用户,再用该用户登录才能激活这个功能。
为了更严格地限制系统管理员的登录,可以使用/etc/securetty 文件。该文件指定了允许root登录的tty设备,/etc/securetty被/bin/login程序读取,用于配置可以允许超级用户登录的终端。它的格式是一行一个被允许登录的终端名字列表,为了安全起见,我们只允许超级用户从tty1上登录。编辑/etc/securetty且注释出下面的行。
tty1
#tty2
#tty3
#tty4
#tty5
#tty6
#tty7
#tty8
(4)只允许wheel组(超级用户所在组)的用户通过su命令改变为root用户
su命令可以使普通用户成为系统中其他已存在的用户。可以通过如下配置限制某些用户通过su命令成为超级用户。在su配置文件(一般是“/etc/pam.d/su”)的开头添加下面两行:
auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/Pam_wheel.so group=wheel
这表明只有“wheel”组的成员可以使用su命令成为root用户。对于所有允许具有超级用户权限的用户,可以把该用户名添加到“wheel”组。
(5)限制用户对主机资源的使用
有时,为了避免用户通过使用大量资源导致系统不稳定情况的发生以及拒绝服务攻击的影响,需要限制用户对主机资源的使用。RedHat Linux系统下的/etc/security/limits.conf文件,可以用来做此类控制。该文件通过 PAM 的一个组件来进行资源限制,因此在进行限制前,必须先保证相应的组件已经进行了恰当的配置,检查方法为:编辑/etc/pam.d/login文件加/检查下行的存在:
session required /lib/security/pam_limits.so
limites.conf文件可以用来对CPU的使用、内存的使用(数据段和堆栈段)、进程数以及最大登录数等多种资源进行限制。此配置文件的中每一行由四项构成:用户名、组名(以@开头)或“*”表示所有用户;soft或者是hard,soft表示限制不严格,需要时可以超过此值,但会有警告,hard 表示严格限制,不能超过此值;所配置的限制种类,cpu 表示占用的处理时间片单位,maxlogins表示允许此用户同时登录的个数,nproc表示最大进程数,等等。
举例如下:
* soft core 0 #所有用户均不产生内存印象
* hard rss 10000 #最多使用10M内存
* hard nproc 20 #最多20个进程
@student hard nproc 20 #student组每个用户最多20个进程
ftp hard nproc 0 #ftp最多开20个进程
@student - maxlogins 4 #student组每个用户最多登录4个
(6)使用 chattr 命令保护一些文件免被改动。该命令有如下两个选项通常用于文件系统的安全配置。选项,+i用于禁止对文件进行改动,+a只允许对文件进行添加。
[root@system]# chattr +i /etc/services
[root@system]# chattr +i /etc/passwd
[root@system]# chattr +i /etc/shadow
[root@system]# chattr +i /etc/group
(7)/etc/exports 文件
如果使用NFS网络文件系统服务,那么应当确保/etc/exports具有最严格的存取权限设置,这意味着不要使用任何通配符,不允许 root 写权限,mount 成只读文件系统。编辑文件/etc/exports并且加:例如:
/dir/to/export host1.mydomain.com(ro,root_squash)
/dir/to/export host2.mydomain.com(ro,root_squash)
/dir/to/export 是要被共享的目录,host.mydomain.com是登录这个目录的机器名,ro意味着 mount 成只读系统,root_squash 禁止 root 写入该目录。为了让上面的改变生效,运行/usr/sbin/exportfs -a。
6、网络配置
(1)对于旧的 Linux 系统,配置/etc/inetd.conf,去掉不用服务,对于较新的系统,则应当配置xinetd.conf以及/etc/xinetd.d/,建议配置时,先备份原有配置,然后去掉所有的服务,然后再根据需要添加。
(2)防止系统信息暴露
默认情况下当登录到linux server时,将显示linux版本名、内核版本名和服务器主机名。建议通过修改配置文件从而避免显示过多信息。这可以通过编辑/etc/rc.d/rc.local 达到,注释掉如下程序。
#
# This will overwrite /etc/issue at every boot.So,make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo "" > /etc/issue
#echo "$R" >> /etc/issue
#echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >> /etc/issue
然后,操作如下:
[root@system]# rm -f /etc/issue
[root@system]# rm -f /etc/issue.net
[root@system]# touch /etc/issue
[root@system]# touch /etc/issue.net
(3)避免域名欺骗,修改“/etc/host.conf”文件
“/etc/host.conf”说明了如何解析地址。编辑“/etc/host.conf”文件(vi /etc/host.conf),加入下面这行:
# Lookup names via DNS first then fall back to /etc/hosts.
order bind,hosts
# We have machines with multiple IP addresses.
multi on
# Check for IP address spoofing.
nospoof on
第一项设置首先通过DNS解析IP地址,然后通过hosts文件解析。第二项设置检测是否“/etc/hosts”文件中的主机拥有多个IP地址(比如有多个以太口网卡)。第三项设置说明要注意对本机未经许可的电子欺骗。
(4)TCP/IP属性的配置
可以添加下面的一行命令到/etc/rc.d/rc.local,以使本地系统不响应远程系统的 ping数据包:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
用下面的命令在系统上禁止接收IP源路由的数据包:
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f
done
为了防止SYN Flood拒绝服务(DoS)的攻击,可以使用Linux系统的“syn cookie”个可选项。命令如下:
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
可以把这写命令加入“/etc/rc.d/rc.local”文件中,这样系统重新启动的时候就不必重新配置了。
7、系统配置
(1)禁止Control-Alt-Delete 关闭系统命令
在“/etc/inittab”文件中注释掉下面这行(使用#):
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
改为:
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
为了使这项改动起作用,须重新运行如下命令:
/sbin/init q
(2)/etc/lilo.conf配置
LILO是Linux上一个多功能的引导程序。它可以用于多种文件系统,也可以从软盘或硬盘上引导 Linux 并装入内核,还可以作为其他操作系统的“引导管理器”。根(/)文件系统对LILO来说很重要,有下面这两个原因:第一,LILO要告诉内核到哪里去找根文件系统;第二,LILO要用到的一些东西,如引导扇区、“/boot”目录和内核就存放在根文件系统中。引导扇区包括 LILO 引导程序的第一部分,这个部分在引导阶段的后半部分还要装入更大的引导程序。这两个引导程序通常存在“/boot/boot.b”文件中。内核是由引导程序装入并启动的。在RedHat Linux系统中,内核通常在根目录或“/boot”目录下。
因为LILO对Linux系统非常重要,所以我们要尽可能地保护好它。LILO最重要的配置文件是“/etc”目录下的“lilo.conf”文件。用这个文件我们可以配置或提高 LILO 程序以及Linux系统的安全性。下面是LILO程序的三个重要的选项设置。
①加入:timeout=00。这项设置设定 LILO在引导默认的系统之前,等候用户输入的时间。C2安全等级规定这个时间间隔必须设成0,因为多重引导会使系统的安全措施形同虚设。除非想用多重引导,否则最好把这项设成0。
②加入:restricted。当LILO引导的时候,输入参数linux single,进入单用户(single)模式。因为单用户模式没有口令验证,所以可以在LILO引导时,加上口令保护。“restricted”选项只能和“password”合起来用。注意要给每个内核都要加上口令保护。
③加入:password=<password>。用单用户模式启动 Linux 系统的时候,系统要求用户输入这个口令。口令是大小写敏感的,而且要注意,要让“/etc/lilo.conf”文件,除了root之外,其他用户没有读的权限,这样也就看不到口令了。下面是用“lilo.conf”文件保护 LILO的一个具体例子。
第一步
编辑lilo.conf文件(vi /etc/lilo.conf),加上或改变下面介绍的三个设置:
boot=/dev/sda
map=/boot/map
install=/boot/boot.b
prompt
timeout=00 ? change this line to 00.
Default=linux
restricted ? add this line.
password=<password> ? add this line and put your password.
image=/boot/vmlinuz-2.2.12-20
label=linux
initrd=/boot/initrd-2.2.12-10.img
root=/dev/sda6
read-only
第二步
因为“/etc/lilo.conf”配置文件里,存在没有经过加密的口令,所以只有root才能有读的权限。用下面的命令改变文件的权限:
[root@system]# chmod 600 /etc/lilo.conf (will be no longer world readable).
第三步
使改变后的“/etc/lilo.conf”配置文件生效:
[root@system]# /sbin/lilo -v (to update the lilo.conf file).
第四步
为了更安全一点,可以用chattr命令给“lilo.conf”文件加上不可改变的权限。让文件不可改变用下面的命令:
[root@system]# chattr +i /etc/lilo.conf
这样可以避免“lilo.conf”文件因为意外或其他原因而被改变。如果想要改变“lilo.conf”文件,必须先清除它的不可改变标志。
清除不可改变的标记用下面的命令:
[root@system]# chattr -i /etc/lilo.conf
以上我们介绍了常见的 LINUX 系统的安全配置。侧重于操作系统本身的安全防护,主要的重点在于系统的用户访问权限控制、文件系统安全以及TCP/IP属性和基本服务的配置。
微信公众号:计算机与网络安全
ID:Computer-network