网络知识 娱乐 全网最全安全加固指南

全网最全安全加固指南

干货 | 全网最全安全加固指南

安全加固相关概念阐述

安全加固定义

安全加固和优化是实现信息系统安全的关键环节。通过安全加固,将在信息系统的网络层、主机层、软件层、应用层等层次建立符合安全需求的安全状态,并以此作为保证客户信息系统安全的起点。

安全加固是配置软件系统的过程,针对服务器操作系统、数据库及应用中间件等软件系统,通过打补丁、强化帐号安全、加固服务、修改安全配置、优化访问控制策 略、增加安全机制等方法,堵塞漏洞及“后门”,合理进行安全性加强,提高其健壮性和安全性,增加攻击者入侵的难度,提升系统安全防范水平。

为什么需要安全加固

应用系统运行所需的软硬件,往往存在以下安全问题:

  1. 安装、配置不符合安全需求
  2. 参数配置错误
  3. 使用、维护不符合安全需求
  4. 系统完整性被破坏
  5. 被注入木马程序
  6. 帐户/口令问题
  7. 安全漏洞没有及时修补
  8. 应用服务和应用程序滥用
  9. 应用程序开发存在安全问题等

安全加固内容

  1. 正确的安装
  2. 安装最新和全部OS和应用软件的安全补丁
  3. 操作系统、系统软件、应用软件的安全配置
  4. 系统安全风险防范
  5. 提供系统使用和维护建议
  6. 系统功能测试
  7. 系统安全风险测试
  8. 系统完整性备份
  9. 必要时重建系统等

安全加固目标

加固目标也就确定系统在做过加固和优化后,达到的安全级别

  • 解决目标系统在安全评估中发现的技术性安全问题。
  • 对系统性能进行优化配置,杜绝系统配置不当而出现的弱点。

通常不同环境下的系统对安全级别的要求不同,由此采用的加固方案也不同。

安全加固原则

明确加固目标的结果必须能够明确做加固和优化的系统如何在功能性与安全性之间寻求平衡。

  • 修补加固内容不能影响目标系统所承载的业务运行

  • 修补加固不能严重影响目标系统的自身性能

  • 修补加固操作不能影响与目标系统以及与之相连的其它系统的安全性, 也不能造成性能的明显下降

安全加固基线的内容

系统加固

Windows系统安全加固

Windows常用系统命令

命令说明
ver查看系统版本
hostname查看主机名
ipconfig /all查看网络配置
net user/localgroup/share/config查看用户/用户组/共享/当前运行可配置服务
at建立或查看系统作业
netstat查看开放端口
secpol.msc查看和修改本地安全设置
services.msc查看和修改服务
eventvwr.msc查看日志
regedit打开注册表
whoami查看当前操作用户的用户名

Windows常见端口

端口说明
80/8080/8081HTTP协议代理服务器常用端口号
443HTTPS协议代理服务器常用端口号
21FTP(文件传输协议)协议代理服务器常用端口号
23Telnet(远程登录)协议代理服务器常用端口号
22SSH(安全登录)、SCP(文件传输)
1521Oracle 数据库
1433MS SQL SERVER数据库
1080QQ
3306Mysql数据库
25SMTP(简单邮件传输协议)

Windows账号及安全策略

账号安全是计算机系统安全的第一关,如果计算机系统账号被盗用,那么计算机将非常危险,入侵者可以任意控制计算机系统,如果计算机中存在着重要的机密文件,或者银行卡号和密码,那么损失会非常严重。

账号安全设置
设置方法:“开始”—“运行”输入secpol.msc(控制面板——管理工具)
立即生效:gpupdate /force

账号策略
密码必须符合复杂性要求:启用
密码长度最小值 8个字符
密码最长使用期限: 30天
强制密码历史: 3个记住的密码

账号锁定
帐户锁定阀值: 3次无效登陆
帐户锁定时间: 30分钟
复位帐户锁定计数器:30分钟之后

账户密码策略

账户锁定策略

Administartor账号、组重命名

Administartor账号、组重命名,可增加账号安全性

wmic useraccount where name='Administrator' call Rename admin

禁用Guest账户权限

我的电脑“右击”管理“打开—计算机管理—本地用户和组—用户—Guest—右键—属性—常规—选择“账户已禁用”

net user guest /active:no

日志及审核策略

在一个完整的信息系统里面,日志系统是一个非常重要的功能组成部分。它可以记录下系统所产生的所有行为,并按照某种规范表达出来。我们可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为。在安全领域,日志系统的重要地位尤甚,可以说是安全审计方面最主要的工具之一。

对重要事件进行审核记录,方便日后出现问题时查找问题根源。
审核策略:

审核策略更改 		成功,失败 
审核登陆事件 		成功,失败
审核对象访问 		失败   
审核目录服务访问   失败 
审核特权使用		失败   
审核系统事件 		成功,失败  
审核账户登陆事件   成功,失败  
审核帐户管理		成功,失败 

调整事件日志的大小及覆盖策略

日志安全设置
设置方法:“开始”—“运行”输入eventvwr.msc
增大日志大小,避免由于日志文件容量过小导致重要日志记录遗漏

日志类型		日志大小	覆盖策略
应用程序		80000KB	覆盖早于30天的日志
安全日志		80000KB	覆盖早于30天的日志
系统日志		80000KB	覆盖早于30天的日志

安全选项策略设置

本地安全策略->本地策略->安全选项

  • Microsoft 网络服务器:当登录时间用完时自动注销用户(启用)

目的:可以避免用户在不适合的时间登录到系统,或者用户登录到系统后忘记退出登录

  • Microsoft 网络服务器:在挂起会话之前所需的空闲时间(小于等于30分钟)

目的:设置挂起会话之前所需的空闲时间为30分钟

  • Microsoft 网络客户端:发送未加密的密码到第三方SMB服务器(禁用)

目的:禁止发送未加密的密码到第三方SMB服务器

  • 故障恢复控制台:允许对所有驱动器和文件夹进行软盘复制和访问(禁用)

目的:禁止它访问硬盘驱动器上的所有文件和目录。它仅允许访问每个卷的根目录%systemroot%目
录及子目录,即使是这样它还限制不允许把硬盘驱动器上的文件拷贝到软盘上

  • 故障恢复控 制台:允许自动系统管理级登录(禁用)

目的:恢复控制台是Windows 2003的一个新特性,它在一个不能启动的系统上给出一个受限的命令行访问界面。可能会导致任何可以重起系统的人绕过账号口令限制和其它安全设置而访问系统

  • 关机:清除虚拟内存页面文件(启用)

目的:某些第三方的程序可能把一些没有的加密的密码存在内存中,页面文件中也可能含有另外一些敏感的资料。关机的时候清除页面文件,防止造成意外的信息泄漏

  • 关机:允许系统在未登录前关机(禁用)

目的:在未登录前不能关闭计算机

  • 交互式登录:不显示上次的用户名(启用)

目的:登陆时不显示上次的用户名,防止暴露用户名。

  • 交互式登录:不需要按Ctrl+Alt+Del(禁用)

目的:登录时需要按CTRL+ALT+DEL

  • 交互式登录:可被缓存的前次登录个数(设置缓存数为0,此项对域服务器无效。)

目的:登陆时不显示上次的用户名,防止暴露用户名

  • 网络访问:不允许为网络身份验证储存凭证或 .NET passports(启用)

  • 审核:如果无法记录安全审核则立即关闭系统 (启用)

  • 审核:对全局系统对象的访问进行审核(启用)

  • 网络访问:本地账户的共享和安全模式:仅来宾–本地账户以来宾用户身份验证

  • 网络访问:可匿名访问的共享(全部删除)

  • 网络访问:可匿名访问的命名管道 (全部删除)

  • 网络访问:可远程访问的注册表路径(全部删除)

  • 网络访问:可远程访问的注册表路径和子路径 (全部删除)

用户权限策略设置

  • 通过终端服务拒绝登陆”中加入Guests、User组
  • “通过终端服务允许登陆”中只加入Administrators组
  • “从网络访问此计算机”中删除PowerUsers和BackupOperators
  • “拒绝本地登录”中添加web和guest用户

NTFS安全

文件系统又被称作文件管理系统,它是指操作系统中负责管理和存储文件信息的软件机构。文件系统由与文件管理有关的软件、被管理的文件以及实施文件管理所需的数据结构这三部分构成。
从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件的存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

Windows权限的继承性、累加性、优先性、交叉性四项基本原则

  • Windows NT以后的文件,及文件夹共享设置有以下特性:继承性、累加性、优先性、交叉性。

  • 继承性:下级的目录在没有经过重新设置之前,是拥有上一级目录权限设置的。

  • 累加性:是说如一个组GROUP1中有两个用户USER1、USER2,他们同时对某文件或目录的访问权限分别为“读取”和“写入”,那么组GROUP1对该文件或目录的访问权限就为USER1和USER2的访问权限之和。

  • 优先性:权限的这一特性又包含两种子特性,其一是文件的访问权限优先目录的权限,也就是说文件权限可以越过目录的权限,不顾上一级文件夹的设置。另一特性就是“拒绝”权限优先其它权限,也就是说“拒绝”权限可以越过其它所有其它权限,一旦选择了“拒绝”权限,则其它权限也就不能取任何作用,相当于没有设置。

  • 交叉性:指当同一文件夹在为某一用户设置了共享权限的同时又为用户设置了该文件夹的访问权限,且所设权限不一致时,它的取舍原则是取两个权限的交集,也即最严格、最小的那种权限。如目录A为用户USER1设置的共享权限为“只读”,同时目录A为用户USER1设置的访问权限为“完全控制”,那用户USER1的最终访问权限为“只读”。

权限设置

系统分区C盘				                  administrator、system完全控制
C:Documents and Settings			     administrator、system完全控制
C:windowssystem32		             administrator读写
C:progran files	为Common File目录之外的所有目录赋予Administrators 和SYSTEM 完全控制
C:windows			系统管理员完全控制、system拒绝(继承)
C:windowssystem32	其关键程序只允许administrator完全控制
C:Inetpub			administrator、system完全控制,必要时可以删除该目录
网站目录所在磁盘	   administrator、system完全控制

注册表安全设置

通过注册表,用户可以轻易地添加、删除、修改windows系统内的软件配置信息或硬件驱动程序,这不仅方便了用户对系统软硬件的工作状态进行适时的调整,于此同时注册表也是入侵者攻击的目标,通过注册表也可称为入侵者攻击的目标,通过注册表植入木马、修改软件信息,甚至删除、停用或改变硬件的工作状态。

HKEY_LOCAL_MACHINE   包含关于本地计算机系统的信息,包括硬件和操作系统数据。
HKEY_LOCAL_ROOT          包含各种OLE技术使用的信息技术和文件类别关联数据
HKEY_LOCAL_USER           包含环境变量、桌面设置、网络连接、打印机和程序首选项。
HKEY_LOCAL_USERS         包含关于动态加载的用户配置文件和默认的配置文件的信息,有些信息和HKEY_CURRENT_USER交叉出现
HKEY_CURRENT_CONFIG  包含在启动时由本地计算机系统使用的硬件配置文件的相关信息。

利用文件管理器对regedit.exe文件设置成只允许管理员能使用命令访问修改注册表,其他用户只能读取,但不能修改这样就可以防止非法用户恶意修改注册表。

开始运行输入“regedit"运行注册表管理器

禁止自动登录

编辑注册表 HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersion`
WinlogonAutoAdminLogon(REG_DWORD)值设置为0

reg add "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWinlogon" /v AutoAdminLogon  /d 0 /f

启用源路由欺骗保护
SystemCurrentControlSet ServicesTcpipParameters 新建(REG_DWORD) 值 名称为 DisableIPSourceRouting 参数为 2

reg add " SystemCurrentControlSet ServicesTcpipParameters " /v DisableIPSourceRouting   /t REG_DWORD /d 2 /f

目的:防护在网络上发生的源路由欺骗

禁止空链接

删除IPC共享
禁用IPC连接,编辑注册表HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsarestrictanonymous值为1

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsa" /v restrictanonymous  /d 0 /f

删除系统默认共享

删除服务器上的管理员共享
HKLMSystemCurrentControlSet ServicesLanmanServerParametersAutoShareServer参数为0

#查看默认共享
net share
#删除默认共享
net share <共享名> /del

修改默认3389远程端口

修改注册表
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWdsrdpwdTdstcpPortNumber
它默认值是3389,这样我们可以修改成自己的想要的端口号,修改的时候要点十进制。

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWdsrdpwdTdstcp" /v PortNumber  /d 4445 /f

关闭135.139.445隐患端口

  • 关闭135端口

”开始“—“运行”,输入”dcomcnfg”,单击“确定”,打开组件服务
右键我的电脑,单击”属性”,在默认属性中去掉”在此计算机上启用分布式COM”前的勾
选择”默认协议”选项卡,选中“面向连接的TCP/IP”,单击”确定”按钮,设置完成,重新启动后即可关闭135端口

  • 关闭139端口

右键我的“网上邻居”,单击“属性”,再打开本地连接的“属性”
选中Internet协议(TCP/IP),常规选项卡-高级
设置WINS选项卡”禁用TCP/IP上的“NETBIOS”

  • 关闭445端口

修改注册表,添加一个键值
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesNetBTParameters在右面的窗口新建一个SMBDeviceEnabled 为REG_DWORD类型键值为 0。

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesNetBT" /v SMBDeviceEnabled   /t REG_DWORD /d 0 /f

让配置立即生效

  1. 修改完后立即生效
  2. 重启explorer.exe进程就可以让修改注册表生效
  3. 重启计算机

Linux系统安全加固

系统用户

账号分类:
超级管理员	 uid=0,
系统默认用户	系统程序使用,从不登录
新建普通用户	uid大于500

/etc/password

/etc/shadow

liunx用户管理

#添加用户
useradd <用户名>
#删除用户
userdel [-r][-f] <用户名>

#锁定/解锁用户
passwd -l <用户名>
passwd -u <用户名>

#用户属性
usermod -L  <用户名>锁定用户 
usermod -U <用户名>解锁用户

#查看当前用户
id

解析文件权限

执行ls -l … … 命令查看

输出命令包括7个字段

权限与归属

  • 访问权限

读取:允许查看内容-read

写入:允许修改内容-write

可执行:允许运行和切换-excute

  • 归属关系

所有者:拥有此文件/目录的用户-user

所属者:拥有此文件/目录的组-group

其他用户:除所有者、所属组以外的用户-other

所有用户:以上三类归属称-all

文件系统安全

查看权限:
  	ls -l
修改权限:
	chmod 777 test	
	
	chown 123:123 test

	chgrp root test

设置合理的初始文件权限

UMASK命令:

umask值为0022所对应的默认文件和文件夹创建的缺省权限分别为644和755
文件夹其权限规则为:777-022=755
文件其权限规则为: 777-111-022=644(因为文件默认没有执行权限)
修改UMASK值:
1、直接在命令行下umask xxx (重启后消失)
2、修改/etc/profile中设定的umask值

linux提权漏洞

由于Linux 内核的内存子系统在处理 Copy-on-Write 时出现竞争条件(漏洞),导致私有的只读内存映射被破坏、获取读写权限后低权限用户可以进一步提权。

1.检查是否有内核升级包:yum check-update |grep kernel
2.升级内核:yum update kernel
3.确认下新版本的内核或 initrd/initramfs 是否有xen-vbd和virtio_blk驱动:

#lsinitrd /boot/initramfs-2.6.32-642.6.2.el6.x86_64.img |grep -i -E 'xen-blkfront|virtio_blk' -rwxr--r-- 1 root root 23448 Nov 4 16:21 lib/modules/2.6.32-642.6.2.el6.x86_64/kernel/drivers/block/virtio_blk.ko -rwxr--r-- 1 root root 54888 Nov 4 16:21 lib/modules/2.6.32-642.6.2.el6.x86_64/kernel/drivers/block/xen-blkfront.ko

如果没有,则需要给initrd/initramfs安装驱动,然后执行第三步后重启。

锁定系统中多余的自建帐号

执行命令

cat /etc/passwd
cat /etc/shadow

查看账户、口令文件,与系统管理员确认不必要的账号。对于一些保留的系统伪帐户如:bin, sys,

adm,uucp,lp, nuucp,hpdb, www, daemon等可根据需要锁定登陆。

加固方法:
  使用命令passwd -l 锁定不必要的账号。

使用命令passwd -u 解锁需要恢复的账号。

检查shadow中空口令帐号

检查方法:

awk -F ":" '($2=="!"){print $1}' /etc/shadow

加固方法:

#锁定不必要的账户
passwd -l <用户名>

#解锁需要恢复的账户
passwd -u <用户名>

#为用户设置密码
passwd <用户名>

设置系统密码策略

执行命令
cat /etc/login.defs|grep PASS  #查看密码策略设置
加固方法:
vi /etc/login.defs修改配置文件
	PASS_MAX_DAYS		90	   #用户的密码最长使用天数
	PASS_MIN_DAYS		0	   #两次修改密码的最小时间间隔
	PASS_MIN_LEN		7	   #密码的最小长度
	PASS_WARN_AGE	9       #密码过期前多少天开始提示

禁用root之外的超级用户

检测方法:

#检查用户ID为0的用户
awk -F ":" '($3=="0"){print $1}' /etc/passwd

加固方法:

#锁定用户
passwd -l <用户名>

限制能够su为root的用户

#查看是否有auth required /lib/security/pam_wheel.so这样的配置条目
cat /etc/pam.d/su

加固方法
在头部添加:

auth required /lib/security/pam_wheel.so group=wheel

这样,只有wheel组的用户可以su到root

#将test用户加入到wheel组
usermod -G10 test

重要文件加上不可改变属性

#把重要文件加上不可改变属性
chattr +i /etc/passwd
chattr +i /etc/shadow
chattr +i /etc/gshadow
chattr +i /etc/group
chattr +i /etc/inetd.conf
chattr +i /etc/httpd.conf

ssh安全

禁止root用户进行远程登录
检查方法:

#是否为no
cat /etc/ssh/sshd_config | grep PermitRootLogin 

加固方法

vi /etc/ssh/sshd_config 
PermitRootLogin no

更改服务端口

vi /etc/ssh/ssh_config
Port 2222				更改ssh端口

屏蔽SSH登录banner信息
检查方法:

#查看文件中是否存在banner字段,或banner字段为NONE
cat /etc/ssh/sshd_config
#查看文件内容,该处内容作为banner信息显示给登录用户
cat /etc/motd 

加固方法:

vim /etc/ssh/sshd_config

添加:

banner NONE
#vim /etc/motd

删除全部内容或更新成自己想要添加的内容

仅允许SSH协议版本2

有两个SSH协议版本,仅使用SSH协议版本2会更安全。

SSH协议版本1有安全问题,包括中间人攻击(man-in-the-middle)和注入(insertion)攻击。

编辑/etc/ssh/sshd_config文件并查找下面这样的行:

Protocol 2,1 

修改为

Protocol 2 

防止误使用Ctrl+Alt+Del重启系统

检查方法:

#查看输出行是否被注释

cat /etc/inittab |grep ctrlaltdel
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now

加固方法:

vim /etc/inittab

在行开否添加注释符号“#”
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now

设置账户锁定登录失败锁定次数锁定时间

检查方法:

cat /etc/pam.d/system-auth|grep auth 

查看有无auth required pam_tally.so 条目的设置
加固方法:

#设置为密码连续错误6次,锁定时间300秒
vi /etc/pam.d/system-auth
auth required pam_tally.so oneer=filad deny=6 unlock_time=300 

解锁用户:faillog -u -r

修改账户TMOUT值,设置自动注销时间

检查方法:

#查看有无TMOUT的设置
cat /etc/profile|grep TMOUT 

加固方法:

vim /etc/profile

增加

TMOUT=600 

无操作600秒后自动退出

设置BASH保留历史命令的条目

检查方法:

cat /etc/profile | grep HISTSIZE
HISTSIZE=1000

加固方法:

vim /etc/profile

修改

HISTSIZE=5

即保留最新执行的5条命令

用户注销时删除命令记录

检查方法:
查看/etc/skel/.bash_logout文件,增加如下行

rm -f $HOME/.bash_history

这样,系统中的所有用户注销时都会删除其命令记录,如果只需要针对某个特定用户,如root用户进行设置,则可只在该用户的主目录下修改/$HOME/.bash_history文件增加相同的一行即可。

设置系统日志策略配置文件

日志的主要用途是系统审计、监测追踪和分析统计。
为了保证 Linux 系统正常运行、准确解决遇到的各种各样的系统问题,认真地读取日志文件是管理员的一项非常重要的任务。
UNIX/ Linux采用了syslog工具来实现此功能,如果配置正确的话,所有在主机上发生的事情都会被记录下来,不管是好的还是坏的。

CentOS6起/etc/syslog.conf不再有!而是/etc/rsyslog.conf代替!

检查方法:

ps -aef | grep syslog #确定syslog服务是否启用
cat /etc/rsyslog.conf #查看syslogd的配置,并确认日志文件日否存在
#系统日志 (默认)   
/var/log/messages
#cron日志 (默认)   
/var/log/cron
#安全日志 (默认)   
/var/log/secure

阻止系统响应任何从外部/内部来的ping请求

加固方法:

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

其他客户端就不能ping通你的服务器了。

中间件加固

IIS加固

IIS安装及版本的选择

在IIS安装过程中,根据具体的业务需求,只安装必要的组件,以避免安装其他一切不必要的组件带来的安全风险。如网站正常运行只需要ASP环境,那我们就没必要安装.net组件。
对于IIS版本,至少要在6.0以上,IIS5.0存在严重的安全漏洞,不过现在运行IIS5.0的服务器已经非常少了,对于这一点不用太过担心。

删除默认网站

把IIS默认安装的站点删除或禁用掉

禁用不必要的Web服务扩展

打开IIS 管理器看是否有不必要的“Web服务扩展”,如果有则禁用掉。,检查是

删除不使用的应用程序扩展

在IIS管理器中,右击网站“属性”,点击主目录选项卡,点击“应用程序设置”的配置按钮。
根据网站的实际情况,只保留必要的应用程序扩展,其他的一律删除,尤其是像cer、asa这样极其危险的扩展,而且一般网站也不需要它。

IIS访问权限配置

如果IIS中有多个网站,建议为每个网站配置不同的匿名访问账户。
方法:
a. 新建一个账号,加入Guests组
b. “网站属性”—>“目录安全性”—>“身份验证和访问控制”,把“启用匿名访问”处,用刚新建的账户代替默认账户。

正确设置网站目录的权限和IIS权限

网站分区为NTFS分区。网站目录出system和administrator组有完全控制权限外,其他用户只需要有读取权限。

IIS6管理器中设置:

  • 只选择“读取、记录访问、索引资源”
  • 禁止“写入”和“脚本资源访问”,避免IIS Put上传攻击。
  • 禁止“目录浏览”,避免目录遍历攻击。

正确设置网站目录的权限和IIS权限

应用程序设置中的执行权限设置为“纯脚本”

原则

  • 目录有写入权限,一定不要分配执行权限
  • 目录有执行权限,一定不要分配写入权限
  • 网站上传目录和数据库目录一般需要分配“写入”权限,但一定不要分配执行权限
  • 其他目录一般只分配“读取”和“记录访问”权限即可。

设置IP访问限制

正确设置IIS日志

在IIS管理器中,右击网站“属性”,点击网站选项卡,确定已经选择“启用日志记录”,活动日志格式为“W3C扩充日志文件格式”

接着修改IIS日志文件保存路径,默认保存在“C:WINDOWSsystem32LogFiles”目录下,这里修改为自定义路径。

建议保存在非系统盘路径,并且IIS日志文件所在目录只允许Administrators组用户和SYSTEM用户访问。

自定义IIS返回的错误信息

禁止向客户端发送详细的ASP错误信息

在IIS管理器中—>“属性”—>“主目录”—>“配置”—>“调试”,选择“向客户端发送下列文本错误消息”项,自定义出错时返回的错误信息

Apache安全加固

隐藏Apache banner信息

vim /etc/httpd/conf/httpd.conf
#在出现错误页的时候不显示服务器操作系统的名称
ServerTokens OS  修改为:ServerTokens Prod 
#不回显apache版本信息
ServerSignature On 	修改为:ServerSignature Off 

禁止目录浏览

Options Indexes FollowSymLinks
修改为:

vim /etc/httpd/conf/httpd.conf
Options  FollowSymLinks

限制IP访问


    Options Indexes MultiViews FollowSymLinks
    AllowOverride AuthConfig
    AuthType Basic
    AuthName "testuser's paasword"
    AuthUserFile /usr/local/etc/passwd.httpd
    Require user testuser
    Order allow,deny
    Allow from 172.16.1.0

service httpd restart
停止 httpd:[确定]
启动 httpd:[确定]

限制禁止访问的文件夹,例如后台目录

     
        Deny from all     
 

防止Apache的解析漏洞

Apache对于文件名的解析是从后往前解析的,直到遇见一个它认识的文件类型为止,因此;如果web目录下存在以类似webshell.php.test这样格式命名的文件,Apache在解析时因为不认识.test这个文件类型,所以会一直往前解析,当解析到.php时,它认识了,因此会将它解析为PHP文件。

Apache的这种解析特性经常被用来绕过Web应用的文件上传检测。当Web应用的文件上传功能在检测上传文件的合法性时,如果仅通过检测上传文件的扩展名来判断文件是否合法,就可以利用Apache的这种文件名解析特征绕过Web应用的检测。

禁止httpd解析文件

禁止httpd解析index.php.jpg文件

可以在httpd.conf配置文件中添加以下内容来阻止Apache解析这种文件。
修改后配置:


    SetHandler application/x-httpd-php


    SetHandler application/x-httpd-php-source

错误页面重定向

在.htaccess 文件中加入如下内容即可:

ErrorDocument 400 /custom400.html
ErrorDocument 401 /custom401.html
ErrorDocument 403 /custom403.html
ErrorDocument 404 /custom404.html
ErrorDocument 405 /custom405.html
ErrorDocument 500 /custom500.html Customxxx.html 为要设置的错误页面。

重新启动 Apache 服务生效

日志设置

编辑 httpd.conf 配置文件,设置日志记录文件、记录内容、记录 格式。其中,错误日志:

LogLevel notice				#日志的级别
ErrorLog  logs/error_log 	#日志的保存位置(错误日志)

访问日志:

LogFormat %h %l %u %t ”%r” %>s %b “%{Accept}i”%{Referer}i” ”%{User-Agent}i””
combined
CustomLog  logs/access_log combined (访问日志)

在Apache httpd 中将在这个文件中存放诊断信息和处理请求中出现的错误。 若要将错误日志送到 Syslog,则设置: ErrorLog syslog。
CustomLog 指令设置访问日志的文件名和位置。 访问日志中会记录服务器所处理的所有请求。

LogFormat 设置日志格式。 LogLevel 用于调整记录在错误日志中的信息的详细程度,建议设置为 noti判定条件
查看 logs 目录中相关日志文件内容,记录完整。

拒绝服务防范

根据业务需要,合理设置 session 时间,防止拒绝服务攻击

vim httpd.conf 配置文件

Timeout 10 		#客户端与服务器端建立连接前的时间间隔
KeepAlive On
KeepAliveTimeout 15 #限制每个 session 的保持时间是 15 秒 

注:此处为一建议值,具体的设定需要根据现实情况。

禁用CGI

如果服务器上不需要运行 CGI 程序,建议禁用 CGI
修改配置vim /etc/httpd/conf/httpd.conf,把 cgi-bin 目录的配置和模块都注释掉

#LoadModule cgi_module modules/mod_cgi.so
#ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#
AllowOverride None
#    Options None 
#    Order allow,deny
#    Allow from all
#

防止SQL注入及远程包含

SQL注入是非常危险的问题,小则网站后台被入侵,重则整个服务器沦陷,所以一定要小心。

php.ini中有一个设置:

magic_quotes_gpc = Off	改为     magic_quotes_gpc = On

在远程文件包含漏洞中,攻击者可以通过访问外部地址来加载远程代码,所以一定要设置:

allow_url_fopen = off

nginx服务器安全加固

禁用autoindex

确保nginx.conf配置文件上禁用autoindex,即autoindex off或者没有配置autoindex

关闭服务器标记

如果开启的话(默认情况下)所有的错误页面都会显示服务器的版本和信息。nginx.conf配置如下:

http{
    include       naxsi_core.rules;
    include      mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server_tokens off;
... ...

同时修改/usr/local/nginx/conf/fastcgi_params
将里面的
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
修改为:
fastcgi_param SERVER_SOFTWARE nginx;

自定义缓存

设置自定义缓存以限制缓冲区溢出攻击。nginx.conf配置如下:

http{
    ... ...
    server{
        ... ...
        client_body_buffer_size  16K;
       client_header_buffer_size  1k;
        client_max_body_size  1m;
       large_client_header_buffers  4  8k;

注:上述的参数不是最优参数,仅供参考。

timeout设置

设置timeout设低来防御DOS攻击,nginx.conf配置如下:

http {
    ... ...
       client_body_timeout   10;
       client_header_timeout  30;
       keepalive_timeout     30  30;
       send_timeout          10;

配置日志

鉴于日志的输出格式还未确定,目前暂时先使用Nginx默认的日志格式nginx.conf配置如下:

http {
    ......
    log_format  main  '$remote_addr - $remote_user [$time_local]"$request" ''$status $body_bytes_sent "$http_referer"''"$http_user_agent" "$http_x_forwarded_for"';
    access_log logs/ access.log  main;

限制访问

在目前的应用系统中值使用到POST和GET方法,所以除了它们之外,其他方式的请求均可拒绝。

Nginx.conf配置如下:

server{
       ... ...
       if($request_method !~ ^(GET|HEAD|POST)$) {        
                     return404;
              }
       ... ...

限制访问IP

模块 ngx_http_access_module 允许限制某些IP地址的客户端访问。
如下范例:

location/ {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
}

注:规则按照顺序依次检测,直到匹配到第一条规则。

在这个例子里,IPv4的网络中只有 10.1.1.0/16 和 192.168.1.0/24允许访问,但 192.168.1.1除外

对于IPv6的网络,只有2001:0db8::/32允许访问。

集成Naxsi模块

Naxsi模块是一个开放源代码、高效、低维护规则的Nginx web应用防火墙模块。Naxsi的主要目标是加固web应用程序,以抵御SQL注入、跨站脚本、跨域伪造请求、本地和远程文件包含漏洞。
第一步:下载naxsi
https://github.com/nbs-system/naxsi
注:如果不能上网可以事先下载,再上传到服务器中。

开源waf首选,怎么配置和使用,网络教程铺天盖地,这里就不造轮子啦

数据库加固

Mysql数据库安全加固

删除默认数据库和数据库用户

MySQL初始化后会自动生成空用户和test库,进行安装的测试,这会对数据库的安全构成威胁,有必要全部删除,最后的状态只保留单个root即可,当然以后根据需要增加用户和数据库。

mysql> show databases;
mysql> drop database test; 		#删除数据库test
mysql> use mysql;
mysql> delete from db;          #删除存放数据库的表信息,因为还没有数据库信息。
mysql> delete from user where not (user='root');       #删除初始非root的用户
mysql> delete from user where user='root' and password=''; #删除空密码的root尽量重复操作
mysql> flush privileges; 		#强制刷新内存授权表。

不使用默认密码和弱口令

检查账户默认密码和弱口令,口令长度至少8位,并包括数字、小写字母、大写字母和特殊符号四类中至少两种。且5次以内不得设置相同的口令,密码应至少90天更换一次。

Mysql> Update user set password=password(‘test!p3’) where user=‘root’;
Mysql> Flush privileges;

检测操作
检查本地密码: (注意,管理帐号 root 默认是空密码)

mysql> use mysql;
mysql> select Host,User,Password,Select_priv,Grant_priv from user; 

改变默认mysql管理员帐号

改变默认的mysql管理员账号也可以使mysql数据库的安全性有较好的提高,因为默认的mysql管理员的用户名都是root

mysql> update mysql.user set user='admin' where user='root';

使用独立用户运行MySQL

绝对不要作为使用root用户运行MySQL服务器。这样做非常危险,因为任何具有FILE权限的用户能够用root创建文件(例如,~root/.bashrc)。mysqld拒绝使用root运行,除非使用–user=root选项明显指定。应该用普通非特权用户运行 mysql。为数据库建立独立的linux中的mysql账户,该账户用来只用于管理和运行MySQL。

要想用其它linux用户启动mysql,增加user选项指定/etc/my.cnf选项文件或服务器数据目录的my.cnf选项文件中的[mysqld]组的用户名。

vi /etc/my.cnf
[mysqld]
user=mysql

该命令使服务器用指定的用户来启动,无论你手动启动或通过mysqld_safemysql.server启动,都能确保使用mysql的身份。

禁止远程连接数据库

使用命令netstat 查看默认的3306端口是打开的,此时打开了mysql的网络监听,允许用户远程通过帐号密码连接数本地据库,默认情况是允许远程连接数据的。为了禁止该功能,启动skip-networking,不监听sql的任何TCP/IP的连接,切断远程访问的权利,保证安全性。

vi /etc/my.cf       #将#skip-networking注释去掉

限制用户连接的数量

数据库的某用户多次远程连接,会导致性能的下降和影响其他用户的操作,有必要对其进行限制。可以通过限制单个账户允许的连接数量来实现,设置my.cnf 文件的mysql中的max_user_connections变量来完成。GRANT语句也可以支持资源控制选项来限制服务器对一个账户允许的使用范围。

vi /etc/my.cnf
[mysqld]
max_user_connections=2

命令历史记录保护

数据库相关的shell操作命令都会分别记录在.bash_history,如果这些文件不慎被读取,会导致数据库密码和数据库结构等信息泄露,而登陆数据库后的操作将记录在.mysql_history文件中,如果使用update表信息来修改数据库用户密码的话,也会被读取密码,因此需要删除这两个文件,同时在进行登陆或备份数据库等与密码相关操作时,应该使用-p参数加入提示输入密码后,隐式输入密码,建议将以上文件置空。

rm .bash_history .mysql_history	#删除历史记录
ln -s /dev/null .bash_history   #将shell记录文件置空
ln -s /dev/null .mysql_history	#将mysql记录文件置空

对重要数据加密存储

MySQL提供了4个函数用于哈希加密:PASSWORD, ENCRYPT, SHA1和MD5。
INSERT INTO table1 (user, password) VALUE (‘user1’, MD5(‘password1’) )

本地文件读取保护

常见攻击:拥有FILE权限

create dababase use;
CREATE TABLE etc_passwd (pwd_entry TEXT);
LOAD DATA INFILE "/etc/passwd" into TABLE etc_passwd;
SELECT * FROM etc_passwd;

防止用户使用LOAD DATA LOCAL INFILE读取服务器上的本地文件设置

vim /etc/my.cnf
set-variable=local-infile=0

日志功能

mysql 有以下几种日志:

错误日志: -log-err
查询日志: -log (可选)
慢查询日志: -log-slow-queries (可选)
更新日志: -log-update
二进制日志: -log-bin

在 mysql 的安装目录下,打开 my.ini 在后面加上上面的参数,保存后重启mysql 服务就行了

检查操作
查看etc/my.cnf文件,查看是否包含如下配置:

[mysqld]
Log=filename

数据库的恢复

mysql -u root -p [数据库名] < /备份路径/备份文件名

Sqlserver数据库安全加固

密码策略和弱口令

对用户的属性进行安全检查,包括空密码、密码更新时间等。修改目前所有账号的口令,确保口令达到至少12位长度,包括数字、字母、符号混排,无规律的方式,并且不使用默认的win密码。

具体操作

打开SQL Server Management Studio管理界面,在左侧展开“登录名”,对 sa和其它登录名逐一右键点击查看属性,勾选“强制实施密码策略”。

通讯协议加密

当对服务器进行远程管理时,防止鉴别信息在网络传输过程中被窃听,应使用加密通讯协议,提高安全性。

具体操作

SQL Server配置管理器>>SQL Server网络配置>>MSSQLSERVER的协议,右键点击>>属性>>标志
把“强行加密”(ForceEncryption)设为“是”。

限制guest账户对数据库的访问

取消guest账户对master和tempdb之外的数据库的访问权限。

  • 方法一:打SQL Server管理界面,在左侧展开除了master和tempdb之外的所有数据库>>安全性>>用户,删除guest账户。
  • 方法二:用命令去除guest账户对指定数据库的访问权限:
    use 数据库名
    exec sp_revokedbaccess guest

设置身份认证

应实现操作系统和数据库系统特权用户的权限分离,防止操作系统用户对SQL Server数据库进行非授权管理。

具体操作

  • 展开服务器组,右键单击服务器->在弹出的右键菜单中单击“属性”,在“安全性”选项卡中选择“服务器身份验证”认证方式为“SQL Server和Windows身份验证模式”。
  • 在“SQL Server管理器”-〉“安全性”中,选择账号“BUILTINAdministrators”,右击选择“属性”,更改“状态”设置“拒绝允许连接到数据库引擎”和“禁用登录”。

开启日志审计

数据库应配置日志功能,对用户登录进行记录,记录内容包括用户登录使用的账号、登录是否成功、登录时间以及远程登录时用户使用的IP 地址。

具体操作

  • 在“SQL Server管理器”->右键单击服务器->单击“属性”->“安全性”,选择每个登录的“审核级别”为“失败和成功的登录”。
  • 询问数据库管理员,是否采取第三方工具或其他措施增强SQL Server的日志功能,如果有则查看这些工具记录的审计记录是否符合等级保护的安全审计要求。

设置连接协议和监听的IP范围

设定SQL Server允许的连接协议,以及TCP/IP协议中监听端口时绑定的IP地址,限制不必要的远程客户端访问到数据库资源。

具体操作

  • 从开始菜单打开SQL Server配置管理器,展开“SQL SERVER 2008网络配置>>SQL SERVER的协议,在右侧将不需要的协议禁用,如:VIA和Share Memory方式可能一般不需要使用。
  • 在以上界面双击“TCP/IP”协议>>IP地址,如有不必要监听的IP项,则把“活动”属性设置为“否”。如:访问数据库的应用程序也装在该服务器上,则只需要监听127.0.0.1即可,其它IP不需要监听。在应用程序中配置为使用127.0.0.1访问数据库。

根据安全策略设置登录终端的操作超时锁定。

  • 从开始菜单打开SQL Server管理界面,再展开菜单栏的“工具”>>“选项”>>“设计器”>>“Analysis Services设计器”,在“连接”下的“连接超时值”输入合适的数字(默认值15)。
  • 在SQL Server管理界面左侧,右键点击服务器名称>>属性>>高级,在右侧找到“远程登录超时值”,设置为合适的数字,
    选项—连接属性—将连接超时值设置为一个较大的数字(默认值20)。

隐藏实例

防止数据库系统的相关信息泄露

具体操作

  • 在SQL Server配置管理器中选择“SQL Server 网络配置”中的“MSSQLSERVER的协议”,右键选择“属性”,选中其中的“隐藏实例”选项。

修改默认端口

修改默认通信端口,防止攻击者通过1433登录数据库服务器。

具体操作:

  • 在SQL Server配置管理器中选择“SQL Server 2005网络配置”中的“MSSQLSERVER的协议”,选中“TCP/IP”,右键选择“属性”,在TCP/IP属性对话框,选择“IP地址”选项卡。
  • 修改所有“TCP端口”右边的文本栏为新的要修改的端口号(默认端口号为1433),然后重启SQL Server生效。

关于安全加固的知识点就总结到这里,本文可能实际上没有啥技术含量,但是写起来还是比较耗费时间的,在这个喧嚣浮躁的时代,个人博客越来越没有人看了,写博客感觉一直是用爱发电的状态。如果你恰巧财力雄厚,感觉本文对你有所帮助的话,可以考虑打赏一下本文!
“拒绝允许连接到数据库引擎”和“禁用登录”。

开启日志审计

数据库应配置日志功能,对用户登录进行记录,记录内容包括用户登录使用的账号、登录是否成功、登录时间以及远程登录时用户使用的IP 地址。

具体操作

  • 在“SQL Server管理器”->右键单击服务器->单击“属性”->“安全性”,选择每个登录的“审核级别”为“失败和成功的登录”。
  • 询问数据库管理员,是否采取第三方工具或其他措施增强SQL Server的日志功能,如果有则查看这些工具记录的审计记录是否符合等级保护的安全审计要求。

设置连接协议和监听的IP范围

设定SQL Server允许的连接协议,以及TCP/IP协议中监听端口时绑定的IP地址,限制不必要的远程客户端访问到数据库资源。

具体操作

  • 从开始菜单打开SQL Server配置管理器,展开“SQL SERVER 2008网络配置>>SQL SERVER的协议,在右侧将不需要的协议禁用,如:VIA和Share Memory方式可能一般不需要使用。
  • 在以上界面双击“TCP/IP”协议>>IP地址,如有不必要监听的IP项,则把“活动”属性设置为“否”。如:访问数据库的应用程序也装在该服务器上,则只需要监听127.0.0.1即可,其它IP不需要监听。在应用程序中配置为使用127.0.0.1访问数据库。

根据安全策略设置登录终端的操作超时锁定。

  • 从开始菜单打开SQL Server管理界面,再展开菜单栏的“工具”>>“选项”>>“设计器”>>“Analysis Services设计器”,在“连接”下的“连接超时值”输入合适的数字(默认值15)。
  • 在SQL Server管理界面左侧,右键点击服务器名称>>属性>>高级,在右侧找到“远程登录超时值”,设置为合适的数字,
    选项—连接属性—将连接超时值设置为一个较大的数字(默认值20)。

隐藏实例

防止数据库系统的相关信息泄露

具体操作

  • 在SQL Server配置管理器中选择“SQL Server 网络配置”中的“MSSQLSERVER的协议”,右键选择“属性”,选中其中的“隐藏实例”选项。

修改默认端口

修改默认通信端口,防止攻击者通过1433登录数据库服务器。

具体操作:

  • 在SQL Server配置管理器中选择“SQL Server 2005网络配置”中的“MSSQLSERVER的协议”,选中“TCP/IP”,右键选择“属性”,在TCP/IP属性对话框,选择“IP地址”选项卡。
  • 修改所有“TCP端口”右边的文本栏为新的要修改的端口号(默认端口号为1433),然后重启SQL Server生效。

关于安全加固的知识点就总结到这里,本文可能实际上没有啥技术含量,但是写起来还是比较耗费时间的,在这个喧嚣浮躁的时代,个人博客越来越没有人看了,写博客感觉一直是用爱发电的状态。如果感觉本文对你有所帮助的话,就给笔者点个关注吧!

原创不易,转载请注明来源CKCsec!

关于我

欢迎关注公众号