Web服务器攻击常利用Web服务器软件和配置中的漏洞,web服务器安全也是我们现在很多人关注的一点,那么你知道web服务器安全设置吗?下面是我整理的一些关于web服务器安全设置的相关资料,供你参考。
创新互联是一家集网站建设,黄山区企业网站建设,黄山区品牌网站建设,网站定制,黄山区网站建设报价,网络营销,网络优化,黄山区网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
web服务器安全设置一、IIS的相关设置
删除默认建立的站点的虚拟目录,停止默认web站点,删除对应的文件目录c:inetpub,配置所有站点的公共设置,设置好相关的连接数限制, 带宽设置以及性能设置等其他设置。配置应用程序映射,删除所有不必要的应用程序扩展,只保留asp,php,cgi,pl,aspx应用程序扩展。对于php和cgi,推荐使用isapi方式解析,用exe解析对安全和性能有所影响。用户程序调试设置发送文本错误信息给客户。
对于数据库,尽量采用mdb后缀,不需要更改为asp,可在IIS中设置一个mdb的扩展映射,将这个映射使用一个无关的dll文件如C:WINNTsystem32inetsrvssinc.dll来防止数据库被下载。设置IIS的日志保存目录,调整日志记录信息。设置为发送文本错误信息。修改403错误页面,将其转向到其他页,可防止一些扫描器的探测。另外为隐藏系统信息,防止telnet到80端口所泄露的系统版本信息可修改IIS的banner信息,可以使用winhex手工修改或者使用相关软件如banneredit修改。
对于用户站点所在的目录,在此说明一下,用户的FTP根目录下对应三个文件佳,wwwroot,database,logfiles,分别存放站点文件,数据库备份和该站点的日志。如果一旦发生入侵事件可对该用户站点所在目录设置具体的权限,图片所在的目录只给予列目录的权限,程序所在目录如果不需要生成文件(如生成html的程序)不给予写入权限。因为是虚拟主机平常对脚本安全没办法做到细致入微的地步。
方法
用户从脚本提升权限:
web服务器安全设置二、ASP的安全设置
设置过权限和服务之后,防范asp木马还需要做以下工作,在cmd窗口运行以下命令:
regsvr32/u C:\WINNT\System32\wshom.ocx
del C:\WINNT\System32\wshom.ocx
regsvr32/u C:\WINNT\system32\shell32.dll
del C:\WINNT\system32\shell32.dll
即可将WScript.Shell, Shell.application, WScript.Network组件卸载,可有效防止asp木马通过wscript或shell.application执行命令以及使用木马查看一些系统敏感信息。另法:可取消以上文件的users用户的权限,重新启动IIS即可生效。但不推荐该方法。
另外,对于FSO由于用户程序需要使用,服务器上可以不注销掉该组件,这里只提一下FSO的防范,但并不需要在自动开通空间的虚拟商服务器上使用,只适合于手工开通的站点。可以针对需要FSO和不需要FSO的站点设置两个组,对于需要FSO的用户组给予c:winntsystem32scrrun.dll文件的执行权限,不需要的不给权限。重新启动服务器即可生效。
对于这样的设置结合上面的权限设置,你会发现海阳木马已经在这里失去了作用!
web服务器安全设置三、PHP的安全设置
默认安装的php需要有以下几个注意的问题:
C:\winnt\php.ini只给予users读权限即可。在php.ini里需要做如下设置:
Safe_mode=on
register_globals = Off
allow_url_fopen = Off
display_errors = Off
magic_quotes_gpc = On [默认是on,但需检查一遍]
open_basedir =web目录
disable_functions =passthru,exec,shell_exec,system,phpinfo,get_cfg_var,popen,chmod
默认设置com.allow_dcom = true修改为false[修改前要取消掉前面的;]
web服务器安全设置四、MySQL安全设置
如果服务器上启用MySQL数据库,MySQL数据库需要注意的安全设置为:
删除mysql中的所有默认用户,只保留本地root帐户,为root用户加上一个复杂的密码。赋予普通用户updatedeletealertcreatedrop权限的时候,并限定到特定的数据库,尤其要避免普通客户拥有对mysql数据库操作的权限。检查mysql.user表,取消不必要用户的shutdown_priv,reload_priv,process_priv和File_priv权限,这些权限可能泄漏更多的服务器信息包括非mysql的 其它 信息出去。可以为mysql设置一个启动用户,该用户只对mysql目录有权限。设置安装目录的data数据库的权限(此目录存放了mysql数据库的数据信息)。对于mysql安装目录给users加上读取、列目录和执行权限。
Serv-u安全问题:
安装程序尽量采用最新版本,避免采用默认安装目录,设置好serv-u目录所在的权限,设置一个复杂的管理员密码。修改serv-u的banner信息,设置被动模式端口范围(4001—4003)在本地服务器中设置中做好相关安全设置:包括检查匿名密码,禁用反超时调度,拦截“FTP bounce”攻击和FXP,对于在30秒内连接超过3次的用户拦截10分钟。域中的设置为:要求复杂密码,目录只使用小写字母,高级中设置取消允许使用MDTM命令更改文件的日期。
更改serv-u的启动用户:在系统中新建一个用户,设置一个复杂点的密码,不属于任何组。将servu的安装目录给予该用户完全控制权限。建立一个FTP根目录,需要给予这个用户该目录完全控制权限,因为所有的ftp用户上传,删除,更改文件都是继承了该用户的权限,否则无法操 作文 件。另外需要给该目录以上的上级目录给该用户的读取权限,否则会在连接的时候出现530 Not logged in, home directory does not exist。比如在测试的时候ftp根目录为d:soft,必须给d盘该用户的读取权限,为了安全取消d盘其他文件夹的继承权限。而一般的使用默认的system启动就没有这些问题,因为system一般都拥有这些权限的。
web服务器安全设置五、数据库服务器的安全设置
对于专用的MSSQL数据库服务器,按照上文所讲的设置TCP/IP筛选和IP策略,对外只开放1433和5631端口。对于MSSQL首先需要为sa设置一个强壮的密码,使用混合身份验证,加强数据库日志的记录,审核数据库登陆事件的”成功和失败”.删除一些不需要的和危险的OLE自动存储过程(会造成 企业管理 器中部分功能不能使用),这些过程包括如下:
Sp_OAcreate Sp_OADestroy Sp_OAGetErrorInfo Sp_OAGetProperty
Sp_OAMethod Sp_OASetProperty Sp_OAStop
去掉不需要的注册表访问过程,包括有:
Xp_regaddmultistring Xp_regdeletekey Xp_regdeletevalue
Xp_regenumvalues Xp_regread Xp_regremovemultistring
Xp_regwrite
去掉其他系统存储过程,如果认为还有威胁,当然要小心drop这些过程,可以在测试机器上测试,保证正常的系统能完成工作,这些过程包括:
xp_cmdshell xp_dirtree xp_dropwebtask sp_addsrvrolemember
xp_makewebtask xp_runwebtask xp_subdirs sp_addlogin
sp_addextendedproc
在实例属性中选择TCP/IP协议的属性。选择隐藏 SQL Server 实例可防止对1434端口的探测,可修改默认使用的1433端口。除去数据库的guest账户把未经认可的使用者据之在外。 例外情况是master和 tempdb 数据库,因为对他们guest帐户是必需的。另外注意设置好各个数据库用户的权限,对于这些用户只给予所在数据库的一些权限。在程序中不要用sa用户去连接任何数据库。网络上有建议大家使用协议加密的,千万不要这么做,否则你只能重装MSSQL了。
摘至网页链接
常见Mysql配置文件:linux系统下是my.conf,windows环境下是my.ini;
数据库整体安全需求:机密性、完整性、可用性;
下面以mysql 5.7版本为例,介绍mysql常见的安全策略、配置、加固方式等等,有些策略可能只针对Linux操作系统,更多策略可以参考CIS Mysql Benchmark相关文档:
1、操作系统级别安全配置
1.1不要将数据库放在系统分区
Windows系统:直接检查是否将数据库放置在C盘。
Linux系统:
在终端连接上mysql数据库,执行如下命令:
show variables where variable_name = 'datadir';
然后返回shell命令行:
df -h datadir
其中datadir是上一条命令的返回值。
上述命令的返回值不应是/、/var、/usr
1.2使用专用的最小权限账号运行mysql数据库进程
Windows系统:直接打开任务管理器,查看运行mysql进程的操作系统账号,不能为administrator账号。
Linux系统:
Shell命令行运行如下命令:
ps -ef | grep mysql
查看mysql服务的运行账号是否为root或其他高权限账号,如果是的,则需要创建一个非管理员专用账号来运行mysql服务。
1.3禁止使用mysql命令行历史记录
Linux系统:
执行如下命令:
find / -name ".mysql_history"
查看是否存在mysql的历史命令记录文件,如果存在,则需要进行如下加固:
(1)删除.mysql_history文件;
(2)设置环境变量MYSQL_HISTFILE为/dev/null,并添加到shell的初始化脚本中,创建mysql_history到/dev/null的链接:
ln -s /dev/null $HOME/.mysql_history
1.4 确保MYSQL_PWD环境变量未设置敏感信息
Windows系统下进入cmd命令行,使用如下命令:
Set
查看是否设置了环境变量MYSQL_PWD。
Linux系统下使用如下命令:
grep MYSQL_PWD /proc/*/environ
查看MYSQL_PWD环境变量是否设置了敏感信息。
确认那个配置文件或脚本设置了MYSQL_PWD环境变量。
2、安装
2.1使用数据库专用服务器
使用专用的服务器安装mysql服务可以减少mysql服务的攻击面,尽量卸载或删除操作系统上的不必要的应用或服务,减少其他应用的安装可能给mysql的运行带来的安全风险。
2.2 不要复用数据库账号
运行mysql服务的操作系统账号不要用来运行其他应用或服务,这样可以避免其他应用或服务器被攻击给mysql服务带来影响。
2.3 历史命令行密码设置为不可见
使用如下命令:
mysql -u admin -p password
连接mysql数据库服务,退出后查看历史命令,确认password是否为明文。
建议使用如下命令方式登录:
(1)先输入mysql -u admin -p
(2)根据命令行提示输入密码;
而不要在一整条命令中输入密码。
另外要控制mysql配置文件访问权限。
3、文件权限控制
3.1 控制数据目录的访问权限
数据目录是mysql数据库存放的位置,在mysql命令行界面下执行如下命令:
show variables where variable_name = 'datadir';
在终端命令行下执行如下命令:
ls -l datadir/.. | egrep "^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql"
其中datadir是第一条命令的执行结果
如果存在问题,linux环境下在终端执行如下命令进行加固:
chmod 700 datadir
chown mysql:mysql datadir
3.2 控制二进制日志文件的权限
mysql的运行会产生很多日志,例如二进制日志、错误日志、慢查询日志等等,Mysql命令行下执行如下命令:
show variables like 'log_bin_basename';
在终端命令行执行如下命令:
ls log_bin_basename.*
对于发现的每一个文件,执行如下命令:
ls -l log_bin_basename.nnnnn | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
chmod 660 log file
chown mysql:mysql log file
3.3 控制错误日志文件的权限
Mysql命令行下执行如下命令:
show variables like 'log_error';
在终端命令行执行如下命令:
ls log_error.*
对于发现的每一个文件,执行如下命令:
ls -l log_error | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
chmod 660 log file
chown mysql:mysql log file
3.4控制慢查询日志文件的权限
Mysql命令行下执行如下命令:
show variables like 'slow_query_log_file';
在终端命令行执行如下命令:
ls slow_query_log_file.*
对于发现的每一个文件,执行如下命令:
ls -l slow_query_log_file | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
chmod 660 log file
chown mysql:mysql log file
3.5控制通用日志文件的权限
Mysql命令行下执行如下命令:
show variables like 'general_log_file';
在终端命令行执行如下命令:
ls general_log_file.*
对于发现的每一个文件,执行如下命令:
ls -l general_log_file | egrep "^-[r|w]{2}-[r|w]{2}----\s*.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
chmod 660 log file
chown mysql:mysql log file
3.6控制审计日志文件的权限
Mysql命令行下执行如下命令:
show global variables where variable_name = 'audit_log_file';
在终端执行如下命令:
ls -l audit_log_file | egrep "^-rw[-x]rw[-x][-r][-w][-x][ \t]*[0-9][ \t]*mysql[
\t]*mysql.*$"
根据输出确认日志文件的权限设置是否存在问题。
对于每个日志文件,修改其权限和属组如下:
chmod 660 audit_log_file
chown mysql:mysql audit_log_file
4、通用安全
4.1安装最新的补丁
在mysql命令行下查询MySQL的版本:
SHOW VARIABLES WHERE Variable_name LIKE "version";
确认是否由需要安装的补丁包,如果有请安装。
4.2 删除test数据库
Mysql数据库默认安装好后,存在一个名为test的数据库,如果存在,请执行如下命令删除:
Drop database “test”
4.3 确保读取本地文件的参数设置为失效
Mysql命令行下,使用如下命令:
SHOW VARIABLES WHERE Variable_name = 'local_infile';
查看结果是否为OFF。
如果该命令为ON,则数据库用户可以通过LOAD DATA INFILE 或者 SELECT local_file 读取到数据库所在操作系统本地的文件,在这种情况下,需要在mysql配置文件中新增一行:
Local-infile=0;
然后重启数据库服务。
5、权限配置
5.1控制可以访问所有数据库的账号
Mysql数据库下的user表和db表中存放着可以授予数据库用户的权限,确保只有管理员账号才能访问所有数据库。可以访问mysql数据库的用户或许可以查看密码哈希值、修改用户权限等等。
使用如下sql语句:
SELECT user, host FROM mysql.user
WHERE (Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y')
OR (Delete_priv = 'Y') OR (Create_priv = 'Y') OR (Drop_priv = 'Y');
SELECT user, host FROM mysql.db WHERE db = 'mysql'
AND ((Select_priv = 'Y') OR (Insert_priv = 'Y') OR (Update_priv = 'Y')
OR (Delete_priv = 'Y') OR (Create_priv = 'Y') OR (Drop_priv = 'Y'));
确保返回结果只能是数据库管理员账号。
5.2限制非管理员用户的权限
Mysql.user表中的权限列有:
file_priv:表示是否允许用户读取数据库所在主机的本地文件;
Process:表示是否允许用户查询所有用户的命令执行信息;
Super_priv:表示用户是否有设置全局变量、管理员调试等高级别权限;
Shutdown_priv:表示用户是否可以关闭数据库;
Create_user_priv:表示用户是否可以创建或删除其他用户;
Grant_priv:表示用户是否可以修改其他用户的权限;
应确保只有数据库管理员才有上述权限,使用如下sql语句查看拥有各个权限的数据库账号:
select user, host from mysql.user where File_priv = 'Y';
select user, host from mysql.user where Process_priv = 'Y';
select user, host from mysql.user where Process_priv = 'Y';
SELECT user, host FROM mysql.user WHERE Shutdown_priv = 'Y';
SELECT user, host FROM mysql.user WHERE Create_user_priv = 'Y';
SELECT user, host FROM mysql.user WHERE Grant_priv = 'Y';
SELECT user, host FROM mysql.db WHERE Grant_priv = 'Y';
确保查询结果中不存在非管理员用户。
如果存在非管理员用户,使用如下命令进行权限回收:
REVOKE FILE ON *.* FROM 'user';
REVOKE PROCESS ON *.* FROM 'user';
REVOKE SUPER ON *.* FROM 'user';
REVOKE SHUTDOWN ON *.* FROM 'user';
REVOKE CREATE USER ON *.* FROM 'user';
REVOKE GRANT OPTION ON *.* FROM user;
其中user为上述查询到的非管理员用户。
5.3合理控制DML/DDL操作授权
DML/DDL语句包括创建或修改数据库结构的权限,例如insert、update、delete、create、drop和alter语句,在任何数据库中都要控制用户的此类权限,确保只授权给有业务需求的非管理员用户。Mysql命令行下执行如下命令:
SELECT User,Host,Db FROM mysql.db WHERE Select_priv='Y'
OR Insert_priv='Y' OR Update_priv='Y' OR Delete_priv='Y' OR Create_priv='Y'
OR Drop_priv='Y' OR Alter_priv='Y';
上述查询到的用户只能对特地的数据库才有相关的权限,使用如下命令进行相关权限的回收:
REVOKE SELECT ON host.database FROM user;
REVOKE INSERT ON host.database FROM user;
REVOKE UPDATE ON host.database FROM user;
REVOKE DELETE ON host.database FROM user;
REVOKE CREATE ON host.database FROM user;
REVOKE DROP ON host.database FROM user;
REVOKE ALTER ON host.database FROM user;
其中user为查询到的未授权的用户,host为相关主机,database为相关数据库。
6、审计和日志
6.1开启错误日志审计功能
错误日志包括数据库运行和停止过程中的一系列活动信息,有助于分析数据库运行过程中的一些异常活动,一般情况下需要开启错误日志记录功能,使用如下命令查询:
SHOW variables LIKE 'log_error';
确保返回结果为非空,如果为空,需要在mysql数据库配置文件中增加相关配置。
6.2确保日志存放在非系统区域
日志文件随着数据库的运行会不断增加,如果存放在系统区域,则会影响系统的正常运行,使用如下命令进行查询:
SELECT @@global.log_bin_basename;
确保返回结果不是如下路径:/、/var、/usr
6.3关闭原始日志功能
原始日志选项会决定一些敏感信息是否会被明文写进日志中,例如查询日志、慢查询日志、二进制日志,确保数据库配置文件中存在如下配置项:
Log-raw = OFF
7、认证
7.1 Old_passwords环境变量设置
Old_passwords决定了使用PASSWORD()函数和IDENTIFIED BY 、CREATE USER 、GRANT 等语句是时的hash算法:
0 - authenticate with the mysql_native_password plugin
1 - authenticate with the mysql_old_password plugin
2 - authenticate with the sha256_password plugin
设置为mysql_old_password代表弱hash算法,可以快速通过密码字典进行暴力破解。使用如下命令查询相关值:
SHOW VARIABLES WHERE Variable_name = 'old_passwords';
确保返回值不为1。
7.2 secure_auth 选项设置
如果客户端采用Old_passwords发起连接请求,如果服务器端设置了secure_auth,则客户端会拒绝连接请求,可以根据安全需求在配置文件中做相应配置。
7.3 密码保存
确保密码没有明文保存在全局配置文件中。
7.4 确保所有用户都要求使用非空密码登录
执行如下语句查询是否有用户不需要密码即可登录:
SELECT User,host
FROM mysql.user
WHERE (plugin IN('mysql_native_password', 'mysql_old_password')
AND (LENGTH(Password) = 0
OR Password IS NULL))
OR (plugin='sha256_password' AND LENGTH(authentication_string) = 0);
7.5不存在空账号
使用如下命令查询是否存在空账号:
SELECT user,host FROM mysql.user WHERE user = '';
8、网络设置
如果mysql数据库服务器与应用是跨信任域部署的,则需要考虑在数据库服务器与应用服务器之间建立ssl通道进行数据传输,不过这种场景一般很少见,在此不详细描述。
9、数据库备份
其实这个和jsp没啥关系,只要你的代码没有比如爆源码或者直接上传shell这些弱智的漏洞就行了,一般的做法其实很简单,就是给mysql分配一个单独的账号,而不要使用root权限,而且只能针对目标数据库操作,其他的数据库没有操作权限,如果要附加上jsp的话,那么就是别让你的程序出现注入之类的漏洞,因为只要存在注入,那么至少可以肯定你的数据库会全部泄露,这样会使别人进一步入侵你甚至控制你的服务器,当然了linux和windows的服务器还是有差别的,上面给你说的只是最一般的方法