1.删除特殊的用户和用户组:

  linux提供了各种不同角色的系统账号,在系统安装完成后,默认会安装很多不必要的用户和用户组,如果不需要某些用户或用户组,应立即删除他们,因为账号越多,系统就越不安全,从而很可能被×××利用,威胁服务器安全。

  linux系统中可以删除的默认用户和用户组大致如下:

    □可删除的用户:adm lp sync shutdown halt uucp operator games gopher等

    ■可删除的用户组:adm lp uucp games dip等

  命令:

    删除系统不必要的用户命令:

      [root@test1 ~]# userdel adm

    删除系统不必要的用户组命令:

      [root@test1 ~]# groupdel adm

  有些时候,某些用户仅仅作业进程调用或者用户组调用,不需要登录功能,此时可以禁用这些用户登录系统的功能,例如要禁止nobody用户的登录功能,可以执行如下命令:

    [root@test1 ~]# usermod -s /sbin/nologin nobody

  其实要删除那些用户和用户组,并没有固定要求,可以根据服务器的用途来决定,如果服务器是用于Web应用的,那么系统默认的apache用户和用户组就无需删除;而如果服务器是用于数据库应用的,那么建议删除系统的默认的apache用户和用户组。

2.关闭系统不需要的服务

  在安装完成后,Linux绑定了很多没用的服务,这些服务默认都是自动启动的。对于服务器来说,运行的服务越多,系统就越不安全,运行的服务越少,系统安全性就越高,因此关闭一下不需要的服务,对系统安全有很大的帮助。

  具体关闭哪些服务,要根据服务器的用途而定,一般情况下,只要系统本身用不到的服务都认为是不必要的服务,例如某台Linux服务器用于WWW应用,那么除了httpd服务和系统运行是必需的服务外,其他服务都可以关闭。下面这些服务一般情况下是不需要的,可以选择关闭:

   auditd ip6tables kdump mdmonitor netconsole netfs nfs nfslock postfix quota_nld rdisc restorecond rpcsvcgssd saslauthd udev-post winbind

  关闭服务自动启动的方法很简单,可以通过chkconfig命令实现。例如:

    [root@test1 ~]# chkconfig --level 345 nfs off

  建议启动服务如下表:

服务名称服务内容
acpid用于电源管理,对于笔记本电脑和台式电脑很重要,建议开启
apmd高级电源能源管理服务,可以监控电池性能
kudzu检测硬件是否变化的服务,建议开启
crond为Linux下自动安排的进程提供运行服务,建议开启
iptablesLinux内置的防火墙软件,为了系统安全,必须开启
network网络服务,必须启动
sshd远程登录服务,启动
syslog记录系统日志服务,建议启动

3.合理使用su、sudo命令

  su命令是一个切换用户工具,经常用于将普通用户切换到超级用户下,当然也可以从超级用户切换到普通用户。为了保证服务器的安全,几乎所有服务器都禁止了超级用户直接登录系统,而是通过普通用户登录系统,然后再通过su命令切换到超级用户下,执行一些需要超级权限的工作。通过su命令能够为系统管理带来一定的方便,但是也存在不安全的因素,例如系统有10个普通用户,每个用户都需要执行一些有超级权限的操作,就必须把超级用户的密码交给这10个普通用户,如果这10个用户都有超级权限,通过超级权限可以做任何事,那么在一定程度上对系统的安全造成威胁。因此在很多人都需要参与的系统管理中,使用su命令并不是最好的选择,超级用户密码应该掌握在少数人手中,此时sudo命令就派上用场了。

  sudo命令允许系统管理员分配给普通用户一些合理的“权力”,并且不需要普通用户知道超级用户密码,就能让他们执行一些只有超级用户或其他特许用户才能完成的任务,比如系统服务重启、编辑系统配置文件等,通过这种方式不但能减少超级用户登录次数和管理时间,而且提高了系统安全性。因此,sudo命令相对于权限无限制性的su命令来说,还是比较安全的,这使得sudo也称为受限制的su,另外sudo也是需要事先进行授权认证的,所以也称为授权认证的su。

  sudo执行命令的流程是:将当前用户切换到超级用户下,或切换到指定的用户下,然后以超级用户或其指定切换到的用户身份执行命令,执行完成后,直接退回到当前用户,而这一切的完成要通过sudo的配置文件/etc/sudoers来进行授权。

  例如,普通用户是无法访问/etc/shadow文件的:

    [yan@test1 ~]$ more /etc/shadow

    /etc/shadow: 权限不够

  如果要让普通用户yan可访问这个文件,可以在/etc/sudoers添加如下内容:

    yan ALL = /bin/more /etc/shadow

  这样,通过如下方式yan用户就可访问/etc/shadow文件:

    [yan@test1 ~]$ sudo more /etc/shadow

    [sudo] password for yan:

  执行这个命令后,需要输入yan用户的密码,然后就可访问文件内容了。在这里sudo使用时间戳文件来完成类似“检票”的系统功能,当用户输入密码后就获得了一张默认存活期为5分钟的“入场券”(默认值可以在编译的时候改变)。超时以后,用户必须重新输入密码才能查看文件内容。

  如果每次都需要输入密码,那么某些自动调用超级权限的程序就会出现问题,此时可以通过下面的设置让普通用户无需输入密码即可执行具有超级权限的程序。例如,要让一个普通用户user02具有超级用户的所有权限,而有不想输入超级用户的密码,只需在/etc/sudoers添加如下内容即可:

    user02 ALL=(ALL) NOPASSWD: ALL

  这样user02用户登录系统后,就可以通过执行如下命令切换到超级用户:  

          [user02@test1 ~]$ sudo su -

    [root@test1 ~]# pwd

   /root

  设计sudo的宗旨是:赋予用户尽可能少的权限但允许他们完成自己的工作,这种设计兼顾了安全性和易用性,因此,强烈推荐通过sudo来管理系统账号的安全,只允许普通用户登录系统,如果这些用户需要特殊的权限,就通过配置/etc/sudoers来完成,这也是多用户系统下账号安全管理的基本方式。

4.删减系统登录欢迎信息

  虽然系统的一些欢迎信息或版本信息能给系统管理者带来一定的方便,但是这些信息有时候可能被×××利用,从而成为×××服务器的帮凶,为了保证系统的安全,可以修改或删除某些系统文件,这样的文件有4个,分别是/etc/issue、/etc/issue.net、/etc/redhat-release、/etc/motd。

  /etc/issue和/etc/issue.net文件都记录了操作系统的名称和版本号,当用户通过本地终端或本地虚拟控制台等登录系统时,就会显示/etc/issue的文件内容,当用户通过ssh或telnet等远程登录系统时,在登录后就会显示/etc/issue.net的文件内容。在默认情况下/etc/issue.net文件的内容是不会在ssh登录后显示的,要显示这个信息可以修改/etc/ssh/sshd_config文件,在此文件中添加如下内容即可:

  Banner /etc/issue.net

  其实,这些登录提示很明显泄露了系统信息,为了安全起见,建议将此文件中的内容删除或修改。

  /etc/redhat-release文件也记录了操作系统的名称和版本号,为了安全起见,可以将此文件中的内容删除。

  /etc/motd文件是系统的公告信息。每次用户登录后,/etc/motd文件的内容就会显示在用户的终端。

5.禁止Control-Alt-Delete键盘关闭命令

  在linux的默认设置下,同时按下Control-Alt-Delete组合键,系统将自动重启,这个策略是很不安全的,因此要禁止Control-Alt-Delete组合键重启系统。禁止的方法很简单,在Centos6.x以下的系统,只需修改/etc/init/control-alt-delete.conf文件即可,操作如下:

   exec /sbin/shutdown -r now "Control-Alt-Delete pressed"

  在这行之前加上“#”进行注释掉即可。

6.合理使用shell历史命令记录功能

  在linux下可通过history命令查看用户所有的历史操作记录,同时shell命令操作记录默认保存在用户目录下的.bash_history文件中,通过这个文件可以查询shell命令的执行历史,有助于运维人员进行系统审计和问题排查,同时,在服务器遭受××××××后,也可以通过这个命令或文件查询×××登录服务器所执行的历史命令操作。但是有时候×××在***服务器后为了毁灭痕迹,可能会删除.bash_history文件,这就需要合理保护或备份.bash_history文件。下面介绍下history日志文件的安全配置方法。

  默认的history命令只能查看用户历史操作记录,并不能区分每个用户操作命令的时间,这点对于排查问题十分不便,不过可以通过下面的方法(加入四行内容)让history命令自动记录所有shell命令的执行时间,编辑/etc/bashrc文件:    

            #history

            HISTFILESIZE=4000

            HISTSIZE=4000

            HISTTIMEFORMAT='%F %T '

            export HISTTIMEFORMAT

  其中,HISTFILESIZE定义了在.bash_history文件中保存命令的记录总数,默认值是1000,这里设置为4000;HISTSIZE定义了history命令输出的记录总数;HISTTIMEFORMAT定义时间显示格式,这里的格式与date命令后的“+"%F%T"”是一致的;HISTTIMEFORMAT作为history的时间变量将值传递给history命令。

  这样设置后,执行history命令,就会显示每条历史命令的详细执行时间,例如:

                4  2018-07-27 13:22:53 cd /etc/sysconfig/network-scripts/

                5  2018-07-27 13:22:53 ls

                6  2018-07-27 13:22:53 vim ifcfg-eth0

                7  2018-07-27 13:22:53 vi ifcfg-eth0

                8  2018-07-27 13:22:53 ls

  下面介绍一种方法,可以实现详细记录登录过系统的用户、IP地址、shell命令以及详细的操作时间等。将下面这段代码添加到/etc/profile文件中,即可实现上述功能:

                USER_IP=`who -u am i 2>/dev/null|awk '{print $NF}'|sed -e 's/[()]//g'`

                HISTDIR=/usr/share/.history

                if [ -z $USER_IP ];then

                    USER_IP='hostname'

                fi

                if [ ! -d $HISTDIR ];then

                    mkdir -p $HISTDIR

                    chmod 777 $HISTDIR

                fi

                if [ ! -d $HISTDIR/${LOGNAME} ];then

                    mkdir -p $HISTDIR/${LOGNAME}

                    chmod 300 $HISTDIR/${LOGNAME}

                fi

                export HISTSIZE=4000

                DT=`date +%Y%m%d_%H%M%S`

                export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT"

                export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S]"

                chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null

 7.启动tcp_wrappers防火墙

   tcp_wrappers是一个用来分析TCP/IP封包的软件,类似的IP封包软件还有iptables。Linux默认安装了tcp_wrappers。作为一个安全的系统,Linux本身有两层安全防火墙,通过IP过滤机制的iptables实现第一层防护。iptables防火墙通过直观地监视系统的运行状况,阻挡网络中的一些恶意×××,保护整个系统正常运行,免遭×××和破坏。如果通过了第一层防护,那么下一层防护就是tcp_wrappers了。通过tcp_wrappers可以实现对系统中提供的某些服务的开发与关闭、允许与禁止,从而更有效地保证系统安全运行。

  tcp_wrappers的使用很简单,仅仅有两个配置文件:/etc/hosts.allow和/etc/hosts.deny。

  查看系统是否安装了tcp_wrappers:

            [root@test1 ~]# rpm -q tcp_wrappers

            tcp_wrappers-7.6-58.el6.x86_64

  tcp_wrappers防火墙的局限性

    Linux系统中的某个服务是否可以使用tcp_wrappers防火墙,取决于该服务是否应用了libwrapped库文件,如果应用了就可以使用tcp_wrappers防火墙。系统中默认的一些服务,如:sshd、portmap、sendmail、xinetd、vsftpd、tcpd等都可以使用tcp_wrappers防火墙。

  tcp_wrappers设定的规则

    tcp_wrappers防火墙的实现是通过/etc/hosts.allow和/etc/hosts.deny两个文件来完成的,首先看一下设定的格式:

    service:host(s) [:action]

    主要参数含义如下:

      □service:代表服务名,例如sshd、vsftpd、sendmail等。

      ■host(s):主机名或者IP地址,可以有多个,例如192.168.12.0、www.ixdba.net。

      □action:动作,符合条件后采取的动作。

          □ALL:所有服务或者所有IP。

          ■ALL EXCEPT:从所有的服务或者所有IP中除去指定的。

          例如:ALL:ALL EXCEPT 10.0.0.36