小编use*_*144的帖子

API网关与反向代理

为了处理微服务架构,它通常与反向代理(例如nginx或apache httpd)一起使用,并且对于交叉关注问题,使用实现 API网关模式.有时反向代理执行API网关的工作.
很高兴看到这两种方法之间存在明显的差异.看起来API网关使用的潜在好处是调用多个微服务并聚合结果.API网关的所有其他职责可以使用反向代理实现.例如:

  • 身份验证(可以使用nginx LUA脚本完成);
  • 运输安全.它本身就是反向代理任务;
  • 负载均衡
  • ....

基于此,有几个问题:

  1. 是否有意义地同时使用API​​网关和反向代理(例如请求 - > Api网关 - >反向代理(nginx) - >具体的mictoservice)?在什么情况下?
  2. 使用API​​网关可以实现的其他差异是什么,反向代理无法实现,反之亦然?

reverse-proxy nginx microservices aws-api-gateway tyk

85
推荐指数
3
解决办法
3万
查看次数

Spring CSRF覆盖安全XML配置中的"POST"注销行为

目前我们的遗留应用程序的Spring CSRF解决方案存在问题,因为CSRF实现更改了默认Spring安全性Spring安全配置的行为:

<http pattern="">
...
<logout
                logout-url="/logout"
                delete-cookies="..."
                success-handler-ref="logoutSuccessHandler"
                />
<csrf/>
</http>
Run Code Online (Sandbox Code Playgroud)

org.springframework.security.config.annotation.web.configurers.LogoutConfigurer注销配置器.根据Spring文档:

添加CSRF会将LogoutFilter更新为仅使用HTTP POST.这可确保注销需要CSRF令牌,并且恶意用户无法强制注销您的用户.

进行此更改的代码如下:

 private RequestMatcher getLogoutRequestMatcher(H http) {
        if(logoutRequestMatcher != null) {
            return logoutRequestMatcher;
        }
        if(http.getConfigurer(CsrfConfigurer.class) != null) {
            this.logoutRequestMatcher = new AntPathRequestMatcher(this.logoutUrl, "POST");
        } else {
            this.logoutRequestMatcher = new AntPathRequestMatcher(this.logoutUrl);
        }
        return this.logoutRequestMatcher;
    }
Run Code Online (Sandbox Code Playgroud)

通常,对于CSRF保护,这种行为非常有意义.但对于我来说,这种实现不灵活(为什么硬编码实际的实现而不是autowire依赖?)是非常奇怪的.

问题是我们的应用程序是这样构建的,即在常规Spring注销之前,它会在Spring Controllers中执行额外的清理.主要是它实现了Switch User功能,但是以自定义方式实现.因此,更改注销链接以执行POST不是一种选择,因为主要是在自定义控制器上执行清理.

似乎为了使用指定的方法,只有一种可能的解决方案:

@RequestMapping(value = "/logout", method = RequestMethod.GET) //or it can be a post
    public String logout() {
// 1. Perform Clean up
// 2. Decide …
Run Code Online (Sandbox Code Playgroud)

java spring csrf spring-security

8
推荐指数
1
解决办法
8275
查看次数

微服务身份验证最佳实践和安全性(OAuth 2.0和OpenIdConnect)

有几种方法可以在微服务中构建身份验证.然而,非常流行的是将JWT令牌和OAuth协议与OpenID Connect身份层一起使用.

本教程中解释如何实现它有一个提示:

当令牌必须离开您的网络时,通过引用传递,然后在它们进入您的空间时将它们转换为按值令牌.在API网关中执行此转换.

然而,我不清楚它背后的原因是什么.我怀疑它可能是由于一些安全性好处(不是让客户可以阅读任何特定信息).因为在JWT令牌本身中它可能是关于角色/权限的信息.但为此目的,也可以加密令牌.

另一个原因可能是JWT令牌太大,并且为了在每次使用这种方法时不携带该令牌.(或者如果JWT令牌存储在cookie中,则它具有大小限制).

我还没有看到任何关于JWT令牌认证被泄露的信息,并且将它保存在客户端(在浏览器中)是一种不好的做法.

另一方面,我看到Ping Identity也在使用传递引用方法.你能帮我理解背后的原因吗?

security oauth oauth-2.0 openid-connect microservices

7
推荐指数
0
解决办法
2281
查看次数

私有云的AWS S3替代方案

现在我们需要从AWS迁移到私有数据中心.我们需要找出潜在的替代存储而不是AWS S3.目前S3以下列方式使用:

  • 总存储容量为10TB;
  • 最小/平均/最大物体尺寸为0.5/2/100 Mb;
  • 我们有N个App实例同时写入/读取
    对象大约50次写入/秒,30次读取/秒;
  • 该存储应该是冗余的(高度可用),容错,可扩展;

天真的实现可以将这些数据存储在:

  • 简单的NFS存储并添加一些复制功能;
  • 只需将提到的对象存储在NoSQL DB中(例如Cassandra中).但是,Cassandra需要许多实例来支持这种存储(也不建议存储> 1TB pn 1 Cassandra节点Cassandra容量规划)

您会为这种情况推荐什么解决方案?

storage nfs amazon-s3 cassandra

7
推荐指数
2
解决办法
3602
查看次数

Laravel Session 过期事件

用户会话过期时是否可以触发某些事件?

例如(会话过期时间 30 分钟):

  1. 用户登录网站;
  2. 做了几个动作;
  3. 会话已过期;
  4. 没有更多的网站操作。

所以用户必须从外部话语论坛注销。

如何实现这一目标的任何好主意?

php laravel laravel-4 laravel-5.2

6
推荐指数
0
解决办法
1492
查看次数

Spring MVC表单验证日期字段

我有一个表单字段,应将其转换为Date对象,如下所示:

<form:input path="date" />
Run Code Online (Sandbox Code Playgroud)

我需要通过以下方式进行验证:

  1. 如果用户将此字段留空。我需要设置一些默认日期。

  2. 如果用户设置了不可接受的格式,我需要提出一个错误。

问题是我可以满足第一或第二要求。

  1. 我可以注册PropertyEditor并在日期不可接受的情况下将null设置为空,并且在该字段为null的情况下设置一些默认日期。但是用这种方法我不能满足第二个要求,因为如果我将其转换为null,我将无法向用户注册第二个错误。
  2. 我可以设置 @DateTimeFormat(pattern =“ dd-MMM-yyyy”) 批注并提供适当的typeMismatch错误,但是当用户在此字段中保留空值时,它仍会返回此错误。

解决这个问题有什么好的办法吗?

java spring date spring-mvc

5
推荐指数
1
解决办法
2万
查看次数

Spring MVC 注释日期范围验证

为以下用例实施日期范围验证的更好方法是什么:

  1. 日期应早于或晚于指定日期;
  2. 与当前时间(现在)相比的时间差大于/小于某个时间段。(例如检查用户是否超过 21 岁)。

实现这一点的一种方法是将此功能放在验证器中。并在每个控制器中为自己编写此逻辑。

为了更好地重用,可以创建自定义注释。尤其是查看现有注释:

  1. @过去的
  2. @未来

这些注释根本不可重用。他们是为单一条件而设计的,对我来说这是一个问题,为什么要这样设计。

我倾向于通过创建新的自定义注释来实现这些用例。任何人都可以提出更好的方法或提供一些反对 Spring 自定义注释的论据吗?

validation spring annotations bean-validation

5
推荐指数
0
解决办法
1548
查看次数

Java Https客户端证书的工作方式与浏览器或其他工具完全不同

似乎我们无法配置我们的Java客户端来正确处理SSL连接.

我们可以使用具有指定客户端证书和curl工具的浏览器成功连接到HTTPS URL,但不能使用我们的java客户端或基于java的SOAP UI工具.即使我们在浏览器中使用相同的*.p12证书(工作正常)并在SOAP UI工具中(不起作用).

所以,我们有以下信息:

  1. 公共客户证书(pem格式)
  2. 客户端的私钥(pem格式)
  3. 服务器用于验证客户端证书的CA.

我们将这些pem证书转换为jks和p12,并使用apache http client进行连接.并且正如提到的那样,相同的证书适用于浏览器,但对于自定义客户端或基于Java的Java UI都不起作用.

首先,我猜测我们在那里描述了以下问题:
当服务器请求客户端证书(作为TLS握手的一部分)时,它还将提供可信CA的列表作为证书请求的一部分.如果您希望提供用于身份验证的客户端证书未由其中一个CA签名,则根本不会显示该证书

但似乎我们有这样的问题它不会解析浏览器的这个证书.因为默认情况下浏览器默认不允许使用不正确的(具有不同的颁发者)证书.

我根据以下教程创建的客户端:

所以,基本上我有问题:

  1. 如何知道客户端证书是否全部发送:我们使用org.apache.http.conn.ssl.SSLSocketFactory可能在什么地方进行调试;
  2. 问题可能是什么,可能是描述浏览器SSL配置和基于java的工具(可能更严格地说是java SSL验证)的差异的任何好的参考?

更新1

我们尝试使用openssl s_client工具.输出显示服务器证书符合我们的预期,但客户端证书验证没有CA:未

发送客户端证书CA名称

openssl s_client的语法,如果使用连接到443而没有指定模式(https://).所以我们决定在没有架构的情况下在浏览器中尝试我们的URL但使用443端口.服务器响应:

普通HTTP请求已发送到HTTPS端口

接下来我们在这次调查中的步骤是尝试wireshark.首先我们使用浏览器进行了正确的会话,然后我们尝试了我们的应用 我们也试过openssl s_client.

区别在于服务器密钥交换数据包.虽然浏览器数据包有一个证书请求,但openssl和我们的应用程序在该数据包中没有这样的字段.此外,如果浏览器不发送任何证书,则该字段仍然存在于数据包中.

因此,只有浏览器获得证书请求.任何关于为什么会发生这种情况的想法都值得赞赏

评论中的问题答案

  • 我们正在使用java 1.7
  • 它是初始客户端证书身份验证
  • 当我们使用时, openssl s_client -connect your.server.name:443 我们返回有效的服务器证书并且没有发送客户端证书CA名称.我们还得到验证错误:num = 2:无法获得颁发者证书.
  • 我们从s_client和浏览器获得的服务器证书是相同的
  • 没有公布的CA证书列表没有发送客户端证书CA名称

更新2

经过一些调查和研究,我们设法找出问题的根本原因.所以我们在服务器上启用了SNI(服务器名称指示),我们的应用程序正在使用apache httpclient 4.2.1.此版本的客户端不支持SNI扩展,也不在Client Hello数据包中发送server_name扩展.之后该服务器不通告客户端使用客户端证书进行身份验证.此问题已在4.3.2版本中修复.

现在我们正在尝试检查4.3.2版本的httpclient是否正确发送server_name扩展.

java ssl https certificate

5
推荐指数
0
解决办法
5226
查看次数

PingFederate和NGinx集成和部署选项

在我们开始研究如何将PingFederate集成到我们的基础架构之前的某个时间.

我们的初始用例如下:我们提供多租户访问我们的应用程序,不同的公司可能使用不同的(他们的)身份提供商来访问我们的应用程序.

现在流量仅限于此工作流程:多个 Idp(s)到一个SP

但是,未来的流程可能会扩展到多对多关系

目前我们使用NGINX作为反向代理,基于PingFed文档,我们现在很难理解部署选项.

基于本指南中的图表 PingFed和apache httpd集成

这种集成对于apache httpd来说或多或少都很清楚.主要是apache PingFed Agent在apache上使用SSO流程,主要是验证"会话"或启动SSO流程.

    Processing Steps
1. A user attempts to access a resource on the Apache server protected by the PingFederate
Apache Agent.
2. The user is redirected to the PingFederate server for authentication.
(If an OpenToken session already exists, the user is granted immediate access.)
3. The PingFederate server redirects the user’s browser to an IdP for authentication using either the
SAML or WS-Federation protocols. The …
Run Code Online (Sandbox Code Playgroud)

nginx httpd.conf single-sign-on pingfederate saml-2.0

5
推荐指数
1
解决办法
1626
查看次数

OpenStack Swift TempAuth身份验证产品使用

几乎在每个OpenStack Swift文档中都提到TempAuth是一个仅用于测试非prod环境的解决方案(但是它的功能完全正常).
在prod中不使用此方法的关键原因是用户信用存储在普通配置文件中,这会降低对象存储的整体安全性.
另一方面,如果App在内部使用对象存储(因此它只在内部基础架构中存储文件),并且App本身提供了身份验证和授权,那么这种方法似乎可能适合生产使用.
您是否可以在prod环境中分享TempAuth使用的任何其他缺点,考虑到对象存储是内部的(或添加其他参数,它没关系:))?

openstack-swift openstack openstack-keystone

5
推荐指数
0
解决办法
118
查看次数

AWS lambda从CloudFormation读取参数或输出

看起来非常简单,但很难找到很好的例子.
因此,任务如下:AWS lambda向AWS-SQS发送一些消息.

AWS lambda代码包含以下行:

var QUEUE_URL = 'https://sqs.us-west-2.amazonaws.com/ID/QUEUE_NAME';",
Run Code Online (Sandbox Code Playgroud)

为了摆脱这个代码,有两种选择:

  1. 创建将根据区域和队列名称查找此队列的查询SQS具有可预测的名称 ;
  2. 创建Cloud Formaion脚本并在那里指定这些依赖项.

基于这一事实,周期性触发器(lambda)将每天工作多次,最好指定此依赖性duting部署.

通常,它看起来像是直接的任务和云编队脚本创建:

 "Resources": {
"LF2HNR1": {
  "Type": "AWS::Lambda::Function",
    "Properties": {
    "Description": "This is  lambda trigger",
    "Handler": "index.myHandler",
    "Runtime": "nodejs",
    "Timeout": "300",
Run Code Online (Sandbox Code Playgroud)

并且还指定了依赖于SQS的依赖:

 "DependsOn": [
    "SQSQ562D4"
  ]
},
"SQSQ562D4": {
  "Type": "AWS::SQS::Queue",
  "Properties": {},

  }
Run Code Online (Sandbox Code Playgroud)

Hovewer如何以编程方式获取lambda代码中的SQS url,这不是直截了当的任务:

    exports.handler = function(event, context) {
 var params = {
    MessageBody: JSON.stringify(event),
 var QUEUE_URL = ????
Run Code Online (Sandbox Code Playgroud)

amazon-sqs amazon-web-services node.js aws-cloudformation aws-lambda

3
推荐指数
1
解决办法
1052
查看次数