草庐IT

从系统架构分析安全问题及应对措施

Jcloud 2023-03-28 原文

在日常生产生活中,我们常说,“安全第一”、“安全无小事”。围绕着安全问题,在各行各业都有对各类常见安全问题的解决方案和突发安全问题的应急预案。在互联网、软件开发领域,我们日常工作中对各类常见的安全问题又有哪些常见的解决方案呢?在此,结合经典架构图做一个梳理。

经典架构图


下面,结合上述的经典架构图,对数据存储、微服务接口、外网数据传输及APP层可能出现的安全问题进行分析,并给出一些常见的应对措施。

1 数据存储

为了保证数据存储的安全,对于敏感数据在进行存储时,需要进行加密存储,同时,敏感数据建议在全公司进行收口管理,便于统一管理。对敏感数据进行加密存储时,常见的加密方式有可逆加密和不可逆加密,分别适用于不同的敏感数据。

1.1 可逆加密或对称加密

可逆加密,即通过对密文进行解密后,能把密文解密还原出明文。对称加密算法加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合,缺点是密钥的传输比较麻烦。比如:网络购物的收货地址、姓名、手机号等就适合用该加密方式,常用的对称加密算法有DES、AES,下面以AES为例说明对称加密的过程。

 

在该加解密中,对于秘钥K的生成需要加解密双方共同制定并妥善保管。通常,我们会把该秘钥K存储在需要使用加解密程序的进程内,便于在程序使用时直接进行使用。

1.2 不可逆加密

不可逆加密,即不需要解密出明文,如:用户的密码。不可逆加密常用的算法有RES、MD5等,在此以MD5为例进行说明。但大家都知道,MD5算法是存在碰撞的,即不同的明文通过MD5加密后,存在相同的密文。因此,直接使用MD5对密码进行加密在生产上是不严谨的,通常还需要配合盐(salt)进行使用。对于盐的使用,也有一定的技巧,一种盐值是固定的,即所有的明文在进行加密时都使用相同的盐进行加密;另一种是结合具体的业务场景,用可变盐值,比如:就密码加密而言,可以把用户名的部分或全部作为盐值,和密码进行一起加密后存储。

 

2 微服务接口

微服务的安全,需要从请求鉴权和请求容量限制这2个方面来考虑。对于请求鉴权,可以设置请求IP黑名单的方式,对该IP的所有请求或全部放行或全部拒绝,该方式的粒度较粗。而如果要做得较细粒度一些,可以针对具体的API进行token鉴权,相比粗粒度该方式会控制得比较精准;

 

<jsf:consumer id="setmentService" interface="com.jd.lfsp.jsf.service.SetmentService"
                  protocol="jsf" alias="${jsf.consumer.alias}" timeout="${jsf.consumer.timeout}" retries="0">
        <jsf:parameter key="token" value="${jsf.consumer.token}" hide="true" />
</jsf:consumer>
 

除了对请求鉴权外,在实际的生产中,还可以对请求容量进行限制,对请求容量进行限制时,可以按QPS进行限制,也可以对每天的最大请求次数进行限制。在jsf平台管理端,可以对具体的方法进行请求的QPS限流。

 

3 数据传输

数据传输主要分为数据通过前端APP的请求,进入到服务网关前和进入服务网关后这俩部分,对于数据已经进入服务网关后,这属于机房内的数据传输,通常这类加密意义不大,对这类的数据传输的安全需要建立相应的内部安全机制及流程规范,通过制度措施来保证。而数据在进入服务网关前,对数据的安全传输有哪些可做的。在数据请求进入服务网关前,通常我们有基于SSL协议的传输加密以及现在普遍通用的HTTPS加密。

 

HTTPS也是HTTP和SSL协议的结合体,所以在数据传输中,SSL协议扮演了至关重要的角色。那SSL协议的工作过程是怎么样的,他是怎么保证数据传输过程中的安全的呢?下面为大家解析一下SSL协议的工作过程。

 

SSL客户端与SSL服务端验证的过程如下:

  1. SSL客户端向SSL服务端发送随机消息ClientHello的同时把自己支持的SSL版本、加密算法、秘钥交换算法、MAC算法等信息一并发送;
  2. SSL服务端收到SSL客户端的请求后,确定本次通信采用的SSL版本及加密组件和MAC算法,并通过ServerHello发送给SSL客户端;
  3. SSL服务端将携带自己公钥信息的数字证书通过Certificate发送给SSL客户端;
  4. SSL服务端通过ServerHelloDone消息通知SSL客户端版本和加密组件协商结束,开始进行秘钥交换;
  5. SSL客户端验证SSL服务端发送的证书合法后,利用证书中的公钥加密随机数生成ClientKeyExchange发送给SSL服务端;
  6. SSL客户端发送ChangeCipherSpec消息,通知SSL服务端后续将用协商好的秘钥及加密组件和MAC值;
  7. SSL客户端计算已交互的握手消息的hash值,利用协商好的秘钥和加密组件加密hash值,并通过Finished消息发送给SSL服务端,SSL服务端用相同的方法计算已交互的hash值,并与Finished消息进行对比,二者相同且MAC值相同,则秘钥和加密组件协商成功;
  8. 同样地,SSL服务端也通过ChangeCipherSpec消息通知客户端后续报文将采用协商好的秘钥及加密组件和MAC算法;
  9. SSL服务端端计算已交互的握手消息的hash值,利用协商好的秘钥和加密组件加密hash值,并通过Finished消息发送给SSL客户,SSL客户端用相同的方法计算已交互的hash值,并与Finished消息进行对比,二者相同且MAC值相同,则秘钥和加密组件协商成功;

通过上面的这个交互过程,我们可以看出,在使用SSL的过程中,除了客户端(浏览器)跟服务器之间的通讯外,其他的任何第三方想要获取到协商的秘钥是比较困难的。即使有比较厉害的人获取到了,基于目前用户在某个网站上的时效性,会影响我们对应秘钥的时效性,因此,造成的破坏性也比较有限。

4 APP

在APP层的安全问题,需要结合服务端一并来解决,在这主要介绍验证码这种形式。验证码作为一种人机识别手段,其主要作用是区分正常人操作还是机器的操作,拦截恶意行为。当前互联网中,大多数系统为了更好地提供服务,通常都需要用户进行注册。注册后,用户每次在使用系统时需要进行登录,登录过程中,为了防止系统非法使用,通常都需要用户进行登录操作,登录过程中,常用的验证方式主要通过验证码进行验证,当前比较常用的验证码有以下几种类型。

4.1 短信验证码

目前用得比较广泛的一种验证码形式,输入有效的手机号后,系统给手机号发送相应的短信验证码完成验证。

 

4.2 语音验证码

通过输入有效的手机号,系统给手机号拨打电话后,用语音播报的方式完成验证码的验证。

 

4.3 图片验证码

较传统的验证码验证方式,由系统给出验证码在页面显示,在进行页面提交时,验证码一并提交到系统后台验证。

 

4.4 语义验证码

比较新颖的一种验证码形式,但是该种方式相比较而言对用户不是特别友好,需要慎用。

 

除了上述的几种目前常用的验证码外,还有文本验证码、拼图验证码、问题类验证码等,在此就不再一一列举,大家如果感兴趣可以自己去搜索、学习。

这主要从系统的架构上,分析了日常工作中我们所接触到的比较常见的一些安全问题及其应对措施,在实际工作的安全问题远不止这里提到的内容。希望在日常工作中,我们大家都绷紧安全的神经,时刻关注自己工作中的各类潜在的安全问题,争取把安全问题消灭在系统发布前。

5 参考文献

SSL是如何加密传输的数据的:
[技术每日说] - SSL是如何加密传输的数据的!

名词解释:

  • SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,从而实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
  • HTTPS:(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版(HTTP+SSL)。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

作者:廖宗雄

有关从系统架构分析安全问题及应对措施的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  3. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  4. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  5. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  6. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  9. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  10. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

随机推荐