高级Linux安全管理技巧
2010-01-15 10:32:44 阿炯

由于Linux操作系统是一个开放源代码的免费操作系统,因此受到越来越多用户的欢迎。随着Linux操作系统在我国的不断普及,有关的政府部门更是将基于Linux开发具有自主版权的操作系统提高到保卫国家信息安全的高度来看待,因此不难预测今后Linux操作系统在我国将得到更快更大的发展。虽然Linux与Unix很类似,但它们之间也有一些重要的差别。对于众多的习惯了Unix和Windows NT的系统管理员来讲,如何保证Linux操作系统的安全将面临许多新的挑战,本文介绍了一系列实用的Linux安全管理经验。

一、文件系统,在Linux系统中,分别为不同的应用安装单独的主分区将关键的分区设置为只读将大大提高文件系统的安全。这主要涉及到Linux自身的ext2文件系统的只添加(只添加)和不可变这两大属性。

●文件分区Linux的文件系统可以分成几个主要的分区,每个分区分别进行不同的配置和安装,一般情况下至少要建立/、/usr/local、/var和/home等分区。/usr可以安装成只读并且可以被认为是不可修改的。如果/usr中有任何文件发生了改变,那么系统将立即发出安全报警。当然这不包括用户自己改变/usr中的内容。/lib、/boot和/sbin的安装和设置也一样。在安装时应该尽量将它们设置为只读,并且对它们的文件、目录和属性进行的任何修改都会导致系统报警。

当然将所有主要的分区都设置为只读是不可能的,有的分区如/var等,其自身的性质就决定了不能将它们设置为只读,但应该不允许它具有执行权限。

●扩展ext2使用ext2文件系统上的只添加和不可变这两种文件属性可以进一步提高安全级别。不可变和只添加属性只是两种扩展ext2文件系统的属性标志的方法。一个标记为不可变的文件不能被修改,甚至不能被根用户修改。一个标记为只添加的文件可以被修改,但只能在它的后面添加内容,即使根用户也只能如此。

可以通过chattr命令来修改文件的这些属性,如果要查看其属性值的话可以使用lsattr命令。要想了解更多的关于ext2文件属性的信息,可使用命令man chattr来寻求帮助。这两上文件属性在检测黑客企图在现有的文件中安装入侵后门时是很有用的。为了安全起见,一旦检测到这样的活动就应该立即将其阻止并发出报警信息。

如果关键的文件系统安装成只读的并且文件被标记为不可变的,入侵者必须重新安装系统才能删除这些不可变的文件但这会立刻产生报警,这样就大大减少了被非法入侵的机会。

●保护log文件当与log文件和log备份一起使用时不可变和只添加这两种文件属性特别有用。系统管理员应该将活动的log文件属性设置为只添加。当log被更新时,新产生的log备份文件属性应该设置成不可变的,而新的活动的log文件属性又变成了只添加,这通常需要在log更新脚本中添加一些控制命令。

二、备份,在完成Linux系统的安装以后应该对整个系统进行备份,以后可以根据这个备份来验证系统的完整性,这样就可以发现系统文件是否被非法窜改过。如果发生系统文件已经被破坏的情况,也可以使用系统备份来恢复到正常的状态。

●CD-ROM备份当前最好的系统备份介质就是CD-ROM光盘,以后可以定期将系统与光盘内容进行比较以验证系统的完整性是否遭到破坏。如果对安全级别的要求特别高,那么可以将光盘设置为可启动的并且将验证工作作为系统启动过程的一部分。这样只要可以通过光盘启动,就说明系统尚未被破坏过。

如果你创建了一个只读的分区,那么可以定期从光盘映像重新装载它们。即使象/boot、/lib和/sbin这样不能被安装成只读的分区,你仍然可以根据光盘映像来检查它们,甚至可以在启动时从另一个安全的映像重新下载它们。

●其它方式的备份虽然/etc中的许多文件经常会变化,但/etc中的许多内容仍然可以放到光盘上用于系统完整性验证。其它不经常进行修改的文件,可以备份到另一个系统(如磁带)或压缩到一个只读的目录中。这种办法可以在使用光盘映像进行验证的基础上再进行额外的系统完整性检查。

既然现在绝大多数操作系统现在都在随光盘一起提供的,制作一个CD-ROM紧急启动盘或验证盘操作起来是十分方便的,它是一种十分有效而又可行的验证方法。

三、改进系统内部安全机制,可以通过改进Linux操作系统的内部功能来防止缓冲区溢出攻击这种破坏力极强却又最难预防的攻击方式,虽然这样的改进需要系统管理员具有相当丰富的经验和技巧,但对于许多对安全级别要求高的Linux系统来讲还是很有必要的。

●Solaris Designer的安全Linux补丁Solaris Designer用于2.0版内核的安全Linux补丁提供了一个不可执行的栈来减少缓冲区溢出的威胁,从而大大提高了整个系统的安全性。

缓冲区溢出实施起来是相当困难的,因为入侵者必须能够判断潜在的缓冲区溢出何时会出现以及它在内存中的什么位置出现。缓冲区溢出预防起来也十分困难,系统管理员必须完全去掉缓冲区溢出存在的条件才能防止这种方式的攻击。正因为如此,许多人甚至包括Linux Torvalds本人也认为这个安全Linux补丁十分重要,因为它防止了所有使用缓冲区溢出的攻击。但是需要引起注意的是,这些补丁也会导致对执行栈的某些程序和库的依赖问题,这些问题也给系统管理员带来的新的挑战。

不可执行的栈补丁已经在许多安全邮件列表(如securedistros@nl.linux.org)中进行分发,用户很容易下载到它们等。

●StackGuardStackGuard是一个十分强大的安全补丁工具。你可以使用经StackGuard修补过的gcc版本来重新编译和链接关键的应用。

StackGuard进行编译时增加了栈检查以防止发生栈攻击缓冲区溢出,虽然这会导致系统的性能略有下降,但对于安全级别要求高的特定应用来讲StackGuard仍然是一个十分管用的工具。

现在已经有了一个使用了SafeGuard的Linux版本,用户使用StackGuard将会更加容易。虽然使用StackGuard会导致系统性能下降约10~20%,但它能够防止整个缓冲区溢出这一类攻击。

●增加新的访问控制功能Linux的2.3版内核正试图在文件系统中实现一个访问控制列表,这要可以在原来的三类(owner、group和other)访问控制机制的基础上再增加更详细的访问控制。

在2.2和2.3版的Linux内核中还将开发新的访问控制功能,它最终将会影响当前有关ext2文件属性的一些问题。与传统的具有ext2文件系统相比它提供了一个更加精确的安全控制功能,有了这个新的特性,应用程序将能够在不具有超级用户权限的情况下访问某些系统资源,如初始套接等。

●基于规则集的访问控制现在有关的Linux团体正在开发一个基于规则的访问控制(RSBAC)项目,该项目声称能够使Linux操作系统实现B1级的安全。RSBAC是基于访问控制的扩展框架并且扩展了许多系统调用方法,它支持多种不同的访问和认证方法。这对于扩展和加强Linux系统的内部和本地安全是一个很有用的。

四、设置陷井和蜜罐,所谓陷井就是激活时能够触发报警事件的软件,而蜜罐(honey pot)程序是指设计来引诱有入侵企图者触发专门的报警的陷井程序。通过设置陷井和蜜罐程序,一旦出现入侵事件系统可以很快发出报警。在许多大的网络中,一般都设计有专门的陷井程序。陷井程序一般分为两种:一种是只发现入侵者而不对其采取报复行动,另一种是同时采取报复行动。

设置蜜罐的一种常用方法是故意声称Linux系统使用了具有许多脆弱性的IMAP服务器版本。当入侵者对这些IMAP服务器进行大容量端口扫瞄就会落入陷井并且激发系统报警。

另一个蜜罐陷井的例子就是很有名的phf,它是一个非常脆弱的Web cgi-bin脚本。最初的phf是设计来查找电话号码的,但它具有一个严重的安全漏洞:允许入侵者使用它来获得系统口令文件或执行其它恶意操作。系统管理员可以设置一个假的phf脚本,但是它不是将系统的口令文件发送给入侵者,而是向入侵者返回一些假信息并且同时向系统管理员发出报警。

另外一类蜜罐陷井程序可以通过在防火墙中将入侵者的IP地址设置为黑名单来立即拒绝入侵者继续进行访问。拒绝不友好的访问既可以是短期的,也可以是长期的。Linux内核中的防火墙代码非常适合于这样做。

五、将入侵消灭在萌芽状态,入侵者进行攻击之前最常做的一件事情就是端号扫瞄,如果能够及时发现和阻止入侵者的端号扫瞄行为,那么可以大大减少入侵事件的发生率。反应系统可以是一个简单的状态检查包过滤器,也可以是一个复杂的入侵检测系统或可配置的防火墙。

●Abacus Port SentryAbacus Port Sentry是开放源代码的工具包,它能够监视网络接口并且与防火墙交互操作来关闭端口扫瞄攻击。当发生正在进行的端口扫瞄时,Abacus Sentry可以迅速阻止它继续执行。但是如果配置不当,它也可能允许敌意的外部者在你的系统中安装拒绝服务攻击。

Abacus Port Sentry如果与Linux中透明的代理工具一起使用可以提供一个非常有效地入侵防范措施。这样可以将为所有IP地址提供通用服务的未使用端口重定向到Port Sentr中,Port Sentry可以在入侵者采取进一步行动之前及时检测到并阻止端口扫瞄。

Abacus Port Sentry能够检测到慢扫瞄(slow scan),但它不能检测到结构化攻击(structured attack)。这两种方式最终目的都要试图掩盖攻击意图。慢扫瞄就是通过将端口扫瞄分散到很长的时间内来完成,而在结构化的攻击中,攻击者试图通过扫瞄或探测多个源地址中来掩盖自己的真实攻击目标。

正确地使用这个软件将能够有效地防止对IMAP服务大量的并行扫瞄并且阻止所有这样的入侵者。Abacus Sentry与Linux 2.2内核的IPChains工具一起使用时最有效,IPChains能够自动将所有的端口扫瞄行为定向到Port Sentry。

Linux 2.0内核可以使用IPChains进行修补,Abacus Port Sentry也可以与早期的2.0版内核中的ipfwadm工具一起使用,ipfwadm在2.2版本以后被IPChains取代了。

Abacus Port Sentry还可以被配置来对Linux系统上的UDP扫瞄作出反应,甚至还可以对各种半扫瞄作出反应,如FIN扫瞄,这种扫描试图通过只发送很小的探测包而不是建立一个真正的连接来避免被发现。

当然更好的办法就是使用专门的入侵检测系统,如ISS公司的RealSecure等,它们可以根据入侵报警和攻击签名重新配置防火墙。但这样的产品一般价格较高,普及的用户承受起来有困难。

六、反攻击检测系统,主要通过阻止入侵企图来防止入侵,而反攻击系统则可以反向进行端口扫瞄或发起其它的攻击,这一着让入侵者不仅入侵阴谋未能得逞,反而“引狼入室”,招致反攻击。

有些安全系统如Abacus Sentry具有一定的反攻击能力。比如有的站点有了防止用户通过telnet进行连接,在应答telnet连接请求时,系统将返回一些不受欢迎的恶意信息。这只是一种最简单也是最轻微的反攻击措施。

一般情况下并不提倡使用反攻击功能,因为这样的反攻击措施很容易被非法利用来攻击其它的系统。

七、改进登录服务器,将系统的登录服务器移到一个单独的机器中会增加系统的安全级别,使用一个更安全的登录服务器来取代Linux自身的登录工具也可以进一步提高安全。

在大的Linux网络中,最好使用一个单独的登录服务器用于syslog服务。它必须是一个能够满足所有系统登录需求并且拥有足够的磁盘空间的服务器系统,在这个系统上应该没有其它的服务运行。更安全的登录服务器会大大削弱入侵者透过登录系统窜改日志文件的能力。

●安全syslog即使使用单独的登录服务器,Linux自身的syslog工具也是相当不安全的。因此,有人开发了所谓的安全log服务器,将密码签名集成到日志中。这会确保入侵者即使在窜改系统日志以后也无法做到不被发现。现在最常用的用于取代syslog的安全log服务器称为\"安全syslog(ssyslong)\",用户可以从Core SDI站点http://www.core-sdi.com/ssylog处下载这个工具。这个守护程序实现一个称为PEQ-1的密码协议来实现对系统日志的远程审计。即使在入侵者获得系统超级用户权限的情况下也仍然可以进行审计,因为协议保证了以前以及入侵过程中的的log信息没有审计者(在远程可信任的主机上)的通知无法被修改。

●syslog-ng另一个取代syslog的工具是syslog-ng(下一代的syslog)。这是一个更加可配置的守护进程,它提供了密码签名来检测对日志文件的窜改。密码安全登录服务器和远程审计功能一起可以使入侵者极难进行日志窜改并且非常容易被检测到这样的不良企图。用户可以从www.babit.hu/products/syslog-ng.html处下载这个工具。

八、使用单一登录系统,维护分散的大网络环境中的多个用户帐号对于系统管理员来讲是一件非常头疼的事情。现在有一些单一的登录(sign on)系统不仅可以减轻管理员的负担,而同时还提高了安全级别。

网络信息服务(NIS)是一个很好的单一登录系统,它在Sun公司的Yellow Page服务的基础上发展来的,它的基本安全特性不够健状,由于不断有一些bug和脆弱性被公布,因此有人戏称它为网络入侵者服务(Network Intruder Service)。NIS的更新版本NIS+原NIS的不足进行了改进,现在已经有了用于Linux的NIS+版本。

Kerberos也是一种非常有名的单一登录系统。Kerberos v4具有一些很有名的安全漏洞,如入侵者可以离线进行穷尽攻击Kerberos cookie而不会被发现。Ketberos v5大大进行了改进,不会再有v4的问题。

在大的网络中,象NIS和Kerberos这样的单一的登录系统虽然有有利的一面,但也有它不利的一面。一方面,在不同系统上都具有认证机制有助于隔离该功能并且减少它与其它服务相互之间的影响。另一方面,一旦一个系统中的某个帐号被破坏,所有可通过这个帐号访问的系统都将同样遭到破坏。因此在单一的登录系统中特别要求具有较高防猜测水平的口令字。

基于Windows的网络在Windows NT域系统中有自己的单一登录系统。Linux系统可以根据Windows系统进行认证。这允许用户在Windows系统下修改、维护和管理它们的帐号和口令字并且修改结果会在同时在Unix登录中得到体现。如使用pam_smb,Linux系统可以根据Windows SMB Domain进行认证。这在以Windows网络管理为中心的网络中是相当方便的,但它也带来了Windows认证系统自身的一些不安全性。

九、掌握最新安全产品和技术,作为一个系统管理员,还必须时刻跟踪Linux安全技术的发展动向,并且适时采用更先进的Linux安全工具。目前国际上有许多有关Linux安全的研究和开发项目,目前至少有三个安全Linux项目已经启动,每个项目的目标都有自己的侧重点,它们分别是:

●安全Linux(Secure Linux)
安全Linux(www.reseau.nl/securelinux)项目的目标是提供一个用于Internet服务器系统的安全的Linux分发。该项目管理者正寻求在这个产品中集成强大的密码和一些额外的Web服务器功能。既然它是在美国之外创建的,人们可望能够得到改进的密码安全而不会受到美国安全产品出口法律的限制。

●Bastille Linux(www.bastille-linux.org)项目寻求在Linux环境中建立一个类似OpenBSD的标准。该项目宣称的目标是为台式机创建一个安全的分发,使网络管理者可以不用担心用户的安全。

●Kha0s Linux(www.kha0s.org)正寻求创建了一个具有强加密和类似OpenBSD的安全政策的最小的安全Linux分发。该小组目前正在它的Web站点上请求全球用户和厂商的参与和合作。

除此之外,下面两点对于管理员提高Linux安全管理水平也是十分有用的:
●访问安全Linux邮件列表现在有许多关于Linux安全的邮件列表,如securedistros@nl.linux.org、Kha0s-dev@kha0s.org等,经常访问这些邮件列表可以得到大量的安全信息。

还有另一个通用的邮件列表是security-audit@ferret.lmh.ox.ac.uk,它是专门讨论源代码的安全审计的。这个列表可能与其它的邮件列表有大量的重复,但如果想了解源代码审计和相关的安全问题的话还是很值得一读的。

十、多管齐下,任何一种单一的安全措施其防范能力都是有限的,一个安全的系统必须采取多种安全措施,多管齐下才能更好的保证安全。假如一个Linux系统采取了以上各种安全措施,那么要想侵入你的系统,攻击者将不得不绕过防火墙、避开入侵检测系统、跳过陷井程序、通过系统过滤器、逃过你的日志监视器、修改文件系统属性、破坏安全登录服务器才能最终达到目的。由于其中任何一个环节都可能激发报警,因此入侵者要想侵入这样的系统而又不被发现几乎是不可能的。

如何配置Linux操作系统安全管理服务?
任何计算机安全措施的一个重要方面是维持实际控制服务的运行。本文向你展示了在Linux操作系统的PC机上如何配置安全服务管理。

任何计算机安全措施的一个重要方面是维持实际控制服务的运行,让不必要的网络服务接受请求将提高系统的安全风险。即使这些网络服务对于服务器的某些功能是必要的也需要仔细管理,并且对其进行配置最小化不受欢迎的入侵和登录的可能性。

为linux系统配置安全性时,使用/etc/inittab文件、runlevels和一两个服务管理“superdaemons”如inetd或xinetd直接管理服务。

inittab
/etc/inittab文件用于系统的初始化过程启动系统服务。在一个配置好的系统上,虽然它一般都不会包括很多服务,但是在某些Linux系统的默认安装中会加载很多其他服务。/etc/inittab文件内容有些模糊,它的重要之处在于让服务管理变得相对简单。

首先,可不要通过/etc/inittab文件方式向系统启动项中添加服务。

第二,不要移除/etc/inittab文件中第一个冒号之前其第一个字段是单精度型的数字,或整个登录服务的前面部分。以单精度数字开头的行可以打开 TTY控制台,所有服务在它们打开之前都一一列出,甚至列出其更重要的功能。也许有些例外情况,在不改动它时是很安全的,尤其如果不确定的情况下请不要改动。

第三,/etc/inittab在导入和runlevel选择的时候用于过程管理。一般不用于正常的系统操作。

第四,在导入时由rc系统开始添加步骤,而不是init系统。如果看看/etc/inittab的内容,将会注意到登录以rc0到rc6这样的字符结束。这是初始化系统如何处理runlevels的说明。

runlevels
基于Linux操作系统的运转可以通过runlevels进行管理。不同的runlevels被定义成有不同的行为,就像Windows操作系统一样,它有正常操作模式、安全模式、在某些情况下还有DOS模式。

Runlevel 0用于关闭系统,如果软电源设置恰当,它能关闭系统电源。

Runlevel 1是单用户无网络的模式,它用于低水平的故障修复和管理操作。

Runlevel 2到Runlevel 5正常系统操作的多用户模式。Runlevel2和3是命令行模式,3有网络连接而2没有网络连接。Runlevel 5用于启动X Windows提供图形用户接口。

Runlevel 6用于系统重启,当整个init系统甚至bootloader 需要重启时采用它。

其他runlevels由系统管理员进行定义,但是“传统”Unix系统没有此功能。这种情况下,他们不能被定义也不能被使用。

在shell处,可以输入runlevel命令找到以前的renlevel和当前runlevel。如果没有更改系统 runlevel ,命令的输出结果为大写N后面跟runlevel的数字,这里的N表示没有前runlevel,如果要更改runlevel,可以使用init命令,后面跟想要使用到的runlevel的数字。例如:输入init 6表示重启系统,或init 1 进入单用户模式。

配置runlevel 的过程每一版本的情况都不同。例如,在Debian GNU/Linux系统中,位于/etc/init.d的服务脚本有来自/etc/rcN.d的路径与它们进行链接,这里的N表示需要配置的 runlevel数字。以字母K开头的symlinks指示在进入runlevel时被杀死的程序,而以字母 S开头的symlinks指示在进入runlevel时被启动的程序。字母后面的数字值越大,从1到99,表示启动或杀死的时间愈靠后。

大多数基于RPM的版本都采用RedHat所用到的rc系统。比起基于Debian的系统,这一系统使用更复杂的路径结构,并且不同的基于RPM的系统之间也有很大的不同。说明书上提供了更多的关于管理runlevel的信息。

inetd
一个用于Linux后台程序管理的“superdaemon”是众所周知的inetd,它是个用于服务管理的命令行工具。终止服务很简单:首先,作为根 用户用文本编辑器打开/etc/inetd.conf文件。接下来,找到文件中需要终止的服务。最后,在服务所在行的最前面添加#符号(其他还有“尖顶符 ”和“英镑符”),如下所示。“注释掉”这一行,因此inted以后都不会启动这一服务。

编辑之前服务登录可能是下面这样:
ident stream tcp wait identd /usr/sbin/identd identd

停止之后,服务登录变成下面这个样子:
# ident stream tcp wait identd /usr/sbin/identd identd

如果正在卸载被登录参考的后台程序,可以删除文件中的某些行——是否通过包管理器进行卸载或删除执行文件卸载(对于上面的例子是/usr/sbin/identd文件)。

编辑/etc/inetd.conf文件之后,保存它,inetd以后则可以使用更改。编辑和保存一旦完成,可以在根部输入下面的命令使更改即时生效:
kill -HUP `pidofinetd`
使用修改(保存)后的配置文件会导致inetd重启。

另外一个称为xinetd的superdaemon比inetd更新颖更复杂,能完成更多的功能。但是对于关闭服务来说,他们的使用方法相似。

使用xinetd时,必须在/etc/xinetd.conf文件中添加一行关闭服务。如果只想简单的删除服务,必须删除好几行代码而不是一行。找到想要关闭的服务所在的那一块,在块的后面添加“disable = yes”这一行,或者删除整个块。例如,关闭telnet服务,需要像下面这样做(这里的省略号代表了块的其他内容)。
service telnet {
. . .
disable = yes
}

在某些系统中,对于某些服务,服务配置并不在/etc/xinetd.conf文件中。例如,像telnet这样的服务有可能在文件/etc/xinetd.d/telnet中,改变其服务配置方法与它在/etc/xinetd.conf文件中的方法是一样的。

编辑保存了/etc/xinetd.conf文件后或者更改了服务文件后,可以输入下面的命令让修改即时生效:
kill -USR2 `pidofxinetd`
这将通知xinetd程序,使用更改后的配置。

xinetd除了关闭或移除服务配置之外,还可以用于控制远程主机登录服务。这将通过几个机制完成:

可以为服务指定一个允许的主机。例如:可以通过在服务配置文件中添加only_from = 192.168.0.101这一行限制主机登录telnet服务。尽管使用了词语“only”,但是它只能限制主机的数目,而不仅仅只一台主机。也可以使 用部分地址指定完整的网络。例如:可以使用“only_from = 192.168.0.to”表示本地Class C的任何主机都能访问这个服务。

可以在配置文件中为某个服务指定禁止的主机。例如:可以在配置文件中添加“no_access = 192.168.0.102”这一行禁止这个主机远程访问telnet服务。这个也可以使用多次而且也可以使用部分地址指定多个主机。万一某个主机满足 only_from和no_access两个限制,则会权衡确定其访问权限。如果xinetd不能确定哪个限制能被应用,则系统默认更安全的选项——服务不会开启。

超越服务管理
对于安全的远程服务访问,还有更多的事情可以做。应该恰当配置防火墙保护服务免受攻击。代理 服务器、通过网关服务器端口推进以及网络地址转移都能有效减少服务攻击的风险。针对安全使用,那些用于登录正在运行的服务工具也应进行配置,例如:如果使用安全shell进行远程连接而没有使用X Server时,在SSH中调低X forwarding是很重要的。直接进行安全管理是保证Linux系统安全的重要部分,但是它也只是全面安全计划的一部分。

15 个 Linux 安全加固项

服务器加固是通过各种方法增强服务器安全性的过程,有很多方法来保护服务器免受黑客、破解者和攻击者的侵害,这里主要描述的是 CentOS 的服务器加固。本指南将引导完成安全强化CentOS 7所需的步骤,使其更具限制性,建议创建一个可用于实验的虚拟机。

1.安全的远程访问

通过远程方法访问服务器,OpenSSH服务器选项是通过/etc/ssh/sshd_config文件控制的。
禁用 SSH 密码验证方法并启用公钥验证方法
重要的是禁用密码远程登录方法并启用身份验证公钥

将ChallengeResponseAuthentication和PasswordAuthentication更改为no以停用密码方法

授权公钥认证
RSAAuthentication yes
PubkeyAuthentication yes

生成新的密钥对
# ssh-keygen -t rsa

禁用直接root登录
允许 root 直接登录服务器是一种风险安全措施。应该以普通帐户登录系统,然后执行su -以 root 身份挪作。因此需要将PermitRootLogin yes更改为PermitRootLogin no

更改默认 SSH 监听端口(例如:8500)
不建议使用默认端口,因为它是全世界都知道的并且存在安全风险。使用其它端口就很不错
Port 5222

2.使用 GRUB 密码保护引导加载程序

通过保护引导加载程序可以防止访问以 root 身份自动登录的单用户模式。这是通过GRUB 通过设置默认以纯文本形式存储的密码来完成的。

对于 Debian 系统
# grub-mkpasswd-pbkdf2

对于 Centos
# grub2-mkpasswd-pbkdf2

这个可能对云主机就没有那么友好甚至不适用了。

3.监听网络端口

配置网络服务后,重要的是要注意哪些端口实际上正在侦听系统的网络接口。任何开放的端口都可能是被入侵的通道。
# nmap -sT -O localhost

要列出所有打开的端口和相关程序,请使用以下命令
# netstat -tulpn

4.缩小权限

缩小系统文件和文件夹的权限以限制风险。

# chmod 700 /root
# chmod 700 /var/log/audit
# chmod 740 /etc/rc.d/init.d/iptables
# chmod 740 /sbin/iptables
# chmod -R 700 /etc/skel
# chmod 600 /etc/rsyslog.conf
# chmod 640 /etc/security/access.conf
# chmod 600 /etc/sysctl.conf

5.检查空密码的帐户

任何密码为空的帐户都意味着它被打开以供网络上的任何人未经授权访问,并且它是 Linux 服务器中安全性的一部分。要检查密码为空的帐户,请使用以下命令
# cat /etc/shadow | awk -F: '($2==""){print $1}' freeoa

为了安全起见,最好锁定所有空密码帐户:
# passwd -l freeoa Locking password for user freeoa. passwd: Success

6.调整内核参数

Sysctl 是一个用于在 Linux 操作系统中检查和动态更改参数的接口,可编辑/etc/sysctl.conf 文件以持久的形式优化内核参数。

sysctl 是用于在运行时修改内核参数的命令
# sysctl -a
# sysctl -A
# sysctl net.ipv4.conf.all.rp_filter
#To load settings, enter:
# sysctl -p

将以下内容复制粘贴到/etc/sysctl.conf

# Turn on execshield
kernel.exec-shield=1
kernel.randomize_va_space=1
# Enable IP spoofing protection
net.ipv4.conf.all.rp_filter=1
# Disable IP source routing
net.ipv4.conf.all.accept_source_route=0
# Ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_messages=1
# Make sure spoofed packets get logged
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1 # Disable ICMP routing redirects sysctl -w net.ipv4.conf.all.accept_redirects=0 sysctl -w net.ipv6.conf.all.accept_redirects=0 sysctl -w net.ipv4.conf.all.send_redirects=0 sysctl -w net.ipv6.conf.all.send_redirects=0
# Disables the magic-sysrq
key kernel.sysrq = 0
# Turn off the tcp_sack
net.ipv4.tcp_sack = 0 # Turn off the tcp_timestamps
net.ipv4.tcp_timestamps = 0
# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1 # Enable bad error message Protection
net.ipv4.icmp_ignore_bogus_error_responses = 1

7.禁用不需要的服务

需要从系统启动中删除所有不需要的服务和守护程序(在后台运行的服务),这些服务和守护程序在启动时以运行级别 3启动。
# chkconfig --list | grep '3:on'

要禁用服务,请输入:
# service serviceName stop
# chkconfig serviceName off

较新的版本需要使用systemctl工具指令来实现。

8.单用户模式需要认证

建议进入单用户模式时要求输入root密码,编辑/etc/sysconfig/init 文件并添加以下行:
SINGLE=/sbin/sulogin

9.安全增强型 Linux (SELINUX)

SELinux是一组安全规则,用于确定哪个进程可以访问哪个文件、目录、端口等。每个文件、进程、目录和端口都有一个特殊的安全标签,称为 SELinux 上下文。上下文只是 SELinux 策略用来确定进程是否可以访问文件、目录或端口的名称。默认情况下,该策略不允许任何交互,因此显式规则授予访问权限。如果没有允许规则,则不允许访问。

getenforce 命令告诉我们 SELinux 处于什么模式,可以通过更改来将 SELinux 模式更改为强制:SELINUX=enforcing。

该文件(/etc/sysconfig/selinux)中有三个指令,如下所述:
enforcing(强制):SELinux 安全策略被强制执行。
permissive(宽容):SELinux 打印警告而不是强制执行。
disabled(禁用):SELinux 完全禁用。

可以使用以下命令检查 SELinux 的状态
# sestatus SELinux
status: disabled

会看到它已被禁用,要启用它可以使用
# setenforce enforcing

SELinux 的启动与关闭

上面是预设的政策与启动的模式!要注意的是,如果改变了策略则需要重新开机;如果由 enforcing 或 permissive 改成 disabled ,或由 disabled 改成其他两个,那也必须要重新开机。这是因为 SELinux 是整合到核心里面的,只可以在 SELinux 运作下切换成为强制 (enforcing) 或宽容 (permissive) 模式,不能够直接关闭 SELinux 的!

同时由 SELinux 关闭 (disable) 的状态到开启的状态也需要重新开机啦!所以如果刚发现 getenforce 出现 disabled 时,请到上述文件修改成为 enforcing。

如果要启动SELinux必须满足以下两个点:
如果要启动 SELinux 的话,请将上述的 SELINUX=enforcing 设定妥当,并且指定 SELINUXTYPE=targeted 这一个设定, 并且到 /boot/grub/menu.lst 这个文件去;如果要启动 SELinux,则不可以出现 selinux=0 的字样在 kernel 后面。

如果将启动着的SELinux改为禁用,需要重启电脑,不想重启电脑又不想开启SELinux该怎么办呢。

答案:将强制模式改为宽松模
setenforce [ Enforcing | Permissive | 1 | 0 ]

选项与参数:
0 :转成 permissive 宽容模式
1 :转成 Enforcing 强制模式

查看已启动程序的type设定
ps aux -Z

说明:其实这些暂时不用管,是SELinux内置的。先学会在强制和宽松模式间转换就可以了。

小结:
关闭SELinux的方法:
修改/etc/selinux/config文件中的SELINUX="" 为 disabled ,然后重启。如果不想重启系统,使用命令setenforce 0

注:
setenforce 1 设置SELinux 成为enforcing模式
setenforce 0 设置SELinux 成为permissive模式

在lilo或者grub的启动参数中增加:selinux=0,也可以关闭selinux。

查看selinux状态:
/usr/bin/setstatus -v

getenforce/setenforce可查看和设置SELinux的当前工作模式。

查看SELinux状态:
1)./usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态
SELinux status: enabled

2).getenforce ##也可以用这个命令检查

关闭SELinux:
1).临时关闭(不用重启机器)
2).修改配置文件需要重启机器

修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled

重启主机即可。


10.使用 iptables 设置防火墙

iptables 是一个用户空间应用程序,允许系统管理员配置 Linux 内核防火墙提供的表及其存储的链和规则。

关闭所有不需要的端口 iptables -A INPUT -p tcp --dport PORT_NUMBER -j DROP 湾。阻止不良IP iptables -A INPUT -s IP_ADDRESS -j DROP C。阻止与网络接口的连接

要阻止从特定 IP 地址到特定网络接口的连接,请使用命令

# iptables -A INPUT -i ens0 -s 6.6.6.6 -j DROP d。

列出 iptables 规则

可以通过命令查看所有 iptables 规则
iptables -L -n -v

11. 验证文件系统

当 SUID/SGID 可执行文件存在安全问题时,所有启用 SUID/SGID 位的文件都可用于恶意活动,所有本地或远程用户都可以使用此类文件。

识别不需要的 SUID 和 SGID 二进制文件
find / \( -perm -4000 -o -perm -2000 \) -print
find / -path -prune -o -type f -perm +6000 -ls 识别世界可写文件
find /dir -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print 识别孤立的文件和文件夹
find /dir -xdev \( -nouser -o -nogroup \) -print

12.保持 /boot 为只读

Linux 内核及其相关文件在 /boot 目录下,默认为可读写。将其更改为只读可降低未经授权修改关键引导文件的风险,需要编辑/etc/fstab文件编辑行
LABEL=/boot /boot ext2 defaults,ro 1 2

13.拒绝所有 TCP Wrappers

TCP 包装器可以提供一种快速简便的方法来控制对链接到它们的应用程序的访问。因此建议屏蔽所有未使用的应用程序,然后只授权将要使用的应用程序。例如,将阻止所有应用程序,但仅授权 ssh通过:
echo "ALL:ALL" >> /etc/hosts.deny echo "sshd:ALL" >> /etc/hosts.allow

这种方式可能在后面会移除,不再建议使用了。

14.为未经授权的用户锁定 cronjobs

Cron 用于在特定时间自动执行作业。可以指定谁可以或不可以运行作业。这是通过使用名为/etc/cron.allow和的文件来控制的/etc/cron.deny。要使用 cron 锁定用户,只需在 cron.deny 中添加用户名并允许用户在 cron.allow 文件中:
# echo ALL >>/etc/cron.deny

15.保护服务器免受缓冲区溢出

当程序或进程尝试将更多数据写入固定长度的内存块或缓冲区时,会发生缓冲区溢出,而不是分配给缓冲区的内容。再次保护您的服务器很重要一种。

启用ExecShield有助于防止堆栈粉碎。通常缓冲区溢出漏洞会覆盖返回地址,以便函数返回攻击者选择的地址。需要在当前内核上启用
sysctl -w kernel.exec-shield=1

还可以将下面的行添加到/etc/sysctl.conf
kernel.exec-shield = 1

检查/启用 ASLR
地址空间布局随机化是一种防御功能,可以使缓冲区溢出更加困难。ASLR 使攻击者难以找到要跳转的地址。需要通过为kernel.randomize_va_space设置运行时来启用随机虚拟内存区域放置:
sysctl -q -n -w kernel.randomize_va_space=2

/etc/sysctl.conf中不存在的话,则添加下面的行
kernel.randomize_va_space = 2



该文章最后由 阿炯 于 2022-05-28 19:21:15 更新,目前是第 2 版。