项目开发安全经验总结
1、 安全思维
- A)严格控制权限,最小业务授权;
- B)记录详细日志,快速完整识别追查问题发生的位置;
- C)定时备份(完整备份、每日增量备份),增加业务恢复可能;
- D)数据通信加密(HTTPS+高级别SSL证书),数据保存加密(RSA 4096bits);
- E)定时检测(特别是晚上10点到凌晨6点),关注异常行为。
2、 Linux/Windows服务器安全
a) 系统安全
- i. 使用稳定高版本的成熟系统
- ii. 定时升级软件,打补丁
b) 权限控制
- i. 限制端口开放
- ii. 限制ip访问(最好禁用IPv6,研究比较少)
- iii. 限制各类应用,分别给予专用 用户名/用户组
- Php: www用户 www用户组
- Mysql: mysql用户 mysql用户组
- ftp: ftp用户 ftp用户组
- iv. 限制目录权限
- 限制正常目录/文件的权限,修改为root:root 755权限
- 限制上传目录的权限,修改为www:www 700权限
- 限制上传的文件权限,修改为644权限
c) 定时检测
本项内容需要编写bash、sh脚本,配置计划任务来实现。
- i. 监测系统用户,发现新增用户,异常权限用户马上报警
- ii. 监测文件写入,特别是可执行文件,脚本的写入
- iii. 监测并记录异常时间段的正常访问:ssh / mysql等
d) 记录操作日志,定时保护日志
通过定时转移项目日志,修改日志权限来保护日志。
3、 Nginx/Apache安全
- A)调整日志格式,记录更详细信息:多种用户IP,post数据等
- B)采用HTTPS通信,使用高级别的SSL证书
- C)Set-Cookie:HttpOnly、Secure / X-Frame-Options SAMEORIGIN
- D)根据业务过滤常见的GET类型攻击
- E)严格控制上传的文件,并限制上传目录执行web脚本文件。
4、 Mysql 数据库安全
- A)Root用户限制远程登录。必须使用远程超级用户的,一定要限制IP
- B)每个应用专用一个账号,指定访问IP,限制权限范围。上线运行时,只给Select_priv、Insert_prive、Update_priv、Delete_priv权限。更特殊的可根据数据表,甚至数据字段来授权。
- C)开启binlog日志
5、 Php web运行环境安全
- A)使用disable_functions限制风险函数的执行,在不影响业务下可开启安全模式。
- B)expose_php off 防止暴露源码
- C)记录错误日志
- D)合理配置线程工作模式与子进程数量,防止程序崩溃。
6、 程序安全
a) 页面限制
- i. 限制页面的访问
- ii. 限制页面的访问次数/频率
b) 参数限制
- i. 限制参数数量,制作页面参数白名单
- ii. 限制参数类型,过滤参数内容
- iii. 限制参数输出,防止XSS攻击,防止关键参数泄露
c) 行为限制
- i. 验证数据提交防止被篡改,一次一码 md5(uniqid())
- ii. 限制验证码类使用次数
- iii. 限制密码类错误尝试次数
d) 安全监控
- i. 监控超级用户/管理员的权限异常
- ii. 监控并记录超级用户/管理员的操作行为
- iii. 监控核心变量的异常
e) Mysql数据接口
- i. 生产环境,禁止异常sql命令,特别是 权限修改 跟into file这类sql命令;
- ii. 规范Sql命令,保障参数安全。
f) 风险控制机制
- i. 程序源代码加密,减缓代码暴露核心参数;
- ii. 核心数据采用加密存储(RSA 4096bits),保护核心数据直接暴露;
- iii. 如采用api接口通信的,最好对数据加密后再传输(HTTPS也是可以被钓鱼的)。
7、 Memcache 、 Redis等缓存服务器
- a) 限制使用IP,仅限本机使用;
- b) 严禁缓存核心数据,防止关键参数泄露。
8、写在最后
以上都是本人历年经验总结,写的不多,更谈不上详细,更多细节需要读者自己补充完善,算是抛转引玉吧。
欢迎拍砖。