目前,我有以下设计:

数据定期从远程服务器发送到中央服务器。
命令以POST的形式从中央服务器向单个远程服务器发出,以运行在远程服务器上的REST。
我很担心安全问题。最重要的是防止向远程服务器发出未经授权的命令。
目前,我正在使用基于令牌的身份验证。每个远程服务器都有一个令牌,由中央服务器发出,该令牌存储在远程服务器的文件系统上的配置文件中。此令牌在来自远程服务器的POST请求的授权头中传递。
沟通的另一个方向也是类似的。每个远程服务器为中央服务器生成一个令牌,该令牌存储在与中央云服务器相同的网络中的关系数据库中。
我对这个设计的看法是:
我可以用什么方法改进这个设计?从中央云服务器到远程设备的通信不需要是REST。我需要的是两台服务器之间的双向握手。如何使用REST实现这一点?
一些注意事项:
我考虑过的一些事情:
发布于 2018-02-07 02:08:13
因为您主要关注的是程序的安全性(即防止有人向您的客户发出命令),所以您还必须识别您的威胁模型。例如,如果您向程序发送命令以解锁您的前门,则您设计应用程序的方法将与仅仅发送无意义的数据(如"hello world!“)的方法大不相同。
一旦定义了密码,您就可以决定是否应该散列数据库中的密码,并将密钥锁定在安全的或纯文本密码中,这对于不重要的数据可能有效。我将尝试与您的应用程序交谈,尽管不知道每一个细节。
您已经在使用SSL/TLS,所以这是一个很好的开始。您已经实现了一种身份验证形式,客户端可以通过这种方式向服务器证明它们是合法的。您拥有对主机的物理控制,所以我假设没有人能够获得物理访问。如果您有静态IP,当然,可以抛出一个白名单和一个可能的防火墙来限制某些http方法(GET,POST)。您可能会考虑使用诸如Nginx这样的前端代理在服务器上完成所有这些工作。我强烈建议您不要允许客户端干净地切断到数据库的连接。只允许服务器连接到数据库。您提到您正在数据库中存储密码,为什么不使用散列/盐分呢?这也取决于你的威胁模型。
您提到客户端计算机在您的物理访问范围内,但可能被偷。如果攻击者具有对某个盒子的物理访问权限,则所有投注都取消。你在这里的最佳选择是尽快识别出一个客户被破坏了。您已经在使用令牌了,为什么不使用到期时间呢?
最后,从客户端发送到服务器的任何数据都必须、必须、必须进行消毒和检查。如果您知道数据是什么样子,请设置一个模板和接收到的与其不匹配的数据,请拒绝它。
https://security.stackexchange.com/questions/179267
复制相似问题