网络安全基线
liebian365 2024-11-21 17:34 17 浏览 0 评论
安全基线
1、网络安全基线
- 采用白名单制做好网络层面的ACL,只对外网开放必需的端口(如80或443等);
- 同一网段的服务器要与其他服务器划分在不同的Vlan中,防止被ARP欺骗;
- 生产环境网络必须与办公网络隔离;
- 只允许出口IP和堡垒机连接服务器的管理端口
2、服务器安全基线
2.1 Linux服务器安全基线
- 操作系统最小化安装,只安装业务所必需的服务;
- 服务器禁止使用弱口令,禁止所有服务器使用相同的密码;
- 使用iptables做好服务器层面的ACL,只允许出口IP连接ssh,对外网开放必需的端口(80或443等);
- 禁止允许root用户直接登录SSH,安全加固方法:
PermitRootLogin no
StrictModes yes
- 使用SSH协议版本2,安全加固方法为:Protocol 2,1 修改为 Protocol 2
- Mysql、Redis、Memcache、Mongodb等应用程序只允许监听在内网网卡上。
2.2 Windows服务器安全基线
- 使用正版、干净的安装盘安装操作系统;
- 设置强壮的口令,禁止所有服务器使用相同的密码;
- 配置IPSEC,只允许出口IP访问远程桌面,对外网开放必需的端口(80或443等);
- 正式上线前确保打全了所有补丁,设置可以自动安装补丁但不自动重启;
- 安装一款杀毒程序并可以自动更新病毒库;
- 禁止安装与业务无关的第三方软件。
3、WEB服务器安全基线
3.1 Apache服务器安全基线
- 隐藏Apache的版本及操作系统信息,防止敏感信息,安全加固方法:
ServerSignature Off
ServerTokens Prod
- 禁止目录枚举和禁止使用符号链接跨越DocumentRoot,安全加固方法:
Options -Indexes –FollowSymLinks
- 禁止用户使用.htaccess文件覆盖Options配置项,安全加固方法:
AllowOverride None
- 禁止访问站点目录之外的文件,安全加固方法:
<Directory />
Order Deny, Allow
deny from all
</Directory>
- 禁用不需要的模块,保持最小化原则,安全加固方法为注释掉以下一些不需要的模块: mod_imap, mod_include, mod_info, mod_userdir, mod_autoindex等
- 禁止Apache以直接以Root用户运行,应为apache创建独立的运行账户,如
www:User www
Group www
- 为管理后台等重要目录设定ACL,安全加固方法如下:
<Directory "/var/www/html/admin">
Order Deny,Allow
Deny from all
Allow from 出口IP
</Directory>
- 去除用户上传目录的脚本执行权限,防止攻击者写入webshell,安全加固方法:
<Directory "/var/www/html/upload">
<FilesMatch ".(php|php5)#34;>
Deny from all
</FilesMatch>
</Directory>
- 禁止访问.git、.git目录及.sql格式的文件,防止源码或数据库SQL文件泄漏,安全加固方法:
<Directory "/home/work/data/www">
<FilesMatch ".(/svn/|/git/|sql)#34;>
Deny from all
</FilesMatch>
</Directory>
3.1 Nginx服务器安全基线
- 防止操作系统和Nginx版本泄漏,安全加固方法: server_tokens off;
- 修改Nginx的Banner信息,修改方法为将
src/http/ngx_http_header_filter_module.c文件中的以下2行:
static char ngx_http_server_string[] = "Server: nginx" CRLF;
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
修改为:
static char ngx_http_server_string[] = "Server: Xiaomi Web Server" CRLF;
static char ngx_http_server_full_string[] = "Server: Xiaomi Security Team is hiring" CRLF;
- 为站点的管理后台目录设定ACL,安全加固方法为:
location /admin/ {
\## allow anyone in 192.168.1.1
allow 192.168.1.1;
\## drop rest of the world
deny all;
}
- 去除用户上传目录的脚本执行权限,防止用户写入webshell,安全加固方法为:
location ~ /upload/.*\.(php|php5)?$ {
deny all;
}
- 禁止不必要的http方法,以下的配置只保留了GET、POST和HEAD方法:
## Only allow these request methods ##
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
- 禁止访问.svn/.git目录及.sql格式的文件,防止代码或数据库文件泄漏,安全加固方法:
location ~ \.(/svn/|/git/|sql)?$ {
deny all;
}
3.2 PHP配置安全规范
- 关闭暴露php版本信息:
expose_php=Off
- 关闭可以用远程代码执行的相应参数:
allow_url_fopen=Off allow_url_include=Off
- 禁用危险函数:
disable_functions=exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
- 错误的信息处理:
display_errors=Off
log_errors=On error_log=/var/log/httpd/php_scripts_error.log #便于分析
- 使用open_basedir限制php对文件的访问权;
open_basedir="/var/www/html/;
- 为php创建单独的用户和用户组;
- 为php用户创建单独的用户和用户组,不可以直接以root用户身份执行php程序。
4、 常用的应用程序安全基线
4.1 Mysql安全基线
- Mysql端口禁止监听在外网网卡上;
- 禁止使用弱口令并删除匿名账户;
- 禁止使用root用户启动mysql;
- 禁止除了root和mysql启动用户之外的其他用户对mysql的数据目录有读写权限;
- 每个mysql数据库对应一个mysql用户,禁止mysql用户可以访问与之无关的数据库;
- 严格遵循数据与代码分离的原则,禁止WEB服务与mysql运行于同一台服务器。
4.2. Sql server 2008安全基线
- 限制可以访问数据库的IP,采用白名单机制,只允许信任的IP连接;
- 禁止将数据库端口监听在外网网卡中;
- 修改日志审核策略, 将登录审核修改为“开启登录成功和失败的日志”;
- 禁止使用弱口令;
- 每个数据库一个用户,权限为PUBLIC,禁止用户可以访问其他不必需的数据库;
- 使用NETWORK SERVICE账户来启动数据库;
- 严格遵循数据与代码分离的原则,禁止数据库与WEB服务使用同一台服务器;
- 禁用以下高危的存储过程:
xp_cmdshell
xp_delete_file
xp_regread
xp_regwrite
xp_dirtree
4.3 Oracle安全基线
- 禁止监听在外网网卡上;
- 利用iptables和oracle的监听器设置ACL,安全加固方法:
tcp.validnode_checking = yes
\#允许访问的ip
tcp.invited_nodes = (ip1,ip2…)
\#不允许访问的ip
tcp.excluded_nodes=(ip1,ip2,……)
- 关闭不必要的服务,只保留OracleServiceORCL和OracleOraDb11g_home1TNSListener;
- 禁止使用弱口令,建议锁定DBSNMP和SYSMAN用户;
- 数据与代码分离,禁止WEB应用与数据库使用同一台服务器;
- 每个数据库一个用户,禁止用户可以访问其他不必需的数据库。
- 禁止超级管理员远程登录,安全加固方法:
在spfile中设置 REMOTE_LOGIN_PASSWORDFILE=NONE;
在sqlnet.ora中设置 SQLNET.AUTHENTICATION_SERVICES=NONE 禁用SYSDBA角色的自动登录
4.4 Redis安全基线
- 禁止监听在外网网卡上;
- 为Redis设置强壮的口令,requirepass yourpassword;
- 禁止以Root权限启动redis;
- 禁用以下危险指令:
rename-command FLUSHALL;
rename-command FLUSHDB;
rename-command CONFIG
4.5 Mongdb安全基线
- 禁止监听在外网网卡上;
- 为Mongodb设置强壮的口令,启动时加上--auth参数;
- 禁用HTTP接口,安全加固方法为:
nohttpinterface = true
- 禁用rest接口,该接口不支持安全认证机制,安全加固方法为:
rest = false
- 利用iptables设置ACL,只允许信任的IP连接。
4.6. Memcache安全基线
- 禁止以root权限启动;
- 禁止监听到外网网卡上;
- 利用iptables做好ACL,只允许必需的服务器连接。
4.7. Rsync安全基线
- 禁止以root用户权限启动;
- 设置允许连接的IP列表,安全加固方法:
hosts allow = X.X.X.X #允许访问的IP
- 设置访问口令,安全加固方法为:
secrets file = /etc/rsyncd.secrets #密码文件位置,认证文件设置,设置用户名和密码;
auth users = rsync #授权帐号,认证的用户名,如果没有这行则表明是匿名,多个用户用,分隔。
- 利用iptables设置ACL,只对信任的IP开放873端口,安全加固方法如下:
iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
- 排除.svn和.git目录,防止客户端上传后导致源码泄漏,安全加固方法:exclude = .svn/ .git/
5、 WEB应用安全规范
5.1. 认证安全
- OAuth 认证安全
- SSO 认证安全
5.2. 防御XSS
- 在html属性中的输出,使用htmlencode进行处理,不过更为保险的做法是:除了字母和数字之外,其他所有的特殊字符都编码为htmlentities;
- 在<script>中的输出,采用的javascriptEncode;
- 在事件中的输出,采用javascriptEncode防止符号的闭合;
- 在css中的输出,禁止用户可控制的遍历出现在<style>、css文件中。 推荐使用owasp的encodeForCSS()`函数进行加密,也就是除了字母和数字之外的特殊字符都编码成十六进制的形式
- 在地址中的输出,使用urlEncode即可,将特殊字符进行url编码转换。 其中比较特殊的就是伪协议的url,例如javascript,dataurl,这种的话对url进行判断是否是http协议的url地址;
- 针对富文本的处理,富文本的xss防御比较多样化,除了上述的一些,还应注意使用白名单标签,避免使用黑名单标签;
- 针对dom型xss,在$var变量进入<script>时,应该先执行一次javascriptencode,在dom输出到html页面时候也需要区别对待,如果是输出到事件或者脚本中,则需要在做一次javascriptencode,如果是输出到html或者属性,则需要做一个htmlencode。
5.3. 防御SQL注入
- 使用预编译语句;
- 防御sql注入最佳的方式就是使用预编译语句,绑定变量;
- 在php中使用bindParameter()`函数;
- 使用安全的的存储过程;
- 检查数据类型;
- 使用安全函数
5.4. 防御CSRF(跨站请求伪造)
- 验证码被认为是对抗CSRF简洁而有效的防御方法;
- referer检测;
- 增加CRSF token认证
5.5. 防御代理执行漏洞
- 能使用脚本解决的工作,不要调用其他程序处理。尽量少用执行命令的函数,并在disable_functions中禁用;
- 对于可控点是程序参数的情况,使用escapeshellcmd函数进行过滤;
- 对于可控点是程序参数的值的情况,使用escapeshellarg函数进行过滤;
- 参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义。
5.6. 防御点击劫持(Clickjacking)
- 使用X-FRAME-OPTIONS;
- 使用js判断当前也没是否是top页面。
5.7. 防御SSRF
- 过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准;
- 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态;
- 限制请求的端口为http常用的端口,比如,80、443、8080、8090;
- 黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网;
- 禁用不需要的协议,仅仅允许http和https请求。
5.8. 防御URL重定向
- 加入referer的限制,保证该URL的有效性,避免恶意用户自己生成跳转链接;
- 加入有效性验证Token,避免用户生成自己的恶意链接从而被利用(但是如果功能本身要求比较开放,可能会产生一定的限制);
- 设置严格白名单及网络边界:功能要求比较开放的情况下,需要严格限定协议以及可访问的网络。
5.9. 防御XXE(xml实体注入)
在默认情况下关闭内联DTD解析(Inline DTD parsing)、外部实体、实体,使用白名单来控制允许实用的协议。
- PHP:对于使用SimpleXML解析XML的方法可在加载实体之前添加libxmldisableentity_loader(true)语句以进制解析外部实体;
- 对于使用DOM解析XML的方法可在加载实体之前添加libxmldisableentity_loader(true);语句或者使用:
<?php
// with the XMLReader functionality:
$doc = XMLReader::xml($badXml,'UTF-8',LIBXML_NONET);
?>
- JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
- .NET
通过将XmlReaderSettings.XmlResolver属性设置为XmlSecureResolver对象限制XmlReader可访问的资源。
通过将XmlReaderSettings.XmlResolver属性设置为null,不允许XmlReader打开任何外部资源。
对于利用超大的XML文档进行拒绝服务攻击的问题,使用XmlReader时,通过设置MaxCharactersInDocument属性,可以限制能够分析的文档大小。
通过设置MaxCharactersFromEntities属性,可以限制从扩展实体中生成的字符数。
- Python
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
6. Android应用安全基线
6.1. Android代码安全
- 防止app被冒用:验证app的证书和签名;
- 防止app被反编译:推荐使用proGuard、DexGuard保护安卓代码安全,DexGuard除了会混淆java代码还会用在Android资源和Dalvik字节码上;
- 防止敏感信息泄露:将代码中的敏感信息进行加密,防止反编译代码直接看到数据库密码等等敏感信息;
- 检测安装程序、模拟器、调试标志位防止逆向工程;
- 检查随机数生成类:在Android 4.2以下,SecureRandom是基于老版的Bouncy Castle实现的。如果生成SecureRandom对象后马上调用setSeed方法。SecureRandom会用用户设置的seed代替默认的随机源。使得每次生成随机数时都是会使用相同的seed作为输入,从而导致生成的随机数是相同的;
- 检查webview的使用:是否允许用户输入url访问网页,是否允许file等伪协议;
- 检查是否允许allowbackup
6.2. Android加密
- Hash算法:
- 建议使用SHA-256、SHA-3算法;
- 不建议使用MD2、MD4、MD5、SHA-1、RIPEMD算法来加密用户密码等敏感信息;
- 不要使用哈希函数做为对称加密算法的签名;
- 注意:当多个字符串串接后再做hash,要非常当心
- 消息认证算法
- 建议使用HMAC-SHA256算法,避免使用CBC-MAC
- 对称加密算法
- 建议使用AES算法
- DES默认的是56位的加密密钥,已经不安全,不建议使用
- 注意加密模式不要使用ECB模式
- Android 提供的AES加密算法API默认使用的是ECB模式,所以要显式指定加密算法为:CBC或CFB模式,可带上PKCS5Padding填充。AES密钥长度最少是128位,推荐使用256位。
- 非对称加密
- 注意密钥长度不要低于512位,建议使用2048位的密钥长度;
- 使用RSA算法做加密,RSA加密算法应使用Cipher.getInstance(RSA/ECB/OAEPWithSHA256AndMGF1Padding),否则会存在重放攻击的风险。
- 加密算法PBE
- 使用基于口令的加密算法PBE时,生成密钥时要加盐,盐的取值最好来自SecureRandom,并指定迭代次数。
6.3. Android组件安全
- 正确使用AndroidManifest.xml文件
- 在代码级别上强制使用权限检查
- 保护content provider的路径(path)
6.4. 信息存储安全
- Shared Preferences
- 使用Secure-Preference对Shared Preferences进行保护
- 基于口令的加密,使用PBE加密
- 基于密钥的加密,密钥存储在系统密钥链(keychain)
- SQLite数据库:使用SQLCiper加密数据库,使用手机特有的字符进行加密,防止重放
- 内部存储:敏感数据进行加密处理;
- 外部存储:外部存储是可以被任意app读取的,不要存储敏感信息,大文件存储的话参用加密处理
6.5. 网络传输安全
- 验证ssl自签名证书
- 避免错误的认为所有服务器的证书都是可信的,信任所有的证书
- 保护敏感信息,使用https传输数据,针对传输的敏感数据进行加密处理
- 服务器返回数据带有敏感信息的进行加密处理
6.6. 日志输出
- 在log中禁止输出敏感信息,包括用户信息,服务器信息及加密信息等;
- 使用Progurad进行日志擦除
- 上一篇:文件操作
- 下一篇:C语言经典100例 --- 96-100
相关推荐
- go语言也可以做gui,go-fltk让你做出c++级别的桌面应用
-
大家都知道go语言生态并没有什么好的gui开发框架,“能用”的一个手就能数的清,好用的就更是少之又少。今天为大家推荐一个go的gui库go-fltk。它是通过cgo调用了c++的fltk库,性能非常高...
- 旧电脑的首选系统:TinyCore!体积小+精简+速度极快,你敢安装吗
-
这几天老毛桃整理了几个微型Linux发行版,准备分享给大家。要知道可供我们日常使用的Linux发行版有很多,但其中的一些发行版经常会被大家忽视。其实这些微型Linux发行版是一种非常强大的创新:在一台...
- codeblocks和VS2019下的fltk使用中文
-
在fltk中用中文有点问题。英文是这样。中文就成这个样子了。我查了查资料,说用UTF-8编码就行了。edit->Fileencoding->UTF-8然后保存文件。看下下边的编码指示确...
- FLTK(Fast Light Toolkit)一个轻量级的跨平台Python GUI库
-
FLTK(FastLightToolkit)是一个轻量级的跨平台GUI库,特别适用于开发需要快速、高效且简单界面的应用程序。本文将介绍Python中的FLTK库,包括其特性、应用场景以及如何通过代...
- 中科院开源 RISC-V 处理器“香山”流片,已成功运行 Linux
-
IT之家1月29日消息,去年6月份,中科院大学教授、中科院计算所研究员包云岗,发布了开源高性能RISC-V处理器核心——香山。近日,包云岗在社交平台晒出图片,香山芯片已流片,回片后...
- Linux 5.13内核有望合并对苹果M1处理器支持的初步代码
-
预计Linux5.13将初步支持苹果SiliconM1处理器,不过完整的支持工作可能还需要几年时间才能完全完成。虽然Linux已经可以在苹果SiliconM1上运行,但这需要通过一系列的补丁才能...
- Ubuntu系统下COM口测试教程(ubuntu port)
-
1、在待测试的板上下载minicom,下载minicom有两种方法:方法一:在Ubuntu软件中心里面搜索下载方法二:按“Ctrl+Alt+T”打开终端,打开终端后输入“sudosu”回车;在下...
- 湖北嵌入式软件工程师培训怎么选,让自己脱颖而出
-
很多年轻人毕业即失业、面试总是不如意、薪酬不满意、在家躺平。“就业难”该如何应对,参加培训是否能改变自己的职业走向,在湖北,有哪些嵌入式软件工程师培训怎么选值得推荐?粤嵌科技在嵌入式培训领域有十几年经...
- 新阁上位机开发---10年工程师的Modbus总结
-
前言我算了一下,今年是我跟Modbus相识的第10年,从最开始的简单应用到协议了解,从协议开发到协议讲解,这个陪伴了10年的协议,它一直没变,变的只是我对它的理解和认识。我一直认为Modbus协议的存...
- 创建你的第一个可运行的嵌入式Linux系统-5
-
@ZHangZMo在MicrochipBuildroot中配置QT5选择Graphic配置文件增加QT5的配置修改根文件系统支持QT5修改output/target/etc/profile配置文件...
- 如何在Linux下给zigbee CC2530实现上位机
-
0、前言网友提问如下:粉丝提问项目框架汇总下这个网友的问题,其实就是实现一个网关程序,内容分为几块:下位机,通过串口与上位机相连;下位机要能够接收上位机下发的命令,并解析这些命令;下位机能够根据这些命...
- Python实现串口助手 - 03串口功能实现
-
串口调试助手是最核心的当然是串口数据收发与显示的功能,pzh-py-com借助的是pySerial库实现串口收发功能,今天痞子衡为大家介绍pySerial是如何在pzh-py-com发挥功能的。一、...
- 为什么选择UART(串口)作为调试接口,而不是I2C、SPI等其他接口
-
UART(通用异步收发传输器)通常被选作调试接口有以下几个原因:简单性:协议简单:UART的协议非常简单,只需设置波特率、数据位、停止位和校验位就可以进行通信。相比之下,I2C和SPI需要处理更多的通...
- 同一个类,不同代码,Qt 串口类QSerialPort 与各种外设通讯处理
-
串口通讯在各种外设通讯中是常见接口,因为各种嵌入式CPU中串口标配,工业控制中如果不够还通过各种串口芯片进行扩展。比如spi接口的W25Q128FV.对于软件而言,因为驱动接口固定,软件也相对好写,因...
- 嵌入式linux为什么可以通过PC上的串口去执行命令?
-
1、uboot(负责初始化基本硬bai件,如串口,网卡,usb口等,然du后引导系统zhi运行)2、linux系统(真正的操作系统)3、你的应用程序(基于操作系统的软件应用)当你开发板上电时,u...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- go语言也可以做gui,go-fltk让你做出c++级别的桌面应用
- 旧电脑的首选系统:TinyCore!体积小+精简+速度极快,你敢安装吗
- codeblocks和VS2019下的fltk使用中文
- FLTK(Fast Light Toolkit)一个轻量级的跨平台Python GUI库
- 中科院开源 RISC-V 处理器“香山”流片,已成功运行 Linux
- Linux 5.13内核有望合并对苹果M1处理器支持的初步代码
- Ubuntu系统下COM口测试教程(ubuntu port)
- 湖北嵌入式软件工程师培训怎么选,让自己脱颖而出
- 新阁上位机开发---10年工程师的Modbus总结
- 创建你的第一个可运行的嵌入式Linux系统-5
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)