Linux服务器安全运维
账户和登录安全
删除特殊的账户和账户组
Linux提供了各种不同角色的系统账号,在系统安装完成后,默认会安装很多不必要的
用户和用户组,如果不需要某些用户或者组,就要立即删除它,因为账户越多,系统就越不
安全,很可能被黑客利用,进而威胁到服务器的安全。
Linux系统中可以删除的默认用户和组大致有如下这些:
?可删除的用户,如adm,lp,sync,shutdown,halt,news,uucp,operator,games,gopher等。
?可删除的组,如adm,lp,news,uucp,games,dip,pppusers,popusers,slipusers等。
删除的方法很简单,下面以删除games用户和组为例介绍具体的操作。
删除系统不必要的用户使用下面命令:
[root@localhost~]#userdelgames
删除系统不必要的组使用如下命令:
[root@localhost~]#groupdelgames
有些时候,某些用户仅仅用做进程调用或者用户组调用,并不需要登录功能,此时可以
禁止这些用户登录系统的功能,例如要禁止nagios用户的登录功能,可以执行如下命令:
[root@localhost~]#usermod-s/usr/sbin/nologinnagios
其实要删除哪些用户和用户组,不是固定的,要根据服务器的用途来决定,如果服务器
是用于Web应用的,那么系统默认的apache用户和组就无需删除;而如果服务器是用于数据库应用的,那么默认apache用户和组就建议要删除掉。
关闭系统不需要的服务
Linux在安装完成后,绑定了很多没用的服务,这些服务默认都是自动启动的。对于服
务器来说,运行的服务越多,系统就越不安全,越少服务在运行,安全性就越好,因此关闭
一些不需要的服务,对系统安全有很大的帮助。
具体哪些服务可以关闭,要根据服务器的用途而定,一般情况下,只要系统本身用不到
的服务都认为是不必要的服务,例如某台Linux服务器用于www应用,那么除了httpd服
务和系统运行是必须的服务外,其他服务都可以关闭。下面这些服务一般情况下是不需要的,
可以选择关闭:
anacron、auditd、autofs、avahi-daemon、avahi-dnsconfd、bluetooth、cpuspeed、firstboot、
gpm、haldaemon、hidd、ip6tables、ipsec、isdn、lpd、mcstrans、messagebus、netfs、nfs、nfslock、nscd、pcscdportmap、readahead_early、restorecond、rpcgssd、rpcidmapd、rstatd、sendmail、setroubleshoot、yppasswddypserv
关闭服务自动启动的方法很简单,可以通过chkconfig命令实现。例如要关闭bluetooth
服务,执行下面命令即可:
chkconfig--level345bluetoothoff
对所有需要关闭的服务都执行上面操作后,重启服务器即可。
为了系统能够正常稳定运行,建议启动下面列出的服务,系统运行必须的服务参看表
1.1所示。
表1.1系统运行必须的服务列表
服务名称服务内容
acpid用于电源管理,对于笔记本和台式电脑很重要,所以建议开启
Apmd高级电源能源管理服务,可以监控电池
Kudzu检测硬件是否变化的服务,建议开启
crond为Linux下自动安排的进程提供运行服务,建议开启
atd
atd类似crond,提供在指定的时间做指定的事情的服务,与Windows下的
计划任务有相同功能
keytables用于装载镜像键盘。根据情况,可以启动
iptablesLinux内置的防火墙软件,为了系统安全,必须启动
xinetd支持多种网络服务的核心守候进程,,建议开启
xfs使用XWindow桌面系统必须的服务,
network激活已配置网络接口的脚本程序,也就是启动网络服务,当然要启动
sshd提供远程登录到Linux上的服务,为了系统维护方便,一般建议开启
syslog记录系统日志的服务,很重要,建议开启
密码安全策略
在Linux下,远程登录系统有两种认证方式:密码认证和密钥认证.密码认证方式是传
统的安全策略,对于密码的设置,比较普遍的说法是:至少6个字符以上,密码要包含数字、字母、下划线、特殊符号等。设置一个相对复杂的密码,对系统安全能起到一定的防护作用,但是也面临一些其他问题,例如密码暴力破解、密码泄露、密码丢失等,同时过于复杂的密码对运维工作也会造成一定的负担。
密钥认证是一种新型的认证方式,公用密钥存储在远程服务器上,专用密钥保存在本地,
当需要登录系统时,通过本地专用密钥和远程服务器的公用密钥进行配对认证,如果认证成功,就成功登录系统。这种认证方式避免了被暴力破解的危险,同时只要保存在本地的专用密钥不被黑客盗用,攻击者一般无法通过密钥认证的方式进入系统。因此,在Linux下推荐用密钥认证方式登录系统,这样就可以抛弃密码认证登录系统的弊端。
Linux服务器一般通过SecureCRT、putty、Xshell之类的工具进行远程维护和管理,密
钥认证方式的实现就是借助于SecureCRT软件和Linux系统中的SSH服务实现的。
SSH的英文全称是SecureSHell。SSH以及OpenSSH,是类似于telnet的远程登录程
序,SecureCRT就是一个SSH客户端,SecureCRT要想登录到远程的机器,要求该远程机器必须运行sshd服务,但是,与telnet不同的是,SSH协议非常安全,数据流加密传输,确保数据流的完整性和安全性。OpenSSH的RSA/DSA密钥认证系统是一个很棒的功能组件,
使用基于密钥认证系统的优点在于:在许多情况下,可以不必手工输入密码就能建立起安全的连接。支持RSA/DSA密钥认证的软件有很多,这里以Xshell为例,详细讲述通过密钥认证方式远程登录Linux服务器的实现方法。
合理使用su、sudo
su命令是一个切换用户的工具,经常用于将普通用户切换到超级用户下,当然也可以
从超级用户切换到普通用户。为了保证服务器的安全,几乎所有服务器都禁止了超级用户直接登录系统,而是通过普通用户登录系统,然后再通过su命令切换到超级用户下,执行一些需要超级权限的工作。通过su命令能够给系统管理带来一定的方便,但是也存在不安全的因素,例如系统有10个普通用户,每个用户都需要执行一些有超级权限的操作,就必须把超级用户的密码交给这10个普通用户,如果这10个用户都有超级权限,通过超级权限可以做任何事,那么会在一定程度上对系统的安全造成了威协。因此su命令在很多人都需要参与的系统管理中,并不是最好的选择,超级用户密码应该掌握在少数人手中,此时sudo命令就派上用场了。
sudo命令允许系统管理员分配给普通用户一些合理的“权利”,并且不需要普通用户知
道超级用户密码,就能让他们执行一些只有超级用户或其他特许用户才能完成的任务,比如系统服务重启、编辑系统配置文件等,通过这种方式不但能减少超级用户登录次数和管理时间,也提高了系统安全性。因此,sudo命令相对于权限无限制性的su来说,还是比较安全的,所以sudo也被称为受限制的su,另外sudo也是需要事先进行授权认证的,所以也被称为授权认证的su。
sudo执行命令的流程是:将当前用户切换到超级用户下,或切换到指定的用户下,然
后以超级用户或其指定切换到的用户身份执行命令,执行完成后,直接退回到当前用户,而
这一切的完成要通过sudo的配置文件/etc/sudoers来进行授权。
例如,/etc/shadow文件普通用户是无法访问的:
[user01@unknown~]$more/etc/shadow
/etc/shadow:Permissiondenied
如果要让普通用户user01可访问这个文件,可以在/etc/sudoers添加如下内容:
user01ALL=/bin/more/etc/shadow
这样,通过如下方式user01用户就可访问/etc/shadow文件:
[user01@unknown~]$sudomore/etc/shadow
[sudo]passwordforuser01:
执行这个命令后,需要输入user01用户的密码,然后就可访问文件内容了。在这里sudo
使用时间戳文件来完成类似“检票”的系统,当用户输入密码后就获得了一张默认存活期为
5分钟的“入场券”(默认值可以在编译的时候改变)。超时以后,用户必须重新输入密码才能查看文件内容。
如果每次都需要输入密码,那么某些自动调用超级权限的程序就会出现问题,此时可以
通过下面的设置,让普通用户无需输入密码即可执行具有超级权限的程序。例如,要让普通
用户centreon具有/etc/init.d/nagios脚本重启的权限,可以在/etc/sudoers添加如下设置:
CENTREONALL=NOPASSWD:/etc/init.d/nagiosrestart
这样,普通用户centreon就可以执行nagios重启的脚本而无需输入密码了。如果要让
一个普通用户user02具有超级用户的所有权限,而又不想输入超级用户的密码,只需在
/etc/sudoers添加如下内容即可:
user02ALL=(ALL)NOPASSWD:ALL
这样user02用户登录系统后,就可以通过执行如下命令切换到超级用户下:
[user02@unknown~]$sudosu-
[root@unknown~]#pwd
/root
sudo设计的宗旨是:赋予用户尽可能少的权限但仍允许它们完成自己的工作,这种设
计兼顾了安全性和易用性,因此,强烈推荐通过sudo来管理系统账号的安全,只允许普通
用户登录系统,如果这些用户需要特殊的权限,就通过配置/etc/sudoers来完成,这也是多用户系统下账号安全管理的基本方式。
删减系统登录欢迎信息
系统的一些欢迎信息或版本信息,虽然能给系统管理者带来一定的方便,但是这些信息
有时候可能被黑客利用,成为攻击服务器的帮凶,为了保证系统的安全,可以修改或删除某
些系统文件,需要修改或删除的文件有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文件的内容就会显示在
用户的终端。通过这个文件系统管理员可以发布一些软件或硬件的升级、系统维护等通告信息,但是此文件的最大作用就、是可以发布一些警告信息,当黑客登录系统后,会发现这些警告信息,进而产生一些震慑作用。看过国外的一个报道,黑客入侵了一个服务器,而这个服务器却给出了欢迎登录的信息,因此法院不做任何裁决。
禁止Control-Alt-Delete
在Linux的默认设置下,同时按下Control-Alt-Delete组合键,系统将自动重启,这个策略是很不安全的,因此要禁止Control-Alt-Delete组合键重启系统。禁止的方法很简单,在Centos5.x以下的系统,只需修改/etc/inittab文件即可,操作如下:
[root@localhost~]#vi/etc/inittab
找到此行:
ca::ctrlaltdel:/sbin/shutdown-t3-rnow
在之前加上“#”,然后执行:
[root@localhost~]#telinitq
在Centos6.x以上版本中,需要修改/etc/init/control-alt-delete.conf文件,找到如下内容:
exec/sbin/shutdown-rnow"Control-Alt-Deletepressed"
在之前加上“#”,注释掉即可。
远程访问和认证安全
2.1远程登录取消telnet而采用SSH
关于SSH在前面已经做过一些简单的介绍,它是由客户端和服务端的软件组成的,在
客户端可以使用的软件有SecureCRT、putty、Xshell等,而在服务器端运行的是一个sshd
服务。通过使用SSH,可以把所有传输的数据进行加密,而且也能够防止DNS和IP欺骗。
使用SSH还有另外一个的好处就是:传输的数据是经过压缩的,所以可以加快传输的速度。
下面重点介绍下如何配置服务器端的sshd服务,以保证服务器远程连接的安全。
sshd服务对应的主配置文件是/etc/ssh/sshd_config,下面重点介绍下此文件关于安全方
面的几个配置。先打开主配置文件:
[root@localhost~]#vi/etc/ssh/sshd_config
Port22,“Port”用来设置sshd监听的端口,为了安全起见,建议更改默认的22
端口,选择5位以上的陌生数字端口。
Protocol2,设置使用的ssh协议的版本为SSH1或SSH2,SSH1版本有缺陷和漏
洞,因此这里选择Protocol2即可。
PermitRootLoginno,“PermitRootLogin”用来设置超级用户root能不能用ssh登录。
root远程登录Linux是很危险的,因此在远程ssh登录Linux系统时,这个选项建
议设置为“no”。
PermitEmptyPasswordsno,“PermitEmptyPasswords”用来设置是否允许用口令为空
的账号登录系统,肯定要选择“no”了。
PrintMotdyes,“PrintMotd”用来设置sshd是否在用户登录的时候显示。“/etc/motd”
中的信息,可以在/etc/motd中加入警告信息,以震慑攻击者。
TCPKeepAliveyes,选择“yes”防止死连接
MaxAuthTries3,设置最大失败尝试登录次数为3,合理的设置此值,可以防止攻
击者穷举登录服务器
MaxStartups5,#设置同时允许几个尚未登入的联机,当用户连上SSH但是尚未
输入密码的这个时候就是所谓的联机,在这个联机中,为了保护主机,所以需要设
定最大值,预设最多10个联机画面,而已经建立联机的不计算在这10个当中,其
实设置5个已经够用了,这个设置可以防止恶意对服务器进行连接。
2.2合理使用Shell历史命令记录功能
在Linux下可通过history命令查看用户所有的历史操作记录,同时shell命令操作记录默认保存在用户目录下的.bash_history文件中,通过这个文件可以查询shell命令的执行历史,有助于运维人员进行系统审计和问题排查,同时,在服务器遭受黑客攻击后,也可以通过这个命令或文件查询黑客登录服务器所执行的历史命令操作,但是有时候黑客在入侵服务器后为了毁灭痕迹,可能会删除.bash_history文件,这就需要合理的保护或备份.bash_history文件。下面介绍下history日志文件的安全配置方法。
默认的history命令只能查看用户历史操作记录,并不能区分每个用户操作命令的时间,
这点对于排查问题十分不便,不过可以通过下面的方法(加入四行内容)让history命令自动记录所有shell命令的执行时间,编辑/etc/bashrc文件:
HISTFILESIZE=4000
HISTSIZE=4000
HISTTIMEFORMAT=''%F%T''
exportHISTTIMEFORMAT
编辑完成后重新加载配置文件
source/etc/bashrc
其中,HISTFILESIZE定义了在.bash_history文件中保存命令的记录总数,默认值是1000,这里设置为4000;HISTSIZE定义了history命令输出的记录总数;HISTTIMEFORMAT定义时间显示格式,这里的格式与date命令后的“+"%F%T"”是一致的;HISTTIMEFORMAT
作为history的时间变量将值传递给history命令。
通过这样的设置后,执行history命令,就会显示每个历史命令的详细执行时间,例如:
[root@server~]#history
6342015-03-0416:16:47redis-cli-h192.168.100.10INFO
6352015-03-0416:16:47vim/etc/keepalived/keepalived.conf
6362015-03-0416:16:47halt
6372015-03-0416:16:52clear
6382015-03-0416:17:04vim/etc/bashrc
6392015-03-0416:18:13history
6402015-03-0416:19:06vim/etc/yum.repos.d/CentOS-Debuginfo.repo
6412015-03-0416:19:13hisrory
6422015-03-0416:19:19history
6432015-03-0416:19:34vim/etc/bashrc
6442015-03-0416:19:45source/etc/bashrc
6452015-03-0416:19:49history
为了确保服务器的安全,保留shell命令的执行历史是非常有用的一条技巧。shell虽然
有历史功能,但是这个功能并非针对审计目的而设计,因此很容易被黑客篡改或是丢失。下
面再介绍一种方法,可以实现详细记录登录过系统的用户、IP地址、shell命令以及详细操作时间等,并将这些信息以文件的形式保存在一个安全的地方,以供系统审计和故障排查。
将下面这段代码添加到/etc/profile文件中,即可实现上述功能。
#history
USER_IP=`who-uami2>/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
chmod777$HISTDIR
fi
if[!-d$HISTDIR/${LOGNAME}]
then
mkdir-p$HISTDIR/${LOGNAME}
chmod300$HISTDIR/${LOGNAME}
fi
exportHISTSIZE=4000
DT=`date+%Y%m%d_%H%M%S`
exportHISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT"
exportHISTTIMEFORMAT="[%Y.%m.%d%H:%M:%S]"
chmod600$HISTDIR/${LOGNAME}/.history2>/dev/null
这段代码将每个用户的shell命令执行历史以文件的形式保存在/usr/share/.history目录中,每个用户一个文件夹,并且文件夹下的每个文件以IP地址加shell命令操作时间的格式命名。
下面是user01用户执行shell命令的历史记录文件,基本效果如下:
[root@serveruser01]#pwd
/usr/share/.history/user01
[root@serveruser01]#ls-al
-rw-------1user01wheel56Jul617:07192.168.12.12.history.20130706_164512
-rw-------1user01wheel43Jul617:42192.168.12.12.history.20130706_172800
-rw-------1user01wheel22Jul712:05192.168.12.19.history.20130707_111123
-rw-------1user01wheel22Jul813:41192.168.12.20.history.20130708_120053
-rw-------1user01wheel22Jul115:28192.168.12.186.history.20130701_150941
-rw-------1user01wheel22Jul219:47192.168.12.163.history.20130702_193645
-rw-------1user01wheel22Jul312:38192.168.12.19.history.20130703_120948
-rw-------1user01wheel22Jul319:14192.168.12.134.history.20130703_183150
保存历史命令的文件夹目录要尽量隐蔽,避免被黑客发现后删除。
2.3启用tcp_wrappers防火墙
Tcp_Wrappers是一个用来分析TCP/IP封包的软件,类似的IP封包软件还有iptables。
Linux默认都安装了Tcp_Wrappers。作为一个安全的系统,Linux本身有两层安全防火墙,
通过IP过滤机制的iptables实现第一层防护。iptables防火墙通过直观地监视系统的运行状况,阻挡网络中的一些恶意攻击,保护整个系统正常运行,免遭攻击和破坏。如果通过了第一层防护,那么下一层防护就是tcp_wrappers了。通过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。
(1)查看系统是否安装了Tcp_Wrappers
[root@localhost~]#rpm-qtcp_wrappers
tcp_wrappers-7.6-57.el6.x86_64
或者
[root@localhost~]#rpm-qa|greptcp
tcp_wrappers-7.6-57.el6.x86_64
tcp_wrappers-libs-7.6-57.el6.x86_64
tcpdump-4.0.0-3.20090921gitdf3cb4.2.el6.x86_64
如果有上面的类似输出,表示系统已经安装了tcp_wrappers模块。如果没有显示,可能
是没有安装,可以从Linux系统安装盘找到对应RPM包进行安装。
(2)tcp_wrappers防火墙的局限性
系统中的某个服务是否可以使用tcp_wrappers防火墙,取决于该服务是否应用了
libwrapped库文件,如果应用了就可以使用tcp_wrappers防火墙。系统中默认的一些服务如:
sshd、portmap、sendmail、xinetd、vsftpd、tcpd等都可以使用tcp_wrappers防火墙。
(3)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。
?ALLEXCEPT:所有的服务或者所有IP除去指定的。
例如:
ALL:ALLEXCEPT192.168.12.189
表示除了192.168.12.189这台机器,任何机器执行所有服务时或被允许或被拒绝。
了解了设定语法后,下面就可以对服务进行访问限定。
例如,互联网上一台Linux服务器,实现的目标是:仅仅允许222.61.58.88、61.186.232.58以及域名www.ixdba.net通过SSH服务远程登录到系统,下面介绍具体的设置过程。
首先设定允许登录的计算机,即配置/etc/hosts.allow文件,设置很简单,只要修改
/etc/hosts.allow(如果没有此文件,请自行建立)这个文件,即只需将下面规则加入
/etc/hosts.allow即可。
sshd:222.61.58.88
sshd:61.186.232.58
sshd:www.ixdba.net
接着设置不允许登录的机器,也就是配置/etc/hosts.deny文件。
一般情况下,Linux会首先判断/etc/hosts.allow这个文件,如果远程登录的计算机满足
文件/etc/hosts.allow设定,就不会去使用/etc/hosts.deny文件了;相反,如果不满足hosts.allow
文件设定的规则,就会去使用hosts.deny文件了,如果满足hosts.deny的规则,此主机就被
限制为不可访问Linux服务器,如果也不满足hosts.deny的设定,此主机默认是可以访问linux
服务器的。因此,当设定好/etc/hosts.allow文件访问规则之后,只需设置/etc/hosts.deny为“所
有计算机都不能登录状态”:
sshd:ALL
这样,一个简单的tcp_wrappers防火墙就设置完毕了。
2.4文件系统安全
不正确的权限设置直接威胁着系统的安全,因此运维人员应该能及时发现这些不正确的
权限设置,并立刻修正,防患于未然。下面列举几种查找系统不安全权限的方法。
(1)查找系统中任何用户都有写权限的文件或目录
查找文件:find/-typef-perm-2-o-perm-20|xargsls-al
查找目录:find/-typed-perm-2-o-perm-20|xargsls–ld
(2)查找系统中所有含“s”位的程序
find/-typef-perm-4000-o-perm-2000-print|xargsls–al
含有“s”位权限的程序对系统安全威胁很大,通过查找系统中所有具有“s”位权限的
程序,可以把某些不必要的“s”位程序去掉,这样可以防止用户滥用权限或提升权限的可
能性。
(3)检查系统中所有suid及sgid文件
find/-userroot-perm-2000-print-execmd5sum{}\;
find/-userroot-perm-4000-print-execmd5sum{}\;
将检查的结果保存到文件中,可在以后的系统检查中作为参考。
(4)检查系统中没有属主的文件
find/-nouser-o–nogroup
没有属主的孤儿文件比较危险,往往成为黑客利用的工具,因此找到这些文件后,要么
删除掉,要么修改文件的属主,使其处于安全状态。
2.5/tmp、/var/tmp、/dev/shm安全设定
在Linux系统中,主要有两个目录或分区用来存放临时文件,分别是/tmp和/var/tmp。
存储临时文件的目录或分区有个共同点就是所有用户可读写、可执行,这就为系统留下了安全隐患。攻击者可以将病毒或者木马脚本放到临时文件的目录下进行信息收集或伪装,严重影响服务器的安全,此时,如果修改临时目录的读写执行权限,还有可能影响系统上应用程序的正常运行,因此,如果要兼顾两者,就需要对这两个目录或分区就行特殊的设置。
|
|