大学课程里大作业,在我看来,与其说是Project,不如说是玩具。不管性能,不考虑安全性,不考虑日后如何维护,只要实现相应功能就OK了。比如说大二上的Web课,我后端对上述的事项基本无考虑,最后还是拿了很好的名次... 这里我想从安全和运维的角度谈谈从一个玩具到生产环境的项目要做哪些事情。
安全
后端是跟数据打交道的,我们必须保证最后到达数据库的数据是完整的,安全的。
密码存储
密码存储大概是许多人遇到的第一个安全问题了。明文存储密码显然是不可取的。比如CSDN的密码泄露事件,简直被老师黑出翔,每讲到这个问题都会被拉出来枪毙一次。
普通方案
最简单的方法就是对密码做一次单向哈希。常见的单项哈希算法有SHA-256, SHA-1, MD5等。但随着技术的进步,攻击者可以将所有密码的常见组合进行单向哈希,得到一个摘要组合,与数据库中的摘要进行比对即可获得对应的密码。这个摘要组合被称为rainbow table(彩虹表)。所以这个方案也不太安全。
进阶方案
一种更好地方法是加“盐”(salt)。现对原文做一次单向哈希,将得到的哈希值加上一串只有管理员知道的随机串,再做一次单向哈希。这样就大大增加了破解的难度。避免了密码过短、过于常见而被彩虹表破解。
数据存储
在往数据库里新增或者修改数据时,需要做一些验证,不能一股脑的丢进数据库。尤其是像mongoDB这样的面向文档的数据库,往里放的数据,属性多了,类型不对,也不会报错,这非常可怕。所以在数据库操作前的一步得把好关。
日志
这大概是初学者最初的项目最容易忽略的一点。许多人调试时在终端上log几个数据找出bug后就完事了。
在项目正式上线后,出现问题,日志是我们非常重要的依据。像删除这样的敏感操作得对关键信息做好日志。而access log可以套上一层nginx,让nginx帮我们做。
好的日志应该根据重要程度,分为多级。许多日志库都有这样的设定,如分成debug, info, warning, error这样几级。在开发阶段的log信息丰富些,上线后只做error等重要信息的log
运维
运维做的是项目上线后的长期维护。
配置文件化
在部署时,比如数据库的启动信息,是可以手动作为命令行参数输入的。在学习阶段当然可以这么做,简单便利。而在生产环境应当将配置信息写到文件中,手动输入参数麻烦,而且容易遗漏,输错。
最好是用Makefile这样的工具,make一下完成部署,方便且不易错。
监控
上线后用pm2或者类似的工具对服务器状态进行监控CPU使用率、内存使用率等数据。及时发现问题。
备份
一个合格的运维人员应当定期对数据做容灾备份。